LoginSignup
2
0

More than 3 years have passed since last update.

\setcounter{section}{0}をすると目次のハイパーリンク(しおり)がうまく飛ばない問題

Last updated at Posted at 2020-11-20

\setcounter{}{}をすると目次のハイパーリンクがうまく働かない問題

XeLaTeXで文書を組版していて、hyperrefパッケージから生成した目次のハイパーリンクがうまく機能しないことがあった。以下の文書の目次において、「つぎに」のセクションをクリックしても「はじめに」のページに飛ばされてしまう。

old.tex
\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をリセットしたいところでそのカウンタを一つ増やしてやればよいということになる。以下が変更後の文書。

new.tex
%(プリアンブル略)
\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{}を用いてカウンタをリセットしたほうがいい。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0