amsmath、vec 和 if 不一起工作

amsmath、vec 和 if 不一起工作

\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直到得到两个不可扩展的标记,然后测试这些标记以查看它们是否具有相同的字符代码。我怀疑不是你想测试什么。我建议更换,但目前还不清楚你想测试什么/

相关内容