使用包 hyperref 和 ifthen 时,章节标题中的控制序列 \equal 未定义

使用包 hyperref 和 ifthen 时,章节标题中的控制序列 \equal 未定义

我有一个使用 package 的命令ifthen。我在章节标题中使用该命令。我必须保护该命令,否则我会收到错误 Undefined control serial \equal。到目前为止一切顺利。现在我开始使用 package hyperref,错误又出现了。我该如何解决?下面是一个例子。谢谢。

\documentclass{article}
\usepackage{ifthen}
\usepackage{hyperref} % remove this line => no error
\newcommand{\something}[1]{Was something}
\newcommand{\somethingelse}[1]{\ifthenelse{\equal{#1}{X}}{Was X}{Was not X}}
\begin{document}
     \tableofcontents
     \section{\something{}}
     \section{\protect\somethingelse{}} % remove this line => no error
\end{document}

答案1

电子工具箱软件包中有一个命令,我有时会用它来处理过早扩张的问题,PDF 中不允许使用令牌

\documentclass{article}
\usepackage{etoolbox}
\usepackage{hyperref}
\makeatletter
\newcommand{\something}[1]{Was something}
\newcommand{\somethingelse}[1]{%
  \ifnum\pdfstrcmp{#1}{X}=\z@\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
  {Was X}{Was not X}%
}
\makeatother

\begin{document}
     \tableofcontents
     \section{\something{}}
     \section{\protecting{\somethingelse{X}}}
     \section{\protecting{\somethingelse{Y}}}
\end{document}

另一个解决方案是

\documentclass{article}
\usepackage{etoolbox}
\usepackage{hyperref}
\makeatletter
% In case the platform has no \pdfstrcmp:
\ifdef\pdfstrcmp
  {\let\asdel@strcmp\pdfstrcmp}
  {\usepackage{pdftexcmds}\let\asdel@strcmp\pdf@strcmp}
\let\then\iffalse
\newcommand*\ifstrcmp{}
\def\ifstrcmp#1\with#2\then{\ifnum\asdel@strcmp{#1}{#2}=\z@}
\newcommand{\somethingelse}[1]{\ifstrcmp#1\with X\then Was X\else Was not X\fi}
\makeatother

\begin{document}
  \tableofcontents
  \section{\protecting{\somethingelse{X}}}
  \section{\protecting{\somethingelse{Y}}}
\end{document}

在此处输入图片描述

答案2

我最终使用了包中的测试\ifstrequal和。副作用是,现在不再需要标题中的命令。我认为包也解决了问题,但我需要额外的测试来执行其他任务。总之,我从一个包切换到另一个包。\ifstremptyetoolbox\protectxstringifthenetoolbox

答案3

作为一种解决方法,您可以使用\IfEq作为一种解决方法字符串改为包:

\documentclass{article}
\usepackage{xstring}
\usepackage{hyperref}
\newcommand{\something}[1]{Was something}
\newcommand{\somethingelse}[1]{\IfEq{#1}{X}{Was X}{Was not X}}
\begin{document}
     \tableofcontents
     \section{\something{}}
     \section{\protect\somethingelse{}} % remove this line => no error
\end{document}

答案4

使用 LaTeX3 包:

\usepackage{expl3}
\ExplSyntaxOn
\cs_set:Npn \somethingelse #1
  {
   \str_if_eq:nnTF{#1}{X}{Was~X}{Was~not~X}
  }
\ExplSyntaxOff

这甚至没有对 PDF 字符串中不允许的标记给出警告。

但是,如果执行此命令是为了在章节标题和页眉中写入不同内容,则应使用不同的策略。

相关内容