amsmath, vec und wenn nicht zusammenarbeiten

amsmath, vec und wenn nicht zusammenarbeiten

Ich versuche, einige Makros zu definieren, in denen ich einen „if“-Test benötige, der ein Argument des Makros enthält. Das Problem tritt auf, wenn dieses Argument vorhanden ist \vec{<arg>}und das amsmathPaket geladen wird. Hier ist ein minimales funktionierendes Beispiel:

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

und hier ist ein minimales, nicht funktionierendes Beispiel:

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

Ich würde gerne verstehen, was die Fehler in der Definition von vec durch das amsmath-Paket verursacht und wie man sie behebt.

Um Ihnen weitere Informationen zu geben, erstelle ich das Makro:

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

und ich will

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

"b" zu schreiben, und

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

nichts schreiben.

Ich habe auch versucht:

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

aber in diesem Fall

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

gibt mir die Fehler "Extra \else" und "extra \fi".

Was ich dann möchte, ist Makros zu definieren wie

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

Und

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

so dass

\foo{\bar{}}

gibt nichts und

\foo{\bar{yeah}}

gibt "foobaryeah"

Antwort1

Ich verstehe nicht wirklich, wonach Sie suchen. Das \ifist sicher nicht das richtige Tool, denn es hat folgende Regeln: \ifEs erweitert das Folgende, bis zwei nicht erweiterbare Token gefunden werden, die dann verglichen werden.

Möglicherweise ist dies eine Umsetzung Ihrer Bedürfnisse:

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

Antwort2

 \if\vec{

expandiert \vec, bis es zwei nicht erweiterbare Token erhält und testet dann diese Token, um zu sehen, ob sie den gleichen Zeichencode haben. Ich vermute, dassist nichtwas Sie testen möchten. Ich würde einen Ersatz vorschlagen, aber es ist nicht klar, was Sie an diesem Punkt testen möchten.

verwandte Informationen