我想要一个采用可选参数的宏。
- 如果未传递任何内容,则会产生 G。
- 如果传递了 i,它会产生 G_{p_i}。
但是,以下代码面临一些错误“无法在数学模式下使用‘\spacefactor’”。
\documentclass{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amsthm}
\newcommand{\cabGo}[1][\@empty]{
\ifx\@empty#1{{\sf G}}
\else{{\sf G}_{p_{#1}}}
\fi
}
\begin{document}
$\cabGo$
$\cabGo[3]$
\end{document}
答案1
主要问题缺失了\makeatletter
。
另一方面,代码写得不太好:
\newcommand{\cabGo}[1][]{%
\mathsf{G}%
\if\relax\detokenize{#1}\relax
\else
_{p_{#1}}%
\fi
}
对论证空虚性的检验更加严格;也\sf
已经被弃用了 20 多年。
如果加载xparse
,代码就更简单了:
\usepackage{xparse}
\NewDocumentCommand{\cabGo}{o}{%
\mathsf{G}\IfValueT{#1}{_{p_{#1}}}%
}
评论中请求的更改(可以提供任意数量的选项)
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\cabGo}{o}
{
\mathsf{G}
\IfValueT{#1}
{
\sb{\clist_map_inline:nn { #1 } { p\sb{##1} }}
}
}
\ExplSyntaxOff
\begin{document}
$\cabGo$ (no option)
$\cabGo[1]$ (single option)
$\cabGo[1,2]$ (double option)
$\cabGo[1,2,3]$ (triple option)
\end{document}