如何创建一个\if
带有 1 个参数的命令,即#1
,
\if{#1=1}{symbol1}...{#1=n}{symboln}
当为symbol1
时,返回,...,当为时,返回,当不是 时,不返回任何内容?#1
1
symboln
#1
n
#1
1,...,n
例如,我想使用命令
\if{#1=1}{\mapsto}{#1=2}{\mapsfrom}{#1=3}{\rightarrow}
当我定义一个更大的命令时。
答案1
对于简单的整数比较,TeX 提供\ifcase
:
\ifcase<integer>
% Case 0
\or
% Case 1
\or
...
\else
% Optional
\fi
因此你可以定义一个包装器,例如
\newcommand\myswitch[1]{%
\ifcase#1\relax
\ValueWasZero
\or
\ValueWasOne
\or
\ValueWasTwo
...
\else
\OtherCases
\fi
}
在这里,您从 0 情况开始向上工作:通常您会看到\ifcase#1\relax\or
根本没有 0 情况。您可以\or
根据需要使用任意数量的语句,具体取决于您需要多少个数字。是\else
可选的,如果您想要“否则执行此操作”功能,则可以使用。
顺便说一句,不要定义\if
:这是一个 TeX 原语,你可以不应该改变!
答案2
大多数情况下,按照约瑟夫赖特 (Joseph Wright) 的建议使用\ifcase
是最好的方法。
另一种可能对某些应用程序有益的方法是定义一组宏,这些宏的命名取决于数字。使用\csname ...\endcsname
或\@namedef
宏名称可以包含数字,或者可以使用 将这些数字转换为罗马数字\romannumeral
。然后\@nameuse
可以使用 来使用这些宏。该etoolbox
软件包还提供相同的用户级宏\csdef
和\csuse
。
\documentclass{article}
\makeatletter
\newcommand\defcase[1]{\@namedef{mycase@\the\numexpr#1\relax}}
\newcommand\myswitch[1]{\@nameuse{mycase@\the\numexpr#1\relax}}
\makeatother
% or alternatively:
\makeatletter
\newcommand\defcase[1]{\@namedef{mycase@\romannumeral#1}}
\newcommand\myswitch[1]{\@nameuse{mycase@\romannumeral#1}}
\makeatother
% Define cases:
\defcase{0}{code for case 0}
\defcase{1}{code for case 1}
\defcase{2}{code for case 2}
\defcase{3}{...}
\begin{document}
% Usage
\myswitch{1}
% \myswitch{some integer expression}
\end{document}
eTeX 原语的使用\numexpr
使得整个事情对于特殊的用户输入更加健壮。