2020年7月28日

#64の2のためにちょっと手を入れた.これがよいのかは悩むのだがとりあえずということで.2d4eef4を使うと,Issueにあるソースで\footnoteのリンクが消える.きちんと動かすためには,プリアンブルに次のコードを入れればよい.

\makeatletter
\renewcommand{\footnote}{\jlreq@footnote{\footnote}{\myfootnotemark}{\myfootnotetext}}
\newcounter{mycounter}
\newcommand{\myfootnotemark}[1][]{%
  \setcounter{mycounter}{\value{footnote}}%
  \setcounter{footnote}{\numexpr #1 - 1\relax}%
  \footnotemark
  \let\mysavedHref\Hy@footnote@currentHref
  \setcounter{footnote}{\value{mycounter}}%
}
\newcommand{\myfootnotetext}[2][]{%
  \edef\jlreq@result{%
    \unexpanded{\setcounter{mycounter}{\value{footnote}}}%
    \unexpanded{\setcounter{footnote}{#1}}%
    \unexpanded{\def\Hy@footnote@currentHref}{\expandonce{\mysavedHref}}%
    \unexpanded{\footnotetext{#2}}%
    \unexpanded{\setcounter{footnote}{\value{mycounter}}}%
  }%
}
\makeatother

日本語組版処理の要件 4.2.6によれば,縦組みの傍注(pLaTeX等では\footnoteで出力される)は奇数ページに出力される.また,多段組では最下段に出力される.これを実現するために,\footnote\footnotemark\footnotetextにわけて実行していた.つまり,ある偶数ページで\footnoteが実行されていて,その場所でのfootnoteカウンタの値が10だったとすると,\footnote自身は\footnotemarkに置き換えられ,次ページの先頭にて\footnotetext[10]{傍注}が実行される.

しかし,hyperrefパッケージはオプション付きの\footnotetext等をサポートしない.そのため,\footnotemarkからのリンクは貼られるが(これはオプションなしなのでhyperrefが有効),リンク先の\footnotetextへのリンクはなくなる.これが今まで失敗していた理由.

2d4eef4での変更点は以下の二つ.

  • \footnotemarkもオプション付きで呼び出すようにした.
  • 一連の処理をまとめた命令\jlreq@footnoteを作り,\footnoteは原則としてこれを呼び出すだけとした.

前者の変更により,\footnotemarkでもhyperrefは無効になり,リンクそのものがはられなくなる.きちんとリンクをはらせるためにはユーザ自身が設定する必要があるが,これを可能にするための作りが二番目である.(内部)命令\jlreq@footnoteは次のように使う.

\jlreq@footnote{<commandA>}{<commandB>}{<commandC>}[<number>]{<text>}

最後二つの引数[<number>]{<text>}\footnoteの引数と同様である.\jlreq@footnoteは次のように動く.

  • 横書きまたは縦書きで一段組かつtwosideオプション未指定の時(この場合上で述べたような傍注の遅延処理は行われない)は,{<commandA>}[<number>]{<text>}の実行に置き換えられる.
  • そうでないときは,まずその場で<commandB>[<number>]{<text>}<commandC>[<number>]{<text>}がこの順に実行される.さらに,<commandC>実行直後の\jlreq@resultマクロの中身を遅延実行(今まで\footnotetextが実行されていた場所での実行)する.これら二つのマクロは必ずオプション付きで実行される.(必要ならばその場でのfootnoteカウンタの値がオプションとして渡される.)
  • これらの<commandA><commandB><commandC>および\jlreq@resultに入っている命令が実行される時は,\footnote\footnotemark\footnotetextは(jlreqなどが改変したものではなく)LaTeXオリジナルのものとして実行される.

冒頭のマクロでは,<commandB>\footnotemarkの実行とその場でのリンク先(\Hy@footnote@currentHrefに入っている)の保存を行い,<commandC>では,保存したリンク先の復帰と\footnotetextの実行を\jlreq@resultに入れて終了する.なお,\jlreq@footnoteはfragile.

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です