我在处理一个需要“保护”的论点时遇到了麻烦(这个概念我并不完全理解‡),以避免出现错误。当我写
\command{\argument}
我得到一个错误;但是当我尝试通过编写来避免错误时
\command{\protect\argument}
我没有得到预期的输出。例如,使用凝固胶乳,我必须在崩溃或无法按预期格式化日期之间做出选择:
\documentclass[]{tufte-handout}
\usepackage[orig,american]{isodate}
\begin{document}
%\allcaps{\today} % ! Illegal parameter number in definition of \reserved@a.
\allcaps{\protect\today} % Fails to change case
\end{document}
‡这可能根本不是我的问题,但我猜它是问题的根源。
答案1
\protect
在这里没有意义。它阻止命令在写入文件或标题时展开。尝试例如此示例并查看 -filetoc
以查看差异:
\documentclass[]{article}
\begin{document}
\newcommand\test{abc}
\tableofcontents
\section{\test}
\section{\protect\test}
\end{document}
但您的问题不是 正在\today
移动到文件并且需要保护,以便 不会扩展。您的问题恰恰相反:该\allcaps
命令必须扩展其参数才能访问实际字符。但 isodate 重新定义了 ,\today
因此 不可扩展,因此您不能在 的参数中使用它\allcaps
。
另外:您可以构建自己的可扩展的\today
。例如:
\documentclass[]{tufte-handout}
\usepackage[orig,american]{isodate}
\begin{document}
\allcaps{\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or
December\fi\space \the\day, \the\year}
\end{document}
答案2
该包的isodate
定义\today
方式使其不适合在内部使用\MakeUppercase
,该包需要一串字符而不是一组打印它们的指令(例如,需要执行在其工作isodate
时未执行的任务) 。\MakeUppercase
因此,您的问题的答案是:“不,您绝对不能在的参数中使用\today
重新定义的”。isodate
\allcaps
如果不经过以相当低效的方式定义的\today
所有宏(这是真正的罪魁祸首),就没有合理的方法来访问生成的列表。isodate
\ifthenelse
但是如果您想要将“2012 年 3 月 21 日”形式的日期在需要时大写,则的内核版本\today
正是您要找的:不要加载isodate
,这就是答案。
答案3
一般来说你不能。
请参阅\newcommand 和 \section 错误 \protect
在不同的上下文中有不同的含义,但大多数情况下都与阻止扩展有关。但是,如果您有一个命令需要解析完全扩展的字符串,则阻止扩展并不是您想要的,但如果不受保护的命令不可扩展,那么您就无法始终获得想要的结果。
或者更确切地说,您可能能够获得想要的最终结果,但可能无法通过做任何可能被视为“不保护”的事情来获得。