amsmath, vec y si no trabajan juntos

amsmath, vec y si no trabajan juntos

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 amsmathse 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 \ifno es la buena herramienta, por sus reglas: \ifexpandirá 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 \vechasta 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.

información relacionada