
Возможно ли что-то вроде
\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}