我在测试参数是否为空时遇到了问题。以下示例代码应该返回“正确”,但实际上却没有。
例子:
\documentclass{article}
\newcommand{\ifxnotworking}[1]{
\if #1{}
correct
\else
false
\fi}
\begin{document}
\ifxnotworking{}
\end{document}
比较{}{}
或与 的\empty
结果相同。据我所知,这种情况只发生在空字符串中。有人知道原因吗?什么是正确的解决方案?
答案1
\if\relax\detokenize{#1}\relax
据我所知,检查空参数的最强大方法是(最有可能的是 egreg 出现并给出更详细的答案)。
因此,检查是否为空的强大命令是:
\documentclass[]{article}
\makeatletter
\newcommand{\myifempty}[1]{%
\if\relax\detokenize{#1}\relax%
\expandafter\@firstoftwo%
\else%
\expandafter\@secondoftwo%
\fi}
\makeatother
\begin{document}
\noindent
\myifempty{foo}{empty}{not empty}\\% yields "not empty"
\myifempty{}{empty}{not empty}% yields "empty"
\end{document}
答案2
有更好的方法可以做到这一点,但让我解释一下出了什么问题。
当你调用 时\ifxnotworking{}
,TeX 将#1
用空值替换(括号被从无界参数中剥离),因此输入流将具有
•\if {}•correct•\else false•\fi
(其中•
代表空格标记)。现在\if
比较以下两个不可扩展的标记(在执行完全扩展之后,直到找到其中两个,但这里没有可扩展的标记):两个不可扩展的标记是{
和 ,}
它们具有不同的字符代码,因此测试返回 false。
注意\if
比较字符代码。