这是我的问题的一个简单例子:
% test.tex
\documentclass{article}
\usepackage{ifthen}
\begin{document}
\ifthenelse{\equal{\string\jobname}{test}} {TRUE} {FALSE}
\ifthenelse{\equal{test}{test}} {TRUE} {FALSE}
\typeout{.\jobname.}
\end{document}
当我运行 时pdflatex test.tex
,生成的 PDF 包含“FALSE TRUE”。在命令行上,我看到.test.
,因此\jobname
确实应该是“test”,但比较仍然失败。
我忽略了一些东西,但我不明白。注意:当我不使用时也会失败\string
...
答案1
这里有两种问题,实际上是三种。请考虑以下文档echtler.tex
。
\documentclass{article}
\usepackage{ifthen}
\begin{document}
\textbf{jobname}
\ifthenelse{\equal{\string\jobname}{echtler}} {TRUE} {FALSE}
\ifthenelse{\equal{\jobname}{echtler}} {TRUE} {FALSE}
\ifthenelse{\equal{\jobname}{\detokenize{echtler}}} {TRUE} {FALSE}
\ifthenelse{\equal{echtler}{echtler}} {TRUE} {FALSE}
\bigskip
\textbf{macro}
\newcommand{\echtler}{echtler}
\ifthenelse{\equal{\string\echtler}{echtler}} {TRUE} {FALSE}
\ifthenelse{\equal{\echtler}{echtler}} {TRUE} {FALSE}
\ifthenelse{\equal{\echtler}{\detokenize{echtler}}} {TRUE} {FALSE}
\ifthenelse{\equal{echtler}{echtler}} {TRUE} {FALSE}
\end{document}
如您所见,第一次尝试,使用\string
,在每种情况下都返回 false。事实上,它比较了人物(不是命令)\jobname
或\echtler
与echtler
并且两者显然不同。
第二次尝试在 jobname 情况下返回 false,在 macro 情况下返回 true。这是因为 的扩展\jobname
确实是echtler
,但带有“字符串化字符”(技术上,类别代码为 12,而不是标准代码 11)。
在第三次尝试中,比较字符串是“去标记化的”,即将字符转换为“字符串化形式”的操作,因此 jobname 案例成功而宏案例失败。
如何获得一个可以独立运行的比较测试?
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\stringsequalTF}{mmmm}
{
\str_if_eq:eeTF { #1 } { #2 } { #3 } { #4 }
}
\ExplSyntaxOff
\begin{document}
\newcommand{\echtler}{echtler}
\stringsequalTF{\jobname}{echtler} {TRUE} {FALSE}
\stringsequalTF{\echtler}{echtler} {TRUE} {FALSE}
\stringsequalTF{echtler}{echtler} {TRUE} {FALSE}
\end{document}
答案2
测试\equal{\string\jobname}{test}
永远不会产生你想要的结果。如果你想比较一下,看看是否最好使用类似
\ifnum\pdfstrcmp{\jobname}{test}=0
TRUE%
\else
FALSE%
\fi
其中提供了和\pdfstrcmp{<strA>}{<strB>}
之间的可扩展文本比较。 如果它们相同,则结果(一个数字)等于 0,如果按字典顺序小于,则结果为 -1,否则为 +1。<strA>
<strB>
<strA>
<strB>