如何在宏中创建“条件”?

如何在宏中创建“条件”?

我想制作一个带有两个参数的宏,该宏返回一个文本。例如,我想\M{1}{5}返回[1,5],并\M{2}{2}返回[2](因为两个参数相同)。所以我需要在宏中有一个“检查”或条件来查看两个参数是否相同并执行不同的执行...如何在宏中实现这个“if”?

答案1

为了完成这份清单,我想介绍一下etoolbox. 如果您正在加载biblatex包裹etoolbox将自动加载。

\documentclass{article}
\usepackage{etoolbox}% 
\newcommand{\M}[2]{%
  \ifstrequal{#1}{#2}%
    {[#1]}% #1 = #2 -> [#1]
    {[#1,#2]}% [#1,#2]
}
\begin{document}
Here is \M{2}{3}. Also, \M{2}{2} and \M{5}{1}.
\end{document}

答案2

如果这些都是数字,那么你可以\Mnum使用\Mall

\documentclass{article}
\def\Mnum#1#2{[\ifnum#1=#2\relax #1\else#1,#2\fi]}

\def\Mall#1#2{[\def\tempA{#1}\def\tempB{#2}\ifx\tempA\tempB#1\else#1,#2\fi]}

\begin{document}

\Mnum{1}{5} \Mnum{2}{2}

\Mall{1}{5} \Mall{2}{2}
\end{document}

答案3

使用更上层的方法,xifthen包裹提供各种条件宏。阅读包装文档了解更多信息。对于你的情况,你可以使用

\documentclass{article}
\usepackage{xifthen}% http://ctan.org/pkg/xifthen
\newcommand{\M}[2]{%
  \ifthenelse{\equal{#1}{#2}}%
    {[#1]}% #1 = #2 -> [#1]
    {[#1,#2]}% [#1,#2]
}
\begin{document}
Here is \M{2}{3}. Also, \M{2}{2} and \M{5}{1}.
\end{document}

条件宏的使用

一般来说,定义单字母宏/控制序列时应小心谨慎,因为 (La)TeX 定义了许多用于常规格式的宏/控制序列(例如,\bbar 和\ccedilla,仅举几例)。

答案4

functional包中你可以这样写:

\documentclass{article}

\usepackage{functional} 
\newcommand\M[2]{%
  \StrIfEqTF{#1}{#2}{\Result{[#1]}}{\Result{[#1,#2]}}%
}

\begin{document}

Here is \M{2}{3}. Also, \M{2}{2} and \M{5}{1}.

\end{document}

相关内容