Если иначе не получается, если это часть аргумента

Если иначе не получается, если это часть аргумента

Я следовал очень простому руководству, чтобы создать свой собственный 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 и поставить на \textbf2 строки выше, то работает, а в обратную сторону нет.

решение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) в нужном месте.

Связанный контент