Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
fenril058 opened this issue Jun 10, 2023 · 7 comments
Open

Comments

@fenril058
Copy link

状況

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
Copy link
Owner

abenori commented Jun 12, 2023

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

  • jlreqのデフォルトでは\backmatterで採番するのをやめるようにしているので,この値が増加しない(\refstepcounterが呼び出されない)

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

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

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

@fenril058
Copy link
Author

fenril058 commented Jun 13, 2023

ありがとうございます。

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

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

@fenril058 fenril058 changed the title LuaLaTeXでコンパイルすると\backmatter後の章の参照先がずれる \backmatter以降はhyperref packageによる章の参照が効かない Jun 16, 2023
@suikan4github
Copy link

こんにちは。

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}

@abenori
Copy link
Owner

abenori commented Jul 28, 2024

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

@abenori
Copy link
Owner

abenori commented Jul 31, 2024

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

@munepi
Copy link

munepi commented Jul 31, 2024

@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栞も問題ないです。

@abenori
Copy link
Owner

abenori commented Aug 18, 2024

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants