我有一个定义,例如\def\doctype{SomeString}
。 \doctype
可以采用五个值之一。我想在编程语言中执行类似 switch 语句的操作,即(伪代码):
switch (\doctype) {
case 'SomeString1': some text here
case 'SomeString2': some different text here
...
}
(我不需要默认/其他/其他情况。)我尝试在 LaTeX 中使用以下命令执行此操作:
\documentclass{article}
\usepackage{etoolbox}
\def\doctype{SomeString1}
\newenvironment{switchdoctype}[0]{%
\newcommand{\case}[2]{\ifdefequal{\doctype}{##1}{##2}{}}%
}{}
\begin{document}
\begin{switchdoctype}
\case{SomeString1}{some text here}
\case{SomeString2}{some different text here}
\end{switchdoctype}
\end{document}
这会出现错误:ERROR: Argument of \@secondoftwo has an extra }.
我认为这是使用时出现的某种问题\ifdefequal
。我该如何让它工作?我怀疑这是某种扩展技巧,但我对 [La]TeX 的了解有限,无法让它工作;我有兴趣从中学到一些东西。
这里是 MacTeX 2010,据我所知它基于 TeX Live 2010。谢谢!
PS:boolexpr 有一个\switch
,但我不能使用它,因为它与 etoolbox 严重冲突(据我所知,BibLaTeX 依赖于 etoolbox)。我已将此不兼容问题报告给 boolexpr 文档中列出的作者。
答案1
根据您的描述,我认为您想要\ifdefstring
,因为您需要将一个宏与一个宏的定义进行比较。\ifdefequal
用于测试两个宏是否等效。
答案2
仅供将来参考,expl3
具有良好的 switch/case语句结构:
\str_case:nnF {\doctype}
{
{SomeString1} {some~ text~ here}
{SomeString2} {some~ different~ text~ here}
}
{else~ clause}
还提供整数、维度和标记列表的变体;例如,
\int_case:nnF{2*5}{
{5}{Small}
{4+6}{Medium}
{-2*10}{Negative}
}{Other}
答案3
案例陈述也可以通过以下方式实现包裹xstring
:
\documentclass{article}
\usepackage{xstring}
\newcommand{\CheckCase}[1]{%
\par\noindent%
\IfEqCase*{#1}{%
{Some String 1}{matched case 1}%
{Some String 2}{matched case 2}%
{Some String 3}{matched case 3}%
{Some String 4}{matched case 4}%
{Some String 5}{matched case 5}%
}[Did not match any given case!!]%
}%
\begin{document}
\CheckCase{Some String 1}
\CheckCase{Some String 2}
\CheckCase{Some String 3}
\CheckCase{Some String 4}
\CheckCase{Some String 5}
\CheckCase{Some String 6}
\end{document}
答案4
和functional
包中你可以写这个(这是 Will Robertson 答案的重写):
\documentclass{article}
\usepackage{functional}
\begin{document}
\def\doctype{SomeString1}
\StrCaseF {\Value\doctype} {
{SomeString1} {\Result{Some Text}}
{SomeString2} {\Result{some Different Text}}
}{\Result{Other Text}}
\IntCaseF {2*5} {
{5} {\Result{Small}}
{4+6} {\Result{Medium}}
{-2*10} {\Result{Negative}}
}{\Result{Other}}
\end{document}