\setcounter{}{}をすると目次のハイパーリンクがうまく働かない問題
XeLaTeXで文書を組版していて、hyperref
パッケージから生成した目次のハイパーリンクがうまく機能しないことがあった。以下の文書の目次において、「つぎに」のセクションをクリックしても「はじめに」のページに飛ばされてしまう。
\documentclass{bxjsbook}
\usepackage[unicode]{hyperref}
\hypersetup{% hyperrefオプションリスト
setpagesize=false,
bookmarksnumbered=true,%
bookmarksopen=true,%
}
\renewcommand{\thesection}{\arabic{section}}
\begin{document}
\tableofcontents
\newpage
\section{はじめに}
\newpage
\setcounter{section}{0}% ここが問題の元
\section{つぎに}
\end{document}
結論からいうと、\setcounter{}{}
を用いていたのが原因だった。
前提
上の文書では、
- 文書クラスを
bxjsbook
にしたい - だけど、
\chapter{}
は使いたくない - だけど、あるページでセクション番号を1に戻したい
というクラスファイル作成者の意図を無視した要求のもとに書かれており (色々と制限があってそうせざるを得なかったのです……)、\setcounter{section}{0}
と書いてセクション番号をリセットした。
\setcounter{}{}
を用いるとしおりがうまく働かないことは知られているようだ (参考: https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2528 )。
解決法
\setcounter{}{}
でなく、\addtoreset{}{}
を用いてsection
をリセットすればこの問題は起こらないらしい。\addtoreset{#1}{#2}
は、#2のカウンタが進むたびに#1のカウンタを0にリセットする。適当なカウンタを作成し、section
をリセットしたいところでそのカウンタを一つ増やしてやればよいということになる。以下が変更後の文書。
%(プリアンブル略)
\newcounter{hoge}%%%(*1)
\makeatletter
\@addtoreset{section}{hoge}%%%(*2)
\makeatother
\begin{document}
\tableofcontents
\newpage
\section{はじめに}
\newpage
\stepcounter{hoge}%%%(*3)
\section{つぎに}
\end{document}
(*1)で、新しくhoge
というカウンタを設定した。
(*2)で、hoge
が進むたびにsection
が0になるように設定した。
(*3)で、hoge
を1進めた (そしてそれに伴いsection
がリセットされた)。
これで二回タイプセットすればハイパーリンクが適切に付いた文書ができるはず。
まとめ
章・節番号をリセットするために\setcounter{}{}
を使うとハイパーリンクがうまくいかないことがあるので、\addtoreset{}{}
と\stepcounter{}
を用いてカウンタをリセットしたほうがいい。