Ifthenelse가 인수의 일부인 경우 실패합니다.

Ifthenelse가 인수의 일부인 경우 실패합니다.

나는 매우 간단한 튜토리얼을 따라 자신만의 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작동하지만 반대 방향으로는 작동하지 않습니다.

답변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)를 올바른 위치에 배치하기 위해 다양한 항목의 위치를 ​​변경했습니다.

관련 정보