マクロの引数を含むテストを実行する「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
ルール上、これは良いツールではありません。\if
2 つの展開不可能なトークンが見つかるまで、後続のものを展開し、それを比較します。
おそらくこれはあなたのニーズの実現です:
\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つ得るまで拡張し、それらのトークンが同じ文字コードを持つかどうかをテストします。ない何をテストしたいのか。代替案を提案したいのですが、その時点で何をテストしたいのかが明確ではありません。