パッケージ 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それ以外の場合、カウンターは目次と見出し行のエントリによっても増加します (ページ スタイルによって異なります)。

関連情報