\vec{<arg>}
我正在尝试定义一些宏,其中我需要一个“if”,测试包含宏的参数。当此参数是并且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
将扩展后面的内容,直到找到两个不可扩展的标记,然后进行比较。
这可能是您需求的实现:
\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
直到得到两个不可扩展的标记,然后测试这些标记以查看它们是否具有相同的字符代码。我怀疑不是你想测试什么。我建议更换,但目前还不清楚你想测试什么/