修改后的问题
(尝试遵循 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}
这可能吗?如果可能,如何实现?
(我所研究过的包,即xstring
和stringstring
,提供了许多用于操作和测试字符串的命令,但似乎没有用于分配字符串值的命令。)
答案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}
输出:
事物是‘无论什么’。