Colchete condicional na macro

Sep 24 2020

Estou tentando fazer uma macro para composição de categorias superiores e gostaria de colocar automaticamente o argumento opcional entre colchetes se for uma expressão contendo + ou -.

Em particular, gostaria de ter algo como \cat[<optional_rank>]{<name>}, de modo que, por exemplo \cat{Bord}, \cat[n]{Fus}e \cat[2]{Rep}edite Bord , n Fus e 2 Rep , respectivamente, mas \cat[n+1]{Fus}e \cat[n-k-2]{Rep}edite ( n + 1 ) Fus e ( nk-2 ) Rep, respectivamente.

Como posso conseguir o bracketing automático? Tenho quase certeza de que a resposta envolverá xparse, mas não sei como fazer sozinha.

Por conveniência aqui está um MWE (que não faz exatamente o que eu quero ainda)

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

Respostas

5 egreg Sep 24 2020 at 19:49

Isso verifica se +ou -está no argumento.

\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

Eu uso listofitemsaqui para verificar a presença literal de +ou -no argumento #1(outros podem ser adicionados).

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