
Я следовал очень простому руководству, чтобы создать свой собственный listof
. Ссылкаhttps://texblog.org/2008/07/13/define-your-own-list-of/
Это отлично сработало, я просто хотел добавить необязательный параметр. Если этот необязательный параметр задан, в пользовательский ToC он отправит этот необязательный параметр. Но я получаю ошибку, которую не понимаю.
\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}
Я хотел использовать его следующим образом: \TM{To text and ToC}
и \TM[to ToC]{To text}
Но я получаю ошибку вызова на строке 94:
Недопустимый номер параметра в определении \reserved@al94 \TM{Test...}
Что я сделал не так? Если в \addcontentsline...
команде убрать ifthenelse и поставить на \textbf
2 строки выше, то работает, а в обратную сторону нет.
решение1
Команда \ifthenelse
хрупкая, как и вся конструкция.
\ifthenelse{\equal{#1}{}}{#2}{#1}
Используйте расширяемый тест, например
\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
}
В качестве альтернативы можно использовать \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
}
Я изменил положение различных предметов, чтобы разместить якорь (если вы его используете hyperref
) в нужном месте.