我有一个在宏中定义的值,例如:
\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}