是否可以向 \def 添加“或”条件?

是否可以向 \def 添加“或”条件?

是否有可能

\def\fiveorsix{5,6 OR 6,5}

以便进行以下工作:

\documentclass{standalone}

\def\fiveorsix{5,6 OR 6,5}

\makeatletter
\newcommand{\test}[1][]{
    \def\test@a{#1}
    \ifx\test@a\fiveorsix
        the optional argument is 5,6 or 6,5
    \else
        the optional argument is not 5,6 or 6,5
    \fi}
\makeatother

\begin{document}
\test[5,6]
\end{document}

(显然这不起作用)

或者有更好的方法来实现我的目标?

编辑:我必须更新 MnWE,因为第一个版本实际上太小了。

答案1

\documentclass{article}
\usepackage{expl3}[2013/07/24]
\ExplSyntaxOn
\newcommand{\test}[1][]{
  \str_case:nnTF {#1}
    {
      { 5,6 } { } % within those braces you could put code specific to the 5,6 case
      { 6,5 } { } % within those braces you could put code specific to the 6,5 case
    }
    { the~argument~is~5,6~or~6,5 }
    { the~argument~is~neither~5,6~nor~6,5 }
}
\ExplSyntaxOff
\begin{document}
\test[123]
\test[5,6]
\test[6,5]
\end{document}

考虑到您对问题的评论,似乎可选参数应该是一对用逗号分隔的项目。您可能需要考虑使用xparse's \SplitArgument,它可以在给定的分隔符处拆分参数,如果分隔符的数量不符合预期,则会报告错误。它还会删除每个项目周围的空格。

答案2

您可以使用etoolbox(需要e-TeX):

\documentclass{article}

\usepackage{etoolbox}

\newcommand{\test}[1][]{%
    \ifboolexpr{
        test{\ifstrequal{#1}{5,6}} or
        test{\ifstrequal{#1}{6,5}
        }
    }
    {the optional argument is 5,6 or 6,5}
    {the optional argument is not 5,6 or 6,5}}

\begin{document} 
\test[3,2]

\test[5,6]
\end{document}

结果是:

可选参数不是 5,6 或 6,5
可选参数是 5,6 或 6,5

您可以使用其他测试,例如\ifnumcomp。有关详细信息,请参阅 etoolbox手动的

答案3

不完全符合要求,但思路应该很清楚:

\documentclass{article}

\begin{document}

\def\fivesix#1{\ifcase#1 the  argument is not 5 or 6
\or the  argument is not 5 or 6
\or the  argument is not 5 or 6
\or the  argument is not 5 or 6
\or the  argument is not 5 or 6
\or the  argument IS 5 or 6
\or the  argument IS 5 or 6
\else  the  argument is not 5 or 6\fi}

\fivesix{1}

\fivesix{5}

\end{document}

答案4

考虑到您问的是定义而不是比较,您的问题的确切答案应该是这是不可能的(在 TeX 中)。宏扩展必须是唯一的。要实现这一点,您必须在定义中指定在什么情况下宏\fiveorsix应该扩展为“5,6”或“6,5”。

至于您询问测试宏参数是否扩展为“5,6”或“6,5”的替代方法 - 并且已经得到了一堆答案 - 我添加了这个通用解决方案以确保完整性:

\documentclass{article}

\def\fivsix{5,6}
\def\sixfiv{6,5}

\makeatletter
\newcommand{\test}[1][]{%
    \def\test@a{#1}
    \ifnum
      \ifx\test@a\fivsix 1\else\ifx\test@a\sixfiv 1\else 0\fi\fi
      =1
        the optional argument is 5,6 or 6,5
    \else
        the optional argument is not 5,6 and not 6,5
    \fi}
\makeatother

\begin{document}
\test[4,5]\par
\test[5,6]\par
\test[6,5]
\end{document}

条件

相关内容