
Tal vez alguien pueda decirme cómo definir un nuevo comando en \LaTeX, que puede tomar un valor obligatorio y otro valor opcional (parámetro) como entrada. En este caso, dependiendo del valor del argumento opcional, el tipo de objeto de salida debería cambiar.
Específicamente en mi caso, necesito especificar un comando \dependSet(<arg>, <opt par>)
para dibujar paréntesis. en este caso, dependiendo de la presencia/ausencia del argumento opcional se debe cambiar la salida (presencia/ausencia de una línea vertical en su interior):
En consecuencia, por motivos de usabilidad es importante que el parámetro venga después de los argumentos del comando y que se seleccione entre llaves, no entre llaves.
PD:En realidad, es una lástima que LaTex utilice una notación bastante incómoda (que huele a algo como ALGOL 60) y no haga nada para permitir definir nuevos comandos en un estilo similar al de Python.
Respuesta1
Supongamos que no desea escribir (x,y)
o (x,y\mid a)
por alguna razón. Y hay buenas razones para no hacerlo: por ejemplo, es posible que desee o se le solicite cambiar la notación. Una entrada cableada dificultaría mucho la tarea.
La idea es escribir
\dependSet{x,y}
\dependSet{x,y|a}
pero sin impactar en el resultado final. La entrada es bastante natural y evita las complicaciones de demasiados brackets.
¿Cómo lo hacemos? Podemos utilizar \NewDocumentCommand
y su \SplitArgument
característica.
\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}
Comentarios.
El comando \dependSet
pasa su argumento a \dependSetAux
dos grupos arriostrados. Si no hay ningún |
argumento en el argumento inicial, el segundo grupo arriostrado será {-NoValue-}
el que se podrá probar como se muestra.
Si desea cambiar el formato final, actúe \dependSetAux
.
Un código posiblemente más eficiente, pero menos sencillo, sería
\NewDocumentCommand{\dependSetAux}{mm}{%
(#1\IfValueT{#2}{\mid #2})%
}
Respuesta2
El siguiente código es totalmente compatible con su especificación, dado por un ejemplo 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 puede ver, la idea es separar el argumento de la funcionalidad. Esto es más fácil que pensar en todo tipo de combinaciones que quizás quieras usar o no.