O hiperref do pacote entra em conflito com o contador dentro do título da seção

O hiperref do pacote entra em conflito com o contador dentro do título da seção

O seguinte documento mínimo

\documentclass{article}

\usepackage{hyperref}

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


\begin{document}

\section{Project \protect\proj }

\end{document}

produz o erro

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

O erro desaparece quando eu comento \usepackage{hyper ref}. Alguém vê uma saída para esse dilema?

Responder1

A macro \projcausa problemas nos favoritos. A maior parte da maquinaria estomacal do TeX não funciona aqui. Comandos expansíveis funcionam bem em marcadores, mas atribuições (incrementos de contador, ...) não. O pacote hyperreffornece \texorpdfstringou \pdfstringdefDisableCommandspara lidar com comandos que devem ser redefinidos ou filtrados dentro dos marcadores:

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

Ou \projpode ser divulgado o hyperrefcódigo do marcador de:

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

Dicas:

  • Se você definiu \projcom \DeclareRobustCommand, então um explícito \protectnão será necessário ao usar proj:

    \newcommand*{\proj}{}% check, whether \proj is undefined
    \DeclareRobustCommand*{\proj}{\stepcounter{projno}}
    
  • Dica importante de egreg emo comentário dele: \stepcounterdeveria ser melhor utilizadoantes \section. Caso contrário, o contador também será incrementado pela entrada no índice e nas linhas de cabeçalho (dependendo do estilo da página).

informação relacionada