我正在嘗試定義一些宏,其中我需要一個“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
直到獲得兩個不可展開的標記,然後測試這些標記以查看它們是否具有相同的字元代碼。我懷疑不是你想測試什麼。我建議更換,但目前尚不清楚您當時想要測試什麼/