我正在尝试制作一个用于排版更高类别的宏,并且如果它是一个包含 + 或 - 的表达式,我想自动将可选参数括在括号中。
我特别希望有类似的东西\cat[<optional_rank>]{<name>}
,以便例如\cat{Bord}
,\cat[n]{Fus}
和\cat[2]{Rep}
排版博德,n福斯和 2代表分别但\cat[n+1]{Fus}
和\cat[n-k-2]{Rep}
排版(n+1)福斯和 (NK-2)代表分别。
如何实现自动包围曝光?我几乎可以肯定答案会涉及到xparse
,但我不知道如何自己做。
为了方便起见,这里有一个 MWE(但它还不能完全满足我的要求)
\documentclass{article}
\newcommand{\cat}[2][]{{#1}\mathbf{#2}}
\begin{document}
\(\cat{Bord}\), \(\cat[n]{Fus}\), \(\cat[2]{Rep}\), \(\cat[n+1]{Fus}\), \(\cat[n-k-2]{Rep}\)
\end{document}
答案1
这将检查+
或-
是否在参数中。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\cat}{om}
{
\IfValueT{#1}{ \is_cat_prefix:n { #1 } }
\mathbf{#2}
}
\cs_new_protected:Nn \is_cat_prefix:n
{
\str_if_in:nnTF { #1 } { + }
{ (#1) } % there is +
{
\str_if_in:nnTF { #1 } { - }
{ (#1) } % there is -
{ #1 }
}
}
\ExplSyntaxOff
\begin{document}
\(\cat{Bord}\), \(\cat[n]{Fus}\), \(\cat[2]{Rep}\), \(\cat[n+1]{Fus}\), \(\cat[n-k-2]{Rep}\)
\end{document}
答案2
我listofitems
在这里使用来检查参数中+
或的文字存在(可以添加其他)。-
#1
\documentclass{article}
\usepackage{listofitems}
\newcommand{\cat}[2][\relax]{%
\setsepchar{+||-}%
\readlist\checksgns{#1}%
\ifnum\listlen\checksgns[]>1\relax(#1)\else#1\fi\mathbf{#2}}
\begin{document}
\(\cat{Bord}\), \(\cat[n]{Fus}\), \(\cat[2]{Rep}\), \(\cat[n+1]{Fus}\), \(\cat[n-k-2]{Rep}\)
\end{document}