私はクラスファイルでこれを宣言しました
\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