![扩展为单独的字母或将宏结果的首字母大写](https://linux22.com/image/366302/%E6%89%A9%E5%B1%95%E4%B8%BA%E5%8D%95%E7%8B%AC%E7%9A%84%E5%AD%97%E6%AF%8D%E6%88%96%E5%B0%86%E5%AE%8F%E7%BB%93%E6%9E%9C%E7%9A%84%E9%A6%96%E5%AD%97%E6%AF%8D%E5%A4%A7%E5%86%99.png)
以下代码产生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
应用于\ifmale
token 而不是扩展字符串。因此需要进行另一次扩展,\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}