Estoy intentando definir algunas macros en las que necesito un "si" cuya prueba contenga un argumento de la macro. El problema surge cuando este argumento es \vec{<arg>}
y amsmath
se carga el paquete. Aquí hay un ejemplo de trabajo mínimo:
\documentclass{article}
\begin{document}
$\if\vec{x}\empty true\else false\fi$
\end{document}
y aquí hay un ejemplo mínimo que no funciona:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
$\if\vec{x}\empty true\else false\fi$
\end{document}
Me encantaría entender qué causa los errores en la definición de vec por parte del paquete amsmath y cómo solucionarlo.
Para darte más información, creo la macro:
\newcommand*\ifpresent[2]{\expandafter\if#1\empty\else#2\fi}
y yo quiero
$\ifpresent{\ifpresent{x}{a}}{b}$
escribir "b", y
$\ifpresent{\ifpresent{}{a}}{b}$
para escribir nada.
También probé:
\newcommand*\ifpresent[2]{\expandafter\ifx#1\empty\else#2\fi}
pero en este caso
$\ifpresent{\ifpresent{x}{a}}{b}$
me da los errores "Extra \else
" y "extra \fi
".
Lo que quiero entonces es definir macros como
\newcommand\foo[1]{\ifpresent{#1}{foo#1}}
y
\newcommand\bar[1]{\ifpresent{#1}{bar#1}}
tal que
\foo{\bar{}}
no da nada y
\foo{\bar{yeah}}
da "foobaryeah"
Respuesta1
Realmente no entiendo lo que estás buscando. Seguramente \if
no es la buena herramienta, por sus reglas: \if
expandirá lo que sigue hasta encontrar dos tokens no expandibles que luego compara.
Posiblemente esta sea una realización de sus necesidades:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\doifnonblank}{mm}
{
\val_doifnonblank:fn { #1 } { #2 }
}
\cs_new:Npn \val_doifnonblank:nn #1 #2
{
\tl_if_blank:nF { #1 } { #2 }
}
\cs_generate_variant:Nn \val_doifnonblank:nn { f }
\ExplSyntaxOff
\newcommand{\foo}[1]{\doifnonblank{#1}{foo#1}}
\begin{document}
X\foo{}X
X\foo{x}X
X\foo{\doifnonblank{}{x}}X
X\foo{\doifnonblank{x}{y}}X
\end{document}
Respuesta2
\if\vec{
se expande \vec
hasta que obtiene dos tokens no expandibles y luego prueba esos tokens para ver si tienen el mismo código de carácter. Sospecho queno eslo que quieres probar. Sugeriría un reemplazo, pero no está claro qué desea probar en ese momento.