Bracketing conditionnel dans la macro

Sep 24 2020

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

5 egreg Sep 24 2020 at 19:49

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}

4 StevenB.Segletes Sep 24 2020 at 20:00

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}