summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luatexja/doc/lltjp-geometry.tex
blob: 1b2aa5ed59623628061b2c911e4b5ab01ec6ba95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
%#! lualatex
\documentclass[a4paper,10pt]{ltjsarticle}
\usepackage[textwidth=45\zw, lines=45, footskip=2\zh, verbose]{geometry}
\usepackage{listings,amsmath,booktabs,lltjext,bxghost}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}
\usepackage[match]{luatexja-fontspec}
\usepackage[haranoaji]{luatexja-preset}
\setmonojfont{HaranoAjiGothic-Regular}
\normalsize
\def\emph#1{\textbf{\textgt{\mathversion{bold}#1}}}
\def\headfont{\normalfont\bfseries\gtfamily}
\def\pTeX{p\kern-.05em\TeX}
\def\cs#1{\text{\eghostguarded{\texttt{\char`\\#1}}}}
\protected\def\Pkg#1{\textsf{#1}}
\protected\def\>{\hskip\ltjgetparameter{xkanjiskip}}
\lstset{
  basicstyle=\ttfamily, basewidth=0.5em,
}
\makeatletter\let\SX@Info=\relax\makeatother
\fboxsep=0mm

\usepackage{hyperref,bookmark,xcolor}
\hypersetup{%
	unicode,
	colorlinks,
	allbordercolors=1 1 1,
	allcolors=blue,
	pdftitle={lltjp-geometryパッケージ}
}

\def\LuaTeX{Lua\TeX}
\definecolor{blue}{rgb}{0, 0.25, 1}

\title{\Pkg{lltjp-geometry}パッケージ}
\author{\LuaTeX-jaプロジェクト\null%
  \thanks{\url{http://osdn.jp/projects/luatex-ja/wiki/FrontPage}}}
\begin{document}
\maketitle

ページレイアウトの設定として,\href{http://www.ctan.org/pkg/geometry}%
{\Pkg{geometry}パッケージ}が有名であるが,
これはp\LaTeX・\LuaTeX-jaの縦組クラスでは利用が不可能という問題があった.
本文書で解説する\Pkg{lltjp-geometry}パッケージは,\Pkg{geometry}パッケージを
縦組クラスに対応させるパッチである.


\section{利用方法}
\Pkg{lltjp-geometry}パッケージは,\LuaTeX-jaに標準で含まれている.
本パッケージの動作には\href{http://www.ctan.org/pkg/ifluatex}{\Pkg{ifluatex}},
\href{http://www.ctan.org/pkg/filehook}{\Pkg{filehook}}パッケージが必要である.

\LuaTeX-jaでは,\Pkg{geometry}パッケージ読み込み時に
自動的に\Pkg{lltjp-geometry}パッケージが読み込まれる.
縦組クラスか否かの自動判定(\ref{ssec:auto}節)を上書きしたい場合は,
\begin{lstlisting}
% \PassOptionsToPackage{force}{lltjp-geometry} % 強制的に有効
\PassOptionsToPackage{disable}{lltjp-geometry} % 強制的に無効
\documentclass{...}
\usepackage[...]{geometry}
\end{lstlisting}
のように\emph{\Pkg{luatexja}の読み込み前}に\cs{PassOptionsToPackage}で
本パッケージに渡すオプションを指定する(\cs{usepackage\{lltjp-geometry\}}\>は使えない).

\pTeX 系列では,\Pkg{tarticle}, \Pkg{tbook}, \Pkg{treport}といった
\emph{縦組クラスを使う場合}に,
\begin{lstlisting}
\usepackage[...]{lltjp-geometry}
\usepackage[...]{geometry}
\end{lstlisting}
と,\Pkg{geometry}パッケージの前に読み込む.

\subsection{縦組クラスか否かの判定}
\label{ssec:auto}
本パッケージは,以下のいずれかが該当する場合に「現在のクラスは縦組クラス」と自動判定し,
\Pkg{geometry}パッケージ読み込み直後にパッチを当てる:
\begin{enumerate}
  \item \Pkg{geometry}パッケージを読み込む際に,現在の組方向が縦組になっている.
  \item \cs{AtBeginDocument}により指定される,\cs{begin\{document\}}\>時に実行される内容に
  \cs{tate}(というトークン)が含まれている.
  \item 本パッケージを読み込む際に\texttt{force}オプションが指定されている.
\end{enumerate}
\LuaTeX-jaで縦組クラスを利用する場合は主に1.の,
\pTeX 系列で縦組クラスを利用する場合は主に2.の状況となる
\footnote{%
  標準縦組クラスでは,\cs{begin\{document\}}\>の内部で組方向を縦組に変更する.
}.

上記の自動判定がうまく行かなかったときに備え,
本パッケージには\texttt{force}オプションと\texttt{disable}オプションを用意した.
\begin{itemize}
  \item \texttt{force}オプションが指定されている場合は,自動判定の結果に関わらず
  \Pkg{geometry}パッケージ読み込み直後にパッチを当てる.
  \item \texttt{disable}オプションが指定されている場合は,自動判定の結果に関わらず
  何もしない.
\end{itemize}

\section{\Pkg{lltjp-geometry}使用時の注意事項}

\subsection{\texttt{twoside}指定時}
縦組の本は通常右綴じである.これを反映し,
\texttt{twoside}オプション指定時には
\begin{itemize}
\item \texttt{left}, \texttt{lmargin}は小口側の余白,
\texttt{right}, \texttt{rmargin}はノド側の余白を指す.
\item 左右余白比 \texttt{hmarginratio}の標準値は$3:2$に変更.
\item \texttt{bindingoffset}は\emph{右側}に余白を確保する.
\end{itemize}
と変更している.

\subsection{widthとheight}
\cs{textwidth}が字送り方向の長さ(縦)を表すのと同様に,
\texttt{width}, \texttt{totalwidth}, \texttt{textwidth}キーの値も字送り方向を,また
\texttt{height}, \texttt{totalheight}, \texttt{textheight}キーの値も行送り方向(横)を表すようになっている.

しかし,\emph{用紙サイズについては例外}であり,物理的な意味での幅・高さを表す.
\texttt{paperwidth}, \texttt{layoutwidth}はそれぞれ紙の横幅,レイアウトの横幅を,
\texttt{paperheight}, \texttt{layoutheight}はそれぞれ紙の高さ,レイアウトの高さを表している.



\subsection{傍注}
縦組の場合,傍注は本文の上下に配置される\footnote{%
  二段組の場合は上下共に,一段組の場合は標準では下側だが,
  \texttt{reversemp}が指定されたときには上側に配置される.
}.これにより,\emph{\texttt{includemp}(や \texttt{includeall})が
未指定の場合,傍注はヘッダやフッタに重なる}.
\texttt{includemp}指定時は,\cs{footskip}, \cs{headsep}のいずれか
(二段組の場合は両方)を$\cs{marginparwidth} + \cs{marginparsep}$だけ
増加させる.

\section{\texttt{lines}オプションに関する注意事項}
本節の内容は,\Pkg{lltjp-geometry}パッケージを読み込まない場合,
つまり,横組クラスで\Pkg{geometry}パッケージを普通に使用した場合にも
当てはまる注意事項である.

\subsection{\Pkg{fontspec}パッケージとの干渉}
\Pkg{fontspec}パッケージの,読み込み直後に
\Pkg{geometry}パッケージを用いてレイアウトを設定すると,
\texttt{lines}による指定が正しく働かないという症状が生じる:
\begin{lstlisting}
\documentclass{article}
\usepackage{geometry}
\usepackage{fontspec}
\geometry{lines=20}
\begin{document}
hoge\typeout{\the\topskip, \the\baselineskip, \the\textheight}
\end{document}
\end{lstlisting}
\cs{typeout}で\cs{topskip}, \cs{baselineskip}, \cs{textheight}の値を調べると
\[
 \frac{\cs{textheight} - \cs{topskip}}{\cs{baselineskip}} = 15.8\dot 3
\]
となることがわかるから,1ページには16行分入らないことがわかる.

これは,\Pkg{fontspec}の読み込みによって\cs{baselineskip}がなぜか
10\,ptに変えられてしまい,\cs{geometry}命令はその値に従って本文領域の高さを計算するためで
ある.とりあえずの対策は,
\cs{normalsize}によって\cs{baselineskip}を正しい値に再設定し,その後
レイアウトを設定すれば良い:
\begin{lstlisting}
\usepackage{geometry}
\usepackage{fontspec}
\normalsize\geometry{lines=20}
\end{lstlisting}


\subsection{\cs{maxdepth}の調整}
\LaTeX では,
最後の行の深さ\rensuji{$d$}と
本文領域の上端から最後の行のベースラインまでの距離\rensuji{$f$}に対し,
\[
 \cs{textheight}= f+\max(0, d-\cs{maxdepth})
\]
が成り立つ.

\pTeX 系列の標準縦組クラス\Pkg{[u]tarticle}等,
及びそれを\LuaTeX-ja用に移植した\Pkg{ltjtarticle}等では,
 \cs{topskip}は\emph{横組時における}全角空白の高さ7.77588\,pt\footnote{%
  標準の\texttt{10pt}オプション指定時.以下同じ.
  ところで,この量は公称フォントサイズの10\,ptか,もしくは
  全角空白の高さと深さを合わせた値の9.16446\,ptの間違いではないか,と筆者は考えている.
  なお,奥村晴彦氏の\href{https://oku.edu.mie-u.ac.jp/~okumura/jsclasses/}%
  {p\LaTeXe 新ドキュメントクラス}では公称ポイントサイズ10\,ptに設定されている.
}であり,\cs{maxdepth}はその半分の値(従って3.88794\,pt)である.

いくつかのフォントについて,その中の文字の深さの最大値を見てみると
表\ref{tab:baseline}のようになっている.
\begin{table}[tb]
 \layoutfloat[c]{%
 \begin{tabular}<y>{ll}
  \toprule
  \bfseries フォント(10\,pt)&\bfseries 深さ(pt単位)\\
  \midrule
  横組用の標準和文フォント(\pTeX)&1.38855\\
  縦組用の標準和文フォント(\pTeX)&4.58221\\
  \midrule
  Computer Modern Roman 10\,pt&2.5\\
  Computer Modern Sans Serif 10\,pt&2.5\\
  Times Roman (\texttt{ptmr8t})&2.16492\\
  Helvetica Bold Oblique (\texttt{phvbo8t})&2.22491\\
  Palatino (\texttt{pplr8t})&2.75989\\
  \bottomrule
 \end{tabular}}
 \pcaption{いくつかのフォント中の,文字の深さの最大値
    \label{tab:baseline}}
\end{table}
欧文フォントのベースラインは,そのままでは和文との組み合わせが悪いので,
さらに$\Pkg{tbaselineshift}=3.41666\,\textrm{pt}$だけ下がることを考えると,
最後の行に和文文字が来た場合はほぼ確実に深さが\cs{maxdepth}を超えてしまうことになる.
従って,本文領域を「\rensuji{$n$}行分」として指定するときによく使われる
\begin{equation}
   \cs{textheight} = \cs{topskip} + (n-1)\cs{baselineskip}
 \label{eq:nline}
\end{equation}
は\Pkg{tarticle}クラスのデフォルトでは通用しない.

通常の地の文のみの文章においてほぼ確実に\eqref{eq:nline}が成り立つようにするため,
\Pkg{lltjp-geometry}では\emph{\texttt{lines}オプション指定時のみ}\cs{maxdepth}の値が
最低でも
\begin{quote}
公称ポイントサイズの半分に,欧文ベースラインのシフト量を加えた値%
\footnote{\Pkg{tarticle}の場合だと,
$5\,\textrm{pt} + 3.41666\,\textrm{pt}=8.41666\,\textrm{pt}$である.}
\end{quote}
になるようにしている.\texttt{lines}オプション非指定時にはこのような調整は
行われない.


\subsection{見かけ上の基本版面の位置}
\LaTeX では,
本文の一行目のベースラインは,本文領域の「上端」から
 \cs{topskip}\ だけ「下がった」ところに来ることになっている.
あまり\cs{topskip}が小さいと,ユーザが大きい文字サイズを指定した時に1行目のベースライン
位置が狂う危険があるため,
\Pkg{geometry}パッケージでは
\begin{quote}
 \texttt{lines}オプション指定時,\cs{topskip}の値を最低でも
 \cs{strutbox}の高さ($0.7\cs{baselineskip}$)まで引き上げる
\end{quote}
という仕様になっている.

縦組の場合は,\cs{strutbox}に対応するボックスは\cs{tstrutbox}であるため,
\Pkg{lltjp-geometry}では
\begin{quote}
 \texttt{lines}オプション指定時,\cs{topskip}の値を最低でも
 \emph{\cs{tstrutbox}の高さ}($\cs{baselineskip}/2$)まで引き上げる
\end{quote}
という挙動にした.見かけ上は\cs{topskip}の値制限が緩くなったが,前節で述べたように
欧文フォントのベースラインは和文に合うように下にずらされるので,
実用上は問題は起きないだろう.

前節の\cs{maxdepth}の調整も考え合わせると,\emph{\LaTeX が認識する本文領域と,
実際の見た目の基本版面の位置とは異なる}ことに注意してほしい.

\medskip
例えばA4縦を縦組で,公称フォントサイズ10\,pt,行送り18\,pt,30行左右中央
というレイアウトにするため,
\begin{lstlisting}
\documentclass{tarticle}
\usepackage{lltjp-geometry}
\baselineskip=18pt
\usepackage[a4paper,hcentering,lines=30]{geometry}
\end{lstlisting}
と指定すると,実際には以下のように設定される.
\begin{itemize}
 \item\cs{topskip}は\cs{tstrutbox}の高さ8.5\,ptに設定される.
 \item 本文領域の「高さ」\cs{textheight}は
\[
 \cs{topskip}+ (30-1)\cs{baselineskip}= 530.5\,\textrm{pt}.
\]
 \item 従って,左余白と右余白は
\[
 \frac{210\,\textrm{mm}-\cs{textheight}}2 = 33.50394\,\textrm{pt}.
\]
\end{itemize}
しかし,実際にはページの最初の行のベースラインは,本文領域の右端から
\cs{topskip}だけ左にずれたところにあり,
一方ページの最終行のベースラインは本文領域の左端にある.
縦組和文フォントのベースラインは文字の左右中央を通ることから,
従って,\emph{見た目で言えば,右余白の方が\cs{topskip}}~($=8.5\,\textrm{pt}$)%
\emph{だけ大きい}ということになってしまう\footnote{%
  同様に,横組で \texttt{vcentering}を指定すると,見かけでは
  $\cs{topskip}-\cs{Cht}+\cs{Cdp}$だけ上余白が大きいように見える.
}.


\end{document}