Пакет 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, то явное указание \protectне требуется, при использовании proj:

    \newcommand*{\proj}{}% check, whether \proj is undefined
    \DeclareRobustCommand*{\proj}{\stepcounter{projno}}
    
  • Важный совет от egreg вего комментарий: \stepcounterследует использовать лучшедо \section. В противном случае счетчик также увеличивается на запись в оглавлении и строках заголовков (в зависимости от стиля страницы).

Связанный контент