我想测试一下一个字符串在转换成小写后是否等于给定的字符串。下面是我所讨论内容的 MWE:
\documentclass[a4paper,10pt]{report}
\usepackage[francais]{babel}
\begin{document}
\def\planeone{AirForce1}
\def\planetwo{airforce1}
\edef\planethree{\lowercase{\planeone}}
\planetwo{ and }\planethree{ are }
\ifx\planetwo\planethree{the same}\else{not the same}\fi.
\end{document}
当然,当我测试时\meaning\planetwo
,\meaning\planethree
我可以看到这两个命令并不相同,但我只是想测试它们扩展为什么。
\expandafter
我到处尝试了一些,但都没有成功。
答案1
\lowercase
不可扩展,因此你所做的与
\def\planethree{\lowercase{AirForce1}}
因此\planethree
与 不同\planetwo
。
你可以做
\lowercase\expandafter{\expandafter\def\expandafter\planethree\expandafter{\planeone}}
但对于更复杂的情况,可以采用不同的策略:
\begingroup\edef\x{%
\lowercase{\endgroup
\def\noexpand\planethree{\planeone}}}%
\x
\lowercase
使用此代码,您可以延迟替换文本\planethree
已完全扩展时的应用。
让我们看看它是如何工作的。
仅用于
\begingroup
设置临时值\x
我们
\edef
宏\x
,所以\planeone
将完全扩展,但\lowercase
,\def
和\planethree
保持不变之后
\edef
,替换文本\x
将是\lowercase{\endgroup\def\planethree{Airforce1}}
执行
\x
将\lowercase
改变字母的大小写这次手术后,
\endgroup\def\planethree{airforce1}
放回主输入流,因此以 开始的组
\begingroup
结束并执行定义。