
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):
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 \NewDocumentCommand
e seu \SplitArgument
recurso.
\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}
Comentários.
O comando \dependSet
passa seu argumento \dependSetAux
como 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.