OSDN Git Service

regenerate pdf
[luatex-ja/luatexja.git] / doc / lltjp-geometry.tex
1 %#! lualatex
2 \documentclass[a4paper,10ptj]{ltjsarticle}
3 \usepackage[textwidth=42\zw, lines=42, footskip=2\zh, verbose]{geometry}
4 \usepackage{listings,amsmath,booktabs,lltjext,bxghost}
5 \usepackage{unicode-math}
6 \setmathfont{Latin Modern Math}
7 \usepackage[match]{luatexja-fontspec}
8 \usepackage[haranoaji]{luatexja-preset}
9 \setmonojfont{HaranoAjiGothic-Regular}
10 \normalsize
11 \def\emph#1{\textbf{\textgt{\mathversion{bold}#1}}}
12 \def\headfont{\normalfont\bfseries\gtfamily}
13 \def\pTeX{p\kern-.05em\TeX}
14 \def\cs#1{\text{\eghostguarded{\texttt{\char`\\#1}}}}
15 \protected\def\Pkg#1{\textsf{#1}}
16 \protected\def\>{\hskip\ltjgetparameter{xkanjiskip}}
17 \lstset{
18   basicstyle=\ttfamily, basewidth=0.5em,
19 }
20 \makeatletter\let\SX@Info=\relax\makeatother
21 \fboxsep=0mm
22
23 \usepackage{hyperref,bookmark,xcolor}
24 \hypersetup{%
25         unicode,
26         colorlinks,
27         allbordercolors=1 1 1,
28         allcolors=blue,
29         pdftitle={lltjp-geometryパッケージ}
30 }
31
32 \def\LuaTeX{Lua\TeX}
33 \definecolor{blue}{rgb}{0, 0.25, 1}
34
35 \title{\Pkg{lltjp-geometry}パッケージ}
36 \author{\LuaTeX-jaプロジェクト\null%
37   \thanks{\url{http://osdn.jp/projects/luatex-ja/wiki/FrontPage}}}
38 \begin{document}
39 \maketitle
40
41 ページレイアウトの設定として,\href{http://www.ctan.org/pkg/geometry}%
42 {\Pkg{geometry}パッケージ}が有名であるが,
43 これはp\LaTeX・\LuaTeX-jaの縦組クラスでは利用が不可能という問題があった.
44 本文書で解説する\Pkg{lltjp-geometry}パッケージは,\Pkg{geometry}パッケージを
45 縦組クラスに対応させるパッチである.
46
47
48 \section{利用方法}
49 \Pkg{lltjp-geometry}パッケージは,\LuaTeX-jaに標準で含まれている.
50 本パッケージの動作には\href{http://www.ctan.org/pkg/ifluatex}{\Pkg{ifluatex}},
51 \href{https://www.ctan.org/pkg/etoolbox}{\Pkg{etoolbox}}パッケージが必要である.
52 また,\LaTeXe~2020\nobreakdash-02\nobreakdash-02以前では\href{http://www.ctan.org/pkg/filehook}{\Pkg{filehook}}パッケージも必要である.
53
54 \LuaTeX-jaでは,自動的に\Pkg{lltjp-geometry}パッケージが読み込まれる.
55 縦組クラスか否かの自動判定(\ref{ssec:auto}節)を上書きしたい場合は,
56 \begin{lstlisting}
57 % \PassOptionsToPackage{force}{lltjp-geometry} % 強制的に有効
58 \PassOptionsToPackage{disable}{lltjp-geometry} % 強制的に無効
59 \documentclass{...}
60 \usepackage[...]{geometry}
61 \end{lstlisting}
62 のように\emph{\Pkg{luatexja}の読み込み前}に\cs{PassOptionsToPackage}で
63 本パッケージに渡すオプションを指定する(\cs{usepackage\{lltjp-geometry\}}\>を行っても意味がない).
64
65 \pTeX 系列では,\Pkg{tarticle}, \Pkg{tbook}, \Pkg{treport}といった
66 \emph{縦組クラスを使う場合}に,
67 \begin{lstlisting}
68 \usepackage[...]{lltjp-geometry}
69 \usepackage[...]{geometry}
70 \end{lstlisting}
71 と,\Pkg{geometry}パッケージの\emph{前}に読み込む.
72
73 \subsection{縦組クラスか否かの判定}
74 \label{ssec:auto}
75 本パッケージは,以下のいずれかが該当する場合に「現在のクラスは縦組クラス」と自動判定し,
76 \Pkg{geometry}パッケージ読み込み直後にパッチを当てる:
77 \begin{enumerate}
78   \item \Pkg{geometry}パッケージを読み込む際に,現在の組方向が縦組になっている.
79   \item \cs{AtBeginDocument}により
80   \footnote{\LaTeXe~2020-10-01以降ではそれと同義な\>\cs{AddToHook\{begindocument\}}\>も含む.}指定される,
81   \cs{begin\{document\}}\>時に実行される内容に\cs{tate}(というトークン)が含まれている.
82   \item 本パッケージを読み込む際に\texttt{force}オプションが指定されている.
83 \end{enumerate}
84
85 \LuaTeX-jaで縦組クラスを利用する場合は主に1.の,
86 \pTeX 系列で縦組クラスを利用する場合は主に2.の状況となる
87 \footnote{%
88   標準縦組クラスでは,\cs{begin\{document\}}\>の内部で組方向を縦組に変更する.
89 }.
90
91 上記の自動判定がうまく行かなかったときに備え,
92 本パッケージには\texttt{force}オプションと\texttt{disable}オプションを用意した.
93 \begin{itemize}
94   \item \texttt{force}オプションが指定されている場合は,自動判定の結果に関わらず
95   \Pkg{geometry}パッケージ読み込み直後にパッチを当てる.
96   \item \texttt{disable}オプションが指定されている場合は,自動判定の結果に関わらず
97   何もしない.
98 \end{itemize}
99
100 \section{\Pkg{lltjp-geometry}使用時の注意事項}
101
102 \subsection{\texttt{twoside}指定時}
103 縦組の本は通常右綴じである.これを反映し,
104 \texttt{twoside}オプション指定時には
105 \begin{itemize}
106 \item \texttt{left}, \texttt{lmargin}は小口側の余白,
107 \texttt{right}, \texttt{rmargin}はノド側の余白を指す.
108 \item 左右余白比 \texttt{hmarginratio}の標準値は$3:2$に変更.
109 \item \texttt{bindingoffset}は\emph{右側}に余白を確保する.
110 \end{itemize}
111 と変更している.
112
113 \subsection{widthとheight}
114 \cs{textwidth}が字送り方向の長さ(縦)を表すのと同様に,
115 \texttt{width}, \texttt{totalwidth}, \texttt{textwidth}キーの値も字送り方向を,また
116 \texttt{height}, \texttt{totalheight}, \texttt{textheight}キーの値も行送り方向(横)を表すようになっている.
117
118 しかし,\emph{用紙サイズについては例外}であり,物理的な意味での幅・高さを表す.
119 \texttt{paperwidth}, \texttt{layoutwidth}はそれぞれ紙の横幅,レイアウトの横幅を,
120 \texttt{paperheight}, \texttt{layoutheight}はそれぞれ紙の高さ,レイアウトの高さを表している.
121
122
123
124 \subsection{傍注}
125 縦組の場合,傍注は本文の上下に配置される\footnote{%
126   二段組の場合は上下共に,一段組の場合は標準では下側だが,
127   \texttt{reversemp}が指定されたときには上側に配置される.
128 }.これにより,\emph{\texttt{includemp}(や \texttt{includeall})が
129 未指定の場合,傍注はヘッダやフッタに重なる}.
130 \texttt{includemp}指定時は,\cs{footskip}, \cs{headsep}のいずれか
131 (二段組の場合は両方)を$\cs{marginparwidth} + \cs{marginparsep}$だけ
132 増加させる.
133
134 \section{\texttt{lines}オプションに関する注意事項}
135 本節の内容は,\Pkg{lltjp-geometry}パッケージを読み込まない場合,
136 つまり,横組クラスで\Pkg{geometry}パッケージを普通に使用した場合にも
137 当てはまる注意事項である.
138
139 % \subsection{\Pkg{fontspec}パッケージとの干渉}
140 % \Pkg{fontspec}パッケージの,読み込み直後に
141 % \Pkg{geometry}パッケージを用いてレイアウトを設定すると,
142 % \texttt{lines}による指定が正しく働かないという症状が生じる:
143 % \begin{lstlisting}
144 % \documentclass{article}
145 % \usepackage{geometry}
146 % \usepackage{fontspec}
147 % \geometry{lines=20}
148 % \begin{document}
149 % hoge\typeout{\the\topskip, \the\baselineskip, \the\textheight}
150 % \end{document}
151 % \end{lstlisting}
152 % \cs{typeout}で\cs{topskip}, \cs{baselineskip}, \cs{textheight}の値を調べると
153 % \[
154 %  \frac{\cs{textheight} - \cs{topskip}}{\cs{baselineskip}} = 15.8\dot 3
155 % \]
156 % となることがわかるから,1ページには16行分入らないことがわかる.
157
158 % これは,\Pkg{fontspec}の読み込みによって\cs{baselineskip}がなぜか
159 % 10\,ptに変えられてしまい,\cs{geometry}命令はその値に従って本文領域の高さを計算するためで
160 % ある.とりあえずの対策は,
161 % \cs{normalsize}によって\cs{baselineskip}を正しい値に再設定し,その後
162 % レイアウトを設定すれば良い:
163 % \begin{lstlisting}
164 % \usepackage{geometry}
165 % \usepackage{fontspec}
166 % \normalsize\geometry{lines=20}
167 % \end{lstlisting}
168
169
170 \subsection{\cs{maxdepth}の調整}
171 \LaTeX では,
172 最後の行の深さ\rensuji{$d$}と
173 本文領域の上端から最後の行のベースラインまでの距離\rensuji{$f$}に対し,
174 \[
175  \cs{textheight}= f+\max(0, d-\cs{maxdepth})
176 \]
177 が成り立つ.
178
179 \pTeX 系列の標準縦組クラス\Pkg{[u]tarticle}等,
180 及びそれを\LuaTeX-ja用に移植した\Pkg{ltjtarticle}等では,
181  \cs{topskip}は\emph{横組時における}全角空白の高さ7.77588\,pt\footnote{%
182   標準の\texttt{10pt}オプション指定時.以下同じ.
183   ところで,この量は公称フォントサイズの10\,ptか,もしくは
184   全角空白の高さと深さを合わせた値の9.16446\,ptの間違いではないか,と筆者は考えている.
185   なお,奥村晴彦氏の\href{https://oku.edu.mie-u.ac.jp/~okumura/jsclasses/}%
186   {p\LaTeXe 新ドキュメントクラス}では公称ポイントサイズ10\,ptに設定されている.
187 }であり,\cs{maxdepth}はその半分の値(従って3.88794\,pt)である.
188
189 いくつかのフォントについて,その中の文字の深さの最大値を見てみると
190 表\ref{tab:baseline}のようになっている.
191 \begin{table}[tb]
192  \layoutfloat[c]{%
193  \begin{tabular}<y>{ll}
194   \toprule
195   \bfseries フォント(10\,pt)&\bfseries 深さ(pt単位)\\
196   \midrule
197   横組用の標準和文フォント(\pTeX)&1.38855\\
198   縦組用の標準和文フォント(\pTeX)&4.58221\\
199   \midrule
200   Computer Modern Roman 10\,pt&2.5\\
201   Computer Modern Sans Serif 10\,pt&2.5\\
202   Times Roman (\texttt{ptmr8t})&2.16492\\
203   Helvetica Bold Oblique (\texttt{phvbo8t})&2.22491\\
204   Palatino (\texttt{pplr8t})&2.75989\\
205   \bottomrule
206  \end{tabular}}
207  \pcaption{いくつかのフォント中の,文字の深さの最大値
208     \label{tab:baseline}}
209 \end{table}
210 欧文フォントのベースラインは,そのままでは和文との組み合わせが悪いので,
211 さらに$\Pkg{tbaselineshift}=3.41666\,\textrm{pt}$だけ下がることを考えると,
212 最後の行に和文文字が来た場合はほぼ確実に深さが\cs{maxdepth}を超えてしまうことになる.
213 従って,本文領域を「\rensuji{$n$}行分」として指定するときによく使われる
214 \begin{equation}
215    \cs{textheight} = \cs{topskip} + (n-1)\cs{baselineskip}
216  \label{eq:nline}
217 \end{equation}
218 は\Pkg{tarticle}クラスのデフォルトでは通用しない.
219
220 通常の地の文のみの文章においてほぼ確実に\eqref{eq:nline}が成り立つようにするため,
221 \Pkg{lltjp-geometry}では\emph{\texttt{lines}オプション指定時のみ}\cs{maxdepth}の値が
222 最低でも
223 \begin{quote}
224 公称ポイントサイズの半分に,欧文ベースラインのシフト量を加えた値%
225 \footnote{\Pkg{tarticle}の場合だと,
226 $5\,\textrm{pt} + 3.41666\,\textrm{pt}=8.41666\,\textrm{pt}$である.}
227 \end{quote}
228 になるようにしている.\texttt{lines}オプション非指定時にはこのような調整は
229 行われない.
230
231
232 \subsection{見かけ上の基本版面の位置}
233 \LaTeX では,
234 本文の一行目のベースラインは,本文領域の「上端」から
235  \cs{topskip}\ だけ「下がった」ところに来ることになっている.
236 あまり\cs{topskip}が小さいと,ユーザが大きい文字サイズを指定した時に1行目のベースライン
237 位置が狂う危険があるため,
238 \Pkg{geometry}パッケージでは
239 \begin{quote}
240  \texttt{lines}オプション指定時,\cs{topskip}の値を最低でも
241  \cs{strutbox}の高さ($0.7\cs{baselineskip}$)まで引き上げる
242 \end{quote}
243 という仕様になっている.
244
245 縦組の場合は,\cs{strutbox}に対応するボックスは\cs{tstrutbox}であるため,
246 \Pkg{lltjp-geometry}では
247 \begin{quote}
248  \texttt{lines}オプション指定時,\cs{topskip}の値を最低でも
249  \emph{\cs{tstrutbox}の高さ}($\cs{baselineskip}/2$)まで引き上げる
250 \end{quote}
251 という挙動にした.見かけ上は\cs{topskip}の値制限が緩くなったが,前節で述べたように
252 欧文フォントのベースラインは和文に合うように下にずらされるので,
253 実用上は問題は起きないだろう.
254
255 前節の\cs{maxdepth}の調整も考え合わせると,\emph{\LaTeX が認識する本文領域と,
256 実際の見た目の基本版面の位置とは異なる}ことに注意してほしい.
257
258 \medskip
259 例えばA4縦を縦組で,公称フォントサイズ10\,pt,行送り18\,pt,30行左右中央
260 というレイアウトにするため,
261 \begin{lstlisting}
262 \documentclass{tarticle}
263 \usepackage{lltjp-geometry}
264 \baselineskip=18pt
265 \usepackage[a4paper,hcentering,lines=30]{geometry}
266 \end{lstlisting}
267 と指定すると,実際には以下のように設定される.
268 \begin{itemize}
269  \item\cs{topskip}は\cs{tstrutbox}の高さ8.5\,ptに設定される.
270  \item 本文領域の「高さ」\cs{textheight}は
271 \[
272  \cs{topskip}+ (30-1)\cs{baselineskip}= 530.5\,\textrm{pt}.
273 \]
274  \item 従って,左余白と右余白は
275 \[
276  \frac{210\,\textrm{mm}-\cs{textheight}}2 = 33.50394\,\textrm{pt}.
277 \]
278 \end{itemize}
279 しかし,実際にはページの最初の行のベースラインは,本文領域の右端から
280 \cs{topskip}だけ左にずれたところにあり,
281 一方ページの最終行のベースラインは本文領域の左端にある.
282 縦組和文フォントのベースラインは文字の左右中央を通ることから,
283 従って,\emph{見た目で言えば,右余白の方が\cs{topskip}}~($=8.5\,\textrm{pt}$)%
284 \emph{だけ大きい}ということになってしまう\footnote{%
285   同様に,横組で \texttt{vcentering}を指定すると,見かけでは
286   $\cs{topskip}-\cs{Cht}+\cs{Cdp}$だけ上余白が大きいように見える.
287 }.
288
289
290 \end{document}