我利用这个创建了我的 MWE问答。
梅威瑟:
\documentclass{article}
\usepackage{xifthen}% provides \isempty test
\newcommand{\GlobalDef}[1][]{ %
\ifthenelse{\isempty{#1}} %
{} %
{\xdef\GlobalDef{#1}}
} %
\begin{document}
This should be empty:\GlobalDef{}
\par
This should also be empty: \GlobalDef
This should say Argument: \GlobalDef{Argument}
\par
This should also say Argument: \GlobalDef
\end{document}
输出:
问题:
\xdef
\ifthenelse
在本声明中未注册为全局定义。\GlobalDef{Argument}
为什么这个输出的第三行之前有一个神秘的空格?
答案1
您的调用中的所有评估
\GlobalDef
都为空白,因为您定义了\GlobalDef
一个选修的参数。因此,对 的调用与和\GlobalDef
相同,它们都不使用可选参数。\GlobalDef{}
\GlobalDef{Argument}
第三次调用会插入一个额外的空格,因为虚假空间在您的定义中。如果您希望避免虚假空间,则必须策略性地放置
%
,如下所示:\newcommand{\GlobalDef}[1][]{% \ifthenelse{\isempty{#1}} {} {\xdef\GlobalDef{#1}}% }
您的\GlobalDef
宏被定义为通过\xdef
不打印其(可选)参数来替换自身。因此,无论如何您都不会真正看到任何输出。
但是,如果你的目标是检查空参数,请考虑在如何检查宏值是否为空或不会使用纯 TeX 条件创建文本?, 具体来说
\if\relax\detokenize{#1}\relax
<EMPTY>%
\else
<NON EMPTY>%
\fi