软件包 hyperref 与章节标题内的计数器冲突

软件包 hyperref 与章节标题内的计数器冲突

以下最小文档

\documentclass{article}

\usepackage{hyperref}

\newcounter{projno}
\newcommand{\proj}{%
\stepcounter{projno}%
\theprojno}


\begin{document}

\section{Project \protect\proj }

\end{document}

产生错误

! Missing \endcsname inserted.
<to be read again> 
                   \csname\endcsname
l.14 \section{Project \protect\proj }

当我注释掉时错误就消失了\usepackage{hyper ref}。有人知道解决这个困境的方法吗?

答案1

\proj在书签中造成了麻烦。TeX 的大部分胃机制在这里不起作用。可扩展命令在书签中工作正常,但分配(计数器增量等)则不行。软件包hyperref提供\texorpdfstring\pdfstringdefDisableCommands处理应在书签内重新定义或过滤掉的命令:

\section{Project\texorpdfstring{\protect\proj}{\theprojno}}

或者\proj可以告知hyperref的书签代码:

...
\usepackage{hyperref}
\pdfstringdefDisableCommands{\let\proj\theprojno}
...
\begin{document}
...
\section{Project\protect\proj}

提示:

  • 如果使用 定义\proj,则使用 时不需要\DeclareRobustCommand显式:\protectproj

    \newcommand*{\proj}{}% check, whether \proj is undefined
    \DeclareRobustCommand*{\proj}{\stepcounter{projno}}
    
  • 来自 egreg 的重要提示他的评论:\stepcounter应该更好地利用 \section。否则,计数器也会根据目录和标题行中的条目而增加(取决于页面样式)。

相关内容