Определение новой команды, вывод которой зависит от внутреннего параметра

Определение новой команды, вывод которой зависит от внутреннего параметра

Может быть, кто-нибудь подскажет, как определить новую команду в \LaTeX, которая может принимать одно обязательное значение и другое необязательное значение (параметр) в качестве входных данных. В этом случае в зависимости от значения необязательного аргумента должен меняться тип выходного объекта.

Конкретно в моем случае мне нужно указать команду \dependSet(<arg>, <opt par>)для рисования скобок. В этом случае в зависимости от наличия/отсутствия необязательного аргумента должен меняться вывод (наличие/отсутствие вертикальной линии внутри):

Функция Выход
\dependSet{x, y} введите описание изображения здесь
\dependSet{x, y}{a} ряд

Соответственно, для удобства использования важно, чтобы параметр располагался после аргументов команды и выделялся фигурными скобками, а не квадратными.

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}

Как видите, идея заключается в том, чтобы отделить аргумент от функциональности. Это проще, чем думать о всевозможных комбинациях, которые вы можете или не можете захотеть использовать.

введите описание изображения здесь

Связанный контент