带有案例/条件/“如果...那么”的新命令

带有案例/条件/“如果...那么”的新命令

假设我想定义一个命令,比如说,\tree有两个参数。我想\tree根据我的第一个参数执行不同的操作。例如,

如果#1= a,则返回$\sqrt{#2}$

如果#1= b,则返回“Hi”

是否可以实现上述伪代码?如果可以,我该怎么做?

答案1

您还可以\IfEqCase使用包裹xstring可以轻松扩展以添加更多案例:

在此处输入图片描述

笔记:

  • 除了能够轻松扩展到更多情况之外,这还有一个好处,即\PackageError如果传入未知选项,它将产生一个。

代码:

\documentclass{article}
\usepackage{xstring}

\newcommand{\tree}[2]{%
    \IfEqCase{#1}{%
        {a}{$\sqrt{#2}$}%
        {b}{Hi}%
        % you can add more cases here as desired
    }[\PackageError{tree}{Undefined option to tree: #1}{}]%
}%
\begin{document}
\tree{a}{4}

\tree{b}{4}

%\tree{c}{4}
\end{document}

答案2

ifthen然后打包

  \newcommand\tree[2]{\ifthenelse{\equal{#1}{a}}{$\sqrt{#2}$}{Hi}}

实际上我误读了你的病情所以我想完整版本是

 \newcommand\tree[2]{\ifthenelse{\equal{#1}{a}}%
                     {$\sqrt{#2}$}{\ifthenelse{\equal{#1}{b}}{Hi}{zzz}}}

我认为到目前为止给出的所有答案(包括我上面的答案)都不是可扩展这意味着您无法在类似的地方进行测试\write,或者\edef参见\typeout下文。鉴于您的\sqrt示例,这可能无关紧要,但以下是使用可扩展测试几乎肯定是迄今为止发布的最快的版本,尽管在命令名称使用方面相当昂贵。

\documentclass{article}

\makeatletter
\@namedef{tree@a}#1{$\sqrt{#1}$}
\@namedef{tree@b}#1{h1}
\def\tree#1{\expandafter\ifx\csname tree@#1\endcsname\relax
\expandafter\@gobble\else
\csname tree@#1\expandafter\endcsname
\fi}

\makeatother


\begin{document}
\tree{a}{2}

\typeout{[[[\tree{b}{2}]]]}

\tree{b}{xyz}

\tree{x}{Uh!}

\end{document}

答案3

最简单的实现方法是expl3

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\tree}{ m m }
 {
  \seaton_tree:nn { #1 } { #2 }
 }
\cs_new:Npn \seaton_tree:nn #1 #2
 {
  \str_case:nnF { #1 }
   {
    { a } { $\sqrt{ #2 }$ }
    { b } { Hi }
    % other possible strings
   }
   {
    I~don't~know~what~to~do~with~`#1'
   }
 }
\ExplSyntaxOff

\begin{document}
\tree{a}{2}

\tree{b}{xyz}

\tree{x}{Uh!}

\end{document}

可接受字符串的列表可以任意长。

答案4

您没有提到ab应该是什么,所以我假设它们是字符串(可能是单位长度)。以下构造利用了包\ifthenelse的宏ifthen,应该适合您:

\newcommand{\tree}[2]{%
    \ifthenelse{\equal{#1}{a}}{$\sqrt{#2}$}{%
    \ifthenelse{\equal{#1}{b}}{"Hi."}{}}}

#1请注意,您似乎没有指定如果不等于a或应该做什么b。因此,我将这种情况的结果设置为{}

相关内容