如何撤消 \def(即需要 \undef 功能)

如何撤消 \def(即需要 \undef 功能)

我以为撤销 a 的方法\def是将其定义为\relax,但这似乎行不通。此外,我不确定为什么当我尝试使用\def而不是\let来执行 undef 时不会产生任何输出。

\documentclass{article}

\begin{document}

\def\CaseA{}%

\ifdefined\CaseA%
    \def\ProcessCaseA{}%
    % Do stuff that uses \ProcessCaseA
    %\def\ProcessCaseA\relax% no output if use this, and comment next line
    \let\ProcessCaseA\relax% no output if comment this, and use above line
\fi

% Now do stuff that requires \ProcessCaseA NOT be defined
\ifdefined\ProcessCaseA
    ERROR: \textbackslash ProcessCaseA is still defined
\else
    SUCCESS: \textbackslash ProcessCaseA is not defined
\fi

\end{document}

答案1

该宏\ifdefined不是基本 TeX 的一部分,因此我假设您是从 eTeX 获得它的。在这种情况下,您应该考虑使用包etoolbox,它提供了一些包装函数\ifdef{\macro}{true}{false}和。etoolbox 手册告诉我后者具有将宏注册为“未定义”\ifundef{\macro}{true}{false}的便捷效果,这听起来就像您想要的。\let\relax

或者,根据具体情况,如果您确实希望从 TeX 内存中删除宏,您可以在组中定义它,然后离开该组。请注意,这与将\let其添加到完全不同\relax,因为如果 TeX 试图在它被'd 或\macro之前读取它,它会引发错误,而如果您已经写入,它就不会执行任何操作。\def\let\let\macro=\relax

答案2

你需要让它未定义,而不是放松,试试这个

\providecommand*\@nameundef[1]{%
  \expandafter\let\csname #1\endcsname\@undefined}

请参阅下面 Ulrich 的评论以了解一些注意事项。

答案3

就测试而言,该赋值\let\xyz\relax使结果为\xyz“未定义” \@ifundefined。因此

\makeatletter
\let\xyz\relax
\@ifundefined{xyz}{LaTeX undefined}{LaTeX defined}\par
\ifdefined\xyz e-TeX defined\else e-TeX undefined\fi\par
\ifcsname xyz\endcsname e-TeX defined\else e-TeX undefined\fi\par

将打印

LaTeX 未定义
e-TeX 定义
e-TeX 定义

\undef“取消定义”命令的唯一安全方法是在组内定义它:在它结束时,定义将消失。电子工具箱这依赖于这样一个事实:特定的控制序列(\etb@undefined)永远不会被任何人定义。

\@ifundefined在和测试之间进行选择\ifdefined是一个方便的问题,主要取决于你需要什么。请注意,的参数\@ifundefined是宏的姓名,不带反斜杠。

相关内容