(该问题与 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}