abenori / jlreq

Other
125 stars 18 forks source link

\backmatter以降はhyperref packageによる章の参照が効かない #122

Open fenril058 opened 1 year ago

fenril058 commented 1 year ago

状況

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}
abenori commented 1 year ago

ありがとうございます.hyperrefはchapterカウンタの値をリンク先にしているようなのですが,

というのが原因のようです.では採番するようにすればよいのかというとそうでもなく,\frontmatterchapterカウンタをリセットしているので結局\fontmatter前後の\chapterではchapterカウンタはどちらも1となっていて,結局かぶってしまうのでやぱり失敗します.

ちょっと困ってしまいました.hyperrefパッケージは\@chapterの方経由でもリンクを挟み込むということもしているように見えるのでそちらでどうにかならないか考えてみます.

(個人的メモ:\@makechapterheadを内部で呼び出していないということに起因してパッケージが機能しないということもあった.)

fenril058 commented 1 year ago

ありがとうございます。

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

(この記事ではほかにも、ものすごく苦言を呈されていますが……。)

suikan4github commented 4 months ago

こんにちは。

TeX Live 2024では、状況が少し変わっているようです。

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}
abenori commented 4 weeks ago

79d44a0で改善したかもしれません.(\chapterのみ\@chapter\@schapterを定義し,これらのマクロを経由して見出し本体を呼び出すようにしてみました.)

abenori commented 3 weeks ago

今更なのですが,そもそもより正統的(?)な方法はhttps://okumuralab.org/tex/mod/forum/discuss.php?d=3801でしょうか.(hyperrefのマニュアルを読んでいませんでした.)

munepi commented 3 weeks ago

@abenori そのhyperrefマニュアルに書いてある場当たり的対処でおおよそいけるとは思いますが、実用上、それでも難しいことが生じます。

汎用クラスファイルを使う一般的な利用者(とくにaux, toc, outを分からない利用者)の場合、各種見出しコマンド\foo*{見出し}* を使いつつ、かつ、そこにもPDF栞を入れたい場合にも、その見出しに(hyperrefからみて\refstepcounterとして割り振れ可能なカウンタで)一意的なIDを与える必要があります。

(結局、汎用クラスファイルでhyperrefパッケージを使った場合に、auxのラベルとカウンタを使いまわして、目次tocとPDF栞outを流用しているので、どうしても無理が生じます。 なので、汎用クラスファイルを想定すると、hyperrefパッケージ側で、各種見出しコマンド \foo*{見出し} の場合にも、PDF栞用に(某弊社の書籍用クラスファイルのような)一意的なカウンタをあらかじめ振ってほしいところです。)

なお、某弊社の書籍用クラスファイルの場合、クラスファイル側に\usepackage{hyperref}を組み込んで、現状のhyperrefの挙動に合わせて、クラスファイルを作っています。

こうしておくと、chapterカウンタに依存する各カウンタの値がすべて一意的に定まる(すべてのIDが一意的に定まる)ので、LaTeX文章側に余計なものを何も書かなくても、目次もPDF栞も問題ないです。

abenori commented 6 days ago

-100始まり面白いですね.ただ適用条件が厳しくて汎用クラスファイルには組み込めないですね. \theHchapter 書き換えも試してみたのですが,\appendix内でhyperrefパッケージが勝手に戻していてダメでした.やる気を失いました…….

hyperrefパッケージ側で、各種見出しコマンド \foo*{見出し} の場合にも、PDF栞用に(某弊社の書籍用クラスファイルのような)一意的なカウンタをあらかじめ振ってほしいところです。)

本当にそうですね.LaTeXにhookのメカニズムも入ったし,何かしらやりようはある気がするのですが.

上での対処もad hocすぎる気がしてきたので戻すことにします.