
Может быть, кто-нибудь подскажет, как определить новую команду в \LaTeX, которая может принимать одно обязательное значение и другое необязательное значение (параметр) в качестве входных данных. В этом случае в зависимости от значения необязательного аргумента должен меняться тип выходного объекта.
Конкретно в моем случае мне нужно указать команду \dependSet(<arg>, <opt par>)
для рисования скобок. В этом случае в зависимости от наличия/отсутствия необязательного аргумента должен меняться вывод (наличие/отсутствие вертикальной линии внутри):
Соответственно, для удобства использования важно, чтобы параметр располагался после аргументов команды и выделялся фигурными скобками, а не квадратными.
P.S.:На самом деле жаль, что LaTex использует довольно неудобную нотацию (которая чем-то напоминает ALGOL 60) и не делает ничего, чтобы сделать возможным определение новых команд в стиле Python.
решение1
Предположим, вы не хотите вводить текст (x,y)
или (x,y\mid a)
по каким-то причинам. И есть веские причины не делать этого: например, вы можете захотеть или вам может потребоваться изменить нотацию. Жесткий ввод сильно усложнил бы задачу.
Идея состоит в том, чтобы ввести
\dependSet{x,y}
\dependSet{x,y|a}
но без влияния на конечный результат. Ввод довольно естественный и позволяет избежать осложнений, связанных со слишком большим количеством скобок.
Как мы это делаем? Мы можем использовать \NewDocumentCommand
и его \SplitArgument
функцию.
\documentclass{article}
%\usepackage{xparse} % uncomment for older versions of LaTeX
\NewDocumentCommand{\dependSet}{>{\SplitArgument{1}{|}}m}{%
\dependSetAux#1%
}
\NewDocumentCommand{\dependSetAux}{mm}{%
\IfNoValueTF{#2}{% no | found
(#1)%
}{% found |
(#1\mid #2)%
}%
}
\begin{document}
$\dependSet{x}+\dependSet{x,y}+\dependSet{x,y|a}$
\end{document}
Комментарии.
Команда \dependSet
передает свой аргумент в \dependSetAux
виде двух групп в фигурных скобках. Если в начальном аргументе нет |
, то вторая группа в фигурных скобках будет , {-NoValue-}
которую можно протестировать, как показано.
Если вы хотите изменить окончательное форматирование, действуйте следующим образом \dependSetAux
.
Возможно, более эффективным, но менее простым кодом будет
\NewDocumentCommand{\dependSetAux}{mm}{%
(#1\IfValueT{#2}{\mid #2})%
}
решение2
Следующий код полностью соответствует вашей спецификации, приведенной в виде полного примера:
\documentclass[onecolumn]{article}
\newcommand\ds[1]{%
(#1)%
}
\begin{document}
This can be used as text:
\ds{x, y}
\ds{x, y|a}
It can also be used inline in math-mode: $\ds{x, y}$, see also: $\ds{x, y|a}$.
\end{document}
Как видите, идея заключается в том, чтобы отделить аргумент от функциональности. Это проще, чем думать о всевозможных комбинациях, которые вы можете или не можете захотеть использовать.