
Следующий минимальный документ
\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
. В противном случае счетчик также увеличивается на запись в оглавлении и строках заголовков (в зависимости от стиля страницы).