2019年12月13日

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

縦書き

縦書きにするならばこのあたりで\tateを実行しておきます.

\tate
\AtBeginDocument{%
  \tate\message{《縦組モード》}% お約束?
  \adjustbaseline % 欧文と和文の中央を一致させるようにパラメータを設定し直す.
}%

文字サイズ変更命令の定義

\largeのような文字サイズの変更を行う命令を定義します.まずは通常のフォントサイズに変更する\normalsizeです.

\renewcommand{\normalsize}{%
  \@setfontsize\normalsize{10pt}{16pt}%
  \abovedisplayskip=11pt plus 3pt minus 4pt
  \abovedisplayshortskip=0pt plus 3pt
  \belowdisplayshortskip=9pt plus 3pt minus 4pt
  \belowdisplayskip=\abovedisplayskip
  \let\@listi\@listI
}

\@setfontsize{<フォントサイズ変更命令>}{<フォントサイズ>}{<行送り>}でフォントサイズの変更をします.なお,フォントサイズ10ptといっても実際にはJFMが等倍でないことや\DeclareFontShapeで指定したフォントの拡大率の影響で,10ptの和文フォントになるとは限りません.その次の四行は数式の前後の空きの設定です.最後の\let\@listi\@listIはenumerate環境の定義の段階で説明します.

早速定義した\normalsizeを実行し,またpLaTeXで定義されている寸法レジスタを設定します.これらはクラスファイル内で値を与えることになっています.

\normalsize
\setbox0\hbox{阿}% JFM内でクラス0の文字ならば何でもよい
\setlength\Cht{\ht0}
\setlength\Cdp{\dp0}
\setlength\Cwd{\wd0}
\setlength\Cvs{\baselineskip}
\setlength\Chs{\wd0}

そのほかの文字サイズ変更命令を定義していきます.値は例によってjsarticleのものです.

\newcommand{\small}{% abstractとかで使われる
  \@setfontsize\small{9pt}{13pt}%
  \abovedisplayskip=9pt plus 3pt minus 4pt
  \abovedisplayshortskip=0pt plus 3pt
  \belowdisplayskip=\abovedisplayskip
  \belowdisplayshortskip=\belowdisplayskip
  \def\@listi{%
    \leftmargin=\leftmargini
    \topsep=0pt
    \parsep=0pt
    \itemsep=\parsep
  }%
}
\newcommand{\footnotesize}{% 脚注の文字サイズ
  \@setfontsize\footnotesize{8pt}{11pt}%
  \abovedisplayskip=6pt plus 2pt minus 3pt
  \abovedisplayshortskip=0pt plus 2pt
  \belowdisplayskip=\abovedisplayskip
  \belowdisplayshortskip=\belowdisplayskip
  \def\@listi{%
    \leftmargin\leftmargini
    \topsep=0pt
    \parsep=0pt
    \itemsep=\parsep
  }%
}
\newcommand{\scriptsize}{\@setfontsize\scriptsize{7pt}{8pt}}
\newcommand{\tiny}{\@setfontsize\tiny{5pt}{6pt}}
\newcommand{\large}{\@setfontsize\large{12pt}{17pt}}
\newcommand{\Large}{\@setfontsize\Large{14pt}{21pt}}
\newcommand{\LARGE}{\@setfontsize\LARGE{17pt}{25pt}}
\newcommand{\huge}{\@setfontsize\huge{20pt}{28pt}}
\newcommand{\Huge}{\@setfontsize\Huge{25pt}{33pt}}
\largeあたりは見出しで使われることが多いです.jsarticleにはさらに大きな文字サイズに変更する\HUGEがありますが,これは標準クラスファイルにはありませんので,ここでも定義はしません.

\set@fontsizeの書き換え

通常の日本語組版の要件に合わせて

  • 段落先頭の空き(\parindent)は全角一文字分
  • 和文文字と欧文文字の間の空き(\xkanjiskip)は0.25文字分(いわゆる「四分空き」)
とします.これは文字サイズに比例して変更されるので,文字サイズが変更された場合にそれに追随して変更するようにします.上記で定義した命令群内で使われている\@setfontsizeにその処理を追加してもよいのですが,この命令は\fontsizeによる変更の際に呼び出されないので,代わりに\set@fontsizeを書き換えておきます.

\set@fontsizeは内部で\size@updateという命令を定義し,実際の文字サイズの変更は\size@updateが実行された時に行われます.従って,\size@updateの後に\parindent\xkanjiskipを変更するようにします.ついでに\kanjiskipも変更してしまいましょう.latex.ltx内の\set@fontsizeの定義を参考にしつつ,次のようにしてみます.

\let\mycls@original@set@fontsize=\set@fontsize % オリジナルの\set@fontsizeを保存.他のパッケージなどとバッティングしないために接頭辞\mycls@をつける
\def\set@fontsize#1#2#3{%
  \mycls@original@set@fontsize{#1}{#2}{#3}%
  \expandafter\def\expandafter\size@update\expandafter{\size@update % \size@updateの末尾にマクロを追加する定型文
    \ifdim\parindent=0pt \else\parindent=1zw \fi % 意図的に\parindent=0ptとすることもあるので,そうでないときのみ更新する
    \kanjiskip=0zw plus .1zw minus .01zw % jsarticleの値
    \xkanjiskip=0.25zw plus 0.25zw minus 0.125zw
  }%
}
\normalsize % これで\parindent等が更新される
LuaTeX-jaの場合

LuaTeX-jaにおける(x)kanjiskipの設定は\ltjsetparameterを通じて行います.が,高速化のために用意されている方法があるので,そちらを利用します.

\let\mycls@original@set@fontsize=\set@fontsize
\def\set@fontsize#1#2#3{%
  \mycls@original@set@fontsize{#1}{#2}{#3}%
  \expandafter\def\expandafter\size@update\expandafter{\size@update
    % zwを\zwにしなければならない
    \ifdim\parindent=0pt \else\parindent=1\zw \fi
    \ltj@setpar@global
    \ltjsetkanjiskip 0\zw plus .1\zw minus .01\zw
    \ltjsetxkanjiskip 0.25\zw plus 0.25\zw minus 0.125\zw
  }%
}

行間等に関するパラメータの設定

行間 / 文字サイズに関係するパラメータを設定しておきます.値はjarticleからですが,ほぼ常にこのような値になるかと思います.

\setlength{\lineskip}{1pt}% 行間の最低空き
\setlength{\normallineskip}{1pt}% 保存用\lineskip.
\setlength{\parskip}{0pt plus 1pt}% 段落館の空き
\renewcommand{\baselinestretch}{} % 行間の拡大率.拡大しない場合は空にしておく.
\@lowpenalty=51 % 小さいpenalty(汎用的に使われる)
\@medpenalty=151 % 中くらいのpenalty
\@highpenalty=301 % 大きめのpenalty

0 件のコメント:

コメントを投稿

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