LINUX.ORG.RU

Вытащить первый кириллический UTF-8 символ из макроса

 , ,


0

4

Занимаюсь созданием пакета под свой универ, хочу, чтоб он работал на всех дистрибутивах LaTeX’a. Использую pdflatex. Сейчас мне необходимо получить первый символ из некой строки, «спрятанной» в команду. Например \newcommand\developerName{Иван}. Проблема в том, что если использовать конструкцию

\def\firstchar#1{\getfc#1 \fc}
\def\getfc#1{\def\fc{#1}}

\firstchar{\developerName}

то #1 оказывается единым токеном и, соответственно, «съедается» одномоментно и полностью, честно возвращая «Иван» целиком.

Если же использовать

\def\firstchar#1{\expandafter\getfc#1 \fc}
\def\getfc#1{\def\fc{#1}}

\firstchar{\developerName}

то возникает ошибка ! LaTeX Error: Invalid UTF-8 byte "9A. С xstring, всевозможными комбинациями edef, def и expandafter проблема либо аналогичная (вылезающая из двубайтности символов в UTF-8), либо со случайным неопределённым макросом. Как мне получить первый символ из \developerName?

P.S. Конечная цель иметь 3 переменных, в которые пользователь вбивает свои имя, отчество и фамилию, а на выходе получает строки «И. О. Фамилия» и «Фамилия Имя Отчество». Для первой формы и надо вытаскивать первый символ.

Перемещено hobbit из general

Я делал такое через:

\RequirePackage{xstring}

\newcommand{\studentInitials}{\StrChar{\studentFirstName}{1}.\StrChar{\studentSecondName}{1}.}

Вроде работало (texlive), но тоже не в восторге. Тоже постою-послушаю, может еще варианты есть.

luka83
()
Последнее исправление: luka83 (всего исправлений: 1)
Ответ на: комментарий от luka83

Я xstring тоже пытался использовать (о чём уже сказал), но его работоспособность гарантируется только при использовании таких компиляторов, как XeTeX или LuaTeX. Возможно графический TexLive использует по умолчанию один из них, вот и работает, в отличие от моего pdflatex

LemeRus
() автор топика

Для pdflatex готового решения, полагаю, нет. Посмотри на ответ в этом вопросе на TeX Stackexchange: https://tex.stackexchange.com/questions/631869/expandable-macro-that-extracts-the-first-character-of-utf-8-cyrillic-string-with Его, вероятно, можно приспособить к твоему случаю.

Но я бы советовал переходить на LuaLaTeX (ну или на XeLaTeX в крайнем случае).

TeopeTuK ★★★★★
()
Ответ на: комментарий от TeopeTuK

По ссылке действительно нашлось решение, причём заявленное как работающее для pdflatex, проблема в том, что у меня оно почему-то не работает!

А почему XeLaTeX в крайнем случае? И­ если он в крайнем случае, то какие у него могут быть преимущества?

LemeRus
() автор топика
Ответ на: комментарий от LemeRus

LuaLaTeX сейчас самый активно разрабатываемый движок. Он умеет все, что и PdfLaTeX, а также кучу всего дополнительного (из приятного - UTF-8 без неудобств, произвольные шрифты, юникодная математика (это, впрочем, не каждому нужно), расширения на Lua (есть очень интересные пакеты типа lua-visual-debug)). XeLaTeX по сравнению с PdfLaTeX что-то теряет, например микротипографию. Зато LuaLaTeX медленнее.

TeopeTuK ★★★★★
()