条件表达式

条件表达式

如何创建一个\if带有 1 个参数的命令,即#1

\if{#1=1}{symbol1}...{#1=n}{symboln}

当为symbol1时,返回,...,当为时,返回,当不是 时,不返回任何内容?#11symboln#1n#11,...,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使得整个事情对于特殊的用户输入更加健壮。

相关内容