Bracketing condizionale nella macro

Sep 24 2020

Sto cercando di creare una macro per la composizione di categorie superiori e vorrei racchiudere automaticamente l'argomento opzionale tra parentesi se si tratta di un'espressione contenente + o -.

In particolare, mi piacerebbe avere qualcosa di simile \cat[<optional_rank>]{<name>}, in modo che, ad esempio \cat{Bord}, \cat[n]{Fus}e \cat[2]{Rep}componga Bord , n Fus e 2 Rep rispettivamente, ma \cat[n+1]{Fus}e \cat[n-k-2]{Rep}componga ( n + 1 ) Fus e ( nk-2 ) Rep rispettivamente.

Come posso ottenere il bracketing automatico? Sono quasi sicuro che la risposta coinvolgerà xparse, ma non so come farlo da solo.

Per comodità ecco un MWE (che non fa ancora esattamente quello che voglio)

\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}

Risposte

5 egreg Sep 24 2020 at 19:49

Questo controlla se +o -è nell'argomento.

\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

Uso listofitemsqui per verificare la presenza letterale di +o -nell'argomento #1(altri possono essere aggiunti).

\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}