jlreq
jlreq copied to clipboard
\backmatter以降はhyperref packageによる章の参照が効かない
状況
Option bookをtureにして、hyperrefをつかい、LuaLaTeXでコンパイルすると、 \backmatte以降の章の参照先が目次、しおりともにずれる。
環境
LuaHBTeX, Version 1.16.0 (TeX Live 2023) jlreq 2023-03-05 2023-04-20 v7.00w
再現用コード
\documentclass[book]{jlreq}
\usepackage[
unicode=ture,
pdfusetitle=ture,
bookmarks=true,
]{hyperref}
\title{タイトル}
\author{著者}
\begin{document}
\frontmatter
\maketitle
\tableofcontents
\chapter{はじめに}
\mainmatter
\chapter{テストA}
\chapter{テストB}
\chapter{テストC}
\appendix
\chapter{テストD}
\backmatter
\chapter{おわりに}
この章へのリンクが機能しないようです。
目次やしおりで「おわりに」をクリックすると、
テストDへとんでしまいます。
\end{document}
ありがとうございます.hyperrefはchapterカウンタの値をリンク先にしているようなのですが,
- jlreqのデフォルトでは
\backmatterで採番するのをやめるようにしているので,この値が増加しない(\refstepcounterが呼び出されない)
というのが原因のようです.では採番するようにすればよいのかというとそうでもなく,\frontmatterでchapterカウンタをリセットしているので結局\fontmatter前後の\chapterではchapterカウンタはどちらも1となっていて,結局かぶってしまうのでやぱり失敗します.
ちょっと困ってしまいました.hyperrefパッケージは\@chapterの方経由でもリンクを挟み込むということもしているように見えるのでそちらでどうにかならないか考えてみます.
(個人的メモ:\@makechapterheadを内部で呼び出していないということに起因してパッケージが機能しないということもあった.)
ありがとうございます。
jlreqのデフォルトでは\backmatterで採番するのをやめるようにしているので,この値が増加しない(\refstepcounterが呼び出されない)
なるほどそういうことだったのですね。
なお、美しくないwork aroundですが、pandocでmarkdown-auto_identifiers拡張をONにしたときのように、
\hypertarget{おわりに}{%
\chapter{おわりに}\label{おわりに}}
とすればとりあえず目次としおりが正しく機能することは確認しました。
どうやら調べてみるとhyperref packageはあんまりお行儀がよくないようですね。 TeX wikiでも
「書籍の原稿」といった、「最終的な組版を書き手自身がやるのではない」文書の場合には、hyperref パッケージをはじめとする、お行儀の悪い(=LaTeX の内部処理をあちこち書き換える)パッケージは決して使用しないでください
どまでいわれていて驚きました。
また、\refstepcounterを上書きしたときのアンカーがテキスト要素とみなされてしまい、ページ先頭であってもページ先頭だとはみなされなくなり、\vspace によるマージンが入ってしまうというQiitaの記事を見つけました。
https://qiita.com/kauplan/items/2b404d770a905c38082e
(この記事ではほかにも、ものすごく苦言を呈されていますが……。)
こんにちは。
TeX Live 2024では、状況が少し変わっているようです。
- LuaHBTex 1.18.0 (TeX Live 2024)
- jlreq 2024/02/16 ( \listfiles コマンドの実行結果 )
Issueでのやりとりを参考にワークアラウンドを使ってみましたが、「はじめに」「おわりに」へは正しくジャンプしません。念のため英語も使ってみましたが同じ状況です。
\documentclass[book]{jlreq}
\usepackage[
unicode=ture,
pdfusetitle=ture,
bookmarks=true,
]{hyperref}
\listfiles
\title{タイトル}
\author{著者}
\begin{document}
\frontmatter
\maketitle
\tableofcontents
\hypertarget{はじめに}{
\chapter{はじめに}\label{はじめに}}
\hypertarget{Preface}{
\chapter{Preface}\label{Preface}}
\mainmatter
\chapter{テストA}
\chapter{テストB}
\chapter{テストC}
\appendix
\chapter{テストD}
\backmatter
\hypertarget{おわりに}{%
\chapter{おわりに}\label{おわりに}}
この章へのリンクが機能しないようです。
目次やしおりで「おわりに」をクリックすると、
テストDへとんでしまいます。
\hypertarget{Authornote}{
\chapter{Authornote}\label{Authornote}}
英語の章題にしてもリンクは機能していません。
\end{document}
79d44a0で改善したかもしれません.(\chapterのみ\@chapterと\@schapterを定義し,これらのマクロを経由して見出し本体を呼び出すようにしてみました.)
今更なのですが,そもそもより正統的(?)な方法はhttps://okumuralab.org/tex/mod/forum/discuss.php?d=3801でしょうか.(hyperrefのマニュアルを読んでいませんでした.)
@abenori そのhyperrefマニュアルに書いてある場当たり的対処でおおよそいけるとは思いますが、実用上、それでも難しいことが生じます。
汎用クラスファイルを使う一般的な利用者(とくにaux, toc, outを分からない利用者)の場合、各種見出しコマンド\foo*{見出し}な * を使いつつ、かつ、そこにもPDF栞を入れたい場合にも、その見出しに(hyperrefからみて\refstepcounterとして割り振れ可能なカウンタで)一意的なIDを与える必要があります。
(結局、汎用クラスファイルでhyperrefパッケージを使った場合に、auxのラベルとカウンタを使いまわして、目次tocとPDF栞outを流用しているので、どうしても無理が生じます。
なので、汎用クラスファイルを想定すると、hyperrefパッケージ側で、各種見出しコマンド \foo*{見出し} の場合にも、PDF栞用に(某弊社の書籍用クラスファイルのような)一意的なカウンタをあらかじめ振ってほしいところです。)
なお、某弊社の書籍用クラスファイルの場合、クラスファイル側に\usepackage{hyperref}を組み込んで、現状のhyperrefの挙動に合わせて、クラスファイルを作っています。
- 原則、各種見出しコマンド
\foo*{見出し}を使わない。その代わりに、\frontmatter, \backmatterでは、\fooを使っても、各種見出し番号を出さない。(該当見出しを目次に出す、PDF栞に出すの制御はすべてクラスファイル側で制御する) - \frontmatter: chapterカウンタを-100始まり
- \mainmatter: chapterカウンタを0始まり
- \appendix (in \mainmatter): chapterカウンタを100始まり
- \backmatter: chapterカウンタを200始まり
こうしておくと、chapterカウンタに依存する各カウンタの値がすべて一意的に定まる(すべてのIDが一意的に定まる)ので、LaTeX文章側に余計なものを何も書かなくても、目次もPDF栞も問題ないです。
-100始まり面白いですね.ただ適用条件が厳しくて汎用クラスファイルには組み込めないですね.
\theHchapter 書き換えも試してみたのですが,\appendix内でhyperrefパッケージが勝手に戻していてダメでした.やる気を失いました…….
hyperrefパッケージ側で、各種見出しコマンド \foo*{見出し} の場合にも、PDF栞用に(某弊社の書籍用クラスファイルのような)一意的なカウンタをあらかじめ振ってほしいところです。)
本当にそうですね.LaTeXにhookのメカニズムも入ったし,何かしらやりようはある気がするのですが.
上での対処もad hocすぎる気がしてきたので戻すことにします.