我按照非常简单的教程来创建自己的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
)放置在正确的位置。