Я объявил это в файле класса
\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