OSDN Git Service

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