Ifthenelse falla si es parte del argumento

Ifthenelse falla si es parte del argumento

He seguido un tutorial muy sencillo para crear mi propio archivo listof. El enlace eshttps://texblog.org/2008/07/13/define-your-own-list-of/

Funcionó muy bien, solo quería agregar un parámetro opcional. Si se proporciona esta opción, al ToC personalizado enviará este parámetro opcional. Pero me sale un error que no entiendo.

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

Quería usarlo de la siguiente manera: \TM{To text and ToC}pero \TM[to ToC]{To text}aparece un error al llamar en la línea 94:

Número de parámetro ilegal en la definición de \reserved@al94 \TM{Test...}

¿Que hice mal? Si en \addcontentsline...el comando elimino ifthenelse y lo coloco en \textbfla línea 2 arriba, funciona, pero no en sentido contrario.

Respuesta1

El mando \ifthenelsees frágil y también lo es toda la construcción.

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

Utilice una prueba ampliable, 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, con \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
}

Cambié la posición de los distintos elementos para colocar el ancla (en caso de que uses hyperref) en el lugar correcto.

información relacionada