梅威瑟:

梅威瑟:

我利用这个创建了我的 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}

输出:

输出

问题:

  1. \xdef\ifthenelse在本声明中未注册为全局定义。
  2. \GlobalDef{Argument}为什么这个输出的第三行之前有一个神秘的空格?

答案1

  1. 您的调用中的所有评估\GlobalDef都为空白,因为您定义了\GlobalDef一个选修的参数。因此,对 的调用与和\GlobalDef相同,它们都不使用可选参数。\GlobalDef{}\GlobalDef{Argument}

  2. 第三次调用会插入一个额外的空格,因为虚假空间在您的定义中。如果您希望避免虚假空间,则必须策略性地放置%,如下所示:

    \newcommand{\GlobalDef}[1][]{%
      \ifthenelse{\isempty{#1}}
        {}
        {\xdef\GlobalDef{#1}}%
    }
    

您的\GlobalDef宏被定义为通过\xdef不打印其(可选)参数来替换自身。因此,无论如何您都不会真正看到任何输出。

但是,如果你的目标是检查空参数,请考虑在如何检查宏值是否为空或不会使用纯 TeX 条件创建文本?, 具体来说

\if\relax\detokenize{#1}\relax
  <EMPTY>%
\else
  <NON EMPTY>%
\fi

相关内容