2019年12月16日

クラスファイルを作ろう(5)

柱などの設定を行います.つまり,\pagestyleに指定するページスタイルを作ります.

マークについて

マークについておさらいをしておきます.標準クラスファイルのheadingsページスタイルでは,そのときの\section\subsectionの中身が出力されます.TeXでは,柱として出力したいテキストを「マーク」として保存し,実際にヘッダなどを出力する際に取り出すことができます.これを使い,次のような順で柱の出力が行われます.

  1. \section\subsection(の内部で使われている\@startsection)から\sectionmark\subsectionmarkが呼び出される.
  2. \sectionmarkは「左のマーク」に現在見出しを,右のマークに空文字列を設定する.\subsectionmarkは右のマークに現在見出しを設定する.左のマークはそのままにする.
  3. 柱が出力される際に,偶数ページならば左のマークが,奇数ページならば右のマークが参照される.

マークの設定 / 取得には以下の命令を使います.

  • \markboth{<左のマーク>}{<右のマーク>}で両方のマークを設定する.\markright{<右のマーク>}で右のマークを設定する(左のマークはそのまま).
  • \leftmark\rightmarkで,それぞれ左のマークと右のマークが取得できる.

通常,\sectionmark\subsectionmarkなどの定義は\pagestyleでペーシスタイルを設定した際に定義されるようです.以下のページスタイルの設定でこの定義を入れることにします.

\@mkboth

\tableofcontentsや索引などの中では,\@mkbothというマクロが呼ばれています.これは,\sectionにおける\sectionmarkと同様の立ち位置です.必要ならば\@mkbothを再定義する必要があります.通常,\let\@mkboth=\markbothとするか,\def\@mkboth#1#2{}*1とするかします.

ページスタイル

\pagestyle{<style>}の実態はマクロ\ps@<style>の呼び出し.このマクロをクラスファイル内で定義します.

  • \@oddhead\@oddfoot\@evenhead\@evenfoot.必須です.命令名から明らかかと思いますが,それぞれ奇数ページのヘッダ,奇数ページのフッタ,偶数ページのヘッダ,偶数ページのフッタを定めます.ただし,\@twosidetrueを実行していない場合は常に奇数ページのものが適用されます.
  • \@mkboth.必要ならば.
  • \<見出し命令名>mark.必要なもののみ.

標準クラスファイルと同様に,empty,plain,headings,myheadingsを定義するようにします.なおemptyとplainはLaTeX内で定義されているます.特にemptyは改めて定義する必要は無いでしょう.といいながら以下では一応定義を書いてみますが.まずはemptyとplainです.

\def\ps@empty{% emptyスタイル,全て空
  \def\@mkboth##1##2{}%
  \def\@oddhead{}%
  \def\@oddfoot{}%
  \def\@evenhead{}%
  \def\@evenfoot{}%
}
\def\ps@plain{% plainスタイル.ページ数のみを出す.奇数ページで右下,偶数ページで左下に出るようにする.
  \def\@mkboth##1##2{}%
  \def\@oddhead{}%
  % 既定ではヘッダは傍注部分を無視した本文の上に出るので,それを傍注の部分にまでかかるように調整する
  \def\@oddfoot{\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\hfil\thepage}\hskip -\dimexpr\marginparsep + \marginparwidth\relax}%
  \def\@evenhead{}%
  \def\@evenfoot{\hskip -\dimexpr\marginparsep + \marginparwidth\relax\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\thepage\hfil}}%
}

もちろん傍注を使わない / よくある「傍注を無視した本文部分のみにヘッダやフッタが出る」という挙動で良いのであればそれに関する調整は不要です.headingsは次の通り.ページ数はplainと同じ場所,柱はその上に出すことにします.ついでに下線も引いてみましょう.

\def\ps@headings{% headingsスタイル.
  \let\@mkboth=\markboth
  \def\sectionmark##1{\markboth{##1}{}}% 左のマークを\sectionの見出しとし,右マークをクリア
  \def\subsectionmark##1{\markright{##1}}% 右のマークを設定
  %  右上に\subsectionの見出し
  \def\@oddhead{\underline{\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\hfil\rightmark}}\hskip -\dimexpr\marginparsep + \marginparwidth\relax}%
  \def\@oddfoot{\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\hfil\thepage}\hskip -\dimexpr\marginparsep + \marginparwidth\relax}%
  % 左上に\subsectionの見出し
  \def\@evenhead{\hskip -\dimexpr\marginparsep + \marginparwidth\relax\underline{\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\leftmark\hfil}}}%
  \def\@evenfoot{\hskip -\dimexpr\marginparsep + \marginparwidth\relax\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\thepage\hfil}}%
}

myheadingsはheadingsから\sectionmarkなどを空にしたものです.

\def\ps@myheadings{% headingsスタイル.
  \def\@mkboth##1##2{}%
  \def\sectionmark##1{}%
  \def\subsectionmark##1{}%
  \def\@oddhead{\underline{\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\hfil\rightmark}}\hskip -\dimexpr\marginparsep + \marginparwidth\relax}%
  \def\@oddfoot{\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\hfil\thepage}\hskip -\dimexpr\marginparsep + \marginparwidth\relax}%
  \def\@evenhead{\hskip -\dimexpr\marginparsep + \marginparwidth\relax\underline{\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\leftmark\hfil}}}%
  \def\@evenfoot{\hskip -\dimexpr\marginparsep + \marginparwidth\relax\hbox to \dimexpr\textwidth + \marginparsep + \marginparwidth\relax{\thepage\hfil}}%
}

縦書き

縦書きでも基本は同じですが,\marginparwidthなどは考慮しなくて良くなります.

*1
LaTeX内では\long\def\@gobbletwo#1#2{}により定義されているマクロ\@gobbletwoがあるので,このマクロを使い\let\@mkboth=\@gobbletwoとすることもできます.こちらの方が多いようです.

0 件のコメント:

コメントを投稿

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