假设我想定义一个命令,比如说,\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
您没有提到a
和b
应该是什么,所以我假设它们是字符串(可能是单位长度)。以下构造利用了包\ifthenelse
的宏ifthen
,应该适合您:
\newcommand{\tree}[2]{%
\ifthenelse{\equal{#1}{a}}{$\sqrt{#2}$}{%
\ifthenelse{\equal{#1}{b}}{"Hi."}{}}}
#1
请注意,您似乎没有指定如果不等于a
或应该做什么b
。因此,我将这种情况的结果设置为{}
。