我正在使用 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}
我得到了以下输出
然而,我期待的是
- 测试:描述
我做错了什么?此外,请注意
\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}
可以涵盖这两种情况。