扩展为单独的字母或将宏结果的首字母大写

扩展为单独的字母或将宏结果的首字母大写

以下代码产生Die Patientin ist nicht die Patientin.我想将第二个die也大写。

使用时\edef整个\p@tcnom参数都大写,而不仅仅是第一个字母大写。

这与这个问题因为\p@tctst已经解决了这个问题。所以它是相似的,但是是另一个间接层。;)

有哪位 TeX 专家能解释一下这个问题吗?

\documentclass{article}

\def\ucletter{\expandafter\makeupcase}
\def\makeupcase#1{\uppercase{#1}}
\newif\ifmale

\makeatletter
\def\p@tctst{die Patientin}
\def\p@tcnom{\ifmale{der Patient}\else{die Patientin}\fi}
\def\mytesti#1{\ucletter\p@tctst}
\def\pattest#1{\ucletter\p@tcnom}
\makeatother

\begin{document}

\mytesti{void} ist nicht \pattest{void}.

\end{document}

答案1

如果您\tracingmacros=1在使用之前添加\pattest,您将在日志文件中看到实际发生的情况。我的显示如下:

\pattest #1->\ucletter \p@tcnom 
#1<-void

\ucletter ->\expandafter \makeupcase 

\p@tcnom ->\ifmale der Patient\else die Patientin\fi 

\makeupcase #1->\uppercase {#1}
#1<-\ifmale 

...

这意味着\makeupcase应用于\ifmaletoken 而不是扩展字符串。因此需要进行另一次扩展,\expandafter之前的操作\ucletter会有所帮助。

另一个问题与括号有关。当您用 替换\pattest定义时,\def\pattest#1{\expandafter\ucletter\p@tcnom}您将得到以下内容(在日志中再次出现):

\pattest #1->\expandafter \ucletter \p@tcnom 
#1<-void

\p@tcnom ->\ifmale {der Patient}\else {die Patientin}\fi 

\ucletter ->\expandafter \makeupcase 

\makeupcase #1->\uppercase {#1}
#1<-die Patientin

...

因此,括号将字母分组,并使整个单词成为 的参数\makeupcase。这就是所有字母切换大小写的原因。您必须删除括号。

另外,我不太明白为什么要用\pattest一个被丢弃的参数来定义,但这与这里的问题无关。

以下代码是对 MWE 的最小修改,它仅使首字母大写即可产生正确的输出:

\documentclass{article}

\def\ucletter{\expandafter\makeupcase}
\def\makeupcase#1{\uppercase{#1}}
\newif\ifmale

\makeatletter
\def\p@tctst{die Patientin}
\def\p@tcnom{\ifmale der Patient\else die Patientin\fi}
\def\mytesti#1{\ucletter\p@tctst}
\def\pattest#1{\expandafter\ucletter\p@tcnom}
\makeatother

\begin{document}

\mytesti{void} ist nicht \pattest{void}.

\end{document}

相关内容