引数の一部である場合は失敗する

引数の一部である場合は失敗する

私は非常に簡単なチュートリアルに従って独自のものを作成しました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 を削除して 2 行上に配置すれば\textbf動作しますが、逆の場合は動作しません。

答え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)を適切な場所に配置するために、各種項目の位置を変更しました。

関連情報