我有一个使用 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
和。副作用是,现在不再需要标题中的命令。我认为包也解决了问题,但我需要额外的测试来执行其他任务。总之,我从一个包切换到另一个包。\ifstrempty
etoolbox
\protect
xstring
ifthen
etoolbox
答案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 字符串中不允许的标记给出警告。
但是,如果执行此命令是为了在章节标题和页眉中写入不同内容,则应使用不同的策略。