我需要一些帮助来理解 if 语句。
如何在 LaTeX 中制作以下伪代码。
\newcommand{\@leader}{}
\newcommand{\leader}[1]{\renewcommand\@leader{#1}}
\newcommand{\donow}{
\if \@leader == {} %aka blank, null, empty
this is the false %do false
\else
\@leader %do leader
\fi
}
例如,当用户将以下内容添加到他们的文档中时
\leader{
\begin{itemize}
\item this is an item
\item this is also an item
\end{itemize}
}
\donow
\leader{}
\donow
打印以下内容
*This is an item
*this is also an item
this is the false
关于变量,我唯一的疑问是,我的解决方案真的是创建变量的最佳方法吗?
答案1
您可以使用 来测试宏到宏\ifx
。也就是说,\ifx<csA><csB><true>\else<false>\fi
将测试 的定义是否与 的定义<csA>
相匹配<csB>
并执行<true>
,<false>
否则:
\documentclass{article}
\makeatletter
\newcommand{\@emptymacro}{}% Used to test against an empty macro
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}
\newcommand{\donow}{%
\ifx\@something\@emptymacro %aka blank, null, empty
this is the false %do false
\else
\@something %do something
\fi
}
\makeatother
\begin{document}
\something{%
\begin{itemize}
\item this is an item
\item this is also an item
\end{itemize}
}
\donow
\something{}
\donow
\end{document}
etoolbox
提供类似的检查机制:
\usepackage{etoolbox}
\makeatletter
\newcommand{\@something}{}
\newcommand{\something}[1]{\renewcommand\@something{#1}}
\newcommand{\donow}{%
\ifdefempty{\@something}{%aka blank, null, empty
this is the false %do false
}{%
\@something %do something
}%
}
\makeatother
答案2
给定任务的标准 TeX 代码是:
\def\something#1{\def\internal{#1}%
\ifx\internal\empty the parameter is empty.\else it is nonempty.\fi
}
这段代码(上面)的问题在于宏\something
不可扩展,因为它包含\def
赋值。如果您需要具有相同测试的可扩展宏,则需要选择从未用作参数中第一个标记的标记(例如?
在我们的示例中),您可以编写:
\def\something#1{\ifx?#1?the parameter is empty.\else it is nonempty.\fi}
如果您不知道哪个标记永远不会作为参数的第一个标记出现,那么您可以使用\detokenize
eTeX 的可扩展原语,例如:
\if\penalty\detokenize{#1}\penalty the parameter empty.\else non-empty.\fi