使用 \ifdefempty 输出错误

使用 \ifdefempty 输出错误

我正在使用 TeX 3.1415926 (TeX Live 2013),当我执行

\documentclass{article}    
\usepackage{etoolbox}

% contents 
\newcommand{\contentdesc}[2]{\item \ifdefempty{#2}{\textbf{#1}}{\textbf{#1}: #2}}

\begin{document}    
\begin{enumerate} 
  \contentdesc{test}{description} 
\end{enumerate}        
\end{document}

我得到了以下输出

在此处输入图片描述

然而,我期待的是

  1. 测试:描述

我做错了什么?此外,请注意

\contentdesc{test}{}% this gives an weird error

! 额外 \else。\ifundef ... \expandafter \@secondoftwo \fi \else \expandafter \@firstoftwo ...

答案1

该命令\ifdefempty需要单身的token(应该是宏)作为其第一个参数。让我们看看\ifdefempty{description}在看到相关定义之后会发生什么(这就是您要做的事情):

% etoolbox.sty, line 252:
\newcommand{\ifdefempty}[1]{%
  \ifundef{#1}
    {\@secondoftwo}
    {\ifdefmacro{#1}
       {\ifdefparam{#1}
      {\@secondoftwo}
      {\etb@ifdefempty{#1}}}
       {\@secondoftwo}}}

% etoolbox.sty, line 122:
\newcommand{\ifundef}[1]{%
  \ifdefined#1%
    \ifx#1\relax
      \expandafter\expandafter
      \expandafter\@firstoftwo
    \else
      \expandafter\expandafter
      \expandafter\@secondoftwo
    \fi
  \else
    \expandafter\@firstoftwo
  \fi}

因此\ifundef{description}求值,结果为

\ifdefined description<...>

\ifdefined只检查一个标记,在这种情况下,该标记已定义d并报告已定义;escription已成为“真实”分支的一部分,这解释了您获得的奇怪输出。

如果您想要区分第二个参数是否为\contentdesc空,则\ifstrempty应该使用。

如果参数可以是可以扩展为空或不扩展为空的宏,那么

\expandafter\ifstrempty\expandafter{#1}{True}{False}

可以涵盖这两种情况。

相关内容