使用 etoolbox 的 \ifdefequal 进行 switch/case

使用 etoolbox 的 \ifdefequal 进行 switch/case

我有一个定义,例如\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}

相关内容