Пакет mfirstuc \capitalisewords работает некорректно

Пакет mfirstuc \capitalisewords работает некорректно

Я объявил это в файле класса

\newcommand{\fullname}[1]{\gdef\@fullname{#1}}

С\fullname{john doe}

Я пытаюсь получить полное имя в файле класса. Это \MakeUperrcase{\@fullname}работает, но это \capitalisewordsне так. Я пробовал

\capitalisewords\@fullname

и

\capitalisewords{\@fullname}

Но выход всегда

ДЖОН ДОУ

вместо

Джон Доу

Когда я проверил \@fullname, он печатает

Джон Доу

решение1

\capitalisewordsне расширяет свой аргумент, поэтому вам нужно сначала расширить аргумент, либо как предложил Дэвид в комментариях:

\expandafter\capitalisewords\expandafter{\@fullname}

или используйте команду быстрого доступа \xcapitalisewords, которая делает то же самое:

\xcapitalisewords{\@fullname}

Причина, по которой аргумент не расширяется автоматически, заключается в том, что механизм заглавных букв первой буквы допускает семантическую разметку, которая принимает один аргумент. Например:

\newcommand*{\strong}[1]{\textcolor{red}{\textbf{#1}}}
\capitalisewords{\strong{lorem} ipsum}

Это становится эффективно

\strong{\MakeUppercase lorem} \MakeUppercase ipsum

поэтому семантическая разметка не мешает изменению регистра. Если бы аргумент был расширен, этот экземпляр сломался бы, так как вы бы в конечном итоге получили

\textcolor{\MakeUppercase red}{\textbf{lorem}} \MakeUppercase ipsum

(На самом деле было бы сложнее, если бы это \textcolorбыло еще и расширено.)

Если аргумент начинается с управляющей последовательности, за которой не следует группа, то \capitalisewordsпредполагается, что это символьная или символьная команда (например, \aa), поэтому

\capitalisewords{\aa lorem ipsum}

становится

\MakeUppercase \aa lorem \MakeUppercase ipsum

Это то, что произошло в вашем примере, поэтому вы в итоге получили

\MakeUppercase\@fullname

Связанный контент