我以为撤销 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
是宏的姓名,不带反斜杠。