如何正确使用 \expandafter?(真实示例:\uppercase)

如何正确使用 \expandafter?(真实示例:\uppercase)

(该问题与 LaTeX 3 无关)。

https://www.alanshawn.com/latex3-tutorial/,我读了这段代码:

\newcommand{\cmda}{abcd}
\uppercase{abcd\cmda}

这给出“ABCDabcd”。

目标是得到“ABCDABCD” \uppercase

作者说(没有解决方案)使用\expandafter将得到预期的“ABCDABCD”。我搜索了https://en.wikibooks.org/wiki/TeX/expandafter, 然后https://tug.org/TUGboat/Articles/tb09-1/tb20bechtolsheim.pdf,并且https://www.overleaf.com/learn/latex/Articles/A_six-part_article_series_on_%5Cexpandafter%2C_TeX_tokens_and_expansion

为了避免混淆,我稍微改变了一下例子。

我首先要说的是:

\newcommand{\cmda}{abcd}
\uppercase{efgh\cmda}

并将获得“EFGHABCD”。

我尝试了很多组合但都没有任何效果(我知道这不是好方法,但在绝望的情况下该怎么办?)。

我也在寻找解决方案https://ctan.org/pkg/apprendre-a-programmer-en-tex\expandafter在第 103 页及以后处理)。

\expandafter\uppercase\expandafter{efgh\cmda}

不起作用(给出“EFGHabcd”)。

如果我不那么雄心勃勃,而只尝试使用“e \ cmda”,则此代码有效:

\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\uppercase\expandafter\expandafter{\expandafter\expandafter\expandafter e\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\cmda}

\uppercase并给出:“EABCD”。也许使用较少的“\expandafter”也可以。无论如何,答案似乎取决于)参数中“\cmda”之前的字符数

如果是这样,\expandafter 可能不是大写“\cmda”的好解决方案。

\uppercase回答 的参数中带有“e\cmda” 、然后是 的参数中带有“efgh\cmda”、然后是 的参数中带有“\cmda”的问题的方法是什么?

我对低级 LaTeX 还很陌生,这个问题更多的是好奇,而不是真正的问题。

答案1

那个工程

\uppercase\expandafter{<tokens>}

只会尝试扩展之后的第一个标记,{并且对于你的情况它不会触及\cmda。因此

\uppercase\expandafter{abcd\cmda}

效果和

\uppercase{abcd\cmda}

由于 TeX 仅将显式字符标记大写(使用表格\uccode),因此最终会得到

ABCDabcd

\expandafter在 前面添加\uppercase没有任何新作用(\uppercase执行宏扩展直到找到{)。

您可以使用“完整”扩展(而不是tex没有\expanded

\uppercase\expandafter{\expanded{abcd\cmda}}

否则你就得求助于

\uppercase\expandafter{\expandafter a\expandafter b\expandafter c\expandafter d\cmda}

相关内容