
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, \textbf
funktioniert es, aber nicht umgekehrt.
Antwort1
Das Kommando \ifthenelse
ist 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.