amsmath、vec、そして一緒に動作しない場合

amsmath、vec、そして一緒に動作しない場合

マクロの引数を含むテストを実行する「if」が必要なマクロをいくつか定義しようとしています。この引数があり\vec{<arg>}amsmathパッケージがロードされたときに問題が発生します。最小限の動作例を次に示します。

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

以下は、最小限の動作しない例です。

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

amsmath パッケージによる vec の定義におけるエラーの原因と、それを修正する方法を理解できれば幸いです。

さらに詳しい情報を提供するために、次のマクロを作成します。

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

そして私は

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

「b」と書き、

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

何も書かない。

私も試しました:

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

しかしこの場合

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

「Extra \else」および「extra \fi」エラーが発生します。

私がしたいのは次のようなマクロを定義することです

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

そして

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

そのような

\foo{\bar{}}

何も与えず

\foo{\bar{yeah}}

「foobaryeah」を与える

答え1

あなたが探しているものが本当にわかりません。\ifルール上、これは良いツールではありません。\if2 つの展開不可能なトークンが見つかるまで、後続のものを展開し、それを比較します。

おそらくこれはあなたのニーズの実現です:

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

答え2

 \if\vec{

\vec拡張不可能なトークンを2つ得るまで拡張し、それらのトークンが同じ文字コードを持つかどうかをテストします。ない何をテストしたいのか。代替案を提案したいのですが、その時点で何をテストしたいのかが明確ではありません。

関連情報