amsmath、vec 和 if 不一起工作

amsmath、vec 和 if 不一起工作

我正在嘗試定義一些宏,其中我需要一個“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}$

給我“額外\else”和“額外\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直到獲得兩個不可展開的標記,然後測試這些標記以查看它們是否具有相同的字元代碼。我懷疑不是你想測試什麼。我建議更換,但目前尚不清楚您當時想要測試什麼/

相關內容