\ifthenelse + \equal 行为怪异

\ifthenelse + \equal 行为怪异

这是我的问题的一个简单例子:

% 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\echtlerechtler并且两者显然不同。

第二次尝试在 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>

相关内容