Bracketing conditionnel dans la macro
J'essaie de créer une macro pour la composition de catégories supérieures et je voudrais mettre automatiquement l'argument optionnel entre crochets s'il s'agit d'une expression contenant + ou -.
En particulier, je voudrais avoir quelque chose comme \cat[<optional_rank>]{<name>}, de sorte que, par exemple \cat{Bord}, \cat[n]{Fus}et \cat[2]{Rep}composez Bord , n Fus et 2 Rep respectivement, mais \cat[n+1]{Fus}et \cat[n-k-2]{Rep}composez ( n + 1 ) Fus et ( nk-2 ) Rep respectivement.
Comment puis-je réaliser le bracketing automatique? Je suis presque sûr que la réponse impliquera xparse, mais je ne sais pas comment le faire moi-même.
Pour plus de commodité voici un MWE (qui ne fait pas encore exactement ce que je veux)
\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}
Réponses
Cela vérifie si +ou -est dans l'argument.
\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}
J'utilise listofitemsici pour vérifier la présence littérale de +ou -en argument #1(d'autres peuvent être ajoutés).
\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}