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