如果是參數的一部分,則 Iftheelse 失敗

如果是參數的一部分,則 Iftheelse 失敗

我按照非常簡單的教程創建了自己的listof.連結是https://texblog.org/2008/07/13/define-your-own-list-of/

它工作得很好,我只是想添加可選參數。如果給出此可選參數,則它將向自訂目錄發送此可選參數。但我收到錯誤,我不明白。

\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)放置在正確的位置。

相關內容