Definir um novo comando cuja saída depende de um parâmetro interno

Definir um novo comando cuja saída depende de um parâmetro interno

Talvez alguém possa me dizer como definir um novo comando no \LaTeX, que pode receber um valor obrigatório e outro valor opcional (parâmetro) como entrada. Neste caso, dependendo do valor do argumento opcional, o tipo do objeto de saída deve mudar.

Especificamente no meu caso, preciso especificar um comando \dependSet(<arg>, <opt par>)para desenhar parênteses. neste caso, dependendo da presença/ausência do argumento opcional deve-se alterar a saída (presença/ausência de linha vertical no interior):

Função Saída
\dependSet{x, y} insira a descrição da imagem aqui
\dependSet{x, y}{a} linha

Dessa forma, para usabilidade é importante que o parâmetro venha após os argumentos do comando e seja selecionado entre colchetes e não quadrados.

PS:Na verdade, é uma pena que o LaTex use uma notação um tanto desconfortável (que cheira a algo como ALGOL 60) e não faça nada para tornar possível definir novos comandos no estilo semelhante ao Python.

Responder1

Vamos supor que você não queira digitar (x,y)ou (x,y\mid a)por algum motivo. E há boas razões para não fazê-lo: por exemplo, você pode querer ou ser obrigado a alterar a notação. Uma entrada conectada tornaria a tarefa muito difícil.

A ideia é digitar

\dependSet{x,y}
\dependSet{x,y|a}

mas sem impactar no resultado final. A entrada é bastante natural e evita as complicações de muitos aparelhos.

Como fazemos isso? Podemos usar \NewDocumentCommande seu \SplitArgumentrecurso.

\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}

insira a descrição da imagem aqui

Comentários.

O comando \dependSetpassa seu argumento \dependSetAuxcomo dois grupos entre chaves. Se não houver |no argumento inicial, o segundo grupo entre chaves será {-NoValue-}aquele que pode ser testado conforme mostrado.

Se você quiser alterar a formatação final, siga em frente \dependSetAux.

Um código possivelmente mais eficiente, mas menos direto, seria

\NewDocumentCommand{\dependSetAux}{mm}{%
  (#1\IfValueT{#2}{\mid #2})%
}

Responder2

O código a seguir é totalmente compatível com sua especificação, fornecido por exemplo completo:

\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}

Como você pode ver, a ideia é separar o argumento da funcionalidade. Isso é mais fácil do que pensar em todos os tipos de combinações que você pode ou não querer usar.

insira a descrição da imagem aqui

informação relacionada