如何使用 TeX 条件检查某个值是否不相等?

如何使用 TeX 条件检查某个值是否不相等?

我有一个在宏中定义的值,例如:

\mymacro{apple}

我需要检查一个值是否不等于一个字符串,例如:

IF #1 NOT EQUAL TO "apple" THEN
    PRINT "It is not a apple, it is #1."
FI

我曾尝试使用这个,但它不起作用:

\ifx#1="apple"
\else
    It is not a apple, it is #1.
\fi

我也尝试过使用这个,但它也不起作用:

\startlua
    if #1 ~= "apple" then
        context("It is not a apple, it is #1.")
    end
\stoplua
  • 该宏可以设置为任意值。
  • 如果里面出现除“apple”之外的任何内容,包括不会产生输出的 TeX 命令,它仍应被视为负面结果。

如何创建一个简单的 TeX 或 Lua 条件来检查值是否不相等?

答案1

ConTeXt 提供了一系列\doif...宏来执行字符串比较。请参阅ConTeXt 维基了解详情。例如,如果你想检查是否#1与先前定义的宏相同\fakeapple,那么你可以使用:

\def\checkapple#1%
    {\doifnot\fakeapple{#1}
       {It is not an apple, it is #1}}

答案2

你可以定义一个命令来扩展为“apple”,另一个命令来扩展为你想要测试的任何内容,然后使用\ifx。这里有一个演示这一点的 latex 文件:

\documentclass{article}

\begin{document}

\def\appleref{apple}
\def\testit#1{%
  \def\temp{#1}%
  \ifx\temp\appleref
    Yes, it's apple.
  \else
    No, it's #1.
  \fi
}


apple: \testit{apple}

pear: \testit{pear}

\def\fakeapple{apple}

fakeapple: \testit{\fakeapple}

\end{document}

编辑:tohecz 在评论中指出,如果你更改\def\temp{#1}\edef\temp{#1},那么\fakeapple(这是一个扩展为“apple”的宏)将测试为等于“apple”。

答案3

在 pdfTeX 下,你可以使用 进行字符串比较\pdfstrcmp{<strA>}{<strB>}。从pdfTeX 用户手册

\pdfstrcmp{<general text>}{<general text>}(可扩展)

0此命令比较两个字符串,如果字符串相等,则扩展为;-1 如果第一个字符串排在第二个字符串之前,则扩展为;1否则,扩展为。此原语是在 pdfTEX 1.30.0 中引入的。

在此处输入图片描述

\documentclass{article}

\begin{document}

\def\appleref{apple}
\def\testit#1{%
  \ifnum\pdfstrcmp{#1}{apple}=0
    Yes, it's apple.
  \else
    No, it's #1.
  \fi
}

apple: \testit{apple}

pear: \testit{pear}

\def\fakeapple{apple}

fakeapple: \testit{\fakeapple}

\end{document}

相关内容