![如何在宏中创建“条件”?](https://linux22.com/image/240243/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%AE%8F%E4%B8%AD%E5%88%9B%E5%BB%BA%E2%80%9C%E6%9D%A1%E4%BB%B6%E2%80%9D%EF%BC%9F.png)
我想制作一个带有两个参数的宏,该宏返回一个文本。例如,我想\M{1}{5}
返回[1,5]
,并\M{2}{2}
返回[2]
(因为两个参数相同)。所以我需要在宏中有一个“检查”或条件来查看两个参数是否相同并执行不同的执行...如何在宏中实现这个“if”?
答案1
答案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 定义了许多用于常规格式的宏/控制序列(例如,\b
bar 和\c
cedilla,仅举几例)。
答案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}