以下最小文档
\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
显式:\protect
proj
\newcommand*{\proj}{}% check, whether \proj is undefined \DeclareRobustCommand*{\proj}{\stepcounter{projno}}
来自 egreg 的重要提示他的评论:
\stepcounter
应该更好地利用前\section
。否则,计数器也会根据目录和标题行中的条目而增加(取决于页面样式)。