\ifx 比较空参数不起作用?

\ifx 比较空参数不起作用?

我在测试参数是否为空时遇到了问题。以下示例代码应该返回“正确”,但实际上却没有。

例子:

\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比较字符代码

相关内容