2019年12月14日

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

基本版面などを調整していきます.まずは横書きとします.

紙サイズ

紙のサイズを設定します.ここではA4(横210mm,縦297mm)にします.

\paperwidth=210mm
\paperheight=297mm
% 下二つはe-pTeXのprimitive
\setlength{\pdfpagewidth}{\paperwidth}
\setlength{\pdfpageheight}{\paperheight}

この紙サイズはあくまでLaTeXシステムの認識する紙サイズであり,出力されたDVIに残るわけではありません.dviout / dvips / dvipdfmxあたりでdviを扱うことが確定している場合は,papersize specialを発行することで,DVI内に紙サイズの情報を残します.DVI開始時まで遅延するために,\AtBeginDvi内に入れておきます.

\AtBeginDvi{\special{papersize=\the\paperwidth,\the\paperheight}}

LuaTeX-jaの場合は\pdfpagewidth\pdfpageheightの代わりに\pagewidth\pageheightを設定します.これらが生成されるPDFの紙サイズとなります.papersize specialは不要です.

\setlength{\pagewidth}{\paperwidth}
\setlength{\pageheight}{\paperheight}

段組

二段組みにする場合は\@twocolumntrueを実行し,関連するパラメータを設定します.

\setlength{\columnsep}{2zw}% 左右(縦書きの場合は上下)の段の間の幅
\setlength{\columnseprule}{0pt}% 段の間に引かれる線の幅.0ptだと線を引かない.

twoside

標準クラスファイルにtwosideオプションを指定したときと同様にするには,\@twosidetrueを実行しておきます.

\@twosidetrue

傍注

\marginparで出力される傍注のパラメータを設定します.利用しない場合は0ptなどにすればよいですが,ここでは少し値を設定してみることにします.

\setlength{\marginparwidth}{10zw}% 傍注の幅
\setlength{\marginparsep}{1zw}% 傍注と本文との間の長さ
\setlength{\marginparpush}{0.5zw}% 連続する傍注間の空き

デフォルトでは傍注は右側に出力されます.ページの偶奇に応じて左右を入れ替えるには\@mparswitchtrueを実行しておきます.

\@mparswitchtrue

横方向

横方向の配置をします.次のようにすることにしましょう.

  • 横書き.一段組.
  • 行長は35zw(全角35文字分)
  • 傍注は上記の通り行長10zw,本文との空きが1zw.また\@marswitchtrueは実行されているとする.
  • 本文および傍注を合わせた領域を中央配置する.

まず行長を35zwに設定します.

\setlength{\textwidth}{35zw}

紙の端から本文領域までの左の空きは\oddsidemarginおよび\evensidemarginです.この値を調整して中央配置させましょう.ただし,原点が1インチずれているというTeXの謎仕様があるので,1inずらさなければなりません.(この調整は最後に行います.)計算にはe-TeXのプリミティブである\dimexprを使います.\dimexpr <式>\relaxとして使うことで<式>の値を解釈してくれます.

\setlength{\oddsidemargin}{\dimexpr(\paperwidth - \textwidth - \marginparsep - \marginparwidth)/2\relax}% 紙の長さから本文と傍注の長さを引き半分にする.

\evensidemarginは紙面左側と本文との空きで,傍注部分は考慮されません.偶数ページでは傍注は左に来ます.傍注と紙面左側の脇を奇数ページの左空きである\oddsidemarginと同様にしたいので,傍注部分を足しておきます.

\setlength{\evensidemargin}{\dimexpr\oddsidemargin + \marginparsep + \marginparwidth\relax}
二段組みの場合

二段組みの場合は,傍注は左右どちらにも出現します.そのため,左右の傍注と本文部分を合わせた領域を中央配置した方がよいでしょう.このときは偶数ページも奇数ページと同じです.

\setlength{\oddsidemargin}{\dimexpr(\paperwidth - \textwidth - 2\marginparsep - 2\marginparwidth)/2\relax}
\setlength{\evensidemargin}{\oddsidemargin}

ちなみに二段組みの場合の\textwidthは両方の段の行長の和+段間を表します.従って各段の長さは35zwの半分弱になります.

補正

最後に原点がずれている分の補正をします.

\addtolength{\oddsidemargin}{-1in}
\addtolength{\evensidemargin}{-1in}

\topskip

各ページの一行目は,そのベースラインはが上から\topskipの分だけ下がった場所になるように配置されます.

\setlength{\topskip}{1zw}% 特に根拠なし

ヘッダ関連

ヘッダとフッタのレイアウトパラメータを設定します.\headsepはヘッダと本文の間の長さですが,そこから更に上記の\topskip由来の空きが入ることに注意します.もし一行目の高さがデフォルトサイズの和文のみならば,この空きは\topskip - \Chtです.

\setlength{\headheight}{1zw}% ヘッダとフッタ部分の高さ
\setlength{\headsep}{\dimexpr 1zw - \topskip + \Cht\relax}% これで本文の上端とヘッダの下端が全角一文字分空く.
\setlength{\footskip}{\dimexpr 1zw + \headheight\relax}% 本文最終行のベースラインからフッタのベースラインまでの間

本文最終行の深さとフッタの深さが等しいならば,\footskipは本文下端からフッタ下端までの幅ですから,上の設定で本文とフッタとの間が全角一文字分空きます.ただし,実際にはフッタは本文より小さい文字が使われることが多く,そのためフッタの深さの方が少し短くなるので,厳密にはずれてしまいます.が,考慮しないことにします.もちろんフッタに使われる文字サイズがわかっている場合はそこから厳密に合わせることができます.

縦方向

縦方向は次のような設定をします.

  • 一ページ35行.
  • 中央配置.

設定するのは本文の縦方向の長さである\textheightと紙の一番上からヘッダの一番上までの長さである\topmarginです.\textheightは本文を包み込むボックスの高さになるので,下端は最終行のベースラインになります.上端は本文頭ですが,\topskip由来のグルーがあります.これにより,(\topskipが一行目の高さより長いという仮定のもとでは)\textheight = <一行目のベースラインから最終行のベースラインまでの長さ> + \topskipとなります.35行にしたいので一行目のベースラインから最終行のベースラインまでの長さは34\baselineskipです.

\setlength{\textheight}{\dimexpr 34\baselineskip + \topskip\relax}

中央配置になるように\topmarginを設定します.本文はすべて同じフォントサイズの和文で敷き詰められているとしましょう.このとき,本文の入る部分の縦方向の長さは34\baselineskip + 1zwとなります.よって本文の前に(\paperheight - (34\baselineskip + 1zw))/2の高さを入れればよいことになります.\topmarginはヘッダまでの高さですから,\headheight\headsepを更に引きます.更に,\topskip由来の空きである\topskip - \Chtも引きます.(「本文はすべて同じフォントサイズの和文で敷き詰められている」という仮定から一行目の高さはさきほど設定した\Chtです.)以上により次のようになります.

\setlength{\topmargin}{\dimexpr (\paperheight - (34\baselineskip + 1zw))/2 - \headheight - \headsep - \topskip + \Cht\relax}

最後に原点のずれを補正します.

\addtolength{\topmargin}{-1in}

\maxdepthも設定しておきます.これは,本文最終行の深さの最大値で,本文最終行の深さがこの値を超えた場合,TeXは最終行の参照点を移動し,深さが\maxdepthになるようにします.classes.pdfには\maxdepth + \topskipがフォントサイズの1.5倍になるようにと書いてあるので,それに従います.

\setlength{\maxdepth}{\dimexpr 1.5zw - \topskip\relax}

脚注

脚注関連のパラメータを設定しておきます.

% 脚注一行目の最低高さである\footnotesepを指定する.大きくすると脚注間に空きが入る
{% 脚注での\baselineskipの0.7倍とする.
  \footnotesize
  \global\setlength\footnotesep{0.7\baselineskip}
}
% 本文と脚注との間の距離
\setlength{\skip\footins}{16pt plus 5pt minus 2pt}
% 本文と脚注との間に引かれる罫線を出力するための命令
\renewcommand{\footnoterule}{%
  \kern -3pt
  \hrule width .4\columnwidth height .4pt % \columnwidthは一段の長さ
  \kern 2.6pt
}
% 脚注自身の出力をするときに呼び出されるマクロ.#1が脚注本文.
\newcommand{\@makefntext}[1]{%
  \advance\leftskip by 3zw % 左に3文字分の空きを加える
  \parindent 1zw
  \noindent
  % \@makefnmarkで脚注の番号を出力する.\llapは長さを0に見せかける命令.これがないと脚注番号が脚注本文に入り込む.
  \llap{\@makefnmark\hspace{0.3zw}}#1%
}

縦書きの場合

縦書きの場合は次に注意します.

  • \marginparは本文の上下に出力されます.\marginparwidthなどはこの部分に対する設定です.
  • \textwidthは一行の長さ(縦方向),\textheightは各ページの行送り方向の長さ(横方向)を表します.
  • \headsep\topskipの影響を受けません.(\topskipは本文右端に入ります.)\footskipは本文の最下端からフッタのベースラインまでです.\marginparにより入る項目からではありません.

以上に注意して次のような設定をしてみましょう.

  • 一段組.
  • 一ページは25行.
  • 一行は60文字.
  • \marginparにより出力される分の一行の長さは5文字分.
  • 中央配置する.
\setlength{\marginparwidth}{5zw}
\setlength{\marginparsep}{1zw}
\setlength{\marginparpush}{0.5zw}
\setlength{\topskip}{1zw}
% ヘッダとフッタ
\setlength{\headheight}{1zw}
\setlength{\headsep}{1zw}% \topskipなどの寄与はないので素直でよい
\setlength{\footskip}{\dimexpr 1zw + \marginparwidth + \marginparsep + \Cht\relax}% \marginparの分を加えておく
% 横
\setlength{\textheight}{\dimexpr24\baselineskip + \topskip\relax}
% \oddsidemarginは紙面左端から最終行のベースラインまでの長さ.一行目と最終行のベースラインの間の長さを紙の長さから引き半分にする.
\setlength{\oddsidemargin}{\dimexpr(\paperwidth - \textheight + \topskip)/2\relax}
\addtolength{\oddsidemargin}{-1in}% 補正
\setlength{\evensidemargin}{\oddsidemargin}
% 縦
\setlength{\textwidth}{60zw}
\setlength{\topmargin}{\dimexpr (\paperheight - (\textwidth + \marginparwidth + \marginparsep))/2 - \headsep - \headheight\relax}
\addtolength{\topmargin}{-1in}

0 件のコメント:

コメントを投稿

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