\ifthenelse 作为 \equal 的参数

\ifthenelse 作为 \equal 的参数

在此示例中:

\documentclass{article}
\usepackage{ifthen}

\newcommand{\objtitle}[1]{%                                                                                                                   
\ifthenelse{\equal{#1}{a}}{avalue}{}%                                                                                                         
\ifthenelse{\equal{#1}{b}}{bvalue}{}%                                                                                                         
}

\newcommand{\counterpart}[1]{%                                                                                                                
\ifthenelse{\equal{#1}{a}}{b}{}%                                                                                                              
\ifthenelse{\equal{#1}{b}}{a}{}%                                                                                                              
}
\begin{document}
\counterpart{a}
\objtitle{a}
\objtitle{\counterpart{a}}
\end{document}

\counterpart{a}\objtitle{a}单独工作但\objtitle{\counterpart{a}}产生错误:

! Argument of \equal has an extra }.
<inserted text> 
                \par 
l.17 \objtitle{\counterpart{a}}

使用\objtitle{\protect\counterpart{a}}消除错误消息但不产生输出。

问题是什么?如何解决?

答案1

\ifthenelse 不能不能嵌套使用。没办法。抱歉,这是不可能的。

如果要进行可嵌套的大小写切换,则需要使用更高级的工具。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\caseswitch}{O{}mm}
 {
  \str_case_e:nnF { #2 } { #3 } { #1 }
 }
\ExplSyntaxOff

\newcommand{\objtitle}[1]{%
  \caseswitch{#1}{
   {a}{avalue}
   {b}{bvalue}
  }%
}

\newcommand{\counterpart}[1]{%
  \caseswitch{#1}{
    {a}{b}
    {b}{a}
  }%
}

\begin{document}

\counterpart{a}

\objtitle{a}

\objtitle{\counterpart{a}}

\end{document}

您还可以\caseswitch使用可选参数进行调用;因此

\caseswitch[none of the above]{#1}{
   {a}{avalue}
   {b}{bvalue}
  }

#1如果既不是a也不是,则返回“以上都不是” b。如果没有可选参数,则不匹配将不返回任何内容。

案件的数量是任意的。

相关内容