我在类文件中声明了这个
\newcommand{\fullname}[1]{\gdef\@fullname{#1}}
和\fullname{john doe}
我正在尝试获取类文件的全名。\MakeUperrcase{\@fullname}
可以,但\capitalisewords
不行。我试过了
\capitalisewords\@fullname
和
\capitalisewords{\@fullname}
但输出总是
无名氏
代替
约翰·多伊
当我检查时\@fullname
,它打印
无名氏
答案1
\capitalisewords
没有扩展其论点,因此您需要先扩展论点,正如 David 在评论中所建议的那样:
\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