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 amsmath
pacote é 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 \if
não é a boa ferramenta, por causa de suas regras: \if
irá 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 \vec
até 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/