如何使用 `\ifthenelse` 和 `\equal` 测试命令的值?

如何使用 `\ifthenelse` 和 `\equal` 测试命令的值?

修改后的问题

(尝试遵循 David Carlisle 在评论中的建议。)

ifthenelse我想将一个字符串分配为命令的值,然后根据该字符串的值是否等于特定值来采取替代操作(通过)。

例子:

\documentclass{article}

 \newcommand{\thing}{whatever}

\usepackage{ifthen}
\ifthenelse{\equal{\thing}{\string whatever}}{%
  {\newcommand{\result}{thing is `whatever'.}}
  {\newcommand{\result}{thing is something else.}}%
}

\begin{document}

\result

\end{document}

我的测试出了什么问题\ifthenelse{\equal{\thing...?该命令\result从未赋值,因为 latex 运行会出现错误:

./whatever.tex:13: Undefined control sequence.
l.13     \result

根本目的

在实际项目中,该项目长度与书本相当,涉及由根文档中输入的数十个“辅助”文件组成的序言,\thing在根文档中定义了几个“样式”命令,例如,以便允许在整体文档设计的各个方面(例如,文本宽度、字体系列、标题样式)中选择替代方案。在这些“辅助”文件中,\ifthenelse对每个这样的“样式”命令进行了测试(而不是我的 MWE 中显示的简单的定义\result)。

因此,我只需改变根文档序言中的一个单词就可以改变这些样式参数,而不必深入到单个“辅助”文件中并在那里进行编辑。

原始问题

使用通用 TeX 包texapi— 或者其他方式 —(连同ifthen)我想“声明”一个字符串名称,为该名称分配一个字符串值,然后根据该值采取一些条件操作。

例如:

\documentclass{article}

\input{texapi.tex}
\newstring{thing}
% HOW assign a value here to the string `thing'?

\usepackage{ifthen}
\ifthenelse{\equal{thing}{\string whatever}}{%
  {\newcommand{\result}{``It's whatever.''}}
  {\newcommand{\result}{``It's something else.''}}%
}

\begin{document}

\result

\end{document}

这可能吗?如果可能,如何实现?

(我所研究过的包,即xstringstringstring,提供了许多用于操作和测试字符串的命令,但似乎没有用于分配字符串值的命令。)

答案1

代码不起作用,因为您使用了错误的语法\ifthenelse

请检查语法:

\documentclass{article}

\newcommand{\thing}{whatever}

\usepackage{ifthen}
\ifthenelse{\equal{\thing}{\string whatever}}
  {% True case
   \newcommand{\result}{thing is `whatever'.}%
  }
  {% false case
   \newcommand{\result}{thing is something else.}%
  }

\begin{document}

\result

\end{document}

这将打印

这是另外一回事。

因为\string会使w第二个参数中的不同于w第一个参数中的(扩展)\equal

删除\string将得到预期结果

这就是‘随便’。


你似乎正在使用

\ifthenelse{<test>}{{<code for true>}{<code for false>}}

但这不是正确的方法:

\ifthenelse{<test>}{<code for true>}{<code for false>}

是正确的语法。

在您的代码中,<code for false>\par(因为您错过了 的第三个参数\ifthenelse,所以 TeX 会选择\par由空白行生成的 )。由于测试返回 false,因此未定义任何内容。

另一方面,如果你删除\string,测试将返回 true,你最终会得到\result未定义的结果,因为你会执行 \newcommand说明,但都在一个组内。


对于更通用的方法:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\ifstringsequalTF}{mmmm}
 {
  \str_if_eq:eeTF { #1 } { #2 } { #3 } { #4 }
 }
\NewExpandableDocumentCommand{\stringcase}{mO{}m}
 {
  \str_case_e:nnF { #1 } { #3 } { #2 }
 }
\ExplSyntaxOff

\newcommand{\thing}{whatever}
\newcommand{\xyz}{xyz}
\newcommand{\noneoftheabove}{}

\ifstringsequalTF{\thing}{whatever}
  {\newcommand{\result}{thing is `whatever'.}}
  {\newcommand{\result}{thing is something else.}}

\begin{document}

\result

\stringcase{\thing}[OOPS]{
  {whatever}{found whatever}
  {xyz}{found xyz}
}

\stringcase{\xyz}[OOPS]{
  {whatever}{found whatever}
  {xyz}{found xyz}
}

\stringcase{\noneoftheabove}[OOPS]{
  {whatever}{found whatever}
  {xyz}{found xyz}
}

\end{document}

可以省略可选参数\stringcase,如果不匹配,则不会发生任何事情。

在此处输入图片描述

答案2

这里有一种方法:

\documentclass{article}

 \def\thing{whatever}

\usepackage{ifthen}
\ifthenelse{\equal{\thing}{whatever}}
{\newcommand{\result}{thing is `whatever'.}}
{\newcommand{\result}{thing is something else.}}

\begin{document}

\result

\end{document}

输出:

事物是‘无论什么’。

相关内容