jsbook、fancyスタイルでの柱変更について

jsbook、fancyスタイルでの柱変更について

- gin kkyo の投稿
返信数: 12

jsbook、fancyスタイルにて、ヘッダの奇数頁左に章・タイトルを、偶数頁右に節・タイトルを、フッタの奇数頁左に頁番号・章・タイトルを、偶数頁右に節・タイトル・頁番号を出力させたいと考えています。

章のある頁もレイアウトが揃うようにと、以前のQAを参考にさせて頂いて、修正したつもりですが、章のある頁が偶数頁である場合に限って、ヘッダ・フッタとも節の出力が反映されません。

もし、対処方法をご存知の方がいらっしゃいましたらご教授頂けますと幸いです。

宜しくお願い致します。


\documentclass[b5paper,papersize,openany,dvipdfmx]{jsbook}


\usepackage{fancyhdr}

\usepackage[japanese]{babel}

\usepackage{graphicx}

\usepackage{amsmath,amssymb}

\usepackage{bm}

\usepackage{graphicx}

\usepackage{subfigure}

\usepackage{verbatim}

\usepackage{wrapfig}

\usepackage{ascmac}

\usepackage{makeidx}

\usepackage{pgfplots}

\usepackage{tikz}

\usepackage{multicol}


\setlength{\textwidth}{\fullwidth}

\setlength{\evensidemargin}{\oddsidemargin}


\pagestyle{fancy}


\makeatletter

\renewcommand{\chapter}{%

\if@openright\cleardoublepage\else\clearpage\fi

\global\@topnum\z@

\secdef\@chapter\@schapter}

\makeatother


\renewcommand{\chaptermark}[1]{\markboth{第\ \thechapter\ 章 \ #1}{}}

\renewcommand{\sectionmark}[1]{\markright{\thesection #1}{}}


% clear all header fields

\fancyhead{}


\fancyhead[LO]{\leftmark}

\fancyhead[RE]{\rightmark}


%clear all footer fields

\fancyfoot{}


\fancyfoot[LO]{\thepage \leftmark}

\fancyfoot[RE]{\rightmark \thepage}


%ヘッダの高さ幅を調節

\setlength{\headheight}{12pt}

%ヘッダの罫線を消す

\renewcommand{\headrulewidth}{0pt}


\begin{document}


% 序文の開始

\frontmatter


\chapter{はじめのはじめ}

%\thispagestyle{fancy}

\section{はじめにA}

%\thispagestyle{fancy}

\newpage

\section{はじめにB}


\tableofcontents


% 本文の開始

\mainmatter

\chapter{はじめの章}

\newpage

\newpage

\section{はじめの章の節A}

\chapter{つぎの章}

\section{つぎの章の節A}

\newpage

\section{つぎの章の節B}

\chapter{つぎの${}^2$章}

\section{つぎの${}^2$章の節A}

\newpage

\section{つぎの${}^2$章の節B}

\newpage

\section{つぎの${}^2$章の節C}

\newpage

\chapter{つぎの${}^3$章}

\section{つぎの${}^3$章の節A}

\newpage

\section{つぎの${}^3$章の節B}

\section{つぎの${}^3$章の節C}

\section{つぎの${}^3$章の節D}

\section{つぎの${}^3$章の節E}

\section{つぎの${}^3$章の節F}

\section{つぎの${}^3$章の節G}

\section{つぎの${}^3$章の節H}

\section{つぎの${}^3$章の節I}

\section{つぎの${}^3$章の節J}

\chapter{つぎの${}^4$章}

\section{つぎの${}^4$章の節A}

% 後書きの開始

\backmatter


\end{document}

gin kkyo への返信

Re: jsbook、fancyスタイルでの柱変更について

- 和田 勇 の投稿
\chapter \section の直後に \fbox{\leftmark}\fbox{rightmark} などとして情報をトレースすると理由などがわかるかとおもいます。

さて、直球的な回答ですが、sectionmark の再定義ですが markright {左用}{} ではなく markboth{左用}{右用} に変更でいかがでしょうか?理由は、下段の参考部分。

\renewcommand{\sectionmark}[1]{\markright{\thesection #1}{}}

↓↓↓↓↓↓
\renewcommand{\sectionmark}[1]%
\markboth%
{\thesection #1}%左ページ用
{\thesection #1}%右ページ用
}

またご要望によっては chaptermark の再定義でも右ページ用がカラになっているので同様の対応が必要になるかもしれませんね。

参考:
fancyhdr のキュメントの
http://tug.ctan.org/tex-archive/macros/latex/contrib/fancyhdr/fancyhdr.pdf
の「9 The scoop on LATEX’s marks」(10ページ)最後の段落によると
「通例的に \chapter 処理では 右ページ用の情報がカラに設定されるケースが多いので、最初のページは \rightmark は空っぽ云々」

Another problem with the marks in the standard LATEX classes is that the higher level sectioning commands (e.g. \chapter) call \markboth with an empty right argument. This means that on the first page of a chapter (or a section in article style) the \rightmark will be empty.

和田 勇 への返信

Re: jsbook、fancyスタイルでの柱変更について

- 北見 けん の投稿
LaTeX のマーク機構について、ウェブ上にはあまり解説がないようなので、TeX Wiki に「LaTeX入門/ヘッダーとフッター」として少し書いてみました。間違いや説明不足/過剰なところが無いか心配ですので、どなたでも手直しお願いいたします。

https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%81%A8%E3%83%95%E3%83%83%E3%82%BF%E3%83%BC

あれ、リンクはどうするのかな?(moodleオートフォーマットにしたらリンクになりました)
北見 けん への返信

Re: jsbook、fancyスタイルでの柱変更について

- 北見 けん の投稿
質問なさった方の反応はないようですが、どうなりましたでしょうか。
和田さんの回答にあった \sectionmark の再定義にはタイプミスがあったようで、
そのままだとエラーになりますね。

(タイプミスを直したもの。行末に開きブレイスを補って、%を半角にしました。)
\renewcommand{\sectionmark}[1]{%
\markboth
{\thesection #1}%左ページ用
{\thesection #1}%右ページ用
}

さて、ところがこれでも質問なさった方の希望通りにはならないようです。
理由は、上で紹介した TeX Wiki の「LaTeX入門/ヘッダーとフッター」を読んでいただけるとわかるかも。

仕組みはこうです。
\rightmark は、そのページに埋め込まれた最初のマークを読み出しますが、
ページ冒頭の章見出しのところでマークが埋め込まれる時点では、
章見出しの後に続く節見出しの情報は扱えませんから、
\rightmark で読み取られるページ最初のマークからは、節題を引き出すことはできません。

本質的に解決するには
・章見出しのところで埋め込まれたマークを節見出しのところでキャンセルする機構を TeX に追加するか、
・ページに埋め込まれた二番目のマークを読み取るプリミティブ \secondmark を TeX に追加するか、
・TeX のマーク機構を本質的に2系統に拡張して、2系統それぞれに \firstmark が機能するようにするか
いずれにしても TeX を拡張する必要があります。(ソースが公開されているので、拡張できます)

本質的な解決でなくマクロ的にごまかすなら、どんなケースでもうまくいく方法は諦めて、
典型的なケースだけで通用する方法に甘んじるのであれば可能でしょう。
つまり、「章見出しのところでマークを埋め込むのを止める」という方法です。
これをすると、ページ冒頭に章見出しが来て、そのすぐ後の同ページに節見出しが来るようなケースであれば
節見出しのところで \markboth{章題}{節題} と埋め込まれたマークから \rightmark で節題を拾えます。
ただし、章見出しのあとに節見出しが来る前に地の本文が挟まるようなケースで、
地の文が長く次のページまで続く場合、章見出しがあるページに何らのマークもないため、
\leftmark で章題を拾うことができません。
なので、そういうケースは書籍の編集ポリシーで排除する というのであればうまくいくでしょう。

もっと手動寄りの方法も可能です。
章見出しでページ最初のマークが埋め込まれる前に、
手動で \markboth{}{節題} や \markright{節題} を発行すれば、やはり望む結果が得られます。

ところで、本件の主要な問題とはあまり関係ありませんが、サンプルを見たところ、
「横書き書籍で見開き左が奇数ページ・右が偶数ページ」となるようなものを意図していますか?
もしそうだとしたら通常の書籍と異なるので注意が必要かと思いました。
また、サンプルソースからは直接関係しないパッケージ読み込みを外しておいていただけると
試しやすいです。
あと一点、サンプルの中に \markright{\thesection #1}{} という箇所がありますが、
TeX Wiki の解説にも書いたように \markright は引数一つですから、二つ目の空のブレイスは不用ですね。

(追記)これを書くのを忘れていました。
上で、本質的に実現するには TeX のマーク機構を拡張する必要があると書きました。
章見出しや節見出し自体が本文にあるページであれば、
柱に同じ情報を出さなくてもそこにその章や節があるのは一目瞭然なので、
そのページの柱は省略するという様式も一般的です。
そうすると TeX のマーク機構を拡張する必要はなくなるのですね。
(必要性が薄いからこれまで拡張されてこなかったということかも)
北見 けん への返信

Re: jsbook、fancyスタイルでの柱変更について

- 和田 勇 の投稿

> 和田さんの回答にあった \sectionmark の再定義にはタイプミスがあった

ごめんなさい、実験したソースからコピペすればよかったのですが、質問の例をコピペして見安く修正しようとしてケアレスミス二つやらかしてしまいました。 :-(

>(追記)これを書くのを忘れていました。
北見さんのこの(追記)に加え、まだ試行錯誤段階かもしれませんが、

  \fancyfoot[LO]{\thepage \leftmark}
  \fancyfoot[RE]{\rightmark \thepage}

これだと以下のようになり

「1第1章 はじめの章」
「2.2 つぎの章の節 B4」

ページ番号が五月蝿いあるいは埋没しやすいという状況が発生しています。ページ番号だけにした方がスッキリします。どうしても両方出すのなら

  \fancyfoot[LO]{--- \thepage ---~ \leftmark}

のように \thepage を --- で描こうなどの工夫された方が良いかとおもいます。(テストでは \fbox{\thepage}} のようにしてテストしていました)
北見 けん への返信

Re: jsbook、fancyスタイルでの柱変更について

- 本田 知亮 の投稿
>・TeX のマーク機構を本質的に2系統に拡張して、2系統それぞれに \firstmark が機能するようにするか
いずれにしても TeX を拡張する必要があります。(ソースが公開されているので、拡張できます)

etex拡張と2015/01/01 LaTeX2e大更新で
\newmarks/\marksというのがありますので
markはいっぱいたくさん作れますよ.


本田 知亮 への返信

Re: jsbook、fancyスタイルでの柱変更について

- 北見 けん の投稿
> etex拡張と2015/01/01 LaTeX2e大更新で
> \newmarks/\marksというのがありますので
> markはいっぱいたくさん作れますよ.

そんなことになってるのですね。
うちのは古いまま使っているので、
e-TeX など最近の動向は知りませんでした。

LaTeX も変わっているということなら、
私が TeX Wiki に書いた解説も現在の実装とは合わないかもしれません。
チェックお願いします > お詳しい方
北見 けん への返信

Re: jsbook、fancyスタイルでの柱変更について

- gin kkyo の投稿
質問者です。
検証、結果報告遅れて申し訳ありません。
いろいろとご教授ありがとうございました。

一部のみですが検証させて頂きました。
ただ、初心者のため、そもそもTeX構造など無知な部分が多く、TeX Wiki 「LaTeX入門/ヘッダーとフッター」を参考にさせて頂き、mark機構など(沢山作れるということも踏まえ)から勉強中です。

また、fancyhdr.sty付属のスタイルファイルextramarks.styを用いて\lastrightmark などのmarkを使えるとの情報も頂き、試行錯誤しております。

自分の思い描くものに近づけるためにはしばらく時間が必要なようです。



北見 けん への返信

Re: jsbook、fancyスタイルでの柱変更について

- 北見 けん の投稿
ということで、2015年以降に使えるという、
\marks を試してみました。

手もとのシステムは更新していないので、
ウェブ上で使える「TeXを使ってみよう」
http://oku.edu.mie-u.ac.jp/~okumura/texonweb/
で試しただけですが。

まず、e-TeX での拡張内容を確認すると
次のようになるでしょうか。
互換性を保つためにもともとのプリミティブ
\mark, \topmark, \firstmark, botmark
はそのままで、新たに
\marks, topmarks, \firstmarks, \botmarks
がプリミティブとして追加されて、
\marks<系統番号>{埋め込まれる文字列}
\topmarks<系統番号>
のように使う。

LaTeX ではこの e-TeX 拡張に合わせて
<系統番号>を割り当てるマクロ
\newmarks<コントロールシークエンス>
が用意された。
これで、
\newmarks\aaa
\marks\aaa{aaa系列のマーク1}
\marks\aaa{aaa系列のマーク2}
\output{aaa 系列の最初のマークは \firstmarks\aaa です。\box255}
のように使える。
(追記です:
 ただし、LaTeX 自身では新しいマーク機構は使用しておらず、
 標準の各クラスファイルでも従来の\mark{{章題}{節題}}形式を踏襲している。


ということで、今回の問題では、最初のソースで次のようにするとどうでしょうか。
\newmarks\secmark% 追加
\renewcommand{\sectionmark}[1]{%
    \markright{\thesection #1}% 互換性のため残す
    \marks\secmark{\thesection #1}% これを追加
}
\fancyhead[RE]{%
    %\rightmark% これの代わりに
    \firstmarks\secmark% こちらを使う
}

### ところで、そもそもページの偶奇の配置が一般の書籍
### (市販の書籍のほぼ100%じゃないかと思います)
### と異なることや、見出しのあるページにも柱を出すような
### 様式を見直す方がやはり良いような気がしますが、
### 検討の余地は無いのでしょうか。
北見 けん への返信

Re: jsbook、fancyスタイルでの柱変更について

- 北見 けん の投稿
> \output{aaa 系列の最初のマークは \firstmarks\aaa です。\box255}
> のように使える。
LaTeX での \newmarks の使用例で持ち出した outputルーチンはめちゃくちゃでしたね。
せめて
\output{\shipout\vbox{
    aaa 系列の最初のマークは \firstmarks\aaa です。\par
    \box255
}}
くらいにしないと。
北見 けん への返信

Re: jsbook、fancyスタイルでの柱変更について

- しっぽ 愛好家 の投稿
とりあえず,添付のサンプルファイルのようなことをすると,
「現在の『ページ』上の \mark で「右マークテキスト」が
空でないものがあれば,そのような \mark のうちの最初のものの
右マークテキストを取得」ということも可能です.
%%% 同様に,現在の「ページ」上の全見出し項目を柱に拾うなんてことも
%%% (需要は「字典」の類などに限られるでしょうが)可能です.
しっぽ 愛好家 への返信

Re: jsbook、fancyスタイルでの柱変更について

- 北見 けん の投稿
拝見しました。

なるほど、
埋め込まれるすべてのマーク内容を自前のリストに登録番号付きで管理し、
実際にマークとして埋め込むのはマークの登録番号だけにするわけですね。
そうすると、outputルーチンでは \firstmark と \botmark が
そのページにあるマークが何番から何番までのものかを示すので、
あとは登録リストを自分で参照したり操作したりすれば、
第二成分が空のマークを読み飛ばすなり何なりと自在にできると。

TeX を拡張しないと無理かと思っていましたが、こんな方法があったとは。

サンプルソースの大部分は
LaTeXとの互換性を保ちながらこの汎用的な機構を実装していて、
最後に \rightmark と置き換えられる \RightmarkNonEmptyIfPossible というマクロが、
今回の問題に合わせたカスタマイズというわけですね。

とても勉強になります。
北見 けん への返信

Re: jsbook、fancyスタイルでの柱変更について

- 北見 けん の投稿
この、マーク項目に識別番号を使う方法は
『LaTeX2e マクロ&クラス プログラミング基礎解説』
第8章の最後のページの脚注30番に、
方針だけですが書いてあったのを見つけました。

また、続編の
『LaTeX2e マクロ&クラス プログラミング実践解説』
「7.1.3 ページ内の全項目の取得」には
実装例がしっかり載っていましたね。
今回お示しいただいた例は 当時の掲載例よりさらに洗練されて
汎用性も高まっていますね。

書籍については、2冊とも現在は入手が難しそうですが、
関心ある方のために 出しゃばりかもしれませんが
紹介させていただきます。

## 奥付を見たら15年も前の発行だったのびっくり。