我如何“取消保护”一个论点?

我如何“取消保护”一个论点?

我在处理一个需要“保护”的论点时遇到了麻烦(这个概念我并不完全理解),以避免出现错误。当我写

\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在不同的上下文中有不同的含义,但大多数情况下都与阻止扩展有关。但是,如果您有一个命令需要解析完全扩展的字符串,则阻止扩展并不是您想要的,但如果不受保护的命令不可扩展,那么您就无法始终获得想要的结果。

或者更确切地说,您可能能够获得想要的最终结果,但可能无法通过做任何可能被视为“不保护”的事情来获得。

相关内容