amsmath, vec e se não trabalharmos juntos

amsmath, vec e se não trabalharmos juntos

Estou tentando definir algumas macros nas quais preciso de um "se" cujo teste contenha um argumento da macro. O problema surge quando esse argumento é válido \vec{<arg>}e o amsmathpacote é carregado. Aqui está um exemplo mínimo de trabalho:

\documentclass{article}
\begin{document}
$\if\vec{x}\empty true\else false\fi$
\end{document}

e aqui está um exemplo mínimo que não funciona:

\documentclass{article}
\usepackage{amsmath}
\begin{document}
$\if\vec{x}\empty true\else false\fi$
\end{document}

Eu ficaria feliz em entender o que causa os erros na definição de vec pelo pacote amsmath e como corrigi-los.

Para lhe dar mais informações, eu crio a macro:

\newcommand*\ifpresent[2]{\expandafter\if#1\empty\else#2\fi}

e eu quero

$\ifpresent{\ifpresent{x}{a}}{b}$

escrever "b" e

$\ifpresent{\ifpresent{}{a}}{b}$

escrever nada.

Eu também tentei:

\newcommand*\ifpresent[2]{\expandafter\ifx#1\empty\else#2\fi}

mas neste caso

$\ifpresent{\ifpresent{x}{a}}{b}$

me dá os erros "Extra \else" e "extra \fi".

O que eu quero então é definir macros como

\newcommand\foo[1]{\ifpresent{#1}{foo#1}}

e

\newcommand\bar[1]{\ifpresent{#1}{bar#1}}

de tal modo que

\foo{\bar{}}

não dá nada e

\foo{\bar{yeah}}

dá "foobaryeah"

Responder1

Eu realmente não entendo o que você está procurando. Certamente \ifnão é a boa ferramenta, por causa de suas regras: \ifirá expandir o que segue até encontrar dois tokens não expansíveis que então compara.

Possivelmente esta é uma realização de suas necessidades:

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

Responder2

 \if\vec{

expande \vecaté obter dois tokens não expansíveis e então testa esses tokens para ver se eles têm o mesmo código de caractere. Eu suspeito quenão éo que você deseja testar. Eu sugeriria uma substituição, mas não está claro o que você deseja testar naquele momento/

informação relacionada