Ifthenelse falha se faz parte do argumento

Ifthenelse falha se faz parte do argumento

Eu segui um tutorial muito simples para criar o próprio arquivo listof. O link éhttps://texblog.org/2008/07/13/define-your-own-list-of/

Funcionou muito bem, eu só queria adicionar um parâmetro opcional. Se este opcional for fornecido, para o ToC personalizado ele enviará este parâmetro opcional. Mas recebo um erro que não entendo.

\usepackage{tocloft}
...
\newcommand{\listTMname}{List of TMs}
\newlistof{TM}{tms}{\listTMname}

\newcommand{\TM}[2][]{%
\refstepcounter{TM}
\par\noindent\textbf{TM \theTM. #2}
\addcontentsline{tms}{TM}{\protect\numberline{\theTM}\ifthenelse{\equal{#1}{}}{#2}{#1}%
}\par}

Eu queria usá-lo da seguinte maneira: \TM{To text and ToC}e \TM[to ToC]{To text}mas recebo um erro ao chamar na linha 94:

Número de parâmetro ilegal na definição de \reserved@al94 \TM{Test...}

O que eu fiz de errado? Se no \addcontentsline...comando eu removo o ifthenelse e coloco na \textbf2 linha acima ele funciona, mas não no sentido oposto.

Responder1

O comando \ifthenelseé frágil e toda a construção também

\ifthenelse{\equal{#1}{}}{#2}{#1}

Use um teste expansível, como

\newcommand{\TM}[2][]{%
  \par\noindent
  \refstepcounter{TM}% <--- don't forget %
  \addcontentsline{tms}{TM}{%
    \protect\numberline{\theTM}%
    \if\relax\detokenize{#1}\relax#2\else#1\fi
  }%
  \textbf{TM \theTM. #2}% <--- don't forget %
  \par\nopagebreak
}

Alternativamente, com \usepackage{xparse}:

\NewDocumentCommand{\TM}{om}{%
  \par\noindent
  \refstepcounter{TM}% <--- don't forget %
  \addcontentsline{tms}{TM}{\protect\numberline{\theTM}\IfNoValueTF{#1}{#2}{#1}}%
  \textbf{TM \theTM. #2}% <--- don't forget %
  \par\nopagebreak
}

Mudei a posição dos diversos itens para colocar a âncora (caso você use hyperref) no lugar certo.

informação relacionada