Ifthenelse schlägt fehl, wenn es Teil des Arguments ist

Ifthenelse schlägt fehl, wenn es Teil des Arguments ist

Ich habe ein sehr einfaches Tutorial befolgt, um mein eigenes zu erstellen listof. Der Link isthttps://texblog.org/2008/07/13/define-your-own-list-of/

Es hat super funktioniert, ich wollte nur einen optionalen Parameter hinzufügen. Wenn dieser optionale Parameter angegeben ist, wird dieser optionale Parameter an das benutzerdefinierte Inhaltsverzeichnis gesendet. Aber ich erhalte einen Fehler, den ich nicht verstehe.

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

Ich wollte es wie folgt verwenden: \TM{To text and ToC}und \TM[to ToC]{To text}erhalte jedoch die Fehlermeldung „Aufruf steht in Zeile 94“:

Ungültige Parameternummer in der Definition von \reserved@al94 \TM{Test...}

Was habe ich falsch gemacht? Wenn \addcontentsline...ich im Befehl ifthenelse entferne und es 2 Zeilen weiter oben einfüge, \textbffunktioniert es, aber nicht umgekehrt.

Antwort1

Das Kommando \ifthenelseist fragil und die gesamte Konstruktion auch

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

Verwenden Sie einen erweiterbaren Test, wie zum Beispiel

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

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

Ich habe die Position der verschiedenen Elemente geändert, um den Anker (falls Sie ihn verwenden hyperref) an der richtigen Stelle zu platzieren.

verwandte Informationen