是否有可能
\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}