
私は非常に簡単なチュートリアルに従って独自のものを作成しました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
)を適切な場所に配置するために、各種項目の位置を変更しました。