Eu declarei isso no arquivo de classe
\newcommand{\fullname}[1]{\gdef\@fullname{#1}}
Com\fullname{john doe}
Estou tentando obter o nome completo no arquivo de classe. As \MakeUperrcase{\@fullname}
obras, mas as \capitalisewords
não. eu tentei
\capitalisewords\@fullname
e
\capitalisewords{\@fullname}
Mas a saída é sempre
JOÃO DOE
em vez de
John Doe
Quando eu verifiquei o \@fullname
, ele imprime
Joãozinho
Responder1
\capitalisewords
não expande seu argumento, então você precisa expandi-lo primeiro, como David sugeriu nos comentários:
\expandafter\capitalisewords\expandafter{\@fullname}
ou use o comando de atalho \xcapitalisewords
que faz a mesma coisa:
\xcapitalisewords{\@fullname}
A razão pela qual o argumento não é expandido automaticamente é porque o mecanismo de colocação da primeira letra em maiúscula permite a marcação semântica que utiliza um único argumento. Por exemplo:
\newcommand*{\strong}[1]{\textcolor{red}{\textbf{#1}}}
\capitalisewords{\strong{lorem} ipsum}
Isto se torna efetivamente
\strong{\MakeUppercase lorem} \MakeUppercase ipsum
portanto, a marcação semântica não interfere na mudança de caso. Se o argumento fosse expandido, esta instância seria interrompida e você acabaria com
\textcolor{\MakeUppercase red}{\textbf{lorem}} \MakeUppercase ipsum
(Na verdade, seria mais complicado do que isso se \textcolor
também fosse expandido.)
Se o argumento começar com uma sequência de controle que não é seguida por um grupo, então \capitalisewords
assume que é um comando de caractere ou símbolo (como \aa
), então
\capitalisewords{\aa lorem ipsum}
torna-se
\MakeUppercase \aa lorem \MakeUppercase ipsum
Isto é o que aconteceu no seu exemplo, e é por isso que você acaba com
\MakeUppercase\@fullname