diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/luatex/generic/luatexja/doc |
Initial commit
Diffstat (limited to 'macros/luatex/generic/luatexja/doc')
15 files changed, 12903 insertions, 0 deletions
diff --git a/macros/luatex/generic/luatexja/doc/jfm-test.lua b/macros/luatex/generic/luatexja/doc/jfm-test.lua new file mode 100644 index 0000000000..fdee46c356 --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/jfm-test.lua @@ -0,0 +1,110 @@ +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = 1.0, + kanjiskip = { 0.1, 0.04, 0.05 }, + xkanjiskip = { 0.31, 0.045, 0.057 }, + + [0] = { + chars = { '漢', 'ヒ*' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + }, + [1] = { + chars = { 'あ' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { [3] = { 1.41, 0, 0}, [399] = {1.25, 0.43, 0.87} }, + kern = { [8] = -1.41 , [2] = 2.0, [99] = 1.21 } + }, + [11] = { + chars = { 'い' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { [3] = { 1.41, 0, 0} }, + kern = { [2] = 2.0, } + }, + [21] = { + chars = { 'う' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { [3] = { 1.41, 0, 0}, [99] ={ 1.73, 0, 0} }, + kern = { [8] = -1.41 , [2] = 2.0, } + }, + [31] = { + chars = { 'え' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { [3] = { 1.41, 0, 0} }, + kern = { [2] = 2.0, [99] = 1.73} + }, + [41] = { + chars = { 'お' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + kern = { [8] = -1.41 , [2] = 2.0} + }, + [51] = { + chars = { 'か' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + kern = { [199] = 0.85 }, + }, + + [2] = { + chars = { 'ア' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0 + }, + [3] = { + chars = { 'ウ' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0 + }, + [4] = { + chars = { 'エ' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { [199] = { 0.78, 0, 0} }, + }, + [2000] = { + chars = { '。', '、*', 'ヒ' }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + }, + [100] = { + chars = { '「' }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + }, + [101] = { + chars = { '【' }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + }, + [102] = { + chars = { '〔' }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + }, + [99] = { + chars = { 'jcharbdd' }, + glue = { [11] = { 1.41, 0, 0} }, + kern = { [21] = 2.0, } + }, + [199] = { + chars = { 'boxbdd' }, + glue = { [51] = { 1.03, 0, 0} , [1] = { 0.94, 0.23, 0.45 }}, + }, + [299] = { + chars = { 'parbdd' }, + glue = { [51] = { 0.68, 0.02, 0.04} }, + kern = { [100] = -0.5, [102] = 0.5 } + }, + [399] = { + chars = { -1 }, -- math + glue = { [0] = { 0.68, 0.02, 0.04} }, + }, + [8] = { + chars = { 'lineend' }, + } +} diff --git a/macros/luatex/generic/luatexja/doc/jfm-ujisc33.lua b/macros/luatex/generic/luatexja/doc/jfm-ujisc33.lua new file mode 100644 index 0000000000..7879f58c3b --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/jfm-ujisc33.lua @@ -0,0 +1,135 @@ +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = 1.0, + + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0*0.67, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5*0.67 , 0.0, 0.5 }, + [3] = { 0.25*0.67, 0.0, 0.25 } + } + }, + + [1] = { -- 開き括弧類 + chars = { + '‘', '“', '〈', '《', '「', '『', '【', '〔', '〖', + '〘', '〝', '(', '[', '{', '⦅' + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5*0.67, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [3] = { 0.25*0.67, 0.0, 0.25 } + } + }, + + [2] = { -- 閉じ括弧類 + chars = { + '’', '”', '、', '〉', '》', '」', '』', '】', '〕', + '〗', '〙', '〟', ')', ',', ']', '}', '⦆' + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5*0.67, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5*0.67 , 0.0, 0.5 }, + [1] = { 0.5*0.67 , 0.0, 0.5 }, + [3] = { 0.25*0.67, 0.0, 0.25 }, + [5] = { 0.5*0.67 , 0.0, 0.5 }, + [6] = { 0.5*0.67 , 0.0, 0.5 }, + [7] = { 0.5*0.67 , 0.0, 0.5 } + } + }, + + [3] = { -- 中点類 + chars = {'・', ':', ';'}, + align = 'middle', left = 0.0, down = 0.0, + width = 0.5*0.67, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.25*0.67, 0.0, 0.25 }, + [1] = { 0.25*0.67, 0.0, 0.25 }, + [2] = { 0.25*0.67, 0.0, 0.25 }, + [3] = { 0.5*0.67 , 0.0, 0.5 }, + [4] = { 0.25*0.67, 0.0, 0.25 }, + [5] = { 0.25*0.67, 0.0, 0.25 }, + [6] = { 0.25*0.67, 0.0, 0.25 }, + [7] = { 0.25*0.67, 0.0, 0.25 } + } + }, + + [4] = { -- 句点類 + chars = {'。', '.'}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5*0.67, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5*0.67 , 0.0, 0.0 }, + [1] = { 0.5*0.67 , 0.0, 0.0 }, + [3] = { 0.75*0.67, 0.0, 0.25 }, + [5] = { 0.5*0.67 , 0.0, 0.0 }, + [6] = { 0.5*0.67 , 0.0, 0.0 }, + [7] = { 0.5*0.67 , 0.0, 0.0 } + } + }, + + [5] = { -- ダッシュ + chars = { '―', '‥', '…' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0*0.67, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5*0.67 , 0.0, 0.5 }, + [3] = { 0.25*0.67, 0.0, 0.25 } + }, + kern = { + [5] = 0.0 + } + }, + + [6] = { -- 感嘆符・疑問符 + chars = { '?', '!' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5*0.67 , 0.0, 0.5 }, + [1] = { 0.5*0.67 , 0.0, 0.5 }, + [3] = { 0.25*0.67, 0.0, 0.25 }, + [7] = { 0.5*0.67 , 0.0, 0.5 }, + }, + kern = { + [5] = 0.0 + } + }, + + [7] = { -- 半角カナ + chars = { + '。', '「', '」', '、', '・', 'ヲ', 'ァ', 'ィ', 'ゥ', + 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ', + 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', + 'シ', 'ス', 'セ', 'ソ', 'タ', 'チ', 'ツ', 'テ', 'ト', + 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ', + 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', + 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ン', '゙', '゚', + "AJ1-516", "AJ1-517", "AJ1-518", "AJ1-519", "AJ1-520", "AJ1-521", "AJ1-522", + "AJ1-523", "AJ1-524", "AJ1-525", "AJ1-526", "AJ1-527", "AJ1-528", "AJ1-529", + "AJ1-530", "AJ1-531", "AJ1-532", "AJ1-533", "AJ1-534", "AJ1-535", "AJ1-536", + "AJ1-537", "AJ1-538", "AJ1-539", "AJ1-540", "AJ1-541", "AJ1-542", "AJ1-543", + "AJ1-544", "AJ1-545", "AJ1-546", "AJ1-547", "AJ1-548", "AJ1-549", "AJ1-550", + "AJ1-551", "AJ1-552", "AJ1-553", "AJ1-554", "AJ1-555", "AJ1-556", "AJ1-557", + "AJ1-558", "AJ1-559", "AJ1-560", "AJ1-561", "AJ1-562", "AJ1-563", "AJ1-564", + "AJ1-565", "AJ1-566", "AJ1-567", "AJ1-568", "AJ1-569", "AJ1-570", "AJ1-571", + "AJ1-572", "AJ1-573", "AJ1-574", "AJ1-575", "AJ1-576", "AJ1-577", "AJ1-578", + "AJ1-579", "AJ1-580", "AJ1-581", "AJ1-582", "AJ1-583", "AJ1-584", "AJ1-585", + "AJ1-586", "AJ1-587", "AJ1-588", "AJ1-589", "AJ1-590", "AJ1-591", "AJ1-592", + "AJ1-593", "AJ1-594", "AJ1-595", "AJ1-596", "AJ1-597", "AJ1-598", + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5*0.67, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5*0.67 , 0.0, 0.5 }, + [3] = { 0.25*0.67, 0.0, 0.25 } + } + }, + + [99] = { -- box末尾 + chars = {'boxbdd', 'parbdd'}, + }, + +}
\ No newline at end of file diff --git a/macros/luatex/generic/luatexja/doc/lltjp-geometry.pdf b/macros/luatex/generic/luatexja/doc/lltjp-geometry.pdf Binary files differnew file mode 100644 index 0000000000..2f0d74960c --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/lltjp-geometry.pdf diff --git a/macros/luatex/generic/luatexja/doc/lltjp-geometry.tex b/macros/luatex/generic/luatexja/doc/lltjp-geometry.tex new file mode 100644 index 0000000000..2006e4994e --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/lltjp-geometry.tex @@ -0,0 +1,288 @@ +%#! luajitlatex +\documentclass[a4paper,10pt]{ltjsarticle} +\usepackage[textwidth=45\zw, lines=45, footskip=2\zh, verbose]{geometry} +\usepackage{listings,amsmath,booktabs,lltjext} +\usepackage[match]{luatexja-fontspec} +\usepackage{unicode-math} +\setmathfont{XITS Math} +\setmainfont{TeX Gyre Termes} +\setsansfont[Scale=0.95]{TeX Gyre Heros} +\usepackage[kozuka-pr6n]{luatexja-preset}\normalsize +\def\emph#1{\textbf{\textgt{\mathversion{bold}#1}}} +\def\headfont{\normalfont\bfseries\gtfamily} +\def\pTeX{p\kern-.05em\TeX} +\def\cs#1{\text{\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}$だけ +大きい}ということになってしまう\footnote{% + 同様に,横組で \texttt{vcentering}を指定すると,見かけでは + $\cs{topskip}-\cs{Cht}+\cs{Cdp}$だけ上余白が大きいように見える. +}. + + +\end{document} diff --git a/macros/luatex/generic/luatexja/doc/ltjclasses.pdf b/macros/luatex/generic/luatexja/doc/ltjclasses.pdf Binary files differnew file mode 100644 index 0000000000..872598852f --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/ltjclasses.pdf diff --git a/macros/luatex/generic/luatexja/doc/ltjltxdoc.pdf b/macros/luatex/generic/luatexja/doc/ltjltxdoc.pdf Binary files differnew file mode 100644 index 0000000000..f963ecb767 --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/ltjltxdoc.pdf diff --git a/macros/luatex/generic/luatexja/doc/ltjsclasses.pdf b/macros/luatex/generic/luatexja/doc/ltjsclasses.pdf Binary files differnew file mode 100644 index 0000000000..06aa0a88da --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/ltjsclasses.pdf diff --git a/macros/luatex/generic/luatexja/doc/luatexja-en.pdf b/macros/luatex/generic/luatexja/doc/luatexja-en.pdf Binary files differnew file mode 100644 index 0000000000..ed02760546 --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/luatexja-en.pdf diff --git a/macros/luatex/generic/luatexja/doc/luatexja-ja.pdf b/macros/luatex/generic/luatexja/doc/luatexja-ja.pdf Binary files differnew file mode 100644 index 0000000000..eb9c60bca0 --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/luatexja-ja.pdf diff --git a/macros/luatex/generic/luatexja/doc/luatexja-ruby.pdf b/macros/luatex/generic/luatexja/doc/luatexja-ruby.pdf Binary files differnew file mode 100644 index 0000000000..935ed02930 --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/luatexja-ruby.pdf diff --git a/macros/luatex/generic/luatexja/doc/luatexja-ruby.tex b/macros/luatex/generic/luatexja/doc/luatexja-ruby.tex new file mode 100644 index 0000000000..4d4be4f4f1 --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/luatexja-ruby.tex @@ -0,0 +1,806 @@ +%#! luajitlatex +%%% a test of ruby. +\documentclass[a4paper,10pt]{ltjsarticle} +\usepackage{luatexja-otf,amsmath} +\usepackage[match]{luatexja-fontspec} +\usepackage[kozuka-pr6n]{luatexja-preset}\normalsize +\def\emph#1{\textbf{\textgt{#1}}} +\def\headfont{\normalfont\bfseries\gtfamily} +\setmonojfont{KozGoPr6N-Regular.otf} + +\usepackage[textwidth=45\zw, lines=45, footskip=6mm]{geometry} +\advance\leftmargini-1\zw\advance\leftmarginii-1\zw +\protected\def\Param#1{\underline{\smash{\textsf{\mdseries #1}}}} + +\usepackage{luatexja-ruby,showexpl,booktabs} +\lstset{ + preset=\normalsize, basicstyle=\small\ttfamily, basewidth=0.5em, + explpreset={numberstyle=\tiny, numbers=left, numbersep=1em, columns=fixed}, +} +\makeatletter\let\SX@Info=\relax\makeatother +\fboxsep=0mm + +\usepackage{hyperref,bookmark,xcolor} +\hypersetup{% + unicode, + colorlinks, + allbordercolors=1 1 1, + allcolors=blue, + pdftitle={luatexja-ruby.sty} +} + +\def\Node#1#2{\,\vcenter{\hbox{\fboxsep=1pt\fbox{\vbox{\small\halign{\hfil##\hfil\cr + #1\mathstrut\cr\noalign{\hrule height.4pt}\strut#2\cr}}}}\,}} +\def\LuaTeX{Lua\TeX} + +% 三分ルビ用 +\DeclareFontShape{JY3}{mc}{mc}{n}{<-> [0.92487] + KozMinPr6N-Regular:extend=0.67;jfm=ujisc33}{} + +\title{\textsf{luatexja-ruby}パッケージ} +\begin{document} +\catcode`\<=13 +\def<#1>{{\normalfont\rm\itshape$\langle$#1\/$\rangle$}} +%\fontsize{13.19873}{15}\selectfont% + +\maketitle + +\begin{abstract} +\textsf{luatexja-ruby}パッケージは,\LuaTeX-jaの機能を利用してルビの組版処理を行う追加パッケージである. +\LuaTeX, \LuaTeX-jaの内部処理に割り込むことにより,熟語ルビ中の行分割や, +行頭形・行中形・行末形の自動検出,また進入許容量の自動設定などを可能とした. +\end{abstract} + +\tableofcontents + +\newpage +\section{\ltjruby{利|用|方|法}{り|よう|ほう|ほう}} +パッケージ読み込みは,\verb+\usepackage{luatexja-ruby}+ で良く, +必要ならば自動的に\LuaTeX-ja本体を読み込む. +plain \LuaTeX でのロードはまだサポートしておらず, +\LaTeXe のみサポートしている. + +\subsection{\ltjruby{用|語}{よう|ご}} +「進入(intrusion)」「突出(protrusion)」という用語は, +\href{http://zrbabbler.sp.land.to/pxrubrica.html}{\textsf{pxrubrica}パッケージ}% +での用法に準ずる. + +\begin{quotation} +進入あり:と\ltjruby{暁}{あかつき}の + +進入なし:{\setkeys[ltj]{ruby}{mode=0}と\ltjruby{暁}{あかつき}の} + +突出あり:{\setkeys[ltj]{ruby}{stretch={1}{2}{1}}\ltjruby{聴衆}{ちようしゆう}} + +突出なし:{\setkeys[ltj]{ruby}{stretch={0}{2}{0}}\ltjruby{聴衆}{ちようしゆう}} +\end{quotation} + +\subsection{\ruby{命|令}{めい|れい}} +\paragraph{\tt\textbackslash ltjruby} +ルビ出力用命令の本体.\verb+\ruby+ という別名を定義している. +\begin{quote} +\tt \textbackslash ltjruby[<option>]\{親|文|字\}\{おや|も|じ\} +\end{quote} +のように使用する. +第2・第3引数内の「\verb+|+」はグループの区切りを表す.詳細は\ref{ssec:grp}\nobreak 小節を参照. + +<option>には以下の内容をkey-valueリストで指定可能である: +\begin{description} +\def\makelabel#1{\tt#1} +\item[pre=<real>] 前進入許容量をルビ全角単位で指定. +負の長さを指定した場合は,ルビの状況や直前の文字に応じた自動指定を意味する. +既定値は負(つまり,自動指定). + +\item[post=<real>] 同様に,後進入許容量を指定する.既定値は負(自動指定). + +\item[mode] 進入処理のモードを表すbit vector.下位2\,bitは,\texttt{pre}や +\texttt{post}が負である場合にしか効力を発揮しない.既定値は$(0001)_2 = 1$. +\begin{description} + \item[bit 0] 進入を無効にするならば0,有効にするならば1. + \item[bit 1] 前進入許容量$B$と後進入許容量$A$が異なった場合, +そのまま処理する場合は0,小さい方に揃えるならば1. + \item[bit 2--3] ルビ文字の突出量$x$から実際の前進入量$b$,後進入量$a$の計算方法を指定する. +親文字の文字数が$k+1$,親文字の前に入る空白量・間の空白量・後ろの空白量の比が$p:q:r$のとき, +\begin{description} + \item[00] $b=\min\{B, xp/[p+kq+r]\}$, \ $a=\min\{A, xr/[p+kq+r]\}$ + \item[01] $b=\min(B, x)$, \ $a=\min[A, \max(x-b,0)]$ + \item[10] $a=\min(A, x)$, \ $b=\min[B, \max(x-a,0)]$ + \item[11] $M=\min(B,A)$とおく.もし$x\le 2M$ならば$b=a=x/2$.そうでなければ +\[ + b=\min\left(B, M + \frac{(x-2M)p}{p+kp+r}\right),\qquad + a=\min\left(A, M + \frac{(x-2M)r}{p+kp+r}\right) +\] +\end{description} + +組み方の具体例を実際に示す.例示のため,平仮名にはルビが1字まで,「立」にはルビを +0.5字分までかけてよいことにしている. +\begin{description} +\item[00]{\setkeys[ltj]{ruby}{mode=1}% +\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}% +は\ltjruby{美}{うつく}しい + \quad は\ltjruby{聴衆}{ちようしゆう}と\quad +は\ltjruby{暁}{あかつき}立\quad +は\ltjruby{聴衆}{ちようしゆう}立\par} +\item[01]{\setkeys[ltj]{ruby}{mode=5}% +\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}% +は\ltjruby{美}{うつく}しい + \quad は\ltjruby{聴衆}{ちようしゆう}と\quad +は\ltjruby{暁}{あかつき}立\quad +は\ltjruby{聴衆}{ちようしゆう}立\par} +\item[10]{\setkeys[ltj]{ruby}{mode=9}% +\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}% +は\ltjruby{美}{うつく}しい + \quad は\ltjruby{聴衆}{ちようしゆう}と\quad +は\ltjruby{暁}{あかつき}立\quad +は\ltjruby{聴衆}{ちようしゆう}立\par} +\item[11]{\setkeys[ltj]{ruby}{mode=13}% +\ltjsetparameter{rubypreintrusion={`立,0.5}, rubypostintrusion={`立,0.5}}% +は\ltjruby{美}{うつく}しい\quad +は\ltjruby{聴衆}{ちようしゆう}と\quad +は\ltjruby{暁}{あかつき}立\quad +は\ltjruby{聴衆}{ちようしゆう}立\par} +\end{description} + +\end{description} +\item[stretchruby=\{<left>\}\{<middle>\}\{<right>\}] 親文字の合計長が +ルビ文字の合計長より長い時に,ルビ文字の前・間・後に入れる空白の割合であり, +それぞれ0--7の自然数で指定する. +既定値は\ \verb+{1}{2}{1}+ である. +<left>はルビ文字の先頭までの空き量,<middle>はルビ文字間の空き量,<right>はルビ文字の末尾からの +空き量(の比)を表す.以下が例である. +\begin{LTXexample}[width=0.3\textwidth, preset=\Large] +\ltjruby[stretchruby=123,maxmargin=2]% + {◯◯◯◯}{◆◆} +\end{LTXexample} +\item[stretch=\{<left>\}\{<middle>\}\{<right>\}] +行中形でルビ文字の方が長い場合,親文字の前・中・後に入れる空白の割合. +既定値は\ \verb+{1}{2}{1}+ である.それ以外の代表的な値としては,例えば次のようなものがある. +\begin{description} +\item[親文字均等割禁止] \verb+{1}{0}{1}+\ など<middle>を0にした値 +\item[前突出禁止] \verb+{0}{1}{1}+ +\item[後突出禁止] \verb+{1}{1}{0}+ +\end{description} + +\item[stretchbol=\{<left>\}\{<middle>\}\{<right>\}] 行頭形〜. +既定値は\ \verb+{0}{1}{1}+ である. +\item[stretcheol=\{<left>\}\{<middle>\}\{<right>\}] 行末形〜. +既定値は\ \verb+{1}{1}{0}+ である. + +\item[maxmargin=<real>] 親文字の方がルビより長い時に,ルビの先頭と親文字の先頭,及び +ルビ末尾と親文字の末尾の間に許される最大の空白量.\textbf{親文字全角単位}で指定し,既定値は0.5. + +\medskip +\item[size=<real>] ルビ文字の親文字に対する大きさ.既定値は0.5. +\item[intergap=<real>] ルビ文字と親文字との空きを親文字全角単位で指定.既定値は0. +\item[rubysmash=<bool>] ルビの高さを0にするか.既定値は偽.次が例である. +\begin{LTXexample}[width=0.3\textwidth, preset=\Large] +\ \vrule width 0pt height 2\zw depth 1\zw +\frame{\ltjruby[rubysmash=false]{本}{ほん}}\ +\frame{\ltjruby[rubysmash=true]{本}{ほん}}\ +\frame{\ltjruby[rubysmash=false,intergap=0.2] + {本}{ほん}}\ +\frame{\ltjruby[rubysmash=true,intergap=0.2] + {本}{ほん}}\ +\frame{\ltjruby[rubysmash=false,intergap=-1.5] + {本}{ほん}} +\end{LTXexample} + + +\item[kenten=<command>]各文字につく圏点の出力命令を指定する.既定値は「\verb+\ltjalchar`•+」 +であり,\texttt{U+2022} (Bullet)を\textbf{ALchar}として出力することを指定している. + +\item[fontcmd=<command>]ルビ用のフォント切り替え命令を指定する. +このキーの内容が実行された後に\ \verb+\fontsize...\selectfont+\ が実行されるので, +このキーの指定では最後に\ \verb+\selectfont+ を加える必要はない. + +この \texttt{fontcmd} キーの内容は多くの回数実行される. +例えば,\textsf{luatexja-fontspec}パッケージを用いてOpenTypeフォントを用いる場合, +\begin{lstlisting} + fontcmd=\addjfontfeatures{Style=Ruby} +\end{lstlisting} +のようにしてルビ用字形を用いることが可能だが,現在の実装ではタイプセットに時間がかかるようになる. + + +\end{description} + +\medskip +次の2つは,以上で説明した複数のオプションを一度に設定するためのものである. +普通はこの2つのうちいずれかを設定するだけで足りるだろう. + +\begin{description} +\def\makelabel#1{\tt#1} +\item[naka] 以下のオプションを同時に設定する.主に中付きルビを組むときに用いる. +\begin{verbatim} +mode=1, stretch={1}{2}{1}, stretchruby={1}{2}{1} +\end{verbatim} +\item[kata] 同様に,肩付きルビ用に,次を設定する. +\begin{verbatim} +mode=9, stretch={1}{2}{1}, stretchruby={0}{0}{1} +\end{verbatim} +\end{description} + +\paragraph{\tt\textbackslash ltjsetruby\{<option>\}} +<option>の既定値を指定する.\textsf{luatexja-ruby}読み込み時の値は +各項目の所で既に説明してあるが,次のようになっている. +\begin{verbatim} + pre=-1, post=-1, mode=1, + stretchruby={1}{2}{1}, stretch = {1}{2}{1}, + stretchbol={0}{1}{1}, stretcheol={1}{1}{0}, + maxmargin=0.5, size=0.5, intergap=0, rubysmash=false, + kenten=\ltjalchar`•, fontcmd=\relax +\end{verbatim} + +\paragraph{\texttt{\textbackslash ltjsetparamater} に追加されるキー} +\begin{description} +\item[\Param{rubypreintrusion}\tt =\{<chr\_code>, <pre\_int>\}] +文字<chr\_code> に,その\textbf{直後}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定. +\item[\Param{rubypostintrusion}\tt =\{<chr\_code>, <post\_int>\}] +文字<chr\_code> に,その\textbf{直前}のルビによって掛けられるルビ文字列の最大長をルビ全角単位で指定. +\end{description} +既定値は,\Param{rubypreintrusion},~\Param{rubypostintrusion}とも +以下の文字に対しては1,その他の文字については0である: +\begin{quote} + 平仮名(\texttt{U+3040}--\texttt{U+309F}),カギ括弧「」,読点「,」「、」,中黒「・」 +\end{quote} +また,ここでは「文字コード$-1$の文字」は,「段落開始の \verb+\parindent+」を表す% +\footnote{通常の\LuaTeX-jaにおける指定では文中数式境界を表していることに注意.}. +この「文字」に対する\Param{rubypreintrusion}の値も1である. + +\paragraph{\texttt{\textbackslash ltjkenten}} +圏点を出力する命令で,\verb+\kenten+ という別名を定義している. +\begin{quote} + \tt \textbackslash ltjkenten[<option>]\{親文字\} +\end{quote} +のように使用する.複数文字に圏点をつける場合でも,\verb+\ltjruby+ のように「\texttt{|}」を使って +文字を区切る\textbf{必要はない}ことに注意してほしい. + +圏点として出力される文字は \texttt{kenten} キーによって指定し, +圏点自身の大きさは(ルビと同様に)\texttt{size} キーで指定する. + +\subsection{グループの\ruby{指|定}{し|てい}} +\label{ssec:grp} +\begin{quote} +\tt \textbackslash ltjruby[<option>]\{親|文|字\}\{おや|も|じ\} +\end{quote} +のように,\verb+\ltjruby+\ の第2・第3引数内の「\verb+|+」はグループの区切りを表す. +グループの数は両者で一致しなければならず, +\verb+\ltjruby{紋章}{もん|しよう}+ のようには\emph{できない}. + +1グループのみのルビ(単純グループルビ)はグループルビとして組まれる.そのため, +もしモノルビを使いたければ,面倒でも +\begin{LTXexample}[width=0.4\textwidth, preset=\Large] +の\ltjruby{紋}{もん}\ltjruby{章}{しよう}が +\end{LTXexample} +のように,複数回使用すること. +また,全てのグループにおいて「ルビ文字列の長さは親文字列以下」であれば, +単純グループルビの並びとして扱われる.すなわち,次の2行は全くの等価となる. +\begin{verbatim} +\ltjruby{普|通|車}{ふ|つう|しや} +\ltjruby{普}{ふ}\ltjruby{通}{つう}\ltjruby{車}{しや} +\end{verbatim} + +\newpage +複数グループかつ上記の条件を満たさない場合は, +所謂「可動グループルビ」であり,ルビの前後や各グループの切れ目で行分割が可能となる. +例えば +\begin{verbatim} +…の\ltjruby{表|現|力}{ひよう|げん|りよく}は… +\end{verbatim} +という入力からは得られる組版結果は,次のいずれかになる. +\begin{center} + \begin{tabular}{ll} + \toprule + 改行なし(行中形)&\Large …の\ltjruby{表|現|力}{ひよう|げん|りよく}は…\\ + 直前で改行&\Large \vrule \ltjruby[stretch=011]{表|現|力}{ひよう|げん|りよく}は…\\ +&\Large …の\ltjruby[stretch=110]{表}{ひよう} + \vrule\ltjruby[stretch=011]{現|力}{げん|りよく}は…\\ +&\Large …の\ltjruby[stretch=110]{表|現}{ひよう|げん} + \vrule\ltjruby[stretch=011]{力}{りよく}は…\\ + 直後に改行&\Large …の\ltjruby[stretch=110]{表|現|力}{ひよう|げん|りよく}\vrule\\ +\bottomrule + \end{tabular} +\end{center} +\begin{itemize} + \item これらの行分割によってペナルティは発生しない. + \item 上記の例で見られるように, +2ブロック以上をまとめて組むときは,全体を1つのグループルビのように組版する(JIS~X~4051と同様). +『日本語組版処理の要件』では, +附属書Fに「熟語の構成,さらにその熟語の前後にくる文字の種類を考慮して配置する方法」として +別の方法を解説しているが,こちらの方法は現時点ではサポートしていないので, +面倒でも手動で \texttt{pre}, \texttt{post} などを使って頑張って欲しい. + \item 実装方法の都合により,ルビの直前・直後・途中で2箇所以上の改行が起きる場合,例えば +\begin{center} + \begin{tabular}{lll} + \toprule + \Large …の\ltjruby[stretch=110]{表}{ひよう} + \vrule\ltjruby[stretch=010]{現|力}{げん|りよく}\vrule& +\Large \vrule\ltjruby[stretch=010]{表|現}{ひよう|げん} + \vrule\ltjruby[stretch=011]{力}{りよく}は…& +\Large \vrule\ltjruby[stretch=010]{表|現|力}{ひよう|げん|りよく}\vrule\\ +\bottomrule + \end{tabular} +\end{center} +などの組み方は\emph{想定していない}. +\end{itemize} + +\newpage + +\section{\ruby{注|意|点}{ちゆう|い|てん}} +\begin{description} +\item[ルビ文字のはみ出し] +「日本語組版処理の要件」の図3.82のように, +ルビ文字のはみ出しが繋がらないようにする処理について述べる. + +例えば, +\begin{LTXexample}[preset=\Large,width=0.3\textwidth] +\ltjruby{陵}{りよう}と\ltjruby{陵}{みささぎ}\\ +\ltjruby{陵}{りよう}と\ltjruby[pre=1]{陵}{みささぎ} +\end{LTXexample} +において,1行目右側の「\ltjruby{陵}{みささぎ}」のルビが前の「と」にかかる量は次のように決まる: +\begin{enumerate} +\item 1回目の実行では,行分割前に「\ltjruby{陵}{りよう}」の後側進入量は前もって知ることはでき + ない.なので,「\ltjruby{陵}{りよう}」は行中形で組まれるものとして +「\ltjruby{陵}{みささぎ}」前側進入許容量は +\[ + \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}} +-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの後側進入量(行中形)}}=0.25\,\mathrm{zw} +\] +となる.行分割後,「\ltjruby{陵}{りよう}」の実際の後側進入量は +auxファイルに記述される. +\item 2回目以降の実行では,auxファイルに保存された「\ltjruby{陵}{りよう}」の後側進入量 +を用いて,「\ltjruby{陵}{みささぎ}」前側進入許容量を次のように計算する: +\[ + \underbrace{0.5\,\mathrm{zw}}_{\text{元々の許容量}} +-\underbrace{0.25\,\mathrm{zw}}_{\text{前のルビの後側進入量 (from aux)}}=0.25\,\mathrm{zw}. +\] +\end{enumerate} +auxファイルに保存する際,各 \verb+\ltjruby+ 命令の呼び出しを識別するキーが必要になるが, +そのキーとしては単純に「何個目の \verb+\ltjruby+ 命令か」である. + +なお,以上の処理は,1行目と2行目を比較すれば分かるように, +「\ltjruby{陵}{みささぎ}」の\emph{前進入許容量指定(\texttt{pre})が自動}になっている場合のみ +実施される. + +\item[段落末尾のルビ] +段落がルビで終わった場合,そのルビが行末形で組まれることはない. +これは,段落の「本当の」末尾には \verb+\penalty10000\parfillskip+ があるためで, +ルビ処理用に作った最後のグルー(\ref{sec:impl}\nobreak 節の説明では$g_2$)が消去されないことによる. + +\verb+\parfillskip+ の長さ(や,場合によっては \verb+\rightskip+)を実測し, +それによって処理を変えるのも可能だが,そのようなことはしなかった. +段落がルビで終わることは普通ない(最低でも句点が続くだろう)と思うからである. + + + +\item[段落先頭のルビ] +同様に,段落先頭のルビは行頭形にはならない. +\texttt{pre}が負(つまり,自動指定)のとき,段落最初の \verb+\parindent+ 部分への +進入は可能である.\verb+\parindent+ 部分への進入許容量は +「文字$-1$」に対する\Param{rubypreintrusion}(既定値は1,ルビ全角単位)と +\ \verb+\parindent+ の長さのうち小さい方である. +\begin{LTXexample}[preset=\Large,width=0.4\textwidth] +\parindent1\zw\noindent 012345\par +\ltjruby{陵}{みささぎ}は……\par +\ltjruby{承}{うけたまわ}り……\par +\parindent0.25\zw\ltjruby{陵}{みささぎ}は…… +\end{LTXexample} + + +\end{description} + +\newpage +\section{\ruby{実|装}{じつ|そう}について} +\label{sec:impl} +次の例で実装の大まかな方法を説明する. +\begin{LTXexample}[preset=\Large] +……を\ltjruby{流|暢}{りゆう|ちよう}に…… +\end{LTXexample} + +\begin{enumerate} +\item \verb|\ltjruby|コマンド自体は,一旦次のnode listを値とするwhatsit~$W$を作って, +現在の水平リストへと挿入する(必要ならば\verb|\leavevmode|も実行): +\[ + \Node{whatsit $w$}{value: 2}\longrightarrow + \Node{hlist $s_1$}{「りゆう」}\longrightarrow + \Node{hlist $p_1$}{「流」}\longrightarrow + \Node{hlist $s_2$}{「ちよう」}\longrightarrow + \Node{hlist $p_2$}{「暢」} +\] +ここで,最初の$w$の値2は,ルビが2つのパーツ「\ltjruby{流}{りゆう}」「\ltjruby{暢}{ちよう}」からなっていることを +表している.この値を$\mathit{cmp}$とおこう. +$s_i$達の中の文字は既にルビの大きさである. +\item \LuaTeX-jaの和文処理グルー挿入処理において, +このwhatsit~$W$はまとめて +「先頭が『流』,最後が『暢』であるようなhboxを \verb|\unhbox| で展開したもの」と扱われる. +言い換えれば,ルビ部分を無視した単なる「流暢」という和文文字の並びとして扱われる\footnote{「流」「暢」の間のグルーは既に入っている,と扱われる.}. +次のサンプルを参照 +\begin{LTXexample}[preset=\Large] +\leavevmode\hbox{.}A\\ +%↑xkanjiskip +\ltjruby{.}{}A +%↑2分 +\end{LTXexample} +\item 和文処理グルーの挿入が終わった後で,可動グループルビのためのノードの挿入に入る. +\begin{enumerate} +\item $W$の前後に$2\mathit{cmp}+1=5$個のノードが挿入され,$W$の周辺は次のようなノード列になる. +\begin{align*} + (\text{other nodes})&\longrightarrow + \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{} +\\&\longrightarrow + \Node{glue $g_1$}{}\longrightarrow \Node{rule $r_2$}{}\longrightarrow + \Node{glue $g_2$}{}\longrightarrow (\text{other nodes}) +\end{align*} + +\item このようにノードを挿入する目的は,\TeX の行分割処理自体に影響を加えずに可動グループルビ +を実現させることにある. +\begin{gather*} + (\text{other nodes})\longrightarrow + \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{}\\ +\noalign{\hrulefill 行の境目\hrulefill} +\Node{rule $r_2$}{}\longrightarrow + \Node{glue $g_2$}{}\longrightarrow (\text{other nodes}) +\end{gather*} +のようになったとしたら,「\ltjruby{流}{りゆう}」「\ltjruby{暢}{ちよう}」の間で行分割が起きた,ということがわかり, +$g_i$,~$r_i$達のノードを適切に置き換えればよい(後で詳しく説明する). + +\begin{figure}\centering\small +\begin{tabular}{cllll} +\toprule +\multicolumn{1}{c}{\bf ノード}&\multicolumn{1}{c}{\bf 組み方}&\multicolumn{1}{c}{\bf サンプル}% +&\multicolumn{1}{c}{\bf 対応するノード並び}\\ +\midrule +$n_1$&行末1グループ& +\Large +\fbox{を}{\color{blue!50!black}\gt\ltjruby[pre=1,mode=5,stretch=110]{流}{りゆう}}\vrule +& +$g_0\rightarrow W\rightarrow r_1$\\ +$n_2$&行末2グループ& +\Large +\fbox{を}{\color{blue!50!black}\gt\ltjruby[pre=1,mode=1,stretch=110]{流|暢}{りゆう|ちよう}}\vrule +& +$g_0\rightarrow W\rightarrow r_1\rightarrow g_2 \rightarrow r_2$\\ +$n_3$&行頭1グループ& +\Large +\vrule{\color{blue!50!black}\gt\ltjruby[post=1,mode=1,stretch=011]{暢}{ちよう}}\fbox{に} +& +$r_2\rightarrow g_2$\\ +$n_4$&行頭2グループ& +\Large +\vrule{\color{blue!50!black}\gt\ltjruby[post=1,mode=1,stretch=011]{流|暢}{りゆう|ちよう}}\fbox{に} +& +$W\rightarrow r_1\rightarrow g_2 \rightarrow r_2\rightarrow g_2$\\ +$n_5$&行中& +\Large +\fbox{を}{\color{blue!50!black}\gt\ltjruby[post=0.5,pre=0.5,mode=1]{流|暢}{りゆう|ちよう}}\fbox{に} +& +$g_0\rightarrow W\rightarrow r_1\rightarrow g_2 \rightarrow r_2\rightarrow g_2$\\ + +\bottomrule +\end{tabular} +\caption{ルビの組み方と対応するノード並び} +\label{fig:node} +\end{figure} + +\item なお,$r_i$達の高さ・深さは組み上がった後のそれである. +$g_i$,~$r_i$達の幅は,図\nobreak\ref{fig:node}に示したような対応に沿って算出する. +例えばこの場合,行中形$n_5$に対して +\[ + g_0+r_1+g_2+r_2+g_2 = 3\,\mathrm{zw}-(0.25\,\mathrm{zw}\times 2)=2.5\,\mathrm{zw} +\] +という方程式が立つ(zwは親文字全角の幅,進入量込). +$n_1$から$n_5$まで計5本の方程式が立つが,これらはGau\ss の消去法で解くことができて +$g_i$,~$r_i$達の幅が求まる. +\item また,ルビ処理を統括しているwhatsit~$W$の値も +\[ + \Node{whatsit $w$}{value: 2}\longrightarrow + \Node{vlist $n_1$}{末1}\longrightarrow + \Node{vlist $n_2$}{末2}\longrightarrow + \Node{vlist $n_3$}{頭1}\longrightarrow + \Node{vlist $n_4$}{頭2}\longrightarrow + \Node{vlist $n_5$}{中} +\] +に置き換えておく. + +\end{enumerate} + +\item \LuaTeX の行分割処理を普通に行う. +\item 行分割の結果に従って,$g_i$,~$r_i$達を適切に置換する. + +例えば行分割の結果 +\begin{gather*} + (\text{other nodes})\longrightarrow + \Node{glue $g_0$}{}\longrightarrow \Node{whatsit~$W$}{元からある}\longrightarrow \Node{rule $r_1$}{} + \tag{行A}\\ +\noalign{\hrulefill 行の境目\hrulefill} +\Node{rule $r_2$}{}\longrightarrow + \Node{glue $g_2$}{}\longrightarrow (\text{other nodes})\tag{行B} +\end{gather*} +のようになったとしよう. +\begin{enumerate} +\item 処理は段落の上の行から順番に行われる.行Aの処理がまわってきたとしよう. + +\item 行Aの先頭から順番に眺めていく.すると「whatsit~$W$由来」のノード,$g_0$,~$W$,~$r_1$が見つかり, +行Aはここで終わっている. + +まず,行Aのhboxの中身からwhatsit~$W$を消去(リストから取り除くだけで,$W$のメモリを解放するわけではない)する. +$g_0$,~($W$,)~$r_1$というノードの並びは,「行末1グループ」$n_1$に対応しているので, +$g_0$,~$r_1$を行Aから除去・メモリ解放し,代わりに$n_1$を行Aの中身に追加する. + +\item 次に行Bの処理にうつる.行Aでルビの処理は完了していない(2グループのルビなのにまだ1グループしか使っていない)ので, +「whatsit~$W$由来」のノードがいくつか行B内に残っているはずである. + +案の定,$r_2$,~$g_2$というノード列が見つかった.これは「行頭1グループ」$n_3$に対応しているので, +$r_2$,~$g_2$を行Bから除去・メモリ解放し,代わりに$n_3$を行Bの中身に挿入する. + +\item これで2グループとも使い切ったことになるので, +隔離しておいた$W$を,(使われなかった$n_2$,~$n_4$,~$n_5$などと共に)メモリ解放する.結果として +次のようになった: +\begin{gather*} + (\text{other nodes})\longrightarrow + \Node{vlist $n_1$}{末1}\tag{行A}\\ +\noalign{\hrulefill 行の境目\hrulefill} +\Node{vlist $n_3$}{頭1}\longrightarrow (\text{other nodes})\tag{行B} +\end{gather*} +\end{enumerate} +\end{enumerate} + +\newpage +\section{いくつかの例} +\def\rubytest{\ruby{黄金橋}{ゴールデンゲートブリッジ}\relax} + +\setbox0=\vbox{\hsize=22\zw% +ああああ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ} +%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)} +\fbox{\box0} + +\def\rubytest{\ruby{国府津}{こうづ}\relax} +% グループルビ + +\setbox0=\vbox{\hsize=18\zw% +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ} +%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)} +\fbox{\box0} + +\def\rubytest{\ruby{●●|◆}{◆◆◆◆◆◆|●●●}\relax} +\setbox0=\vbox{\hsize=19\zw% +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこイ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこウ +あ\rubytest いうえおかきくけこエ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ} +%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)} +\fbox{\box0} + +\def\rubytest{\ruby{●●|□}{◆◆◆|●●●}\relax} +\setbox0=\vbox{\hsize=19\zw% +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこイ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこウ +あ\rubytest いうえおかきくけこエ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ +あ\rubytest いうえおかきくけこ} +%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)} +\fbox{\box0} + +\def\rubytest{\ruby{異|様}{い|よう}\relax} +\setbox0=\vbox{\hsize=19\zw% +あ\rubytest いうえくけ +あ\rubytest いうえくけこ +あ\rubytest いうえくけこ +あ\rubytest いうえくけこイ +あ\rubytest いうえおかきくけこ} +%\directlua{ltj.ext_show_node_list(tex.box[0], '? ', print)} +\fbox{\box0} + +\def\rubytest{\ruby{□|■|□}{■■|□□□|■■}\relax} + +\setbox0=\vbox{\hsize=23\zw% +あ\rubytest いうえおかきくけこうえおかきくけこ +あ\rubytest いうえおかきくけこうえおかきくけこ +あ\rubytest いう□おかきくけこうえおかきくけこ +あ\rubytest いう□おかきくけこうえおかきくけこ +あ\rubytest いう□おかきくけこうえおかきくけこ +あ\rubytest いうえおかきくけこ} +\fbox{\box0} + +\begin{description} +\def\sample{又\ruby{承}{うけたまわ}る\quad \ruby{疎}{そ}\quad は\ruby{俄}{にわか}勉強 + \quad 後\ruby{俄}{にわか}勉強\quad は\ruby{暁}{あかつき}に + は\ruby{俄}{にわか}に + \quad \ruby{休|憩|中}{きゆう|けい|ちゆう}かつ\ruby{視|聴|中}{し|ちよう|ちゆう}} +\item[標準] \sample +\item[肩つき] {\ltjsetruby{kata}\sample} +\end{description} + +\newpage +\begin{LTXexample}[pos=t] +{\ltjsetruby{stretch=101}% 親文字均等割り禁止 + \ruby{休|憩|中}{きゆう|けい|ちゆう}かつ\ruby{視|聴|中}{し|ちよう|ちゆう}% +}\quad +\textgt{\ruby{勉|強}{べん|きよう}と% + \ruby[fontcmd=\mcfamily]{勉|強}{べん|きよう}}\quad% ルビは明朝体 +\ruby{コギト・エルゴ・スム}{Cogito ergo sum}\quad % 欧文空白は伸長しない +\ruby[size=1]{Cogito ergo sum}{コギト・エルゴ・スム}% 欧文空白は伸長しない +\end{LTXexample} + +\newpage +\section{『日本語組版処理の要件』20120403の例} + +\newcommand*{\噂}{\CID{7642}} +\newcommand*{\倦}{\CID{7674}} +%================================== 横組 +\paragraph{3.3.1節}\ +\begin{LTXexample}[pos=t] +\obeylines +3.49 \ruby{君|子}{くん|し}は\ruby{和}{わ}して\ruby{同}{どう}ぜず +3.50 \ruby{人}{ひと}に\ruby{誨}{おし}えて\ruby{\倦}{う}まず +% モノルビ.面倒でも複数回の実行が必要 +3.51 \ruby{鬼}{き}\ruby{門}{もん}の\ruby{方}{ほう}\ruby{角}{がく}を% + \ruby{凝}{ぎょう}\ruby{視}{し}する +% 熟語ルビ +3.52 \ruby{鬼|門}{き|もん}の\ruby{方|角}{ほう|がく}を\ruby{凝|視}{ぎよう|し}する +3.53 \ruby{茅場町}{かやばちよう}\quad\ruby{茅|場}{かや|ば}\ruby{町}{ちよう} +% 熟字訓 +3.54 \ruby{紫陽花}{あじさい}\quad\ruby{坩堝}{るつぼ}\quad\ruby{田舎}{いなか} +% グループルビ +3.55 \ruby{模型}{モデル}\quad\ruby{顧客}{クライアント}\quad% + \ruby{境界面}{インターフエース}\quad\ruby{避難所}{アジール} +3.56 \ruby{編集者}{editor}\quad \ruby{editor}{エデイター} +\end{LTXexample} + +\paragraph{3.3.3節}\ +\begin{LTXexample}[pos=t] +\obeylines +3.58 に\ruby{幟}{のぼり}を\quad に\ruby[kata]{幟}{のぼり}を\quad% + \ruby{韋}{い}\ruby{編}{へん}\ruby{三}{さん}\ruby{絶}{ぜつ} +% 三分ルビ.JY3/mc/mc は本文書のプリアンブルで独自に定義 +3.59 に\ruby[fontcmd=\kanjifamily{mc}\kanjiseries{mc}]{幟}{のぼり}を +% ルビ文字を小さくする +3.60 {\Large% + \ruby{韋}{い}\ruby{編}{へん}\ruby{三}{さん}\ruby{絶}{ぜつ}\quad% 比較用 + \ltjsetruby{size=0.375}% 0.5 -> 0.375 + \ruby{韋}{い}\ruby{編}{へん}\ruby{三}{さん}\ruby{絶}{ぜつ}} +\end{LTXexample} + +\paragraph{3.3.4節} +3.61図(両側ルビ)は未サポートにより省略 + +\newpage +\paragraph{3.3.5節 モノルビ}\ +\begin{LTXexample}[pos=t] +\obeylines +3.62 の\ruby{葯}{やく}に +3.63 版面の\ruby{地}{ち}に\quad 版面の\ruby[kata]{地}{ち}に +% 横組肩つきはしないが,現状では縦組未サポートだし,仕方ないね +3.65 の\ruby{砦}{とりで}に +{\ltjsetruby{kata}% +3.66上 の\ruby{旬}{しゆん}に\quad 後\ruby{旬}{しゆん}に +3.66下 の\ruby{旬}{しゆん}又\quad 後\ruby{旬}{しゆん}又} +\end{LTXexample} + + +\paragraph{3.3.6節 グループルビ}\ +\begin{LTXexample}[pos=t] +\obeylines +3.67 は\ruby{冊子体}{コーデツクス}と +3.68 \ruby{模型}{モデル}\quad \ruby{利用許諾}{ライセンス} +% 両端を揃える流儀 +3.69 {\ltjsetruby{stretchruby=010}% + \ruby{模型}{モデル}\quad \ruby{利用許諾}{ライセンス}} +% ルビが極端に短い場合 +3.70 \ruby{なげきの聖母像}{ピエタ}\quad% ルビ全角まで許容 + \ruby[maxmargin=0.75]{なげきの聖母像}{ピエタ}% ルビ全角1.5倍まで +% ルビが長い場合 +3.71 \ruby{顧客}{クライアント}\quad \ruby{境界面}{インターフエース} +3.72 {\ltjsetruby{stretch=010, stretchbol=010, stretcheol=010}% はみ出さない流儀 + \ruby{顧客}{クライアント}\quad \ruby{境界面}{インターフエース}} +\end{LTXexample} + +\newpage +\paragraph{3.3.7節 熟語ルビ}\ +\begin{LTXexample}[pos=t] +\obeylines +3.73 \ruby{杞|憂}{き|ゆう}\quad \ruby{畏|怖}{い|ふ}\quad% + \ruby[kata]{杞|憂}{き|ゆう}\quad \ruby[kata]{畏|怖}{い|ふ} +3.74 の\ruby{流|儀}{りゆう|ぎ}を\quad の\ruby{無|常}{む|じよう}を\quad% + の\ruby{成|就}{じよう|じゆ}を\quad の\ruby{紋|章}{もん|しよう}を\quad% + の\ruby{象|徴}{しよう|ちよう}を +% 熟語の構成を考慮した方法は現行ではできない. +% 行分割はできるのだが,「他の漢字にルビ全角までかかって良い」は難しい. +3.75 {\ltjsetruby{kata}% + の\ruby{流|儀}{りゆう|ぎ}を\quad の\ruby{無|常}{む|じよう}を\quad% + の\ruby{成|就}{じよう|じゆ}を\quad の\ruby{紋|章}{もん|しよう}を\quad% + の\ruby{象|徴}{しよう|ちよう}を} +% モノルビ配置.望ましくない +3.76× の\ruby{流}{りゆう}\ruby{儀}{ぎ}を\quad の\ruby{無}{む}\ruby{常}{じよう}を\quad% + +要調整 3.77\ {\ltjsetruby{stretchbol=121, stretcheol=121}% 行頭・行末揃えず + \hbox{\vrule\vbox{\hsize=10\zw ああああああああの% + \ruby{流|儀}{りゆう|ぎ}がある.}\vrule}\textbf{←なぜ改行できない}\quad% + \hbox{\vrule\vbox{\hsize=5\zw ……等の\ruby{無|常}{む|じよう}を}\vrule}} +\end{LTXexample} + +\paragraph{3.3.8節 ルビはみ出し}\ +\begin{LTXexample}[pos=t] +\obeylines +3.78 \ruby{人}{ひと}は\ruby{死}{し}して\ruby{名}{な}を\ruby{残}{のこ}す +% 現在の自動設定の仕様では「脚」の前が四分だけ「要件」の例より空く +3.79 漢字の部首には\ruby{偏}{へん}・\ruby{冠}{かんむり}・\ruby{脚}{きやく}・% + \ruby{旁}{つくり}がある +3.79 漢字の部首には\ruby{偏}{へん},\ruby{冠}{かんむり},\ruby{脚}{きやく},% + \ruby{旁}{つくり}がある +\end{LTXexample} +\begin{LTXexample}[pos=t] +\obeylines +% もちろん手動で進入量を指定すれば話は別 +3.79 漢字の部首には\ruby{偏}{へん}・\ruby{冠}{かんむり}・\ruby[pre=1]{脚}{きやく}・% + \ruby{旁}{つくり}がある +3.79 漢字の部首には\ruby{偏}{へん},\ruby{冠}{かんむり},\ruby[pre=1]{脚}{きやく},% + \ruby{旁}{つくり}がある +3.79 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を +3.80 漢字の部首には「\ruby{偏}{へん}」「\ruby{冠}{かんむり}」「\ruby{脚}{きやく}」% +「\ruby{旁}{つくり}」がある +3.80 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を +3.81× に\ruby{暁}{あかつき}の\kern-1\zw の\ruby{趣}{おもむき}を +3.82 に\ruby{暁}{あかつき}の\ruby{趣}{おもむき}を + +% 漢字にルビを2分まで掛けても良い流儀 +{% + \ltjsetparameter{rubypostintrusion={`好,0.5}} + \ltjsetparameter{rubypostintrusion={`具,0.5}} + \ltjsetparameter{rubypostintrusion={`材,0.5}} +3.83 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を +3.83 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を +} +% 平仮名にもルビを掛けない流儀 +{\catcode`\<12% + \makeatletter\count@="3040\loop\relax\ifnum \count@<"30A0% + \ltjsetparameter{rubypreintrusion={\the\count@,0}, % + rubypostintrusion={\the\count@,0}}% + \advance\count@1 \repeat +3.84 この\ruby{\噂}{うわさ}の好きな人は\ruby{懐}{ふところ}ぐあいもよく、\ruby{檜}{ひのき}を +3.84 この\ruby{\噂}{うわさ}好きな人は\ruby{懐}{ふところ}具合もよく、\ruby{檜}{ひのき}材を +} +\end{LTXexample} +\begin{LTXexample}[pos=t] +\obeylines +3.85\ {\ltjsetruby{stretchbol=121, stretcheol=121}% 行頭・行末揃えず +\hbox{\vrule\vbox{\hsize=15\zw + \hskip9.5\zw……の\ruby{徑}{こみち}を……% +\hskip9\zw……の\ruby{徑}{こみち}を……}\vrule}} +3.86\ \hbox{\vrule\vbox{\hsize=15\zw + \hskip10\zw……の\ruby{徑}{こみち}を……% +\hskip9\zw……の\ruby{徑}{こみち}を……}\vrule} +3.87\ \hbox{\vrule\vbox{\hsize=15\zw + \hskip8\zw……共\ruby{飾り}{アクセサリー}等……% +\hskip9\zw……共\ruby{飾り}{アクセサリー}等……}\vrule} +\end{LTXexample} + + +\paragraph{圏点の例(常用漢字表前書きより)} +この表は,法令,公⽤⽂書,新聞,雑誌,放送など,⼀般の社会⽣活におい% +て\kenten[kenten=﹅]{現代の国語を書き表す}場合の\kenten{漢字使⽤の⽬安を⽰す}ものである。 + +\subparagraph{「﹅」の大きさを親文字の0.33倍にした例} +この表は,法令,公⽤⽂書,新聞,雑誌,放送など,⼀般の社会⽣活におい% +て\kenten[size=0.33, kenten=﹅]{現代の国語を書き表す}場合の\kenten{漢字使⽤の⽬安を⽰す}ものである。 +\end{document} diff --git a/macros/luatex/generic/luatexja/doc/luatexja-zhfonts.pdf b/macros/luatex/generic/luatexja/doc/luatexja-zhfonts.pdf Binary files differnew file mode 100644 index 0000000000..6b6ee65fdf --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/luatexja-zhfonts.pdf diff --git a/macros/luatex/generic/luatexja/doc/luatexja-zhfonts.tex b/macros/luatex/generic/luatexja/doc/luatexja-zhfonts.tex new file mode 100644 index 0000000000..e220c0de05 --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/luatexja-zhfonts.tex @@ -0,0 +1,280 @@ +\documentclass[DIV=13]{article} +\usepackage{typearea} +\usepackage{hologo} +\makeatletter +\def\verbatim{\@verbatim \frenchspacing\@vobeyspaces\luatexlocalleftbox{\hskip3\zw} \@xverbatim} +\makeatother +\def\pTeX{p\TeX} +\def\LuaTeX{Lua\TeX} +\def\XeTeX{\hologo{XeTeX}} +\def\ConTeXt{Con\TeX t} +\usepackage{booktabs} +\usepackage{multicol} +\usepackage{indentfirst} +\usepackage{luatexja-fontspec} +\parindent2\zw +\linespread{1.25} +\setmainjfont{FandolSong} +\title{\textbf{\LuaTeX-ja简体中文字体配置}} +\author{马起园\hskip2.5\zw 苏 杰} +\date{2013年5月} +\begin{document} +\maketitle +\section{\LuaTeX-ja项目简介} +\LuaTeX-ja项目旨在将\pTeX 处理汉字的机制及相关功能移植到\LuaTeX 下,当前项目 +的成员有:北川弘典、前田一贵、八登崇之、黑木裕介 、阿部纪行、山本宗宏、本田知 +亮、斋藤修三郎和马起园。 + +\LuaTeX 虽然在编码上支持Unicode,但并不能直接处理汉字断行以及禁则应用,而 +在\pTeX 系列中则能够处理断行并应用禁则,但并不支持PDF输出。\LuaTeX 下处理 +汉字的断行和应用禁则需要使用其内建的诸多callback来进行。\pTeX 扩展TFM为JFM, +但是JFM抽象程度更高,该文件涉及到的内容是字体的标点压缩,可以用于多个汉字字体。 + +当前版本的\LuaTeX-ja 可以应用于\TeX\ Live和W32\TeX,在旧版本MikTeX下使用会 +出问题,因为MikTeX下的\LuaTeX 存在编译上的bug。 + +\section{字体使用} + +\subsection{关于\LuaTeX-ja的字体调用} + +\XeTeX 在调用字体的时候需要使用freetype和fontconfig库,所以需要更新字体缓 +存,但是在\LuaTeX 下就不太一样。\LuaTeX 只需要在初次使用的时候刷新字体数据 +库即可(此数据库是一个lua文件)。\LuaTeX 下的字体缓存实际上是将字体的各种 +信息导出并保存的文件,在调用一个新字体的时候会生成一个。\LuaTeX 对于字体的 +处理并没有使用freetype,而是使用了fontforge,不过可能由于该库的接口有一些 +问题,导致部分字体无法在\LuaTeX 下使用。 + +在使用\LuaTeX-ja的时候,需要先刷新字体数据库,该命令的使用方法如下: +\begin{verbatim} +Usage: mkluatexfontdb [OPTION]... + +Rebuild the LuaTeX font database. + +Valid options: + -f --force force re-indexing all fonts + -q --quiet don't output anything + -v --verbose=LEVEL be more verbose (print the searched directories) + -vv print the loaded fonts + -vvv print all steps of directory searching + -V --version print version and exit + -h --help print this message +\end{verbatim} + +在新版本的\texttt{luaotfload}包中,提供了新的命令\texttt{luaotfload-tool}, +但如上所述的\texttt{mkluatexfontdb}依然能够使用。 + +又是可能遇到通不过的字体,需要将这个字体的绝对路径添加到\texttt{luaotfload-blacklist.cnf}中, +这个文件的内容如下: +\begin{verbatim} +% Takes ages to load +LastResort.ttf % a MacOSX font, but also available for free from unicode.org +% Segfaults under LuaTeX 0.76 +lingoes.ttf +% http://tug.org/pipermail/luatex/2013-May/004239.html +Diablindall.ttf +spltfgbd.ttf +spltfgbi.ttf +spltfgit.ttf +spltfgrg.ttf +\end{verbatim} + +如果你在\texttt{texmf-local}下添加了某些私有字体,请及时运行\texttt{texhash}, +这样能够方便在运行\LuaTeX 的时候能够通过kpathsea库找到他们。 + +Lua\TeX 调用TrueType和OpenType字体并没有固定的方式,\XeTeX 使用了固定的接口, +而Lua\TeX 需要使用luaotfload包来进行字体的调用。这两种字体一般都有高级特性, +在\TeX\ Live或者W32\TeX 中可以使用\texttt{otfinfo}命令来查看相关的信息: +\begin{verbatim} +'Otfinfo' reports information about an OpenType font to standard output. +Options specify what information to print. + +Usage: otfinfo [-sfzpg | OPTIONS] [OTFFILES...] + +Query options: + -s, --scripts Report font's supported scripts. + -f, --features Report font's GSUB/GPOS features. + -z, --optical-size Report font's optical size information. + -p, --postscript-name Report font's PostScript name. + -a, --family Report font's family name. + -v, --font-version Report font's version information. + -i, --info Report font's names and designer/vendor info. + -g, --glyphs Report font's glyph names. + -t, --tables Report font's OpenType tables. + -T, --dump-table NAME Output font's 'NAME' table. + +Other options: + --script=SCRIPT[.LANG] Set script used for --features [latn]. + -V, --verbose Print progress information to standard error. + -h, --help Print this message and exit. + -q, --quiet Do not generate any error messages. + --version Print version number and exit. + +Report bugs to <ekohler@gmail.com>. +\end{verbatim} + +\subsection{使用字体的方法} + +目前\LuaTeX-ja支持在plain \TeX 和\LaTeX 下使用。如果你使用texinfo,那么很 +不幸,你不太可能使用\LuaTeX-ja来处理中文,因为texinfo是针对pdf\TeX 设计的, +在\LuaTeX 下使用已经有了一定的不兼容现象,即使完全兼容也需要对texinfo中的 +字体配置进行调整,如果你急需使用texinfo来处理中文,请尝试W32\TeX 下的texinfo, +这个发行版中的texinfo已经打了补丁。对于\ConTeXt 用户,请使用李延瑞的zhfonts模块 +\footnote{见https://github.com/liyanrui/zhfonts}。 + +在plain \TeX 中使用Lua\TeX-ja可以在源文件中写入: +\begin{verbatim} +\input luatexja-core.sty +\end{verbatim} + +Lua\TeX-ja移植的了\verb!\jfont!命令,在plain \TeX 下需要通过该命令来 +控制输出的汉字字体,例如: +\begin{verbatim} +\jfont\song={name:SimSun:jfm=banjiao} at 10pt +\song 我能吞下玻璃而不伤身体。 +\end{verbatim} + +上文中的\verb!jfm=banjiao!使用来控制标点压缩的,如果此项未设定,则 +使用默认的\verb!ujis!压缩模式,对于简体中文来讲,可用的模式有: +\texttt{quanjiao,banjiao,kaiming, CCT}。 + +而在\LaTeX 下使用则较为简单,使用: +\begin{verbatim} +\usepackage{luatexja-fontspec} +\end{verbatim} +这个包对fontspec包进行了封装,令其能够较为便利地设定汉字字体。 +这个包提供的命令如下: +\begin{table}[htbp] + \centering + \begin{tabular}{ll} + \toprule + \multicolumn{1}{c}{\textbf{命令}} & \multicolumn{1}{c}{\textbf{用途}} \\ + \midrule + \verb!\jfontspec! & 改变当前汉字字体 \\ + \verb!\setmainjfont! & 设定文档主汉字字体 \\ + \verb!\setsansjfont! & 设定文档的无衬线汉字字体(黑体) \\ + \verb!\newjfontfamily! & 设定新的汉字字体族命令 \\ + \verb!\newjfontface! & 设定新的汉字字体命令 \\ + \verb!\defaultjfontfeatures! & 默认汉字字体的特性 \\ + \verb!\addjfontfeatures! & 设定当前字体的特性 \\ + \bottomrule + \end{tabular}% +\end{table}% + +\subsection{不可用字体系列} + +中文字体在丰度上与日文字体对比并不占优势,所以中文\TeX 文档在使用使用字体 +上没有太大变化。当你想在\LuaTeX-ja下是有部分特色字体的时候,请做好此种字体 +可能无法使用的准备。目前报错明显的字体有数个: +\begin{itemize} +\item 灵格斯词典附带的音标字体,这些字体会安装到系统字体文件夹下,在更新 + 字体数据库的时候会出现程序崩溃的情况,这是字体本身的原因,需要添加到黑名单中 +\item 康熙字典体,这是中国大陆一位业余字体设计者所设计的字体,由于该作者 + 缺乏相关技术知识,导致此字体的CMap出错,无论是完全版还是试用版都会出现 + 问题,此外该字体的boundingbox也是错误的,在嵌入pdf文档中十分影响阅读 +\item 信黑体,这个字体也是CMap的问题,无法使用 +\end{itemize} +\subsection{Fandol字体系列} +Fandol系列字体由本文档两位作者联合开发,含有数种样式。 +该套字体可以在TeXLive下进行更新。 + +\begin{table}[htbp] + \centering + \begin{tabular}{lll} + \toprule + \multicolumn{1}{c}{\textbf{字体名}} & \multicolumn{1}{c}{\textbf{文件名}} & \multicolumn{1}{c}{\textbf{样例}} \\ + \midrule + FandolSong-Regular & \texttt{FandolSong-Regular.otf} & {我能吞下玻璃而不伤身体} \\ + FandolSong-Bold & \texttt{FandolSong-Bold.otf} & {\bf 我能吞下玻璃而不伤身体} \\ + FandolHei-Regular & \texttt{FandolHei-Regular.otf} & {\jfontspec{FandolHei-Regular}我能吞下玻璃而不伤身体} \\ + FandolHei-Bold & \texttt{FandolHei-Bold.otf} & {\jfontspec{FandolHei-Bold}我能吞下玻璃而不伤身体} \\ + FandolFang-Regular & \texttt{FandolFang-Regular.otf} & {\jfontspec{FandolFang-Regular}我能吞下玻璃而不伤身体}\\ + FandolKai-Regular & \texttt{FandolKai-Regular} & {\jfontspec{FandolKai-Regular}我能吞下玻璃而不伤身体}\\ + \bottomrule + \end{tabular}% +\end{table}% + + +\subsection{华文字体系列} +在微软提供的Office套装中附带了一定数量的中文字体, +这些字体是常州华文印刷新技术有限公司制造的。 +这些字体安装在系统字体文件夹下,在使用\LuaTeX-ja 的时候 +可以酌情使用。在本文档中,我们推荐简体中文用户使用 +此套字体,从使用率上看,各大学都会装有微软的操作系统 +和微软的Office,可以说已经相当普及,故做推荐。 + +\begin{table}[htbp] + \centering + \begin{tabular}{llll} + \toprule + \multicolumn{1}{c}{\textbf{字体名}} & \multicolumn{1}{c}{\textbf{文件名}} & \multicolumn{1}{c}{\textbf{PostScript名}} & \multicolumn{1}{c}{\textbf{样例}} \\ + \midrule + 华文宋体 & \texttt{STSONG.TTF} & STSong & {\jfontspec{STSong}我能吞下玻璃而不伤身体} \\ + 华文中宋 & \texttt{STZHONGS.TTF} & STZhongsong & {\jfontspec{STZhongsong}我能吞下玻璃而不伤身体} \\ + 华文细黑 & \texttt{STXIHEI.TTF} & STXihei & {\jfontspec{STXihei}我能吞下玻璃而不伤身体} \\ + 华文楷体 & \texttt{STKAITI.TTF} & STKaiti & {\jfontspec{STKaiti}我能吞下玻璃而不伤身体} \\ + 华文仿宋 & \texttt{STFANGSO.TTF} & STFangsong & {\jfontspec{STFangsong}我能吞下玻璃而不伤身体} \\ + \bottomrule + \end{tabular}% +\end{table} + +\subsection{中易字体系列} +在Windows系统简体中文版中,附带了数种中文字体。 +这些字体为中易中标电子信息技术有限公司制造的。 +同我们强烈推荐的第一种方案比较,没有中宋。 +如果按照CCT的传统,一般使用黑体替换。 + +\begin{table}[htbp] + \centering + \begin{tabular}{llll} + \toprule + \multicolumn{1}{c}{\textbf{字体名}} & \multicolumn{1}{c}{\textbf{文件名}} & \multicolumn{1}{c}{\textbf{PostScript名}} & \multicolumn{1}{c}{\textbf{样例}} \\ + \midrule + 宋体 & \texttt{simsun.ttc} & SimSun & {\jfontspec{SimSun}我能吞下玻璃而不伤身体} \\ + 黑体 & \texttt{simhei.ttf} & SimHei & {\jfontspec{SimHei}我能吞下玻璃而不伤身体} \\ + 楷体 & \texttt{simkai.ttf} & KaiTi & {\jfontspec{KaiTi}我能吞下玻璃而不伤身体} \\ + 仿宋 & \texttt{simkai.ttf} & FangSong & {\jfontspec{FangSong}我能吞下玻璃而不伤身体} \\ + \bottomrule + \end{tabular}% +\end{table}% + +\subsection{Adobe字体系列} +在Adobe Reader简体中文版中,附带了宋体和黑体两种字体。 +这两种字体实际上是华文字体,但是和华文字体不能混用, +因为Adobe Reader中的中文字体的基线都进行了调整, +不能互相匹配。在Adobe InDesign中还附带了楷体和仿宋体。 +Adobe的中文字体的Postscript名即为文件名去掉后缀名。 + +\begin{table}[htbp] + \centering + \begin{tabular}{lll} + \toprule + \multicolumn{1}{c}{\textbf{字体名}} & \multicolumn{1}{c}{\textbf{文件名}} & \multicolumn{1}{c}{\textbf{样例}} \\ + \midrule + Adobe 宋体 Std & \texttt{AdobeSongStd-Light.otf} & {\jfontspec{AdobeSongStd-Light}我能吞下玻璃而不伤身体} \\ + Adobe 黑体 Std & \texttt{AdobeHeitiStd-Regular.otf} & {\jfontspec{AdobeHeitiStd-Regular}我能吞下玻璃而不伤身体} \\ + Adobe 楷体 Std & \texttt{AdobeKaitiStd-Regular.otf} & {\jfontspec{AdobeKaitiStd-Regular}我能吞下玻璃而不伤身体} \\ + Adobe 仿宋 Std & \texttt{AdobeFangsongStd-Regular.otf} & {\jfontspec{AdobeFangsongStd-Regular}我能吞下玻璃而不伤身体} \\ + \bottomrule + \end{tabular}% +\end{table}% + +\subsection{方正字体系列} +方正字体的来源有两种,第一种是使用方正的排版系统的时候会 +安装到Windows系统的字体文件夹下,第二种是针对Linux系统 +来说的,WPS for Linux附带了部分方正字体。 + +\begin{table}[htbp] + \centering + \begin{tabular}{llll} + \toprule + \multicolumn{1}{c}{\textbf{字体名}} & \multicolumn{1}{c}{\textbf{文件名}} & \multicolumn{1}{c}{\textbf{全名}} & \multicolumn{1}{c}{\textbf{样例}} \\ + \midrule + 方正书宋\_GBK & \texttt{FZSSK.TTF} & FZShuSong-Z01 & {\jfontspec{FZShuSong-Z01}我能吞下玻璃而不伤身体} \\ + 方正小标宋\_GBK & \texttt{FZXBSK.TTF} & FZXiaoBiaoSong-B05 & {\jfontspec{FZXiaoBiaoSong-B05}我能吞下玻璃而不伤身体} \\ + 方正黑体\_GBK & \texttt{FZHTK.TTF} & FZHei-B01 & {\jfontspec{FZHei-B01}我能吞下玻璃而不伤身体} \\ + 方正楷体\_GBK & \texttt{FZKTK.TTF} & FZKai-Z03 & {\jfontspec{FZKai-Z03}我能吞下玻璃而不伤身体} \\ + 方正仿宋\_GBK & \texttt{FZFSK.TTF} & FZFangSong-Z02 & {\jfontspec{FZFangSong-Z02}我能吞下玻璃而不伤身体} \\ + \bottomrule + \end{tabular}% +\end{table}% +\end{document} diff --git a/macros/luatex/generic/luatexja/doc/luatexja.dtx b/macros/luatex/generic/luatexja/doc/luatexja.dtx new file mode 100644 index 0000000000..d65b7165b8 --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/luatexja.dtx @@ -0,0 +1,11274 @@ +%<*!showexpl> +%#! lualatex -shell-escape + +% To typeset this manual, you need following two fonts: +% - KozMinPr6N-Regular.otf +% - KozGoPr6N-Medium.otf +% - KozGoPr6N-Regular.otf + +%%%%% section ==> 章 +%%%%% subsection => 節 +\IfFileExists{luatex85.sty}{\RequirePackage{luatex85}}{} + +%<en>\documentclass[a4paper,titlepage]{article} +%<ja>\documentclass[a4paper,10ptj,titlepage]{ltjsarticle} + +%%%%%%%% +\makeatletter +%%%%%%%% +\def\pgfsysdriver{pgfsys-pdftex.def} +\directlua{if jit then jit.on() end} +\usepackage{metalogo,amsmath,array,tikz,pict2e,multienum,float} +\usepackage{booktabs,multicol,luatexja-ruby} +\usepackage[all]{xy} +\usepackage{lltjext,alltt,comment} + +%%%%%%%% Lua GC +\patchcmd\@outputpage{\stepcounter{page}}{% + \directlua{% + if jit then + local k = collectgarbage("count") + if k>900000 then + collectgarbage("collect") + texio.write_nl("term and log", "GC: ", math.floor(k), math.floor(collectgarbage("count"))) + end + end + }% + \stepcounter{page}% +}{}{} + +%%%%%%%% fonts +\usepackage{luatexja-otf} +\usepackage[no-math]{fontspec} +\setmainfont[Ligatures=TeX,RawFeature=-notdef]{Linux Libertine O} +\setmonofont[Scale=MatchLowercase, ItalicFont=lmmono10-italic.otf, + BoldFont=lmmonolt10-bold.otf, BoldItalicFont=lmmonolt10-boldoblique.otf, + RawFeature=-notdef +]{lmmono10-regular.otf} +\setsansfont[Scale=MatchLowercase,Ligatures=TeX,RawFeature=-notdef]{Linux Biolinum O} +\usepackage[match]{luatexja-fontspec} +\usepackage[kozuka-pr6n]{luatexja-preset} +\usepackage{unicode-math} +\setmonojfont{KozGoPr6N-Regular.otf} +\setmathfont[Scale=MatchLowercase]{XITSMath} + +\setLaTeXa{\scshape a} +%<*ja> +\def\emph#1{\textbf{\textgt{#1}}} +\def\headfont{\normalfont\bfseries\gtfamily}\normalsize +%</ja> +%<*en> +\frenchspacing\sloppy +\usepackage[margin=25mm,lmargin=30mm,rmargin=30mm,footskip=6mm]{geometry} +\usepackage{luatexja-adjust}\ltjdisableadjust +\parskip=\smallskipamount +\makeatletter +\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% + {3.25ex \@plus1ex \@minus.2ex}% + {-1em}% + {\normalfont\normalsize\bfseries\raisebox{.2ex}{$\mdlgblksquare\mkern1mu$}}} +%</en> +%<*ja> +\usepackage[textwidth=44\zw, lines=41, footskip=6mm]{geometry} +\usepackage{luatexja-adjust}%\ltjdisableadjust +\advance\leftmargini-1\zw\advance\leftmarginii-1\zw +%</ja> +%<en>\long\def\fakefn#1#2{\par\noindent{\footnotesize\hbox to1.8em{\hss#1}#2\par}} +%<*ja> +\long\def\fakefn#1#2{% + \par{\footnotesize\advance\leftskip 3\zw\parindent1\zw\noindent + \llap{#1\hskip.3\zw}#2\par}} +%</ja> +%%%%%%%% listings + +%%%%%%%% IVS + +\def\IVS#1{\char\numexpr "E0100+#1\relax}%" +\def\IVSA#1#2#3#4#5{% + \textcolor{blue}{\raisebox{3.5pt}{\tt% + \fboxsep=0.5pt\fbox{\tiny \oalign{0#1#2\crcr#3#4#5\crcr}}}}% +} +{\catcode`\%=11 + \gdef\IVSB#1{\expandafter\IVSA\directlua{ + local cat_str = luatexbase.catcodetables['string'] + tex.sprint(cat_str, string.format('%X', 0xE00EF+#1)) +}}} + +\usepackage{listings,showexpl,enumitem} +\lstset{ + basicstyle=\ttfamily\small, pos=r, breaklines=true, + numbers=none, rframe={}, basewidth=0.5em, numberstyle=\tiny, numbersep=0.5em, + explpreset={numberstyle=\tiny, numbers=left, numbersep=1em, columns=fixed} +} +% Suppress output from showexpl to stdout. +\makeatletter +\let\SX@Info\relax + +%%%%%%%% colors +%% modified from http://jfly.iam.u-tokyo.ac.jp/colorset/ +\usepackage{transparent} +\definecolor{red}{rgb}{1, 0.16, 0} +\definecolor{blue}{rgb}{0, 0.25, 1} +\definecolor{gray}{rgb}{.50, .53, .56} +\definecolor{green}{rgb}{.21, .63, .42} +\definecolor{cyan}{rgb}{0.40, .80, 1} +\definecolor{b_gray}{rgb}{0.78, 0.78, 0.80} +\definecolor{b_pink}{rgb}{1, 0.82, 0.82} +\definecolor{b_green}{rgb}{.53, .91, .69} +\definecolor{b_cyan}{rgb}{0.70, .92, 98} + +%%%%%%%% hyperref +\usepackage{hyperref,bookmark} +%<*en> +\title{The \LuaTeX-ja package} +\author{The \LuaTeX-ja project team} +\date{\LuaTeXjaversion~(\today)} +%</en> +%<*ja> +\title{\LuaTeX-jaパッケージ} +\author{\LuaTeX-jaプロジェクトチーム} +\date{\LuaTeXjaversion(\today)} +%</ja> +\hypersetup{% + unicode, + colorlinks, + allbordercolors=1 1 1, + allcolors=blue, +%<*en> + pdfauthor={The LuaTeX-ja project team}, + pdftitle={The LuaTeX-ja package} +%</en> +%<*ja> + pdfauthor={LuaTeX-jaプロジェクトチーム}, + pdftitle={LuaTeX-jaパッケージ} +%</ja> +} +%<*ja> +\def\HyRef@autoref#1#2{% + \begingroup + \Hy@safe@activestrue + \expandafter\HyRef@autosetref\csname r@#2\endcsname{#2}{#1}% + \endgroup\ltjalchar"200C %" 欧文ゴースト +} +\def\figureautorefname{図} +\def\tableautorefname{表} +%</ja> + +%%%%%%%% definition env. +\usepackage{amsthm} +\theoremstyle{definition} +%<en>\newtheorem{defn}{Definition} +%<ja>\newtheorem{defn}{定義} + +%%%%%%%% logo +\usepackage{metalogo} +\DeclareRobustCommand\eTeX{\ensuremath{\varepsilon}-\kern-.125em\TeX} +\DeclareRobustCommand\LuaTeX{Lua\TeX} +\DeclareRobustCommand\pdfTeX{pdf\TeX} +\DeclareRobustCommand\pTeX{p\kern-.15em\TeX} +\DeclareRobustCommand\upTeX{up\kern-.15em\TeX} +\DeclareRobustCommand\pLaTeX{p\kern-.05em\LaTeX} +\DeclareRobustCommand\pLaTeXe{p\kern-.05em\LaTeXe} +\DeclareRobustCommand\epTeX{\ensuremath{\varepsilon}-\pTeX} + +%%%%%%%% other macros +\newlist{cslist}{description}{2} +\setlist[cslist]{% + style=nextline,font=\mdseries\ttfamily, + before*=\def\<{\char`\<}\def\>{\char`\>}\def\{{\char`\{}\def\}{\char`\}}, + topsep=\medskipamount, +%<ja> leftmargin=2\zw, +%<en> leftmargin=2em, +} + +\def\labelenumii{(\arabic{enumii})} +\long\def\@makecaption#1#2{% + \vskip\abovecaptionskip + \sbox\@tempboxa{{\small #1. #2}}% + \ifdim \wd\@tempboxa >\hsize + {\small #1. #2}\par + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip} + +\def\_{\leavevmode \kern .06em\vbox {\hrule \@width .333em}} +\def\cs#1{\texttt{\upshape + \texorpdfstring{\textbackslash\hbox{\ltjsetparameter{autoxspacing=false}#1}}{\textbackslash#1}}} +\ltjsetparameter{alxspmode={`\\,allow}} +\def\text@#1{% + \ifnum\mathstyle<\scriptstyle + \mbox{#1} + \else\ifnum\mathstyle<\scriptscriptstyle + \mbox{\let\f@size\sf@size\selectfont#1} + \else + \mbox{\let\f@size\ssf@size\selectfont#1} + \fi\fi +} +%%%%%%%% +\makeatother +%%%%%%%% + +\def\Node#1#2{\,\vcenter{\hbox{\fboxsep=1pt\fbox{\vbox{\small\halign{\hfil##\hfil\cr + #1\mathstrut\cr\noalign{\vskip1pt\hrule height.4pt\vskip1pt}\strut#2\cr}}}}}\,} +\def\HNode#1#2#3#4{\,\vcenter{\hbox{\fboxsep=1pt\fbox{\vbox{\small\halign{\hfil##\hfil\cr + #1\mathstrut\cr\noalign{\vskip1pt\hrule height.4pt\vskip1pt}% + width:\hfill\ #2\cr height:\hfill\ #3\cr depth:\hfill\ #4\cr + }}}}}\,} + +\makeatletter +\def\myghost{\ifmmode\else\ltjalchar"200C \fi} +\def\Param#1{\texorpdfstring{\@Param{#1}}{#1}} % parameter name +\protected\def\@Param#1{\myghost\hyperlink{fld:#1}{\underline{\smash{\textsf{#1}}}}\myghost} +\protected\def\DParam#1{\myghost\hypertarget{fld:#1}{\underline{\smash{\textsf{#1}}}}\myghost} % parameter name (definition) +\def\Pkg#1{\texorpdfstring{\textsf{#1}}{#1}} % packages/classes +\ltjsetparameter{alxspmode={"200C,allow}} + +\begin{document} +\lstset{ + vscmd=\IVSB +} + +\catcode`\<=13 +\def<#1>{{\normalfont\rm\itshape$\langle$#1\/$\rangle$}} +\let\LARG=< +\maketitle + +\tableofcontents +\bigskip + +%<*en> +\textbf{This documentation is far from complete. It may have many +grammatical (and contextual) errors.} Also, several parts +are written in Japanese only. +%</en> +%<*ja> +\emph{\large 本ドキュメントはまだまだ未完成です.} +%</ja> + +\clearpage +%<en>\part{User's manual} +%<ja>\part{ユーザーズマニュアル} + +%<en>\section{Introduction} +%<ja>\section{はじめに} + + +%<*en> +The \LuaTeX-ja package is a macro package for typesetting high-quality +Japanese documents when using \LuaTeX. +%</en> +%<*ja> +\LuaTeX-jaパッケージは,次世代標準\TeX である\LuaTeX の上で,\pTeX と同等 +/それ以上の品質の日本語組版を実現させようとするマクロパッケージである. +%</ja> +%<en>\subsection{Backgrounds} +%<ja>\subsection{背景} + +%<*en> +Traditionally, ASCII \pTeX, an extension of \TeX, and its derivatives +are used to typeset Japanese documents in \TeX. \pTeX\ is an engine +extension of \TeX: so it can produce high-quality Japanese documents +without using very complicated macros. But this point is a mixed +blessing: \pTeX\ is left behind from other extensions of \TeX, +especially \eTeX\ and \pdfTeX, and from changes about +Japanese processing in computers (\textit{e.g.}, the UTF-8 encoding). +%</en> +%<*ja> +従来,「\TeX を用いて日本語組版を行う」といったとき,エンジンとしては +ASCII \pTeX やそれの拡張物が用いられることが一般的であった.\pTeX は\TeX +のエンジン拡張であり,(少々仕様上不便な点はあるものの)商業印刷の分野に +も用いられるほどの高品質な日本語組版を可能としている.だが,それは弱点に +もなってしまった.\pTeX という(組版的に)満足なものがあったため,海外で +行われている数々の\TeX の拡張――例えば\eTeX や\pdfTeX ――や,TrueType, +OpenType, Unicodeといった計算機で日本語を扱う際の状況の変化に追従すること +を怠ってしまったのだ. +%</ja> + +%<*en> +Recently extensions of \pTeX, namely \upTeX\ (Unicode-implementation +of \pTeX) and \epTeX\ (merging of \pTeX\ and +\eTeX\ extension), have developed to fill those gaps to some +extent, but gaps still exist. +%</en> +%<*ja> +ここ数年,若干状況は改善されてきた.現在手に入る大半の\pTeX バイナリでは +外部UTF-8入力が利用可能となり,さらにUnicode化を推進し,\pTeX の内部処理 +までUnicode化した\upTeX も開発されている.また,\pTeX に\eTeX 拡張をマー +ジした\epTeX も登場し,\TeX\ Live\ 2011では\pLaTeX が\epTeX の上で動作す +るようになった.だが,\pdfTeX 拡張(PDF直接出力やmicro-typesetting)を +\pTeX に対応させようという動きはなく,海外とのgapは未だにあるのが現状であ +る. +%</ja> + +%<*en> +However, the appearance of \LuaTeX\ changed the whole situation. With +using Lua ``callbacks'', users can customize the internal processing of +\LuaTeX. So there is no need to modify sources of engines to +support Japanese typesetting: to do this, we only have to write Lua +scripts for appropriate callbacks. +%</en> +%<*ja> +しかし,\LuaTeX の登場で,状況は大きく変わることになった.Luaコードで +``callback''を書くことにより,\LuaTeX の内部処理に割り込みをかけることが可 +能となった.これは,エンジン拡張という真似をしなくても,Luaコードとそれに +関する\TeX マクロを書けば,エンジン拡張とほぼ同程度のことができるようになっ +たということを意味する.\LuaTeX-jaは,このアプローチによってLuaコード・ +\TeX マクロによって日本語組版を\LuaTeX の上で実現させようという目的で開発 +が始まったパッケージである. +%</ja> + +%<en>\subsection{Major changes from \pTeX} +%<ja>\subsection{\pTeX からの主な変更点} +\label{ssec:chgptex} + +%<*en> +The \LuaTeX-ja package is under much influence of \pTeX\ engine. The initial +target of development was to implement features of \pTeX. However, +implementing all feature of \pTeX\ is impossible, +since all process of \LuaTeX-ja must be implemented only by Lua and \TeX\ macros. +Hence \emph{\LuaTeX-ja is not a just porting of \pTeX; unnatural +specifications/behaviors of \pTeX\ were not adopted}. +%</en> +%<*ja> +\LuaTeX-jaは,\pTeX に多大な影響を受けている.初期の開発目標は,\pTeX の機 +能をLuaコードにより実装することであった.しかし,(\pTeX はエンジン拡張であったのに対し) +\LuaTeX-jaはLuaコードと\TeX マクロを用いて全てを実装していなければならないため,\pTeX +の完全な移植は不可能であり,また\pTeX における実装がいささか不可解になっ +ているような状況も発見された.そのため,\emph{\LuaTeX-jaは,もはや +\pTeX の完全な移植は目標とはしない.\pTeX における不自然な仕様・挙動があ +れば,そこは積極的に改める.} +%</ja> + +%<*en> +The followings are major changes from \pTeX. +For more detailed information, see Part~\ref{part-imp} or other sections of this manual. +%</en> +%<*ja> +以下は \pTeX からの主な変更点である. +より詳細については第\ref{part-imp}部など本文書の残りを参照. +%</ja> + +%<*en> +\paragraph{Command names} \pTeX\ addes several primitives, such as \cs{kanjiskip}, +\cs{prebreakpenalty},~and \cs{ifydir}. They can be used as follows: +%</en> +%<*ja> +\paragraph{命令の名称} 例えば\pTeX で追加された次のようなプリミティブ +%</ja> +\begin{verbatim} +\kanjiskip=10pt \dimen0=kanjiskip +\tbaselineshift=0.1zw +\dimen0=\tbaselineshift +\prebreakpenalty`ぁ=100 +\ifydir ... \fi +\end{verbatim} +%<en> However, we cannot use them under \LuaTeX-ja. +%<en> Instead of them, we have to write as the following. +%<ja> は\LuaTeX-jaには存在しない.\LuaTeX-jaでは以下のように記述することになる. +\begin{verbatim} +\ltjsetparameter{kanjiskip=10pt} \dimen0=\ltjgetparameter{kanjiskip} +\ltjsetparameter{talbaselineshift=0.1\zw} +\dimen0=\ltjgetparameter{talbaselineshift} +\ltjsetparameter{prebreakpenalty={`ぁ,100}} +\ifnum\ltjgetparemeter{direction}=4 ... \fi +\end{verbatim} +%<*en> +Note that \pTeX\ adds new two useful units, namely \texttt{zw}~and~\texttt{zh}. +As shown above, they are changed by \cs{zw}~and~\cs{zh} respectively, in \LuaTeX-ja. +%</en> +%<*ja> +特に注意してほしいのは,\pTeX で追加された \texttt{zw} と \texttt{zh} という単位は +\LuaTeX-ja では使用できず,\cs{zw}, \cs{zh} と制御綴の形にしないといけないという点である. +%</ja> + +%<*en> +\paragraph{Linebreak after a Japanese character} +In \pTeX, a line break after Japanese character is ignored (and + doesn't yield a space), since line breaks (in source files) are + permitted almost everywhere in Japanese texts. However, \LuaTeX-ja + doesn't have this feature completely, because of a specification + of \LuaTeX. For the detail, see Section~\ref{sec-lbreak}. +%</en> +%<*ja> +\paragraph{和文文字直後の改行} +日本語の文書中では改行はほとんどどこでも許されるので,\pTeX では和文文字 + 直後の改行は無視される(スペースが入らない)ようになっていた.しかし, + \LuaTeX-ja では \LuaTeX の仕様のためにこの機能は完全には実装されていない. + 詳しくは\ref{sec-lbreak}章を参照. +%</ja> + +%<*en> +\paragraph{Spaces related to Japanese characters} +The insertion process of glues/kerns between two Japanese + characters and between a Japanese character and other characters + (we refer glues/kerns of both kinds as \textbf{JAglue}) is rewritten from + scratch. +%</en> +%<*ja> +\paragraph{和文関連の空白} +2つの和文文字の間や,和文文字と欧文文字の間に入るグルー/カーン + (両者をあわせて\textbf{JAglue}と呼ぶ)の挿入処理が0から書き直されている. +%</ja> + +\begin{itemize} +%<*en> +\item As \LuaTeX's internal ligature handling is \emph{node-based} + (\textit{e.g.}, \verb+of{}fice+ doesn't prevent ligatures), the + insertion process of \textbf{JAglue} is now \emph{node-based}. +%</en> +%<*ja> +\item \LuaTeX の内部での合字の扱いは「ノード」を単位として行われるようになっている(例えば, + \verb+of{}fice+ で合字は抑制されない).それに合わせ,\textbf{JAglue}の挿入処理も + ノード単位で実行される. +%</ja> + +%<*en> +\item Furthermore, nodes between two characters which have no effects in + line break (\textit{e.g.}, \cs{special} node) and kerns from + italic correction are ignored in the insertion process. +%</en> +%<*ja> +\item さらに,2つの文字の間にある行末では効果を持たないノード(例えば \cs{special} ノード)や, + イタリック補正に伴い挿入されるカーンは挿入処理中では無視される. +%</ja> + +%<*en> +\item \emph{Caution: due to above two points, many methods which did for the + dividing the process of the insertion of \textbf{JAglue} in \pTeX\ are not + effective anymore.} In concrete terms, the following two methods are not effective anymore: +%</en> +%<*ja> +\item \emph{注意:上の2つの変更により,従来\textbf{JAglue}の挿入処理を分断するのに + 使われていたいくつかの方法は用いることができない.具体的には,次の方法はもはや無効である:} +%</ja> +\begin{lstlisting} +ちょ{}っと ちょ\/っと +\end{lstlisting} +%<*en> + If you want to do so, please put an empty horizontal box (hbox) between it instead: +%</en> +%<*ja> + もし同じことをやりたければ,空の水平ボックス(hbox)を間に挟めばよい: +%</ja> +\begin{lstlisting} +ちょ\hbox{}っと +\end{lstlisting} + +%<*en> +\item In the process, two Japanese fonts which only differ in their ``real'' + fonts are identified. +%</en> +%<*ja> +\item 処理中では,2つの和文フォントは,実フォントが異なるだけの場合には同一視 + される. +%</ja> +\end{itemize} + +%<*en> +\paragraph{Directions} +From version~20150420.0, \LuaTeX-ja supports vertical writing. +We implement this feature by using callbacks of \LuaTeX; so it must \emph{not} be confused +with $\Omega$-style direction support of \LuaTeX\ itself. +Due to implementation, the dimension returned by \cs{wd},~\cs{ht}, or~\cs{dp} depends +on the content of the register \emph{only}. This is major difference with \pTeX. +%</en> +%<*ja> +\paragraph{組方向} +バージョン20150420.0からは,不安定ながらも\LuaTeX-ja における縦組みをサポートしている. +なお,\LuaTeX 本体も$\Omega$流の組方向をサポートしているが,それとは全くの別物であること +に注意してほしい. +特に,異なった組方向のボックスを扱う場合には +\cs{wd}, \cs{ht}, \cs{dp}等の仕様が\pTeX と異なるので注意.詳細は第\ref{sec-direction}章を参照. +%</ja> + +%<*en> +\paragraph{\cs{discretionary}} +Japanese characters in discretionary break (\cs{discretionary}) is not supported. +%</en> +%<*ja> +\paragraph{\cs{discretionary}} + \cs{discretionary} 内に直接和文文字を記述することは,\pTeX においても想定されていなかった + 感があるが.\LuaTeX-jaにおいても想定していない.和文文字をどう + しても使いたい場合は \cs{hbox} で括ること. +%</ja> + +%<*en> +\paragraph{Greek and Cyrillic letters, and ISO~8859-1 symbols} +By default, \LuaTeX-ja uses Japanese fonts to typeset Greek and Cyrillic letters, + To change this behavior, + put \verb!\ltjsetparameter{jacharrange={-2,-3}}! in the preamble. + For the detailed description, see Subsection~\ref{ssec:setrange}. + +From version~20150906.0, characters which belongs both ISO~8859-1 and JIS~X~0208, +such as \P~and~\S, are now typeset in alphabetic fonts. +If you are using \LaTeXe\ prior to 2017/01/01, these characters are not typeset correctly +without the \cs{fontspec} (and~\Pkg{luatexja-fontspec}) package. +%</en> +%<*ja> +\paragraph{ギリシャ文字・キリル文字とISO~8859-1の記号} +標準では,\LuaTeX-jaはギリシャ文字やキリル文字を和文フォントを使っ + て組む.ギリシャ語などを本格的に組むなどこの状況が望ましくない場合, + プリアンブルに +\begin{lstlisting} + \ltjsetparameter{jacharrange={-2,-3}} +\end{lstlisting} + を入れると + 上記種類の文字は欧文フォントを用いて組まれるようになる. + 詳しい説明は\ref{ssec:setrange}節を参照してほしい. + +また,\P,~\S といったISO~8859-1の上位領域とJIS~X~0208の共通部分の文字は + バージョン20150906.0から標準で欧文扱いとなった.\LaTeXe\ 2017/01/01以降では +標準でTUエンコーディングのLatin Modernフォントが使われるので, +特に何もせずソース中にそのまま記述してもこれらの文字が出力される +\footnote{\LaTeXe\ 2017/01/01より前では,ソース中に直接記述しても + \Pkg{fontspec}パッケージ(および\Pkg{luatexja-fontspec}パッケージ)非読み込みの状態では出力されない.}. +和文扱いで出力するには \verb+\ltjjachar`§+ のように \cs{ltjjachar} 命令 +を使えばよい. +%</ja> + +%<en>\subsection{Notations} +%<ja>\subsection{用語と記法} + +%<*en> +In this document, the following terms and notations are used: +%</en> +%<*ja> +本ドキュメントでは,以下の用語と記法を用いる: +%</ja> +\begin{itemize} +%<*en> +\item Characters are classified into following two types. + Note that the classification can be customized by a user + (see Subsection~\ref{ssec:setrange}). +%</en> +%<*ja> +\item 文字は次の2種類に分けられる.この類別は固定されているものではなく,ユーザが後から変更可能である + (\ref{ssec:setrange}節を参照). +%</ja> +\begin{itemize} +%<*en> +\item \textbf{JAchar}: standing for characters which is used in Japanese typesetting, + such as Hiragana,~Katakana, Kanji, and~other Japanese punctuation marks. +%</en> +%<*ja> +\item \textbf{JAchar}: ひらがな,カタカナ,漢字,和文用の約物といった + 日本語組版に使われる文字のことを指す. +%</ja> + +%<en>\item \textbf{ALchar}: standing for all other characters like latin alphabets. +%<ja>\item \textbf{ALchar}: ラテンアルファベットを始めとする,その他全ての文字を指す. +\end{itemize} + +%<*en> +We say \emph{alphabetic fonts} for fonts used in \textbf{ALchar}, +and \emph{Japanese fonts} for fonts used in \textbf{JAchar}. +%</en> +%<*ja> +そして,\textbf{ALchar}の出力に用いられるフォントを\emph{欧文フォント}と呼び, +\textbf{JAchar}の出力に用いられるフォントを\emph{和文フォント}と呼ぶ. +%</ja> +%<*en> +\item A word in a sans-serif font with underline (like \Param{prebreakpenalty}) + means an internal parameter for Japanese typesetting, and it + is used as a key in \cs{ltjsetparameter} command. +%</en> +%<*ja> +\item 下線つきローマン体で書かれた語(例:\Param{prebreakpenalty})は日本語組版用の + パラメータを表し,これらは \cs{ltjsetparameter} 命令のキーとして + 用いられる. +%</ja> +%<*en> +\item A word in a sens-serif font without underline (like \Pkg{fontspec}) + means a package or a class of \LaTeX. +%</en> +%<*ja> +\item 下線なしサンセリフ体の語(例:\Pkg{fontspec})は\LaTeX の + パッケージやクラスを表す. +%</ja> +%<*en> +\item In this document, natural numbers start from~zero. + $\omega$ denotes the set of all natural numbers which can be used in \TeX. +%</en> +%<*ja> +\item 本ドキュメントでは,自然数は0から始まる.(\TeX で扱える)自然数全体の集合は$\omega$と表記する. +%</ja> +\end{itemize} + +%<en>\subsection{About the project} +%<ja>\subsection{プロジェクトについて} + +%<en>\paragraph{Project Wiki} Project Wiki is under construction. +%<ja>\paragraph{プロジェクトWiki} プロジェクトWikiは構築中である. +%<*en> +\begin{itemize} +\item \url{https://osdn.jp/projects/luatex-ja/wiki/FrontPage%28en%29} (English) +\item \url{https://osdn.jp/projects/luatex-ja/wiki/FrontPage} (Japanese) +\item \url{https://osdn.jp/projects/luatex-ja/wiki/FrontPage%28zh%29} (Chinese) +\end{itemize} +%</en> +%<*ja> +\begin{itemize} +\item \url{https://osdn.jp/projects/luatex-ja/wiki/FrontPage}(日本語) +\item \url{https://osdn.jp/projects/luatex-ja/wiki/FrontPage%28en%29}(英語) +\item \url{https://osdn.jp/projects/luatex-ja/wiki/FrontPage%28zh%29}(中国語) +\end{itemize} +%</ja> + +%<en>This project is hosted by OSDN. +%<ja>本プロジェクトはOSDNのサービスを用いて運営されている. + +%<en>\paragraph{Members}\ +%<ja>\clearpage\paragraph{開発メンバー}\ + +%<*en> +\begin{multienumerate} +\def\labelenumi{$\bullet$} +\mitemxxx{Hironori KITAGAWA}{Kazuki MAEDA}{Takayuki YATO} +\mitemxxx{Yusuke KUROKI}{Noriyuki ABE}{Munehiro YAMAMOTO} +\mitemxxx{Tomoaki HONDA}{Shuzaburo SAITO}{MA Qiyuan} +\end{multienumerate} +%</en> +%<*ja> +\begin{multienumerate} +\def\labelenumi{$\bullet$} +\mitemxxx{北川 弘典}{前田 一貴}{八登 崇之} +\mitemxxx{黒木 裕介}{阿部 紀行}{山本 宗宏} +\mitemxxx{本田 知亮}{齋藤 修三郎}{馬 起園} +\end{multienumerate} +%</ja> + +% \paragraph{Acknowledgments} -- 挿入するならここ + +%<en>\clearpage +%<en>\section{Getting Started} +%<ja>\section{使い方} +%<en>\subsection{Installation} +%<ja>\subsection{インストール} + +%<en>The following packages are needed for the \LuaTeX-ja\ package. +%<ja>\LuaTeX-jaパッケージの動作には次のパッケージ類が必要である. +\begin{itemize} +\item \LuaTeX\ 1.0.0 (or later) +\item recent \Pkg{luaotfload} (v2.98 or later recommended) +\item \Pkg{adobemapping} (Adobe cmap and pdfmapping files) +\item \Pkg{etoolbox}, \Pkg{everysel} (if you want to use \LuaTeX-ja with \LaTeXe) +\item \Pkg{ltxcmds}, \Pkg{pdftexcmds}, \Pkg{filehook}, \Pkg{atbegshi} +\item \Pkg{fontspec} v2.7c (or later) +%<en>\item \emph{IPAex fonts} (\url{http://ipafont.ipa.go.jp/}) +%<ja>\item \emph{IPAexフォント(\url{http://ipafont.ipa.go.jp/})} +\end{itemize} +%<en>In summary, \LuaTeX-ja version 20180825.0 (or~later) no longer supports \TeX~Live~2016. +%<*ja> +要約すると,バージョン20180825.0以降の\LuaTeX-jaは\TeX~Live~2016以前では動作しない\footnote{% + もっとも,自分で\LuaTeX のバイナリをSubversionリポジトリからビルドしていれば話は別である. +}. +%</ja> + +%<*en> +Now \LuaTeX-ja is available from +CTAN (in the \texttt{macros/luatex/generic/luatexja} directory), and +the following distributions: + \begin{itemize} + \item MiK\TeX\ (in \texttt{luatexja.tar.lzma}); see the next subsection + \item \TeX\ Live (in \texttt{texmf-dist/tex/luatex/luatexja}) + \item W32\TeX\ (in \texttt{luatexja.tar.xz}) + \end{itemize} +IPAex fonts are also available in these distributions. +%</en> +%<*ja> +現在,\LuaTeX-jaはCTAN (\texttt{macros/luatex/generic/luatexja})に収録されている他, +以下のディストリビューションにも収録されている: + \begin{itemize} + \item MiK\TeX\ (\texttt{luatexja.tar.lzma}) + \item \TeX\ Live (\texttt{texmf-dist/tex/luatex/luatexja}) + \item W32\TeX\ (\texttt{luatexja.tar.xz}) + \end{itemize} +これらのディストリビューションはIPAexフォントも収録している. +W32\TeX においてはIPAexフォントは \texttt{luatexja.tar.xz} 内にある. +%</ja> + +%<en>\paragraph{Manual installation} +%<ja>\paragraph{手動インストール方法} + +\begin{enumerate} +%<*en> +\item Download the source, by one of the following method. + At the present, \LuaTeX-ja has no \emph{stable} release. + +\begin{itemize} +\item Clone the Git repository: +\begin{lstlisting} +$ git clone git://git.osdn.jp/gitroot/luatex-ja/luatexja.git +\end{lstlisting} +\item Download the \texttt{tar.gz} archive of HEAD in the \texttt{master} branch from +\begin{flushleft} +\url{http://git.osdn.jp/view?p=luatex-ja/luatexja.git;a=snapshot;h=HEAD;sf=tgz}. +\end{flushleft} +\end{itemize} + +Note that the \texttt{master} branch, and hence the archive in CTAN, are not updated frequently; +the forefront of development is not the \texttt{master} branch. +%</en> +%<*ja> +\item ソースを以下のいずれかの方法で取得する.現在公開されているのはあくまでも + 開発版であって,安定版でないことに注意. + +\begin{itemize} +\item Gitリポジトリをクローンする: +\begin{lstlisting} +$ git clone git://git.osdn.jp/gitroot/luatex-ja/luatexja.git +\end{lstlisting} +\item \texttt{master} ブランチのスナップショット(\texttt{tar.gz} 形式)をダウンロードする. +\begin{flushleft} +\url{http://git.osdn.jp/view?p=luatex-ja/luatexja.git;a=snapshot;h=HEAD;sf=tgz}. +\end{flushleft} +\end{itemize} +\texttt{master} ブランチ(従って,CTAN内のアーカイブも)はたまにしか更新されないことに注意. +主な開発は\texttt{master}の外で行われ,比較的まとまってきたらそれを \texttt{master} に +反映させることにしている. +%</ja> + +%<*en> +\item Extract the archive. You will see \texttt{src/} and several other sub-directories. +But only the contents in \texttt{src/} are needed to work \LuaTeX-ja. +%</en> +%<*ja> +\item 「Gitリポジトリをクローン」以外の方法でアーカイブを取得したならば,それを展開する. + \texttt{src/} をはじめとしたいくつかのディレクトリができるが, + 動作には \texttt{src/} 以下の内容だけで十分. +%</ja> + +%<*en> +\item If you downloaded this package from CTAN, you have to run following commands + to generate classes + and \texttt{ltj-kinsoku.lua} (the file which stores default ``\textit{kinsoku}'' parameters): +%</en> +%<*ja> +\item もしCTANから本パッケージを取得したのであれば,日本語用クラスファイルや +標準の禁則処理用パラメータを +格納した \texttt{ltj-kinsoku.lua} を生成するために, +以下を実行する必要がある: +%</ja> +\begin{lstlisting} +$ cd src +$ lualatex ltjclasses.ins +$ lualatex ltjsclasses.ins +$ lualatex ltjltxdoc.ins +$ luatex ltj-kinsoku_make.tex +\end{lstlisting} +%<*en> +\emph{Do not forget The last line (processing \texttt{ltj-kinsoku\_make.tex})}. +\texttt{*.\{dtx,ins\}} and \texttt{ltj-kinsoku\_make.tex} used here are not needed in regular use. +%</en> +%<*ja> +\emph{最後の \texttt{ltj-kinsoku\_make.tex} の実行を忘れないように注意}. +ここで使用した \texttt{*.\{dtx,ins\}} と \texttt{ltj-kinsoku\_make.tex} は +通常の使用にあたっては必要ない. +%</ja> + + + +%<*en> +\item Copy all the contents of \texttt{src/} into one of your \texttt{TEXMF} tree. + \texttt{TEXMF/tex/luatex/luatexja/} is an example location. + If you cloned entire Git repository, making a symbolic link of \texttt{src/} + instead copying is also good. +%</en> +%<*ja> +\item \texttt{src} の中身を自分の \texttt{TEXMF} ツリーにコピーする. + 場所の例としては,例えば +\begin{quote} + \texttt{TEXMF/tex/luatex/luatexja/} +\end{quote} + がある. + シンボリックリンクが利用できる環境で,かつリポジトリを直接取得したのであれば, + (更新を容易にするために)コピーではなくリンクを貼ることを勧める. +%</ja> +%<*en> +\item If \texttt{mktexlsr} is needed to update the file name database, make it so. +%</en> +%<*ja> +\item 必要があれば,\texttt{mktexlsr} を実行する. +%</ja> +\end{enumerate} + +%<*en> +\subsection{Cautions} +For changes from \pTeX, see Subsection~\ref{ssec:chgptex}. +%</en> +%<*ja> +\subsection{注意点} +\pTeX からの変更点として,\ref{ssec:chgptex}節も熟読するのが望ましい. +ここでは一般的な注意点を述べる. +%</ja> +\begin{itemize} +%<*en> +\item The encoding of your source file must be UTF-8. Other + encodings, such as EUC-JP or Shift-JIS, are not supported. +%</en> +%<*ja> +\item 原稿のソースファイルの文字コードはUTF-8固定である. + 従来日本語の文字コードとして用いられてきたEUC-JPやShift-JISは使用できない. +%</ja> +%<*en> +\item \LuaTeX-ja is very slower than \pTeX. + % Generally speaking, LuaJIT\TeX\ processes \LuaTeX-ja + % about 30\% faster than \LuaTeX, but not always% + % \footnote{% + % LuaJIT has several limitations such as 1\,GB~(or~2\,GB) memory limitation. + % So typesetting a large source by LuaJIT\TeX may cause an ``out of memory'' error, + % or failure of loading/saving font cache of \Pkg{luaotfload}. + % }. +%</en> +%<*ja> +\item \LuaTeX-jaは動作が\pTeX に比べて非常に遅い. +コードを調整して徐々に速くしているが,まだ満足できる速度ではない. +% LuaJIT\TeX を用いると\LuaTeX のだいたい1.3倍の速度で動くようであるが, +% IPA mj明朝などの大きいフォントを用いた場合には\LuaTeX よりも遅くなることもある +% \footnote{% +% LuaJITは1\,GB(あるいは2\,GB)のメモリ制限など,いくつかの制限事項があることが知られている.そのため, +% 大きいソースファイルをLuaJIT\TeX でタイプセットするとLuaの側で``out of memory''エラーが発生してしまう. +% 本ドキュメントのように,「各ページごとにLuaで使っているメモリ容量をチェックし, +% 必要なら\texttt{collectgarbage("collect")}でガベージコレクタを実行」すると +% 状況が多少改善されるかもしれない. +% また,LuaJIT\TeX でIPA mj明朝などの「大きい」フォントを利用した場合はフォントキャッシュの保存に失敗し, +% 毎回フォントを読み込まなければならず結果的に時間がかかることがある. +% }. +%</ja> + +\item% +%<*en> +\textbf{(Outdated) note for MiK\TeX\ users}\quad +\LuaTeX-ja requires that several CMap files% +\footnote{\texttt{UniJIS2004-UTF32-\{H,V\}} and \texttt{Adobe-Japan1-UCS2}.} +must be found from \LuaTeX. +Strictly speaking, those CMaps are needed +only in the first run of \LuaTeX-ja after installing or updating. +But it seems that MiK\TeX\ does not satisfy this condition, +so you will encounter an error like the following: +%</en> +%<*ja> +\LuaTeX-jaが動作するためには,\emph{導入・更新後の初回起動時に} +\texttt{UniJIS2004-UTF32-\{H,V\}}, \texttt{Adobe-Japan1-UCS2}という3つのCMapが +\LuaTeX によって見つけられることが必要である. +しかし古いバージョンのMiK\TeX ではそのようになっていないので,次のエラーが発生するだろう: +%</ja> +\begin{lstlisting} +! LuaTeX error ...iles (x86)/MiKTeX 2.9/tex/luatex/luatexja/ltj-rmlgbm.lua +bad argument #1 to 'open' (string expected, got nil) +\end{lstlisting} + +%<*en> +If so, please execute a batch file which is written on +\href{https://osdn.jp/projects/luatex-ja/wiki/FrontPage%28en%29}{ the Project Wiki (English)}. +This batch file creates a temporary directory, copy CMaps in it, +run a test file which loads \LuaTeX-ja in this directory, +and finally delete the temporary directory. +%</en> +%<*ja> +そのような場合には, +\href{https://osdn.jp/projects/luatex-ja/wiki/FrontPage%28en%29}{% + プロジェクトWiki英語版トップページ}中に書かれているバッチファイルを +実行して欲しい.このバッチファイルは,作業用ディレクトリにCMap達を +コピーし,その中で\LuaTeX-jaの初回起動を行い,作業用ディレクトリを消す作業をしている. +%</ja> + +\end{itemize} + +%<en>\subsection{Using in plain \TeX} +%<ja>\subsection{plain \TeX で使う} +\label{ssec:plain} + +%<en>To use \LuaTeX-ja in plain \TeX, simply put the following at the beginning of the document: +%<ja>\LuaTeX-jaを plain \TeX で使うためには,単に次の行をソースファイルの冒頭に追加すればよい: +\begin{lstlisting} +\input luatexja.sty +\end{lstlisting} +%<en>This does minimal settings (like \texttt{ptex.tex}) for typesetting Japanese documents: +%<ja>これで(\texttt{ptex.tex}のように)日本語組版のための最低限の設定がなされる: + +\begin{itemize} +%<*en> +\item The following 12~Japanese fonts are preloaded: +\begin{center}\small +\begin{tabular}{llllll} +\toprule +\textbf{direction}& +\textbf{classification}&\textbf{font name}&\bfseries ``10\,pt''&\bfseries ``7\,pt''&\bfseries ``5\,pt''\\\midrule +\smash{\raisebox{-1ex}{\emph{yoko} (horizontal)}}& +\emph{mincho}&IPAex Mincho&\cs{tenmin}&\cs{sevenmin}&\cs{fivemin}\\ +&\emph{gothic}&IPAex Gothic&\cs{tengt} &\cs{sevengt} &\cs{fivegt}\\ +\midrule +\smash{\raisebox{-1ex}{\emph{tate} (vertical)}}& +\emph{mincho}&IPAex Mincho&\cs{tentmin}&\cs{seventmin}&\cs{fivetmin}\\ +&\emph{gothic}&IPAex Gothic&\cs{tentgt} &\cs{seventgt} &\cs{fivetgt}\\ +\bottomrule +\end{tabular} +\end{center} +%</en> +%<*ja> +\item 以下の12個の和文フォントが定義される: +\begin{center}\small +\begin{tabular}{llllll} +\toprule +\emph{組方向}&\emph{字体}&\emph{フォント名}&\bfseries``10\,pt''&\bfseries``7\,pt''&\bfseries``5\,pt''\\\midrule +\smash{\raisebox{-0.7\zh}{横組}}& +明朝体&IPAex明朝&\cs{tenmin}&\cs{sevenmin}&\cs{fivemin}\\ +&\textgt{ゴシック体}&IPAexゴシック&\cs{tengt} &\cs{sevengt} &\cs{fivegt}\\ +\midrule +\smash{\raisebox{-0.7\zh}{縦組}}& +明朝体&IPAex明朝&\cs{tentmin}&\cs{seventmin}&\cs{fivetmin}\\ +&\textgt{ゴシック体}&IPAexゴシック&\cs{tentgt} &\cs{seventgt} &\cs{fivetgt}\\ +\bottomrule +\end{tabular} +\end{center} +%</ja> +\begin{itemize} +%<*en> +\item The ``default'' Japanese fonts (and~JFMs for them) can be + modified by defining \cs{ltj@stdmcfont} etc.\ \emph{before} + one inputs \texttt{luatexja.sty} (Subsection~\ref{ssec:cfg}). +%</en> +%<*ja> +\item 標準和文フォントやJFMをIPAexフォントから別のものに置き換えるには, + \cs{ltj@stdmcfont}等を\texttt{luatexja.sty}読み込み\emph{前}に定義すればよい. + \ref{ssec:cfg}節を参照. +%</ja> + +%<*en> +\item A character in an alphabetic font is generally smaller than a + Japanese font in the same size. So actual size specification of + these Japanese fonts is in fact smaller than that of alphabetic + fonts, namely scaled by 0.962216. +%</en> +%<*ja> +\item 欧文フォントの文字は和文フォントの文字よりも,同じ文字サイズでも + 一般に小さくデザインされている.そこで,標準ではこれらの和文フォントの実際のサイズは指定された値よりも + 小さくなるように設定されており,具体的には指定の0.962216倍にスケールされる. + この0.962216という数値も,\pTeX におけるスケーリングを踏襲した値である. +%</ja> +\end{itemize} + +%<*en> +\item The amount of glue that are inserted between a \textbf{JAchar} and + an \textbf{ALchar} (the parameter \Param{xkanjiskip}) is set to +%</en> +%<*ja> +\item \textbf{JAchar}と\textbf{ALchar}の間に入るグルー(\Param{xkanjiskip})の + 量は次のように設定されている: +%</ja> +\[ + (0.25\cdot 0.962216\cdot 10\,\mathrm{pt})^{+1\,\text{pt}}_{-1\,\text{pt}} + = 2.40554\,\mathrm{pt}^{+1\,\text{pt}}_{-1\,\text{pt}}. +\] +\end{itemize} + +%<en>\subsection{Using in \LaTeX} +%<ja>\subsection{\LaTeX で使う} +\label{ssec:ltx} + +%<*en> +Using in \LaTeXe\ is basically same. To set up the minimal environment +for Japanese, you only have to load \texttt{luatexja.sty}: +%</en> +%<*ja> +\LaTeXe を用いる場合も基本的には同じである.日本語組版のための最低限の環境を +設定するためには,\texttt{luatexja.sty}を読み込むだけでよい: +%</ja> +\begin{lstlisting} +\usepackage{luatexja} +\end{lstlisting} +%<*en> +It also does minimal settings (counterparts in \pLaTeX\ are \texttt{% +plfonts.dtx} and \texttt{pldefs.ltx}). +%</en> +%<*ja> +これで\pLaTeX の\texttt{plfonts.dtx}と\texttt{pldefs.ltx}に相当する最低限の設定が +なされる. +%</ja> + +\begin{itemize} +%<*en> +\item Font encodings for Japanese fonts are \texttt{JY3}~(for horizontal direction) and +\texttt{JT3}~(for vertical direction). +%</en> +%<*ja> +\item 和文フォントのエンコーディングとしては,横組用には \texttt{JY3},縦組用には\ +\texttt{JT3}が用いられる. +%</ja> + +%<*en> +\item Traditionally, Japanese documents use only two families: \emph{mincho}~(明朝体) and + \emph{gothic}~(\textgt{ゴシック体}). \emph{mincho} is used in the main text, while \emph{gothic} + is used in the headings or for emphasis. +\begin{center}\small +\begin{tabular}{lllc} +\toprule +\textbf{classification}&&&\textbf{commands}\\\midrule +\emph{mincho} (明朝体)&\verb+\textmc{...}+&\verb+{\mcfamily ...}+&\cs{mcdefault}\\ +\emph{gothic} (\textgt{ゴシック体})&\verb+\textgt{...}+&\verb+{\gtfamily ...}+&\cs{gtdefault}\\ +\bottomrule +\end{tabular} +\end{center} +\item +By default, the following fonts are used for these two families. +\begin{center}\small +\begin{tabular}{lllll} +\toprule +\textbf{classification}&\textbf{family}&\cs{mdseries}&\cs{bfseries}&\textbf{scale}\\\midrule +\emph{mincho} (明朝体)&\tt mc&IPAex Mincho&IPAex Gothic&0.962216\\ +\emph{gothic} (\textgt{ゴシック体})&\tt gt&IPAex Gothic&IPAex Gothic&0.962216\\ +\bottomrule +\end{tabular} +\end{center} +\item Note that the bold series (series \texttt{bx}~or~\texttt{b}) in both family + are same as the medium series of gothic family. + There is no italic nor slanted shape for these \texttt{mc}~and~\texttt{gt}. +%</en> +%<*ja> +\item \pLaTeX と同様に,標準では「明朝体」「ゴシック体」の2種類を用いる: +\begin{center}\small +\begin{tabular}{llll} +\toprule +\emph{字体}&&&\emph{ファミリ名}\\\midrule +明朝体&\verb+\textmc{...}+&\verb+{\mcfamily ...}+&\cs{mcdefault}\\ +\textgt{ゴシック体}&\verb+\textgt{...}+&\verb+{\gtfamily ...}+&\cs{gtdefault}\\ +\bottomrule +\end{tabular} +\end{center} + \newpage +\item 標準では,次のフォントが用いられる: +\begin{center}\small +\begin{tabular}{lllll} +\toprule +\emph{字体}&\emph{ファミリ}&\cs{mdseries}&\cs{bfseries}&\emph{スケール}\\\midrule +明朝体&\tt mc&IPAex明朝&IPAexゴシック&0.962216\\ +\textgt{ゴシック体}&\tt gt&IPAexゴシック&IPAexゴシック&0.962216\\ +\bottomrule +\end{tabular} +\end{center} + +明朝・ゴシックどちらのファミリにおいても,太字(\cs{bfseries})のフォントは +ゴシック体中字(\cs{gtfamily}\cs{mdseries})で使われるフォントと同じであることに注意. +また,どちらのファミリでもイタリック体・スラント体は定義されない. + + \item 和文の太字を表すシリーズ名は,(元々のComputer Modernが + 太字に\texttt{bx}を用いていたことから)伝統的に\texttt{bx}~(Bold Extended)が使われてきた. + しかし,太字にシリーズ\texttt{b}を使うフォントも増えてきたため, + バージョン20180616.0以降では和文の太字として\texttt{bx},~\texttt{b}の両方を扱えるようにした. +%</ja> + +%<*en> + \item From version~20181102.0, one can specifies \texttt{disablejfam} option at + loading \LuaTeX-ja. This option prevents loading a patch for \LaTeX, which are + needed to support Japanese characters in math mode. + + Without \texttt{disablejfam} option, one can typeset Japanese characters in + math mode as~\verb+$あ$+ (see Page~\pageref{para:jachar_in_math}) as before. + Japanese characters in math mode are typeset by the font family \texttt{mc}. +%</en> +%<*ja> + \item バージョン20181102.0以降では,\texttt{disablejfam}オプションを\LuaTeX-ja読み込み時に + 指定できるようになった.このオプションは,数式モード中に直に和文文字を書けるようにするための + \LaTeX へのパッチを読み込まない. + + \texttt{disablejfam}のない状況では,以前と同様に和文文字を数式モード中に + 直に書くことができる(但し\autoref{para:jachar_in_math}ページの記述も参照). + その際には明朝体(\texttt{mc})で出力される. +%</ja> +%<*en> + \item \cs{jttdefault}% + \footnote{% + When \Pkg{ltjsclasses} classes are used, or + \Pkg{luatexja-fontspec} (or \Pkg{luatexja-preset}) is loaded with \texttt{match} option, + \cs{ttfamily} changes the current Japanese font amily to \cs{jttdefault}. + These classes and packages also redefine \cs{jttdefault} to + \cs{gtdefault} (\emph{gothic}~family). + } specifies the Japanese font family in \cs{verb}~or~\texttt{verbatim} environment. + The default value of \cs{jttdefault} is \cs{mcdefault}, so the mincho family is used. +%</en> +%<*ja> + \item \cs{verb} や \texttt{verbatim} 環境中の和文文字に使われる和文フォントファミリは + \ \cs{jttdefault} で指定する% + \footnote{% + \Pkg{ltjsclasses}を使用したり,あるいは \texttt{match} オプションを指定して\Pkg{luatexja-fontspec}% + や\Pkg{luatexja-preset}パッケージを読み込んだときは,単なる \cs{ttfamily} によっても和文フォントが + \ \cs{jttdefault}\ に変更される.また,これらのクラスファイルやパッケージは + \ \cs{jttdefault}\ を \cs{gtdefault}(ゴシック体)に再定義する. + }.標準値は \cs{mcdefault},つまり明朝体として用いるのと + 同じフォントファミリである. +%</ja> + +%<*en> +\item If you use the \Pkg{beamer} class with the default font theme (which uses sans serif + fonts) and with \LuaTeX-ja, you might want to change default Japanese fonts to + the gothic family. The following line changes the default Japanese font family + to it: +%</en> +%<*ja> +\item \Pkg{beamer}クラスを既定のフォント設定で使う場合,既定欧文フォントがサンセリフなの + で,既定和文フォントもゴシック体にしたいと思うかもしれない.その場合はプリアンブルに +次を書けばよい: +%</ja> +\begin{lstlisting} + \renewcommand{\kanjifamilydefault}{\gtdefault} +\end{lstlisting} + +%<*ja> +\item \pLaTeX と同様に,\texttt{mc},~\texttt{gt}両ファミリには「従属欧文」書体が定義されている. + これらは\cs{userelfont}を\cs{selectfont}(や,その他の「実際に」 + フォントを変更する命令)の前で実行することにより使うことができる. + + \pLaTeX では標準の欧文フォントはOT1エンコーディングのComputer Modern Roman (\texttt{cmr})% + であったが,2017年以降の\LuaLaTeX ではTUエンコーディングのlatin Modern Roman (\texttt{lmr})% + に変更されている.そのため,前段落で述べた「従属欧文」も,Latin Modern Romanに設定している. +%</ja> + +\end{itemize} + +%<*en> +However, above settings are not sufficient for Japanese-based +documents. To typeset Japanese-based documents, you are better to use +class files other than \texttt{article.cls}, \texttt{book.cls}, and so on. At +the present, \LuaTeX-ja has the counterparts of \Pkg{jclasses} (standard +classes in \pLaTeX) and \Pkg{jsclasses} (classes by Haruhiko +Okumura), namely, \Pkg{ltjclasses}\footnote{% + \texttt{ltjarticle.cls},~\texttt{ltjbook.cls}, \texttt{ltjreport.cls}, + \texttt{ltjtarticle.cls}, \texttt{ltjtbook.cls}, \texttt{ltjtreport.cls}. + The latter \texttt{ltjt*.cls} are for vertically written Japanese documents. +} and \Pkg{ltjsclasses}\footnote{% + \texttt{ltjsarticle.cls},~\texttt{ltjsbook.cls}, \texttt{ltjsreport.cls},~\texttt{ltjskiyou.cls}.}. + +Original \Pkg{jsclasses} use \cs{mag}~primitive to set the main document font size. +However, \LuaTeX\ does not support \cs{mag} in PDF~output, +so \Pkg{ltjsclasses} uses the \texttt{nomag*} option\footnote{Same effect as + the \Pkg{BXjscls} classes (by Takayuki Yato) and \Pkg{jsclasses}. + However, these classes uses only \TeX\ code, but \Pkg{ltjsclasses} uses Lua code.} + by default to set the main font size. If this causes some unexpected behavior, specify +\texttt{nomag} option in \cs{documentclass}. +%</en> +%<*ja> +しかしながら,上記の設定は日本語の文書にとって十分とは言えない. +日本語文書を組版するためには,\texttt{article.cls}, \texttt{book.cls}といった +欧文用のクラスファイルではなく,和文用のクラスファイルを用いた方がよい. +現時点では,\Pkg{jclasses}(\pLaTeX の標準クラス)と\Pkg{jsclasses}% +(奥村晴彦氏による「\pLaTeXe 新ドキュメントクラス」)に対応するものとして, +\Pkg{ltjclasses}\footnote{% + 横組用は \texttt{ltjarticle.cls},~\texttt{ltjbook.cls}, \texttt{ltjreport.cls} であり, + 縦組用は \texttt{ltjtarticle.cls}, \texttt{ltjtbook.cls}, \texttt{ltjtreport.cls} である. +}, +\Pkg{ltjsclasses}\footnote{% + \texttt{ltjsarticle.cls},~\texttt{ltjsbook.cls}, \texttt{ltjsreport.cls},~\texttt{ltjskiyou.cls}.}% +がそれぞれ\LuaTeX-ja標準で用意されている. + +元々の\Pkg{jsclasses}では本文のフォントサイズを設定するのに\cs{mag}プリミティブが使われていたが, +\LuaTeX ではPDF出力時の\cs{mag}のサポートが廃止された. +そのため,\Pkg{ltjsclasses}では\texttt{nomag*}オプション +\footnote{\Pkg{jsclasses}や,八登崇之氏による\Pkg{BXjscls}クラスにおける同名のオプションと + 同じ.上記クラスは\TeX コードのみで実装しているが,\Pkg{ltjsclasses}ではLuaコードも用いている.}が標準で +有効になっており,これを使って本文フォントサイズの設定を行っている. +しかし,この\texttt{nomag*}オプションでは(20180121.0版より前の版において\Pkg{unicode-math}パッケージ使用時に +起きたように)予想外の意図しない現象に遭遇する危険がある.そのような場合は +\cs{documentclass}において\texttt{nomag}オプションを指定してほしい. +%</ja> + +%<*ja> +\paragraph{脚注とボトムフロートの出力順序} +オリジナルの\LaTeX では脚注はボトムフロートの上に出力され,また\cs{raggedbottom}命令でページの高さが不揃いであることを許した場合には +脚注の下端の垂直位置もページに応じて変わるようになっている. +一方,日本語の組版では脚注はボトムフロートの下に来るのが一般的であるので, +\pLaTeX ではそのように変更されており, +さらに\cs{raggedbottom}命令を実行した後でも脚注は常にページの下端に固定されるようになっている. + +\LuaTeX-jaでは「欧文クラスの中にちょっとだけ日本語を入れる」という利用も考慮し, +脚注とボトムフロートの順序,及び\cs{raggedbottom}時の脚注の垂直位置は\LaTeX 通りとした. +これらを制御するには以下の手段がある: +\begin{itemize} + \item \pLaTeX のように,脚注をボトムフロートの下に組む場合には + \Pkg{stfloats}パッケージを利用して + \begin{lstlisting} + \usepackage{stfloats}\fnbelowfloat + \end{lstlisting} + とする.この状況から「脚注をボトムフロートの上に組む」という\LaTeX の標準の挙動に戻したければ, + \Pkg{stfloats}パッケージの\cs{fnunderfloat}命令を使用する. + \item \cs{raggedbottom}時の脚注の垂直位置は,\cs{iffnfixbottom}という真偽値で制御する. + \begin{description} + \item[偽(\cs{fnfixbottomfalse})の場合] \LaTeX 標準と同じく,本文と脚注の間の空白は\cs{skip}\cs{footins}のみ. + 従って脚注の垂直位置はページにより変動する. + \item[真(\cs{fnfixbottomtrue})の場合] \pLaTeX や\Pkg{footmisc}パッケージを\texttt{bottom}オプションで + 読み込んだ場合のように,脚注は常にページの下端に固定される. + \end{description} +\item ただし,\LuaTeX-jaが提供する「互換クラス」(\Pkg{ltjclasses}, \Pkg{ltjsclasses})では, + \pLaTeX と合わせるために以下のようにしている: + \begin{itemize} + \item \cs{fnfixbottomtrue}が自動的に実行される + \item \Pkg{stfloats}パッケージが\LuaTeX から参照できる場所にあった場合は + 自動的に読み込み,\cs{fnbelowfloat}を実行する. + \end{itemize} +\end{itemize} +なお,\Pkg{stfloats}パッケージを使う代わりに, +\Pkg{footmisc}パッケージを \texttt{bottom}オプションを指定して読み込む +という「解決法」もある. +%</ja> +%%% ↑は英訳しない + +%<*en> +\paragraph{\Pkg{geometry} package and classes for vertical writing} +It is well-known that the \Pkg{geometry} package produces the following error, when classes for +vertical writing is used: +%</en> +%<*ja> +\paragraph{縦組での\Pkg{geometry}パッケージ} +\pLaTeX の縦組用標準クラスファイルでは\Pkg{geometry}パッケージを利用することは出来ず, +%</ja> +\begin{lstlisting} +! Incompatible direction list can't be unboxed. +\@begindvi ->\unvbox \@begindvibox + \global \let \@begindvi \@empty +\end{lstlisting} +%<*en> +Now, \LuaTeX-ja automatically applies the patch \Pkg{lltjp-geometry} to the +\Pkg{geometry} package, when the direction of the document is \emph{tate} (vertical +writing). +This patch \Pkg{lltjp-geometry} also can be used in \pLaTeX; for the detail, please refer +\url{lltjp-geometry.pdf}~(Japanese). +%</en> +%<*ja> +というようなエラーが発生することが知られている. +\LuaTeX-jaでは, \texttt{ltjtarticle.cls} といった縦組クラスの下でも +\Pkg{geometry}パッケージが利用できるようにパッチ\Pkg{lltjp-geometry}パッケージを自動的に当てている. + +なお,\Pkg{lltjp-geometry}パッケージは\pTeX 系列でも明示的に読み込むことによって +使用可能である.詳細や注意事項は \url{lltjp-geometry.pdf} を参照のこと. +%</ja> + + +%<en>\section{Changing Fonts} +%<ja>\section{フォントの変更} + +\subsection{plain \TeX~and~\LaTeXe} +\label{ssec:chgfnt} + +\paragraph{plain \TeX} +%<*en> +To change Japanese fonts in plain \TeX, you must use the command +\cs{jfont}~and~\cs{tfont}. So please see Subsection~\ref{ssec:jfont}. +%</en> +%<*ja> +plain \TeX で和文フォントを変更するためには, +\pTeX のように \cs{jfont} 命令や \cs{tfont} 命令を直接用いる. +\ref{ssec:jfont}節を参照. +%</ja> + +\paragraph{\LaTeXe\ (NFSS2)} +%<*en> +For \LaTeXe, \LuaTeX-ja adopted most of the font selection system of \pLaTeXe\ (in \texttt{plfonts.dtx}). +%</en> +%<*ja> +\LaTeX で用いる際には,\pLaTeXe\ (\texttt{plfonts.dtx})用のフォント選択機構の大部分を流用している. +%</ja> +\begin{itemize} +%<*en> +\item Commands \cs{fontfamily}, \cs{fontseries}, and \cs{fontshape} can be used to change + attributes of Japanese fonts. +%</en> +%<*ja> +\item 和文フォントの属性を変更するには,\cs{fontfamily}, \cs{fontseries}, \cs{fontshape} を使用する. + もちろん,それらを実際に反映させるには手動で \cs{selectfont} を実行する必要がある. +%</ja> + +%<*en> +\begin{center}\small +\begin{tabular}{llllll} +\toprule +&\textbf{encoding}&\textbf{family}&\textbf{series}&\textbf{shape}&\textbf{selection}\\\midrule +alphabetic fonts +&\cs{romanencoding}&\cs{romanfamily}&\cs{romanseries}&\cs{romanshape} +&\cs{useroman}\\ +Japanese fonts +&\cs{kanjiencoding}&\cs{kanjifamily}&\cs{kanjiseries}&\cs{kanjishape} +&\cs{usekanji}\\ +both&---&--&\cs{fontseries}&\cs{fontshape}&---\\ +auto select&\cs{fontencoding}&\cs{fontfamily}&---&---&\cs{usefont}\\ +\bottomrule +\end{tabular} +\end{center} +%</en> +%<*ja> +\begin{center}\small +\begin{tabular}{llllll} +\toprule +&\emph{エンコーディング}&\emph{ファミリ}&\emph{シリーズ}&\emph{シェープ}&\emph{選択}\\\midrule +\emph{欧文} +&\cs{romanencoding}&\cs{romanfamily}&\cs{romanseries}&\cs{romanshape} +&\cs{useroman}\\ +\emph{和文} +&\cs{kanjiencoding}&\cs{kanjifamily}&\cs{kanjiseries}&\cs{kanjishape} +&\cs{usekanji}\\ +\emph{両方}&---&--&\cs{fontseries}&\cs{fontshape}&---\\ +\emph{自動選択}&\cs{fontencoding}&\cs{fontfamily}&---&---&\cs{usefont}\\ +\bottomrule +\end{tabular} +\end{center} +%</ja> + +%<*en> + \verb+\fontencoding{+<encoding>\verb+}+ changes the encoding of alphabetic fonts + or Japanese fonts depending on the argument. For example, + \verb+\fontencoding{JY3}+ changes the encoding of Japanese fonts to + \texttt{JY3}, and \verb+\fontencoding{T1}+ changes the encoding of + alphabetic fonts to \texttt{T1}. + \cs{fontfamily} also changes the current Japanese font family, + the current alphabetic font family, \emph{or both}. + For the detail, see Subsection~\ref{ssec:nfsspat}. +%</en> +%<*ja> + ここで,\verb+\fontencoding{+<encoding>\verb+}+ は,引数により和文側か欧文 + 側かのどちらかのエンコーディングを変更する.例えば, + \verb+\fontencoding{JY3}+ は和文フォントのエンコーディングを + \texttt{JY3}に変更し,\verb+\fontencoding{T1}+ は欧文フォント側を + \texttt{T1}へと変更する.\cs{fontfamily} も引数により和文側,欧文 + 側,\emph{あるいは両方}のフォントファミリを変更する.詳細は + \ref{ssec:nfsspat}節を参照すること. +%</ja> + +%<*en> +\item For defining a Japanese font family, use + \cs{DeclareKanjiFamily} instead of + \cs{DeclareFontFamily}. (In previous version of \LuaTeX-ja, + using \cs{DeclareFontFamily} didn't cause any problem. But this no longer applies + the current version.) +\item Defining a Japanese font shape can be done by usual \cs{DeclareFontShape}: +%</en> +%<*ja> +\item 和文フォントファミリの定義には \cs{DeclareFontFamily} の + 代わりに \cs{DeclareKanjiFamily} を用いる.以前の + 実装では \cs{DeclareFontFamily} を用いても問題は生じなかったが,現在の実装では + そうはいかない. +\item 和文フォントのシェイプを定義するには,通常の \cs{DeclareFontShape} を使えば良い: +%</ja> +\begin{lstlisting} +\DeclareFontShape{JY3}{mc}{bx}{n}{<-> s*KozMinPr6N-Bold:jfm=ujis;-kern}{} + % Kozuka Mincho Pr6N Bold +\end{lstlisting} +%<*ja> +仮名書体を使う場合など,複数の和文フォントを組み合わせて使いたい場合は +\ref{ssec:altfont}節の \cs{ltjdeclarealtfont} と,その\LaTeX 版の\ +\cs{DeclareAlternateKanjiFont}(\ref{ssec:nfsspat}節)を参照せよ. +%</ja> + +\end{itemize} + +%<*en> +\paragraph{Japanese characters in math mode} +\label{para:jachar_in_math} + +Since \pTeX\ supports Japanese characters in math mode, there are +sources like the following: +%</en> +%<*ja> +\paragraph{数式モード中の和文文字} +\label{para:jachar_in_math} + +\pTeX では,特に何もしないでも数式中に和文文字を記述することができた.そのため, +以下のようなソースが見られた: +%</ja> + +\begin{LTXexample} +$f_{高温}$~($f_{\text{high temperature}}$). +\[ y=(x-1)^2+2\quad よって\quad y>0 \] +$5\in 素:=\{\,p\in\mathbb N:\text{$p$ is a prime}\,\}$. +\end{LTXexample} +%<*en> +We (the project members of \LuaTeX-ja) think that using +Japanese characters in math mode are allowed if and only if these are used as identifiers. +In this point of view, +%</en> +%<*ja> +\LuaTeX-jaプロジェクトでは,数式モード中での和文文字はそれらが識別子として用いられる +ときのみ許されると考えている. +この観点から, +%</ja> + +\begin{itemize} +%<*en> +\item The lines 1~and~2 above are not correct, since ``高温'' in above is used as a textual label, and +``よって'' is used as a conjunction. +%</en> +%<*ja> +\item 上記数式のうち1, 2行目は正しくない.なぜならば「高温」が意味のあるラベルと + して,「よって」が接続詞として用いられているからである. +%</ja> +%<en>\item However, the line~3 is correct, since ``素'' is used as an identifier. +%<ja>\item しかしながら,3行目は「素」が単なる識別子として用いられているので正しい. +\end{itemize} +%<en>Hence, in our opinion, the above input should be corrected as: +%<ja>したがって,\LuaTeX-jaプロジェクトの意見としては,上記の入力は次のように直されるべきである: +\begin{LTXexample} +$f_{\text{高温}}$~% +($f_{\text{high temperature}}$). +\[ y=(x-1)^2+2\quad + \mathrel{\mbox{よって}}\quad y>0 \] +$5\in 素:=\{\,p\in\mathbb N:\text{$p$ is a prime}\,\}$. +\end{LTXexample} + +%<*en> +We also believe that using Japanese characters as identifiers is rare, +hence we don't describe how to change Japanese fonts in math mode in +this chapter. For the method, please see Subsection~\ref{ssec:math}. + +{\emshape When \LuaTeX-ja is loaded with \texttt{disablejfam}~option, + one cannot write Japanese characters in math mode as~\verb+$素$+. + At that case, one have to use \cs{mbox} (or~\cs{text} in the \Pkg{amsmath} package). +} +%</en> +%<*ja> +なお\LuaTeX-jaプロジェクトでは,和文文字が識別子として用いられることはほとんどない +と考えており,したがってこの節では数式モード中の和文フォントを変更する方法については +記述しない.この方法については\ref{ssec:math}節を参照のこと. + +{\gtfamily\bfseries + 既に記述した通り,\texttt{disablejfam}オプションを指定して\LuaTeX-jaを読み込んだ場合は, + \verb+$素$+ のように直接和文文字を数式モード中に記述することはできなくなる. + \cs{mbox},あるいは\Pkg{amsmath}パッケージの提供する\cs{text}命令などを使うことになる. +} +%</ja> + + + +%<en>\subsection{\Pkg{luatexja-fontspec} package} +%<ja>\subsection{\Pkg{luatexja-fontspec}パッケージ} +\label{ssec:fontspec} +%<*en> +To use the functionality of the \Pkg{fontspec} package to Japanese fonts, +it is needed to load the \Pkg{luatexja-fontspec} package in the preamble, as follows: +\begin{quote} +\ttfamily \textbackslash usepackage[<options>]\{luatexja-fontspec\} +\end{quote} +This \Pkg{luatexja-fontspec} package +automatically loads \Pkg{luatexja} and \Pkg{fontspec} +packages, if needed. +%</en> +%<*ja> +\Pkg{fontspec}パッケージは,\LuaTeX・\XeTeX において +TrueType・OpenTypeフォントを容易に扱うためのパッケージであり,このパッケージを読み込んでお +けばUnicodeによる各種記号の直接入力もできるようになる. +\LuaTeX-jaでは和文と欧文を区別しているため,\Pkg{fontspec}パッケージの機能は欧文フォントに +対してのみ有効なものとなっている. + +\LuaTeX-ja上において,\Pkg{fontspec}パッケージと同様の機能を和文フォントに対しても用いる場 +合は\Pkg{luatexja-fontspec}パッケージを読み込む: +\begin{quote} +\ttfamily \textbackslash usepackage[<options>]\{luatexja-fontspec\} +\end{quote} +このパッケージは自動で\Pkg{luatexja}パッケージと\Pkg{fontspec}パッケージを読み込む. +%</ja> + +%<*en> +In the \Pkg{luatexja-fontspec} package, several commands are defined as +counterparts of original commands in the \Pkg{fontspec} package +(see \autoref{tab:ltj_fntspc}): +%</en> +%<*ja> +\Pkg{luatexja-fontspec}パッケージでは,\autoref{tab:ltj_fntspc}の +「和文」行に示した命令を\Pkg{fontspec}パッケージの元のコマンド(「欧文」行) +に対応するものとして定義している: +%</ja> +%<*en> +\begin{table} +\caption{Commands of \Pkg{luatexja-fontspec}}\label{tab:ltj_fntspc} +\medskip +{\centering\small +\begin{tabular}{cllll} +\toprule +Japanese fonts +&\cs{jfontspec}&\cs{setmainjfont}&\cs{setsansjfont}&\cs{setmonojfont}$^*$\\ +alphabetic fonts +&\cs{fontspec}&\cs{setmainfont}&\cs{setsansfont}&\cs{setmonofont}\\ +\midrule +Japanese fonts +&\cs{newjfontfamily}&\cs{renewjfontfamily}$^{**}$&\cs{setjfontfamily}$^{**}$\\ +alphabetic fonts +&\cs{newfontfamily}&\cs{renewfontfamily}$^{**}$&\cs{setfontfamily}$^{**}$\\ +\midrule +Japanese fonts +&\cs{newjfontface}&\cs{defaultjfontfeatures}&\cs{addjfontfeatures}\\ +alphabetic fonts +&\cs{newfontface}&\cs{defaultfontfeatures}&\cs{addfontfeatures}\\ +\bottomrule +\end{tabular}\par} +\medskip +\fakefn{$^*$}{% + \cs{setmonojfont} is defined if and only if \texttt{match} option is specified.} +\fakefn{$^{**}$}{% + \cs{renewfontfamily}~and~\cs{setfontfamily} are new commands + in \Pkg{fontspec}~v2.6h (2018/7/30). + Hence, \Pkg{luatexja-fontspec} define \cs{renewjfontfamily}~and~\cs{setjfontfamily} + only when \Pkg{fontspec}~v2.6h (or later) is used. +} +\end{table} +%</en> +%<*ja> +\begin{table} +\caption{\Pkg{luatexja-fontspec}で定義される命令}\label{tab:ltj_fntspc} +\medskip +{\centering\small +\begin{tabular}{lllll} +\toprule +\emph{和文} +&\cs{jfontspec}&\cs{setmainjfont}&\cs{setsansjfont}&\cs{setmonojfont}$^*$\\ +\emph{欧文} +&\cs{fontspec}&\cs{setmainfont}&\cs{setsansfont}&\cs{setmonofont}\\ +\midrule +\emph{和文} +&\cs{newjfontfamily}&\cs{renewjfontfamily}$^{**}$&\cs{setjfontfamily}$^{**}$\\ +\emph{欧文} +&\cs{newfontfamily}&\cs{renewfontfamily}$^{**}$&\cs{setfontfamily}$^{**}$\\ +\midrule +\emph{和文} +&\cs{newjfontface}&\cs{defaultjfontfeatures}&\cs{addjfontfeatures}\\ +\emph{欧文} +&\cs{newfontface}&\cs{defaultfontfeatures}&\cs{addfontfeatures}\\ +\bottomrule +\end{tabular}\par} + +\medskip +\fakefn{$^*$}{\cs{setmonojfont} は \texttt{match} オプションが +指定された時のみ定義される.} +\fakefn{$^{**}$}{% + \cs{renewfontfamily} と \cs{setfontfamily} は + \Pkg{fontspec}~v2.6h (2018/7/30)で新たに追加された命令である. + そのため,\Pkg{luatexja-fontspec}が \cs{renewjfontfamily} と \cs{setjfontfamily} を + 定義するのはv2.6h以降の\Pkg{fontspec}を使用した時のみになっている. +} + +\end{table} +%</ja> + +%<en> The package option of \Pkg{luatexja-fontspec} are the followings: +%<ja> \Pkg{luatexja-fontspec} パッケージのオプションは以下の通りである: +\begin{cslist} + \item[match] +%<*en> +If this option is specified, usual family-changing commands such as +\cs{rmfamily},~\cs{textrm}, \cs{sffamily},~\dots\ also change Japanese font family. + +Note that \emph{\cs{setmonojfont} is defined +if and only if this \texttt{\textup{match}} option is specified}. +%</en> + +%<*ja> +このオプションが指定されると,「\pLaTeXe 新ドキュメントクラス」のように\ +\cs{rmfamily}, \verb+\textrm{...}+, \cs{sffamily} 等が +欧文フォントだけでなく和文フォントも変更するようになる. + +\emph{なお,\cs{setmonojfont} はこの \texttt{match} オプションが +指定された時のみ定義される.}この命令は標準の「タイプライタ体に対応する和文フォント」を指定する. +%</ja> + + \item[pass=<opts>] +%<en> \emph{(Obsoleted)}\ Specify options <opts> which will be passed to the \Pkg{fontspec} package. +%<ja> \Pkg{fontspec} パッケージに渡すオプション <opts> を指定する.本オプションは時代遅れである. + +\item[scale=<float>] +%<*en> +Override the ratio of the font size of Japanese fonts to that of alphabetic fonts. +The default value is determined as follows: + \begin{itemize} + \item The value of \cs{Cjascale} is used, if this control sequence is already defined. + \item It is calculated automatically from the current Japanese font at the loading of the + package, if \cs{Cjascale} is not defined. + \end{itemize} +\cs{Cjascale} is defined in \Pkg{ltjclasses} and \Pkg{ltjsclasses}. +%</en> +%<*ja> +欧文に対する和文の比率を手動で上書きするときに使用する. +標準では +\begin{itemize} + \item \cs{Cjascale}が定義されている場合 + \footnote{\LuaTeX-ja が用意しているクラスファイル(\Pkg{ltjclasses},~\Pkg{ltjsclasses})を + 使う場合はこちらに当てはまる.}は,それを用いる. + \item \cs{Cjascale}が未定義の場合は,\Pkg{luatexja-fontspec}読み込み時の和文フォントから自動計算される. +\end{itemize} +%</ja> +\end{cslist} + +%<*en> +All other options listed above are simply passed to the \Pkg{fontspec} package. +This means that two lines below are equivalent, for example. +%</en> +%<*ja> +上記にないオプションは全て \Pkg{fontspec} パッケージに渡される. +例えば,下の2行は同じ意味になる: +%</ja> +\begin{lstlisting} +\usepackage[no-math]{fontspec}\usepackage{luatexja-fontspec} +\usepackage[no-math]{luatexja-fontspec} +\end{lstlisting} + + +%<*en> +The reason that \cs{setmonojfont} is not defined by default is that +it is popular for Japanese fonts that nearly all Japanese glyphs have same +widths. Also note that kerning information in a font is not used +(that is, \texttt{kern} feature is set off) by default in these seven (or~eight) commands. +This is because of the compatibility with previous versions of \LuaTeX-ja +(see \ref{para-kern}). + +Below is an example of \cs{jfontspec}. +%</en> +%<*ja> +標準で \cs{setmonojfont} コマンドが定義されないのは, +和文フォントではほぼ全ての和文文字のグリフが等幅であるのが伝統的であったことによる. +また,これらの和文用のコマンドではフォント内のペアカーニング情報は標準では使用されない, +言い換えれば \texttt{kern} featureは標準では無効化となっている. +これは以前のバージョンの\LuaTeX-jaとの互換性のためである(\ref{para-kern}節を参照). + +以下に\cs{jfontspec}の使用例を示す. +%</ja> + +\begin{LTXexample}[width=0.4\textwidth] +\jfontspec[CJKShape=NLC]{KozMinPr6N-Regular} +JIS~X~0213:2004→辻\par +\jfontspec[CJKShape=JIS1990]{KozMinPr6N-Regular} +JIS~X~0208:1990→辻 +\end{LTXexample} + +%<en>\subsection{Presets of Japanese fonts} +%<ja>\subsection{和文フォントのプリセット設定} +\label{ssec:preset-abst} + +%<*en> +With \Pkg{luatexja-preset} package, +one use one of ``preset'' to simplify Japanese font setting. +For details of package options, and those of each presets, please see Subsecion~\ref{ssec:preset}. +The following presets are defined: +%</en> +%<*ja> +よく使われている和文フォント設定を一行で指定できるようにしたのが +\Pkg{luatexja-preset}パッケージである.オプションや各プリセットの詳細については +\ref{ssec:preset}節を参照して欲しい. +現時点では以下のプリセットが定義されている: +%</ja> +\begin{quote} + \ttfamily + \hyphenchar\font=-1 \exhyphenchar=-1 + hiragino-pro, hiragino-pron, ipa, ipa-hg, ipaex, ipaex-hg, + kozuka-pr6, kozuka-pr6n, kozuka-pro, moga-mobo, moga-mobo-ex, + bizud, morisawa-pr6n, morisawa-pro, ms, ms-hg, noembed, noto-otc, noto-otf, + sourcehan, sourcehan-jp, ume, yu-osx, yu-win, yu-win10 +\end{quote} + +%<ja> 例えば,本ドキュメントでは\Pkg{luatexja-preset}パッケージを +%<en> For example, this document loads \Pkg{luatexja-preset} package by +\begin{lstlisting} +\usepackage[kozuka-pr6n]{luatexja-preset} +\end{lstlisting} +%<ja>として読み込み,小塚書体(Pr6N)を使うことを指定している. +%<en> which means that Kozuka~Pr6N fonts will be used in this document. + + +%<*en> +\subsection{\cs{CID}, \cs{UTF}, and macros in \Pkg{japanese-otf} package} +Under \pLaTeX, \Pkg{japanese-otf} package (developed by Shuzaburo Saito) is +used for typesetting characters which is in Adobe-Japan1-6 CID but not +in JIS~X~0208. Since this package is widely used, \LuaTeX-ja +supports some of functions in the \Pkg{japanese-otf} package, +as an external package \Pkg{luatexja-otf}. +%</en> +%<*ja> +\subsection{\cs{CID}, \cs{UTF}と\Pkg{otf}パッケージのマクロ} +\pLaTeX では,JIS~X~0208にないAdobe-Japan1-6の文字を出力するために, +齋藤修三郎氏による\Pkg{otf}パッケージが用いられていた.このパッケージは +広く用いられているため,\LuaTeX-jaにおいても\Pkg{otf}パッケージの機能の +一部を(\Pkg{luatexja-otf}という別のパッケージとして)実装した. +%</ja> + +\begin{LTXexample} +\jfontspec{KozMinPr6N-Regular.otf} +森\UTF{9DD7}外と内田百\UTF{9592}とが\UTF{9AD9}島屋に行く。 + +\CID{7652}飾区の\CID{13706}野家, +\CID{1481}城市,葛西駅, +高崎と\CID{8705}\UTF{FA11} + +\aj半角{はんかくカタカナ} +\end{LTXexample} + +%<*ja> +\Pkg{otf}パッケージでは,それぞれ次のようなオプションが存在した: +\begin{cslist} +\item[deluxe] 明朝体・ゴシック体各3ウェイトと,丸ゴシック体を扱えるようになる. +\item[expert] 仮名が横組・縦組専用のものに切り替わり,ルビ用仮名も +\ \cs{rubyfamily}\ によって扱えるようになる. +\item[bold] ゴシック体を標準で太いウェイトのものに設定する. +\end{cslist} +しかしこれらのオプションは\Pkg{luatexja-otf}パッケージには存在しない. +\Pkg{otf}パッケージが文書中で使用する和文用TFMを自前の物に置き換えていたのに対し, +\Pkg{luatexja-otf}パッケージでは,そのようなことは行わないからである. + +これら3オプションについては, +\Pkg{luatexja-preset} パッケージにプリセットを使う時に一緒に指定するか, +あるいは対応する内容を\ref{ssec:chgfnt}節,\ref{ssec:nfsspat}節 (NFSS2) や +\ref{ssec:fontspec}節 (\Pkg{fontspec}) の方法で手動で指定する必要がある. +%</ja> + +%<en>\section{Changing Internal Parameters} +%<ja>\section{パラメータの変更} + +%<*en> +There are many internal parameters in \LuaTeX-ja. And due to the behavior of \LuaTeX, +most of them are not stored as internal register of \TeX, but as an +original storage system in \LuaTeX-ja. Hence, to assign or acquire those +parameters, you have to use commands \cs{ltjsetparameter} and +\cs{ltjgetparameter}. +%</en> +%<*ja> +\LuaTeX-jaには多くのパラメータが存在する.そして\LuaTeX の仕様のために, +その多くは\TeX のレジスタにではなく,\LuaTeX-ja独自の方法で保持されている. +これらのパラメータを設定・取得するためには \cs{ltjsetparameter} と \cs{ltjgetparameter} を +用いる. +%</ja> + +%<en>\subsection{Range of \textbf{JAchar}s} +%<ja>\subsection{\textbf{JAchar}の範囲} +\label{ssec:setrange} + +%<*en> +\LuaTeX-ja divides the Unicode codespace \texttt{U+0080}--\texttt{U+10FFFF} +into \emph{character ranges}, +numbered 1 to 217. The grouping can be (globally) customized by \cs{ltjdefcharrange}. +The next line adds whole characters in Supplementary Ideographic Plane +and the character ``漢'' to the character range~100. +%</en> +%<*ja> +\LuaTeX-jaは,Unicodeの \texttt{U+0080}--\texttt{U+10FFFF} の空間を +1番から217番までの\emph{文字範囲}に分割している. +区分けは \cs{ltjdefcharrange} を用いることで(グローバルに)変更することができ, +例えば,次は追加漢字面(SIP)にある全ての文字と「漢」を「100番の文字範囲」に追加する. +%</ja> +\begin{lstlisting} +\ltjdefcharrange{100}{"20000-"2FFFF,`漢} +\end{lstlisting} + +%<*en> +A character can belong to only one character range. +For example, whole SIP belong to the range~4 in the default setting of \LuaTeX-ja, +and if one executes the above line, then SIP will belong to the range~100 and be +removed from the range~4. +%</en> +%<*ja> +各文字はただ一つの文字範囲に所属することができる. +例えば,SIP内の文字は全て\LuaTeX-jaのデフォルトでは4番の文字範囲に +属しているが,上記の指定を行えばSIP内の文字は100番に属すようになり,4番からは除かれる. +%</ja> + +%<*en> +The distinction between \textbf{ALchar} and \textbf{JAchar} is performed by character ranges. +This can be edited by setting the \textsf{jacharrange} parameter. +For example, the code below is just the default setting of \LuaTeX-ja, and +it sets +\begin{itemize} + \item a character which belongs character ranges 1,~4, 5, and~8 is \textbf{ALchar}, + \item a character which belongs character ranges 2,~3, 6, and~7 is \textbf{JAchar}. +\end{itemize} +%</en> +%<*ja> +\textbf{ALchar}と\textbf{JAchar}の区別は文字範囲ごとに行われる. +これは\textsf{jacharrange}パラメータによって編集できる. +例えば,以下は\LuaTeX-jaの初期設定であり,次の内容を設定している: +\begin{itemize} + \item 1番,4番,5番,8番の文字範囲に属する文字は\textbf{ALchar}. + \item 2番,3番,6番,7番の文字範囲に属する文字は\textbf{JAchar}. +\end{itemize} +%</ja> +\begin{lstlisting} +\ltjsetparameter{jacharrange={-1, +2, +3, -4, -5, +6, +7, -8}} +\end{lstlisting} +%<*en> +The argument to \textsf{jacharrange} parameter is a list of non-zero integer. +Negative integer $-n$ in the list means that ``each character in the range~$n$ is an +\textbf{ALchar}'', +and positive integer $+n$ means that ``\dots\ is a \textbf{JAchar}''. +%</en> +%<*ja> +\textsf{jacharrange}パラメータの引数は非零の整数のリストである. +リスト中の負の整数$-n$は「文字範囲$n$に属する文字は\textbf{ALchar}として +扱う」ことを意味し,正の整数$+n$は「\textbf{JAchar}として扱う」ことを意味する. +%</ja> + +%<*en> +Note that characters \texttt{U+0000}--\texttt{U+007F} are always treated as an +\textbf{ALchar} (this cannot be customized). +%</en> +%<*ja> +なお,\texttt{U+0000}--\texttt{U+007F} は常に\textbf{ALchar}として扱われる(利用者が変更す +ることは出来ない). +%</ja> + +%<*en> +\paragraph{Default character ranges} +\LuaTeX-ja predefines eight character ranges for convenience. They are +determined from the following data: +%</en> +%<*ja> +\paragraph{文字範囲の初期値} +\LuaTeX-jaでは8つの文字範囲を予め定義しており, +これらは以下のデータに基づいて決定している. +%</ja> +\begin{itemize} +%<en>\item Blocks in Unicode~12.0.0. +%<ja>\item Unicode~11.0のブロック. +%<en>\item The \texttt{Adobe-Japan1-UCS2} mapping between a CID Adobe-Japan1-6 and Unicode. +%<ja>\item Adobe-Japan1-6のCIDとUnicodeの間の対応表\texttt{Adobe-Japan1-UCS2}. +%<en>\item The \Pkg{PXbase} bundle for \upTeX\ by Takayuki Yato. +%<ja>\item 八登崇之氏による\upTeX 用の\Pkg{PXbase}バンドル. +\end{itemize} + +%<*en> +Now we describe these eight ranges. The superscript ``J'' or ``A'' after the +number shows whether each character in the range is treated as +\textbf{JAchar}s or not by default. These settings are similar to the +\texttt{prefercjk} settings defined in \texttt{PXbase} bundle. +Any characters equal to or above \texttt{U+0080} which does not belong to +these eight ranges belongs to the character range~217. +%</en> +%<*ja> +以下ではこれら8つの文字範囲について記述する.添字のアルファベット「J」「A」 +は,その文字範囲内の文字が\textbf{JAchar}か\textbf{ALchar}かを表している.これらの初期設定は +\texttt{PXbase}バンドルで定義されている\texttt{prefercjk}と類似のものであるが, +8ビットフォント使用時のトラブルを防ぐために \texttt{U+0080}--\texttt{U+00FF} の文字は全部 +\textbf{ALchar}としている. +なお,\texttt{U+0080} 以降でこれら8つの文字範囲に属さない文字は,217番の文字範囲に属することになっている. +%</ja> +\begin{description} +%<*en> + +\item[Range~8${}^{\text{A}}$] The intersection of the upper half of ISO~8859-1 + (Latin-1 Supplement) and JIS~X~0208 (a basic character set for Japanese). This character range + consists of the following characters: +%</en> +%<*ja> +\item[範囲8${}^{\text{A}}$] ISO~8859-1の上位領域(ラテン1補助)と + JIS~X~0208の共通部分.この文字範囲は + 以下の文字で構成される: +%</ja> +\begin{multicols}{2} +\begin{itemize} +\def\ch#1#2{\item \char"#1\ (\texttt{U+00#1}, #2)}%" +\ch{A7}{Section Sign} +\ch{A8}{Diaeresis} +\ch{B0}{Degree sign} +\ch{B1}{Plus-minus sign} +\ch{B4}{Spacing acute} +\ch{B6}{Paragraph sign} +\ch{D7}{Multiplication sign} +\ch{F7}{Division Sign} +\end{itemize} +\end{multicols} + +%<*en> +\item[Range~1${}^{\text{A}}$] Latin characters that some of them are included in Adobe-Japan1-6. +This range consists of the following Unicode ranges, \emph{except characters in the range~8 above}: +%</en> +%<*ja> +\item[範囲1${}^{\text{A}}$] ラテン文字のうち,Adobe-Japan1-6との共通部分があるもの. + この範囲は以下のUnicodeのブロックのうち + \emph{範囲8を除いた}部分で構成されている: +%</ja> +\begin{multicols}{2} +\begin{itemize} +\item \texttt{U+0080}--\texttt{U+00FF}: Latin-1 Supplement +\item \texttt{U+0100}--\texttt{U+017F}: Latin Extended-A +\item \texttt{U+0180}--\texttt{U+024F}: Latin Extended-B +\item \texttt{U+0250}--\texttt{U+02AF}: IPA Extensions +\item \texttt{U+02B0}--\texttt{U+02FF}: Spacing Modifier Letters +%<en>\par\ +\item \texttt{U+0300}--\texttt{U+036F}: \\*\null\hfill Combining Diacritical Marks +\item \texttt{U+1E00}--\texttt{U+1EFF}: \\*\null\hfill Latin Extended Additional +%<ja>\par\ +\end{itemize} +\end{multicols} +%<*en> +\item[Range~2${}^{\text{\kern.1emJ}}$] Greek and Cyrillic letters. JIS~X~0208 (hence most of Japanese + fonts) has some of these characters. +%</en> +%<*ja> +\item[範囲2${}^{\text{\kern.1emJ}}$] ギリシャ文字とキリル文字.JIS~X~0208(したがってほとんどの + 和文フォント)には,これらの文字の一部が含まれている. +%</ja> +\begin{multicols}{2} +\begin{itemize} +\item \texttt{U+0370}--\texttt{U+03FF}: Greek and Coptic +\item \texttt{U+0400}--\texttt{U+04FF}: Cyrillic +\item \texttt{U+1F00}--\texttt{U+1FFF}: Greek Extended +\\\ +\end{itemize} +\end{multicols} +%<*en> +\item[Range~3${}^{\text{\kern.1emJ}}$] Punctuations and Miscellaneous symbols. The block list is + indicated in \autoref{tab:rng3}. +%</en> +%<*ja> +\item[範囲3${}^{\text{\kern.1emJ}}$] 句読点と記号類.ブロックのリストは\autoref{tab:rng3}% + に示してある. +%</ja> +\begin{table}[!tb] +%<en>\caption{Unicode blocks in predefined character range~3.}\medskip +%<ja>\caption{文字範囲3に指定されているUnicodeブロック.} +\label{tab:rng3} +\catcode`\"=13\def"#1#2#3#4{\texttt{U+#1#2#3#4}}%" +\centering\footnotesize +\begin{tabular}{llll} +"2000--"206F&General Punctuation& +"2070--"209F&Superscripts and Subscripts\\ +"20A0--"20CF&Currency Symbols& +"20D0--"20FF&Comb.\ Diacritical Marks for Symbols\\ +"2100--"214F&Letterlike Symbols& +"2150--"218F&Number Forms\\ +"2190--"21FF&Arrows& +"2200--"22FF&Mathematical Operators\\ +"2300--"23FF&Miscellaneous Technical& +"2400--"243F&Control Pictures\\ +"2500--"257F&Box Drawing& +"2580--"259F&Block Elements\\ +"25A0--"25FF&Geometric Shapes& +"2600--"26FF&Miscellaneous Symbols\\ +"2700--"27BF&Dingbats& +"2900--"297F&Supplemental Arrows-B\\ +"2980--"29FF&Misc.\ Math Symbols-B& +"2B00--"2BFF&Misc.\ Symbols and Arrows +\end{tabular} +\end{table} +%<*en> +\item[Range~4${}^{\text{A}}$] Characters usually not in Japanese fonts. This range consists + of almost all Unicode blocks which are not in other + predefined ranges. Hence, instead of showing the block list, + we put the definition of this range itself: +%</en> +%<*ja> +\item[範囲4${}^{\text{A}}$] 通常和文フォントには含まれていない文字. + この範囲は他の範囲にないほとんど全てのUnicodeブロック + で構成されている.したがって,ブロックのリストを示す + 代わりに,範囲の定義そのものを示す: +%</ja> +\begin{lstlisting} +\ltjdefcharrange{4}{% + "500-"10FF, "1200-"1DFF, "2440-"245F, "27C0-"28FF, "2A00-"2AFF, + "2C00-"2E7F, "4DC0-"4DFF, "A4D0-"A95F, "A980-"ABFF, "E000-"F8FF, + "FB00-"FE0F, "FE20-"FE2F, "FE70-"FEFF, "10000-"1AFFF, "1B170-"1F0FF, + "1F300-"1FFFF +} % non-Japanese +\end{lstlisting} +%<en>\item[Range~5${}^{\text{A}}$] Surrogates and Supplementary Private Use Areas. +%<ja>\item[範囲5${}^{\text{A}}$] 代用符号と補助私用領域. +%<en>\item[Range~6${}^{\text{\kern.1emJ}}$] Characters used in Japanese. The block list is indicated in \autoref{tab:rng6}. +%<ja>\item[範囲6${}^{\text{\kern.1emJ}}$] 日本語で用いられる文字.ブロックのリストは\autoref{tab:rng6}に示す. +\begin{table}[!tb] +%<en>\caption{Unicode blocks in predefined character range~6.}\medskip +%<ja>\caption{文字範囲6に指定されているUnicodeブロック.} +\label{tab:rng6} +\catcode`\"=13\def"#1#2#3#4{\texttt{U+#1#2#3#4}}%" +\centering\footnotesize +\begin{tabular}{llll} +"2460--"24FF&Enclosed Alphanumerics& +"2E80--"2EFF&CJK Radicals Supplement\\ +"3000--"303F&CJK Symbols and Punctuation& +"3040--"309F&Hiragana\\ +"30A0--"30FF&Katakana& +"3190--"319F&Kanbun\\ +"31F0--"31FF&Katakana Phonetic Extensions& +"3200--"32FF&Enclosed CJK Letters and Months\\ +"3300--"33FF&CJK Compatibility& +"3400--"4DBF&CJK Unified Ideographs Ext-A\\ +"4E00--"9FFF&CJK Unified Ideographs& +"F900--"FAFF&CJK Compatibility Ideographs\\ +"FE10--"FE1F&Vertical Forms& +"FE30--"FE4F&CJK Compatibility Forms\\ +"FE50--"FE6F&Small Form Variants& +"FF00--"FFEF&Halfwidth and Fullwidth Forms\\ +"{1B}000--"{1B}0FF&Kana Supplement& +"{1B}100--"{1B}12F&Kana Extended-A\\ +%"{1B}130--"{1B}16F&Small Kana Extension +"{1F}100--"{1F}1FF&Enclosed Alphanumeric Supp.& +"{1F}200--"{1F}2FF&Enclosed Ideographic Supp.\\ +"{20}000--"{2F}FFF&(Supp. Ideographic Plane)& +"{E0}100--"{E0}1EF&Variation Selectors Supp. +\end{tabular} +\end{table} +%<*en> +\item[Range~7${}^{\text{\kern.1emJ}}$] Characters used in CJK languages, but not included in Adobe-Japan1-6. +The block list is indicated in \autoref{tab:rng7}. +%</en> +%<*ja> +\item[範囲7${}^{\text{\kern.1emJ}}$] CJK言語で用いられる文字のうち,Adobe-Japan1-6に + 含まれていないもの. + ブロックのリストは\autoref{tab:rng7}に示す. +%</ja> +\begin{table}[!tb] +%<en>\caption{Unicode blocks in predefined character range~7.}\medskip +%<ja>\caption{文字範囲7に指定されているUnicodeブロック.} +\label{tab:rng7} +\catcode`\"=13\def"#1#2#3#4{\texttt{U+#1#2#3#4}}%" +\centering\small +\begin{tabular}{llll} +"1100--"11FF&Hangul Jamo& +"2F00--"2FDF&Kangxi Radicals\\ +"2FF0--"2FFF&Ideographic Description Characters& +"3100--"312F&Bopomofo\\ +"3130--"318F&Hangul Compatibility Jamo& +"31A0--"31BF&Bopomofo Extended\\ +"31C0--"31EF&CJK Strokes& +"A000--"A48F&Yi Syllables\\ +"A490--"A4CF&Yi Radicals& +"A960--"A97F&Hangul Jamo Extended-A\\ +"AC00--"D7AF&Hangul Syllables& +"D7B0--"D7FF&Hangul Jamo Extended-B +\end{tabular} +\end{table} +\end{description} + +%<*en> +\paragraph{Notes on \texttt{U+0080}--\texttt{U+00FF}} +You should treat characters in \\texttt{U+0080}--\texttt{U+00FF} as \textbf{ALchar}, +when you use traditional 8-bit fonts, such as the \Pkg{marvosym} package. + +For example, \cs{Frowny} which is provided by the \Pkg{marvosym} package has +the same codepoint as \S\ (\text{U+00A7}). +Hence, as previous versions of \LuaTeX-ja, if these characters are treated as +\text{JAchar}s, then \cs{Frowny} produces ``\ltjjachar`§'' (in a Japanese font). + +To avoid such situations, the default setting of \LuaTeX-ja is changed in version~20150906.0 +so that all characters \texttt{U+0080}--\texttt{U+00FF} are treated as \textbf{ALchar}. + +If you want to output a character as \textbf{ALchar} and \textbf{JAchar} regardless the range +setting, you can use \cs{ltjalchar} and \cs{ltjjachar} respectively, as the following example. +\begin{LTXexample}[width=0.3\textwidth] +\gtfamily\large % default, ALchar, JAchar +¶, \ltjalchar`¶, \ltjjachar`¶\\ % default: ALchar +α, \ltjalchar`α, \ltjjachar`α % default: JAchar +\end{LTXexample} +%</en> +%<*ja> +\paragraph{\texttt{U+0080}--\texttt{U+00FF}についての注意} +\LuaTeX-jaで,\Pkg{marvosym}パッケージ等,Unicodeフォントでなく +伝統的な8ビットフォントを用いる場合には注意が必要である. + +例えば,\Pkg{marvosym}パッケージの提供する \cs{Frowny} も,符号位置は167,つまりUnicodeにおける +\S\ (\text{U+00A7}) と同じ符号位置にある. +即ち,以前のバージョンのように,「前節の文字範囲8内の文字は\textbf{JAchar}」という設定で +あったとすると,上記の \cs{Frowny} は和文フォントで「\ltjjachar`§」を出力することになる. + +このような事態を避けるために,バージョン20150906.0からは \texttt{U+0080}--\texttt{U+00FF} の範囲の +文字は全て\textbf{ALchar}となるように初期設定を変更している. + +なお,文字範囲の設定に関わらず1つの文字を\textbf{ALchar}, \textbf{JAchar}で出力したい場合には, +以下の例のようにそれぞれ \cs{ltjalchar},~\cs{ltjjachar} に該当文字の文字コードを渡せばよい. +\begin{LTXexample}[width=0.3\textwidth] +\gtfamily\large % default, ALchar, JAchar +¶, \ltjalchar`¶, \ltjjachar`¶\\ % default: ALchar +α, \ltjalchar`α, \ltjjachar`α % default: JAchar +\end{LTXexample} +%</ja> + + +%<en>\subsection{\Param{kanjiskip} and \Param{xkanjiskip}} +%<ja>\subsection{\Param{kanjiskip}と\Param{xkanjiskip}} +\label{subs-kskip} + +%<en>\textbf{JAglue} is divided into the following three categories: +%<ja>\textbf{JAglue}は以下の3つのカテゴリに分類される: +\begin{itemize} +%<*en> +\item Glues/kerns specified in JFM. If \cs{inhibitglue} is issued + around a \textbf{JAchar}, this glue will not be inserted at the + place. +%</en> +%<*ja> +\item JFMで指定されたグルー/カーン.もし \cs{inhibitglue} が\textbf{JAchar}の周りで + 発行されていれば,このグルーは挿入されない. +%</ja> +%<*en> +\item The default glue which inserted between two \textbf{JAchar}s (\Param{% + kanjiskip}). +%</en> +%<*ja> +\item デフォルトで2つの\textbf{JAchar}の間に挿入されるグルー(\Param{kanjiskip}). +%</ja> +%<*en> +\item The default glue which inserted between a \textbf{JAchar} and an + \textbf{ALchar} (\Param{xkanjiskip}). +%</en> +%<*ja> +\item デフォルトで\textbf{JAchar}と\textbf{ALchar}の間に挿入されるグルー(\Param{xkanjiskip}). +%</ja> +\end{itemize} +%<*en> +The value (a skip) of \Param{kanjiskip} or +\Param{xkanjiskip} can be changed as the following. +Note that only their values \emph{at the end of a paragraph or a hbox are +adopted in the whole paragraph or the whole hbox. +} +%</en> +%<*ja> +\Param{kanjiskip}や\Param{xkanjiskip}の値 +は以下のようにして変更可能である. +%</ja> +\begin{lstlisting} +\ltjsetparameter{kanjiskip={0pt plus 0.4pt minus 0.4pt}, + xkanjiskip={0.25\zw plus 1pt minus 1pt}} +\end{lstlisting} +%<*en> +Here \cs{zw} is a internal dimension +which stores fullwidth of the current Japanese font. +This \cs{zw} can be used as the unit \texttt{zw} in \pTeX. + +The value of these parameter can be get by \cs{ltjgetparameter}. +Note that the result by \cs{ltjgetparameter} is \emph{not} the internal quantities, +but \emph{a string} (hence \cs{the} cannot be prefixed). +%</en> +%<*ja> +ここで,\cs{zw} は現在の和文フォントの全角幅を表す長さであり, +\pTeX における長さ単位 \texttt{zw} と同じように使用できる. + +これらのパラメータの値は以下のように取得できる. +戻り値は内部値ではなく\emph{文字列}である(\cs{the} は前置できない)ことに注意してほしい: +%</ja> +\begin{LTXexample} +kanjiskip: \ltjgetparameter{kanjiskip},\\ +xkanjiskip: \ltjgetparameter{xkanjiskip} +\end{LTXexample} + +%<*en> +It may occur that JFM contains the data of ``ideal width of +\Param{kanjiskip}'' +and/or ``ideal width of \Param{xkanjiskip}''. +To use these data from JFM, set the value of \Param{kanjiskip} or +\Param{xkanjiskip} to \cs{maxdimen} +(these ``ideal width'' cannot be retrived by \cs{ltjgetparameter}). +%</en> +%<*ja> +JFMは「望ましい\Param{kanjiskip}の値」や +「望ましい\Param{xkanjiskip}の値」を持っていることがある. +これらのデータを使うためには,\Param{kanjiskip}や% +\Param{xkanjiskip}の値を \cs{maxdimen} の値に設定すればよいが, +\cs{ltjgetparameter} によって取得することはできないので注意が必要である. +%</ja> + +%<en>\subsection{Insertion setting of \Param{xkanjiskip}} +%<ja>\subsection{\Param{xkanjiskip} の挿入設定} + +%<*en> +It is not desirable that \Param{xkanjiskip} is inserted into every +boundary between \textbf{JAchar}s and \textbf{ALchar}s. For example, +\Param{xkanjiskip} should not be inserted after opening parenthesis +(\textit{e.g.}, compare ``(あ'' and ``(\hskip\ltjgetparameter{xkanjiskip}あ''). +\LuaTeX-ja can control whether \Param{xkanjiskip} can be inserted +before/after a character, by changing \Param{jaxspmode} for \textbf{JAchar}s and +\Param{alxspmode} parameters \textbf{ALchar}s respectively. +%</en> +%<*ja> +\Param{xkanjiskip}がすべての\textbf{JAchar}と\textbf{ALchar}の境界に +挿入されるのは望ましいことではない.例えば,\Param{xkanjiskip}は開き括弧の +後には挿入されるべきではない(「(あ」と「(\hskip\ltjgetparameter{xkanjiskip}あ」を +比べてみよ). +\LuaTeX-jaでは\Param{xkanjiskip}をある文字の前/後に挿入するかどうかを, +\textbf{JAchar}に対しては\Param{jaxspmode}を,\textbf{ALchar}に対しては +\Param{alxspmode}をそれぞれ変えることで制御することができる. +%</ja> +\begin{LTXexample} +\ltjsetparameter{jaxspmode={`あ,preonly}, alxspmode={`\!,postonly}} +pあq い!う +\end{LTXexample} + +%<*en> +The second argument \texttt{preonly} means that the insertion of +\Param{xkanjiskip} is allowed before this character, but not after. +the other possible values are \texttt{postonly}, \texttt{allow}, and \texttt{inhibit}. +%</en> +%<*ja> +2つ目の引数の \texttt{preonly}は「\Param{xkanjiskip}の挿入はこの文字の +前でのみ許され,後では許さない」ことを意味する.他に指定可能な値は +\texttt{postonly}, \texttt{allow}, \texttt{inhibit}である. +%</ja> + +%<*en> +\Param{jaxspmode} and \Param{alxspmode} use a same table to store the parameters +on the current version. Therefore, line~1 in the code above can be rewritten +as follows: +%</en> +%<*ja> +なお,現行の +仕様では,\Param{jaxspmode}, \Param{alxspmode}はテーブルを共有しており, +上のコードの1行目を次のように変えても同じことになる: +%</ja> +\begin{lstlisting} +\ltjsetparameter{alxspmode={`あ,preonly}, jaxspmode={`\!,postonly}} +\end{lstlisting} +%<*en> +One can use also numbers to specify these two parameters (see Subsection~\ref{ssec:param}). +%</en> +%<*ja> +また,これら2パラメータには数値で値を指定することもできる(\ref{ssec:param}節を参照). +%</ja> + +%<*en> +If you want to enable/disable all insertions of \Param{kanjiskip} and +\Param{xkanjiskip}, set \Param{autospacing} and \Param{autoxspacing} +parameters to \texttt{true}/\texttt{false}, respectively. +%</en> +%<*ja> +もし全ての\Param{kanjiskip}と\Param{xkanjiskip}の挿入を有効化/無効化 +したければ,それぞれ\Param{autospacing}と\Param{autoxspacing}を +\texttt{true}/\texttt{false}に設定すればよい. +%</ja> + +%<en>\subsection{Shifting the baseline} +%<ja>\subsection{ベースラインの移動} +%<*en> +To make a match between a Japanese font and an alphabetic font, sometimes +shifting of the baseline of one of the pair is needed. In \pTeX, this is achieved +by setting \cs{ybaselineshift} (or \cs{tbaselineshift}) to a non-zero length (the +baseline of \textbf{ALchar} is shifted below). However, for documents +whose main language is not Japanese, it is good to shift the baseline of +Japanese fonts, but not that of alphabetic fonts. +Because of this, \LuaTeX-ja can independently set the shifting amount +of the baseline of alphabetic fonts and that of Japanese fonts. +\begin{center} + \small +\begin{tabular}{>{\bfseries}lcc} +\toprule +&\bfseries Horizontal writing (\emph{yoko} direction) etc. +&\bfseries Vertical writing(\emph{tate} direction)\\ +\midrule +Alphabetic fonts&\Param{yalbaselineshift} + parameter&\Param{talbaselineshift} parameter\\ +Japanese fonts&\Param{yjabaselineshift} + parameter&\Param{tjabaselineshift} parameter\\ +\bottomrule +\end{tabular} +\end{center} +%</en> +%<*ja> +和文フォントと欧文フォントを合わせるためには,時々どちらかのベースラインの移動が +必要になる.\pTeX ではこれは \cs{ybaselineshift}(または\cs{tbaselineshift})を設定することで +なされていた(\textbf{ALchar}のベースラインがその分だけ下がる).しかし,日本語が主ではない +文書に対しては,欧文フォントではなく和文フォントのベースラインを移動した方がよい. +このため,\LuaTeX-jaでは欧文フォントのベースラインのシフト量 +と和文フォントのベースラインのシフト量を独立に設定できるようになっている. +\begin{center} + \small +\begin{tabular}{>{\bfseries}lcc} +\toprule +&\bfseries 横組など&\bfseries 縦組\\ +\midrule +欧文フォントのシフト量&\Param{yalbaselineshift} + parameter&\Param{talbaselineshift} parameter\\ +和文フォントのシフト量&\Param{yjabaselineshift} + parameter&\Param{tjabaselineshift} parameter\\ +\bottomrule +\end{tabular} +\end{center} +%</ja> + +%<*en> +Here the horizontal line in the below example is the baseline of a line. +%</en> +%<*ja> +下の例において引かれている水平線がベースラインである. +%</ja> +\begin{LTXexample} +\vrule width 150pt height 0.2pt depth 0.2pt \hskip-120pt +\ltjsetparameter{yjabaselineshift=0pt, yalbaselineshift=0pt}abcあいう +\ltjsetparameter{yjabaselineshift=5pt, yalbaselineshift=2pt}abcあいう +\end{LTXexample} + +%<*en> +There is an interesting side-effect: characters in different size can be +vertically aligned center in a line, by setting two parameters appropriately. +The following is an example (beware the value is not well tuned): +%</en> +%<*ja> +この機能には面白い使い方がある:2つのパラメータを適切に設定することで,サイズの +異なる文字を中心線に揃えることができる. +以下は一つの例である(値はあまり調整されていないことに注意): +%</ja> +\begin{LTXexample}[width=0.4\textwidth] +\vrule width 150pt height4.417pt depth-4.217pt% +\kern-150pt +\large xyz漢字 +{\scriptsize + \ltjsetparameter{yjabaselineshift=-1.757pt, + yalbaselineshift=-1.757pt} + 漢字xyzあいう +}あいうabc +\end{LTXexample} + +%<*en> +Note that setting positive \Param{yalbaselineshift}~or~\Param{talbaselineshift} +parameters does not increase the depth of one-letter \emph{syllable} $p$ of \textbf{Alchar}, if +its left-protrusion~(\cs{lpcode}) and right-protrusion~(\cs{rpcode}) are both non-zero. +This is because +\begin{itemize} +\item These two parameters are implemented by setting \texttt{yoffset} field of a +glyph node, and this does not increase the depth of the glyph. +\item To cope with the above situation, \LuaTeX-ja automatically supplies +a rule in every syllable. +\item However, we cannot use this ``supplying a rule'' method if a syllable comprises just + one letter whose \cs{lpcode}~and~\cs{rpcode} are both non-zero. +\end{itemize} + +This problem does not apply for \Param{yjabaselineshift}~nor~\Param{tjabaselineshift}, +becuse a \emph{JAchar} is encapsulated by a horizontal box if needed. +%</en> +%<*ja> +なお,以下の場合には1文字の\textbf{ALchar}からなる「音節」の深さは増加しないことに注意. +\begin{itemize} + \item \Param{yalbaselineshift},~\Param{talbaselineshift}パラメータが正になっている. + \item 「音節」を構成する唯一の文字$p$の +左余白への突出量(\cs{lpcode}),右余白への突出量(\cs{rpcode})がどちらも非零である. +\end{itemize} +\emph{JAchar}は必要に応じて1文字ずつボックスにカプセル化されるため, +\Param{yjabaselineshift},~\Param{tjabaselineshift}パラメータについてはこのような問題は起こらない. +%</ja> + +%<*ja> +\paragraph{数式における挙動:\pTeX との違い} +\textbf{ALchar}のベースラインを補正する\Param{yalbaselineshift}, \Param{talbaselineshift}パラメータは +ほぼ\pTeX における \cs{ybaselineshift}, \cs{tbaselineshift} に対応しているものであるが, +数式中の挙動は異なっているので注意が必要である. +例えば,\autoref{tab:math_bsa}のように,数式中に明示的に現れた \cs{hbox},~\cs{vbox} は,横組において +\begin{itemize} + \item 2015年以前の\pTeX では,ボックス全体が \cs{ybaselineshift} だとシフトされるので, + \autoref{tab:math_bsa}中の``い''のように,ボックス中の和文文字は + \ \cs{ybaselineshift} だけシフトされ,一方,``for all''のように, + ボックス内の欧文文字は2重にシフトされることになる. + \item 一方,\LuaTeX-jaではそのようなことはおこらず, + 数式中に明示的に現れた \cs{hbox},~\cs{vbox} はシフトしない.そのため, + \autoref{tab:math_bsa}中の``い''も``for all''も,それぞれ本文中に + 書かれたときと同じ上下位置に組まれる. + + なお,\TeX~Live~2016以降の\pTeX では改修がなされ,\LuaTeX-jaと + 近い挙動になるようにしているが,数式中に直に書かれた``あ''のベースラインについては + まだ違いが見られる. +\end{itemize} + +なお,バージョン20170401.0以降の\LuaTeX-jaでは,\cs{vcenter} によるボックスには +全体が\Param{yalbaselineshift}, \Param{talbaselineshift} パラメータが反映されるようにしている. +その方が結果が自然であることによる変更なのだが,結果的に\cs{vcenter} については\pTeX と同じ挙動となった. + +\begin{table} +\small\centering +\caption{数式関係のベースライン補正($\Param{yalbaselineshift}=10\,\textrm{pt}$)} +\label{tab:math_bsa} +\newdimen\origbaselineskip +\origbaselineskip=\baselineskip +\begin{tabular}{lp{30\zw}} +\toprule +\emph{入力}&\vspace*{\dimexpr-\origbaselineskip-\smallskipamount} +\begin{lstlisting} +数式abc: $あa\hbox{い}$, $\int_0^x t\,dt=x^2/2$, +$\Phi\vdash F(x)\ \hbox{for all}\ x\in A$ +\end{lstlisting}\\ +\noalign{\vskip-\origbaselineskip} +\midrule +\emph{\pTeX~(--2015)}& +{\ltjsetparameter{yalbaselineshift=10pt}% +数式abc: $\lower10pt\hbox{あ}a\lower10pt\hbox{い}$, $\int_0^x t\,dt=x^2/2$, +$\Phi\vdash F(x)\ \lower10pt\hbox{for all}\ x\in A$ +\par}\\\noalign{\vskip-\origbaselineskip}\midrule +\emph{\pTeX~(2016--)}& +{\ltjsetparameter{yalbaselineshift=10pt}% +数式abc: $\lower10pt\hbox{あ}a\hbox{い}$, $\int_0^x t\,dt=x^2/2$, +$\Phi\vdash F(x)\ \hbox{for all}\ x\in A$ +\par}\\\noalign{\vskip-\origbaselineskip}\midrule +\emph{\LuaTeX-ja}& +{\ltjsetparameter{yalbaselineshift=10pt}% +数式abc: $あa\hbox{い}$, $\int_0^x t\,dt=x^2/2$, +$\Phi\vdash F(x)\ \hbox{for all}\ x\in A$ +\par}\\ +\noalign{\vskip-\origbaselineskip} +\bottomrule +\end{tabular} +\end{table} +%</ja> + +%<*en> +\subsection{\emph{kinsoku} parameters and OpenType features} +Among parameters which related to Japanese word-wrapping process (\emph{kinsoku shori}), +\begin{quote} + \Param{jaxspmode},~\Param{alxspmode}, \Param{prebreakpenalty}, + \Param{postbreakpenalty}~and~\Param{kcatcode} +\end{quote} +are stored by each character codes. + +OpenType font features are ignored in these parameters. +For example, a fullwidth katakana ``ア'' on line~10 in the below input is replaced to +its halfwidth variant ``ア'', by \verb+hwid+ feature. +However, the penalty inserted after it is 10 which is the \Param{postbreakpenalty} of +``ア'', not 20. +%</en> +%<*ja> +\subsection{禁則処理関連パラメータとOpenType機能} +禁則処理や \Param{kanjiskip}, \Param{xkanjiskip} の挿入に関連したパラメータのうち +\begin{quote} + \Param{jaxspmode},~\Param{alxspmode}, \Param{prebreakpenalty}, + \Param{postbreakpenalty}, \Param{kcatcode} +\end{quote} +は,文字コードごとに設定する量である. + +\Pkg{fontspec}パッケージを使う(\ref{ssec:fontspec}節)場合など, +各種のOpenType機能を適用することもあると思うが,前段落に述べたパラメータ類は, +\emph{OpenType機能の適用前の文字コードによって適用される.} +例えば,以下の例において10行目の「ア」は,\verb+hwid+ featureの適用により半角カタカナの「ア」 +に置き換わる.しかし,その直後に挿入される \Param{postbreakpenalty}は,置換前の「ア」に対する値10である. +%</ja> + +\begin{LTXexample}[width=0.2\textwidth] +\ltjsetparameter{postbreakpenalty={`ア, 10}} +\ltjsetparameter{postbreakpenalty={`ア, 20}} + +\newcommand\showpostpena[1]{% + \leavevmode\setbox0=\hbox{#1\hbox{}}% + \unhbox0\setbox0=\lastbox\the\lastpenalty} + +\showpostpena{ア}, +\showpostpena{ア}, +{\addjfontfeatures{CharacterWidth=Half}\showpostpena{ア}} +\end{LTXexample} + +\clearpage +%<en>\part{Reference} +%<ja>\part{リファレンス} +\label{part-ref} +\suppressfloats[t] +%<*ja> +\section{\LuaTeX-jaにおける \cs{catcode}} +\label{sec-catcode} +\subsection{予備知識:\pTeX と\upTeX における \cs{kcatcode}} +\pTeX,\upTeX においては,和文文字が制御綴内で利用できるかどうか +は \cs{kcatcode} の値によって決定されるのであった. +詳細は\autoref{tab:kcat}を参照されたい. +%</ja> +%<*en> +\section{\cs{catcode} in \LuaTeX-ja} +\label{sec-catcode} +\subsection{Preliminaries: \cs{kcatcode} in \pTeX\ and \upTeX} +In \pTeX~and~\upTeX, the value of \cs{kcatcode} determines +whether a Japanese character can be used in a control word. +For the detail, see \autoref{tab:kcat}. +%</en> + +\begin{table}[t] +\small +\caption{\cs{kcatcode} in \upTeX} +\label{tab:kcat} +%<en>\medskip + +\noindent\hfill +\begin{tabular}{llccc} +\toprule +\bfseries \cs{kcatcode}& +%<*en> +\bfseries meaning& +\bfseries control word& +\bfseries widow penalty& +\bfseries linebreak\\ +%</en> +%<*ja> +\bfseries 意図& +\bfseries 制御綴中に使用& +\bfseries 文字ウィドウ処理& +\bfseries 直後での改行\\ +%</ja> +\midrule +15&non-cjk&\multicolumn{3}{c}{(treated as usual \LaTeX)}\\ +16&kanji&Y&Y&ignored\\ +17&kana&Y&Y&ignored\\ +18&other&N&N&ignored\\ +19&hangul&Y&Y&space\\ +\bottomrule +\end{tabular}\hfill\null + +\medskip + +%<*ja> +文字ウィドウ処理:「漢字が一文字だけ次の行に行くのを防ぐ」 +\cs{jcharwidowpenalty} が, +その文字の直前に挿入されうるか否か,を示す. +%</ja> +\end{table} + +%<*en> +\cs{kcatcode} can be set by a row of JIS~X~0208 in \pTeX, +and generally by a Unicode block\footnote{% + \upTeX\ divides \texttt{U+FF00}--\texttt{U+FFEF} (Halfwidth and Fullwidth Forms) + into three subblocks, and \cs{kcatcode} can be set by a subblock. +} +in \upTeX. So characters which can be used in a control word +slightly differ between \pTeX~and~\upTeX. +%</en> +%<*ja> +\pTeX では \cs{kcatcode} はJIS~X~0208の区単位, +\upTeX では概ねUnicodeブロック単位\footnote{% + \texttt{U+FF00}--\texttt{U+FFEF} (Halfwidth and Fullwidth Forms)は + 「全角英数字」「半角カナ」「その他」と3つに分割されており, + それぞれ別々に \cs{kcatcode} が指定できるようになっている. +}で設定可能になっている.そのため,\pTeX と\upTeX の初期状態では +制御綴内で使用可能な文字が微妙に異なっている. +%</ja> + +%<*en> +\subsection{Case of \LuaTeX-ja} +The role of \cs{kcatcode} in \pTeX~and~\upTeX\ can be +divided into the following four kinds, +and \LuaTeX-ja can control these four kinds separately: +\begin{itemize} + \item +\emph{Distinction between \textbf{JAchar} or \textbf{ALchar}} +is controlled by the character range, see Subsection~\ref{ssec:setrange}. + \item +\emph{Whether the character can be used in a control word} +is controlled by setting \cs{catcode} to 11~(enabled) or 12~(disabled), as usual. + \item +\emph{Whether \Param{jcharwidowpenalty} can be inserted before the character} +is controlled by the lowermost bit of the \Param{kcatcode} parameter. + \item +\emph{Linebreak after a \textbf{JAchar}} does not produce a space. +\end{itemize} +%</en> +%<*ja> +\subsection{\LuaTeX-jaの場合} +\LuaTeX-jaでは,従来の\pTeX・\upTeX における \cs{kcatcode} の役割を +分割している: +\begin{description} + \item[欧文/和文の区別 (\upTeX)] +\cs{ltjdefcharrange} と\textsf{jacharrange}パラメータ(\ref{ssec:setrange}節) + \item[制御綴中に使用可か] +\LuaTeX 自身の \cs{catcode} でよい + \item[\Param{jcharwidowpenalty}が挿入可か] +\Param{kcatcode}パラメータの最下位ビット + \item[直後の改行] +日本語しか想定していないので,\textbf{JAchar}直後の改行で半角スペースが挿入されることはない. +\end{description} +%</ja> + +%<*en> +Default setting of \cs{catcode} of Unicode characters are located in +\begin{description} + \item[plain \LuaTeX] \texttt{luatex-unicode-letters.tex}, which is based on \texttt{unicode-letters.tex} +(for \XeTeX). + \item[\LuaLaTeX] now included in \LaTeX\ kernel as~\texttt{unicode-letters.def}. +\end{description} +However, the default setting of \cs{catcode} differs +between \XeTeX\ and \LuaTeX, by the following reasons: +\begin{itemize} + \item (plain format) \texttt{luatex-unicode-letters.tex} is based on old \texttt{unicode-letters.tex}. + \item The latter half of \texttt{unicode-letters.tex}~and~\texttt{unicode-letters.def} +sets\cs{catcode} of several characters to 11, via setting \cs{XeTeXcharclass}. +However, this latter half does not exist (plain case), or not executed (\LaTeX~case) in \LuaTeX. +\end{itemize} +In other words, +\begin{description} +\item[plain \LuaTeX] +Kanji nor kana characters cannot be used in +a control word, in the default setting of plain \LuaTeX. +\item[\LuaLaTeX] +In recent (2015-10-01 or later) \LuaLaTeX, Kanji and kana characters in a control word is supported (these catcode are 11), +but not fullwidth alphanumerics and several other characters. +\end{description} + +This would be inconvenient for \pTeX~users to shifting to \LuaTeX-ja, +since several control words containing Kanji or other fullwidth characters, such as +\verb+\西暦+~or~\verb+\1年目西暦+ are used in \pTeX. +Hence, \LuaTeX-ja have a counterpart of \texttt{unicode-letters.tex} +for \LuaTeX, \emph{to match the \cs{catcode} setting with that of \XeTeX.} +%</en> +%<*ja> +ネイティブにUnicode全部の文字を扱える\XeTeX や\LuaTeX では, +文字が制御綴内で使用できるかは通常の欧文文字と同じく\cs{catcode}% +で指定することとなる.plain \XeTeX における\cs{catcode}の初期設定は% +\texttt{unicode-letters.tex}中に記述されており,plain \LuaTeX ではそれを +元にした\texttt{luatex-unicode-letters.tex}を用いている. +\LaTeX では\cs{catcode}の設定はカーネルに\texttt{unicode-letters.def}として統合され. +このファイルを\XeLaTeX, \LuaLaTeX の両方が用いている. + +だが,\XeTeX における\cs{catcode}の初期設定と +\LuaTeX におけるそれは一致していない: +\begin{itemize} + \item \texttt{luatex-unicode-letters.tex} の元になった + \texttt{unicode-letters.tex}が古い + \item \texttt{unicode-letters.tex} 後半部や\texttt{unicode-letters.def}後半部では +\cs{XeTeXcharclass}の設定を行なっており, +それによって漢字や仮名,および全角英数字の\cs{catcode}が11に設定されている. +しかし,\texttt{luatex-unicode-letters.tex}ではこの「後半部」が +まるごと省略されており,また\LuaLaTeX でも\texttt{unicode-letters.def}後半部は実行されな + い. +\end{itemize} +言い換えると, +\begin{description} + \item[plain \LuaTeX] 漢字や仮名を制御綴内に +使用することはできない. + \item[\LuaLaTeX] 最近の(2015-10-01以降の) +\LuaLaTeX では漢字や仮名を制御綴内に +使用することが可能になったが,全角英数字は相変わらず使用できない, +\end{description} +これでは\pTeX で使用できた\verb+\1年目西暦+\footnote{科研費\LaTeX で使用されているそうです.}などが使えないこととなり, +\LuaTeX-jaへの移行で手間が生じる.そのため,\LuaTeX-jaでは +\texttt{unicode-letters.tex}の後半部にあたる内容を自前でパッチし, +結果として\emph{\XeTeX における初期設定と同じになるようにしている.} +%</ja> + +\begin{table} + \centering\small +%<en>\caption{Difference of the set of non-kanji JIS~X~0208 characters which can be used in a control word} +%<ja>\caption{制御綴中に使用出来るJIS~X~0208非漢字の違い} +%<en>\medskip +\label{tab:kcat-diff} +\def\D#1#2#3#4{% + {\fboxsep0pt\fcolorbox{cyan}{white}% + {\large\char"#1#2#3#4}}\ (\texttt{U+#1#2#3#4})} %" +\leavevmode\hbox to 0pt{\hss\begin{tabular}{cccccc} +\toprule +%<en>&\textbf{row}&\textbf{col.}&\textbf{\pTeX}&\textbf{\upTeX}&\textbf{\LuaTeX-ja}\\ +%<ja>&\emph{区}&\emph{点}&\emph{\pTeX}&\emph{\upTeX}&\emph{\LuaTeX-ja}\\ +\midrule +%\D 3000&1&1&N&N&Y\\ +\D 30FB&1&6&N&Y&N\\ +\D 309B&1&11&N&Y&N\\ +\D 309C&1&12&N&Y&N\\ +\D FF40&1&14&N&N&Y\\ +\D FF3E&1&16&N&N&Y\\ +\D FFE3&1&17&N&N&Y\\ +\D FF3F&1&18&N&N&Y\\ +%\D 30FD&1&19&N&Y&Y\\ +%\D 30FE&1&20&N&Y&Y\\ +%\D 309D&1&21&N&Y&Y\\ +%\D 309E&1&22&N&Y&Y\\ +\D 3003&1&23&N&N&Y\\ +\D 4EDD&1&24&N&Y&Y\\ +\D 3005&1&25&N&N&Y\\ +\D 3006&1&26&N&N&Y\\ +\D 3007&1&27&N&N&Y\\ +\D 30FC&1&28&N&Y&Y\\ +\D FF0F&1&31&N&N&Y\\ +\D FF3C&1&32&N&N&Y\\ +\bottomrule +\end{tabular}\qquad +\begin{tabular}{cccccc} +\toprule +%<en>&\textbf{row}&\textbf{col.}&\textbf{\pTeX}&\textbf{\upTeX}&\textbf{\LuaTeX-ja}\\ +%<ja>&\emph{区}&\emph{点}&\emph{\pTeX}&\emph{\upTeX}&\emph{\LuaTeX-ja}\\ +\midrule +\D FF5C&1&35&N&N&Y\\ +\D FF0B&1&60&N&N&Y\\ +\D FF1D&1&65&N&N&Y\\ +\D FF1C&1&67&N&N&Y\\ +\D FF1E&1&68&N&N&Y\\ +\D FF03&1&84&N&N&Y\\ +\D FF06&1&85&N&N&Y\\ +\D FF0A&1&86&N&N&Y\\ +\D FF20&1&87&N&N&Y\\ +\D 3012&2&9&N&N&Y\\ +\D 3013&2&14&N&N&Y\\ +\D FFE2&2&44&N&N&Y\\ +\D 212B&2&82&N&N&Y\\ +%<en>\multicolumn{3}{c}{$\vphantom{\D 3000}$\hbox{}Greek letters (row 6)}&Y&N&Y\\ +%<en>\multicolumn{3}{c}{$\vphantom{\D 3000}$\hbox{}Cyrillic letters (row 7)}&N&N&Y\\ +%<ja>\multicolumn{3}{c}{$\vphantom{\D 3000}$\hbox{}ギリシャ文字(6区)}&Y&N&Y\\ +%<ja>\multicolumn{3}{c}{$\vphantom{\D 3000}$\hbox{}キリル文字(7区)}&N&N&Y\\ +\bottomrule +\end{tabular}\hss}\par +\end{table} + +%<*en> +\subsection{Non-kanji characters in a control word} +Because the engine differ, so non-kanji JIS~X~0208 characters +which can be used in a control word differ in \pTeX, in \upTeX,~and~in \LuaTeX-ja. +\autoref{tab:kcat-diff} shows the difference. +Except for four characters ``・'',~``゛'', ``゜'',~``゠'', +\LuaTeX-ja admits more characters in a control word than \upTeX. + +Difference becomes larger, if we consider +non-kanji JIS~X~0213 characters. +For the detail, see \url{https://github.com/h-kitagawa/kct}. +%</en> +%<*ja> +\subsection{制御綴中に使用出来るJIS非漢字の違い} + +エンジンが異なるので,\pTeX, \upTeX, \LuaTeX-ja +において制御綴中に使用可能なJIS~X~0208の文字は異なる. +異なっているところだけを載せると,\autoref{tab:kcat-diff}のようになる. +「・」「゛」「゜」「゠」を除けば,\LuaTeX-jaでは\upTeX より多くの文字が +制御綴に使用可能になっている. + +JIS~X~0213の範囲に広げると,差異はさらに大きくなる. +詳細については例えば \url{https://github.com/h-kitagawa/kct} 中の\ +\texttt{kct-out.pdf} などを参照すること. +%</ja> + + +%<*en> +\section{Directions} +\LuaTeX\ supports four $\Omega$-style directions: \texttt{TLT},~\texttt{TRT}, \texttt{RTT} +and \texttt{LTL}. +However, neither directions are not well-suited for typesetting Japanese vertically, hence we +implemented vertical writing by rotating \texttt{TLT}-box by 90~degrees. +%</en> +%<*ja> +\section{縦組} +\label{sec-direction} +\LuaTeX 本体でも,$\Omega$・$\aleph$由来の機能として,複数の組方向をサポートしている. +しかし,\LuaTeX がサポートするのは \texttt{TLT},~\texttt{TRT}, \texttt{RTT},~\texttt{LTL}\ +のみであり,日本語の縦組に使うのは望ましくない\footnote{% +和文文字だけならば \texttt{RTT} を使えばなんとかなると思うが, +欧文文字が入ってきた場合はうまくいかず,\texttt{RTR} という組方向が必要になる. +}.そのため,\LuaTeX-jaでは横組(\texttt{TLT})で組んだボックスを回転させる方式で +縦組を実装した. +%</ja> + +%<ja>\subsection{サポートする組方向} +\begin{table}[t] +%<ja>\caption{\LuaTeX-ja のサポートする組方向} +%<en>\caption{Directions supported by \LuaTeX-ja} +%<en>\medskip +\label{tab-dir} +\centering\small +\def\obox#1{% + \setbox0=\hbox{\yoko\hbox{#1% + \large\ltjsetparameter{talbaselineshift=0pt}% + \vrule height 25pt width 0.4pt depth 15pt\kern-.2pt% + \raise25pt\hbox to 0pt{\hss\composite{*r^@{>>}}\hss}% + \raise-15pt\hbox to 0pt{\hss\composite{*l^@{>|}}\hss}\kern.2pt% + \vrule height.2pt depth.2pt width 60pt\hbox to 0pt{\hss\composite{*d^@{>}}\hss}\kern-60pt + \hbox to 60pt{\,銀は、Ag\hss}}}% + \raise\dimexpr 0.5\ltjgetdp0-0.5\ltjgetht0\box0% +} +%<*ja> +\begin{tabular}{>{\bfseries}lcccc} +\toprule +&横組&縦組 &「dtou方向」&「utod方向」\\ +\midrule +命令&\cs{yoko}&\cs{tate}&\cs{dtou}&\cs{utod}\\ +字送り方向&水平右向き(→)&垂直下向き(↓)&垂直上向き(↑)&垂直下向き(↓)\\ +行送り方向&垂直下向き(↓)&水平左向き(←)&水平右向き(→)&水平左向き(←)\\ +使用する和文フォント&横組用(\cs{jfont})&縦組用(\cs{tfont})& +\multicolumn{2}{c}{% + 横組用(\cs{jfont})の$90^\circ$回転}\\[\smallskipamount] +組版例\null $^*$ &\obox{\yoko}&\obox{\tate}&\obox{\dtou}&\obox{\utod}\\ +\noalign{\medskip} +\bottomrule +\end{tabular} + +\medskip\raggedright +\def\R#1{% + \raise0.38\zw\hbox{% + \vrule height.2pt depth.2pt width2\zw% + \hbox to 0pt{\hss\composite{*d^@{#1}}\hss}% + }% +} +$^*$\ 幅(width),高さ(height),深さ(depth)の増加方向を, +それぞれ「\R{>}」,「\R{>>}」,「\R{>|}」で表している. +\raggedright +%</ja> + +%<*en> +\begin{tabular}{>{\bfseries}lcccc} +\toprule +&horizontal (\emph{yoko}~direction)&vertical (\emph{tate}~direction)&% + \emph{dtou} direction&\emph{utod} direction\\ +\midrule +Commands&\cs{yoko}&\cs{tate}&\cs{dtou}&\cs{utod}\\ +Beginning of the page&Top&Right&Left&Right\\ +Beginning of the line&Left&Top&Bottom&Top\\ +Used Japanese font&horizontal (\cs{jfont})&vertical (\cs{tfont})& +\multicolumn{2}{c}{% + horizontal ($90^\circ$ rotated)}\\[\smallskipamount] +Example&\obox{\yoko}&\obox{\tate}&\obox{\dtou}&\obox{\utod}\\ +\noalign{\medskip} +(Notation used in $\Omega$)&TLT&RTR, RTT&LBL&RTR\\ +\bottomrule +\end{tabular} + +\medskip\raggedright +\def\R#1{% + \raise0.38\zw\hbox{% + \vrule height.2pt depth.2pt width2\zw% + \hbox to 0pt{\hss\composite{*d^@{#1}}\hss}% + }% +} +\raggedright +%</en> +\end{table} + +%<*en> +\LuaTeX-ja supports four directions, as shown in \autoref{tab-dir}. +The second column (\emph{yoko} direction) is just horizontal writing, +and the third column (\emph{tate} direction) is vertical writing. +The fourth column (\emph{dtou} direction) is actually a hidden feature of \pTeX. +We implemented this for debugging purpose. +The fifth column (\emph{utod} direction) corresponds the ``\texttt{tate (math) direction}'' of \pTeX. + +Directions can be changed by \cs{yoko},~\cs{tate}, \cs{dtou},~\cs{utod}, +only when the current list is null. +These commands cannot be executed in unrestricted horizontal modes, nor math modes. +The direction of a math formula is changed to +\emph{utod}, when the direction outside the math formula is \emph{tate} (vertical writing). +%</en> + +%<*ja> +\LuaTeX-jaがサポートする組方向は\autoref{tab-dir}に示す4つである. +4列目の \cs{dtou} は聞き慣れない命令だと思うが, +実は\pTeX に同名の命令が(ドキュメントには書かれていないが)存在する. +Down-TO-Upの意味なのだろう.\cs{dtou} を使用する機会はないだろうが, +\LuaTeX-jaではデバッグ用に実装している. +5列目の \cs{utod} は,\pTeX で言う「縦数式ディレクション」に相当するものである. + +組方向は,\cs{yoko},~\cs{tate}, \cs{dtou},~\cs{utod} をそれぞれ使用することで, +現在作成中のリストやボックスが空の時にのみ変更可能である. +ただし,現在のモードが非制限水平モードや(文中,別行立て問わず)数式モードであるときには +組方向を変更することは出来ない. +また,縦組中の数式内のボックスは\pTeX と同じように組方向が \cs{utod} となる. + +なお,\LaTeX の下で\LuaTeX-jaを使用する場合,組方向変更命令には +「新たな組方向下での和文フォントを必要なら読み込み(・選択する)」という +処理が付け加えられている(\ref{ssec:ltx-jfm}節参照). +%</ja> + +%<*en> +\subsection{Boxes in different direction} + +As in \pTeX, one can use boxes of different direction in one document. +The below is an example. +\begin{LTXexample} +ここは横組% yoko +\hbox{\tate % tate + \hbox{縦組}% tate + の中に + \hbox{\yoko 横組の内容}% yoko + を挿入する +} +また横組に戻る% yoko +\end{LTXexample} + +\autoref{tab-diffdir} shows how a box is arranged when +the direction inside the box and that outside the box differ. +%</en> +%<*ja> +\subsection{異方向のボックス} + +縦組の中に「42」などの2桁以上の算用数字を横組で組むなど, +異なる組方向を混在させることがしばしば行われる. +組方向の混在も\pTeX と同じようにできる: +\begin{LTXexample} +ここは横組% yoko +\hbox{\tate % tate + \hbox{縦組}% tate + の中に + \hbox{\yoko 横組の内容}% yoko + を挿入する +} +また横組に戻る% yoko +\end{LTXexample} + +異なる組方向のボックスを配置した場合にどう組まれるかの仕様も,\pTeX を +踏襲している.\autoref{tab-diffdir}に示す. +%</ja> + +\begin{table}[t] +%<ja>\caption{異方向のボックスの配置} +%<en>\caption{Boxes in different direction} +%<en>\medskip +\label{tab-diffdir} + \centering\small\unitlength3mm + \def\TATEeg{% + \hbox{\smash{\begin{picture}(0,0)(-2,0) + \thicklines + \polyline(-2,0)(-2,-7)(5,-7)(5,0) + \put(0,0){\circle*{0.3}} + \put(2.5,-4){\makebox(0,0){\hbox{\tate\bfseries \emph{tate}/\emph{utod}}}} + \put(0,0){\vector(1,0){5}} \put(2.5,-0.2){\makebox(0,0)[t]{$h_{\mathrm{T}}$}} + \put(0,0){\vector(-1,0){2}}\put(-1,-0.2){\makebox(0,0)[t]{$d_{\mathrm{T}}$}} + \put(0,0){\vector(0,-1){7}}\put(0.2,-3.5){\makebox(0,0)[l]{$w_{\mathrm{T}}$}} + \end{picture}}}% + } + \def\DTOUeg{% + \hbox{\smash{\begin{picture}(0,0)(-5,0) + \thicklines + \polyline(-5,0)(-5,7)(2,7)(2,0) + \put(0,0){\circle*{0.3}} + \put(-2.5,4){\makebox(0,0){\hbox{\dtou\bfseries \emph{dtou}}}} + \put(0,0){\vector(-1,0){5}} \put(-2.5,0.3){\makebox(0,0)[b]{$h_{\mathrm{D}}$}} + \put(0,0){\vector(1,0){2}}\put(1,0.3){\makebox(0,0)[b]{$d_{\mathrm{D}}$}} + \put(0,0){\vector(0,1){7}}\put(-0.2,3.5){\makebox(0,0)[r]{$w_{\mathrm{D}}$}} + \end{picture}}}% + } + \def\YOKOeg{% + \hbox{\smash{\begin{picture}(0,0) + \thicklines + \polyline(0,5)(7,5)(7,-2)(0,-2) + \put(4,2.5){\makebox(0,0){\hbox{\yoko\bfseries \emph{yoko}}}} + \put(0,0){\circle*{0.3}} + \put(0,0){\vector(0,1){5}} \put(0.3,2.5){\makebox(0,0)[l]{$h_{\mathrm{Y}}$}} + \put(0,0){\vector(0,-1){2}}\put(0.3,-1){\makebox(0,0)[l]{$d_{\mathrm{Y}}$}} + \put(0,0){\vector(1,0){7}}\put(3.5,0.2){\makebox(0,0)[b]{$w_{\mathrm{Y}}$}} + \end{picture}}}% + } +\begin{tabular}{ccc} +\toprule +%<ja>\emph{横組中に配置}&\emph{縦組中に配置}&% +%<ja>\emph{組方向 \cs{dtou} 中に配置}\\ +%<en>\textbf{typeset in \emph{yoko} direction} +%<en>&\textbf{typeset in \emph{tate} or \emph{utod} direction} +%<en>&\textbf{typeset in \emph{dtou} direction}\\ +\midrule + \parbox[c]{15\unitlength}{\begin{picture}(15,15)(0,-4) + \put(0,0){\line(1,0){3.8}} + \put(4,7){\TATEeg} + \put(11.2,0){\line(1,0){3.8}} +% + \put(2,7){\line(1,0){1.8}} + \put(3,3.5){\vector(0,1){3.5}\vector(0,-1){3.5}} + \put(2.8,3.5){\makebox(0,0)[r]{$H_{\mathrm{Y}}$}} + \put(3,-2){\vector(0,1){2}} + \put(2.8,-1){\makebox(0,0)[r]{$D_{\mathrm{Y}}$}} +% + \put(4,7.2){\line(0,1){1.8}} + \put(11,7.2){\line(0,1){1.8}} + \put(6,8){\vector(-1,0){2}} + \put(9,8){\vector(1,0){2}} + \put(7.5,8){\makebox(0,0){$W_{\mathrm{Y}}$}} +% + \end{picture}\vspace{-\baselineskip} + \begin{align*} + W_{\mathrm{Y}} &= h_{\mathrm{T}}+d_{\mathrm{T}},\\ + H_{\mathrm{Y}} &= w_{\mathrm{T}},\\ + D_{\mathrm{Y}} &=0\,\mathrm{pt} + \end{align*}% + }& + \parbox[c]{15\unitlength}{\begin{picture}(15,15)(0,-4) + \put(7.5,-0.2){\line(0,-1){2.8}} + \put(4,2){\YOKOeg} + \put(7.5, 7.2){\line(0,1){3.8}} +% + \put(2,7){\line(1,0){1.8}} + \put(2,0){\line(1,0){1.8}} + \put(3,5){\vector(0,1){2}} + \put(3,2){\vector(0,-1){2}} + \put(3,3.5){\makebox(0,0){$W_{\mathrm{T}}$}} +% + \put(4,7.2){\line(0,1){1.8}} + \put(11,7.2){\line(0,1){1.8}} + \put(8,8){\vector(-1,0){0.5}\vector(1,0){3}} + \put(7,8){\vector(-1,0){3}\vector(1,0){0.5}} + \put(9.25,8.2){\makebox(0,0)[b]{$H_{\mathrm{T}}$}} + \put(5.75,8.2){\makebox(0,0)[b]{$D_{\mathrm{T}}$}} +% + \end{picture}\vspace{-\baselineskip} + \begin{align*} + W_{\mathrm{T}} &= h_{\mathrm{Y}}+d_{\mathrm{Y}},\\ + H_{\mathrm{T}} &= w_{\mathrm{Y}}/2,\\ + D_{\mathrm{T}} &= w_{\mathrm{Y}}/2 + \end{align*}% + }& + \parbox[c]{15\unitlength}{\begin{picture}(15,15)(0,-4) + \put(11,-0.2){\line(0,-1){2.8}} + \put(4,2){\YOKOeg} + \put(11, 7.2){\line(0,1){3.8}} +% + \put(2,7){\line(1,0){1.8}} + \put(2,0){\line(1,0){1.8}} + \put(3,5){\vector(0,1){2}} + \put(3,2){\vector(0,-1){2}} + \put(3,3.5){\makebox(0,0){$W_{\mathrm{D}}$}} +% + \put(4,7.2){\line(0,1){1.8}} + \put(11,7.2){\line(0,1){1.8}} + \put(7.5,8){\vector(-1,0){3.5}\vector(1,0){3.5}} + \put(13,8){\vector(-1,0){2}} + \put(7.5,8.2){\makebox(0,0)[b]{$H_{\mathrm{D}}$}} + \put(12,8.2){\makebox(0,0)[b]{$D_{\mathrm{D}}$}} +% + \end{picture}\vspace{-\baselineskip} + \begin{align*} + W_{\mathrm{D}} &= h_{\mathrm{Y}}+d_{\mathrm{Y}},\\ + H_{\mathrm{D}} &= w_{\mathrm{Y}},\\ + D_{\mathrm{D}} &= 0\,\mathrm{pt} + \end{align*}% + }% +\\\midrule + \parbox[c]{15\unitlength}{\begin{picture}(15,15)(0,-4) + \put(0,0){\line(1,0){3.8}} + \put(4,0){\DTOUeg} + \put(11.2,0){\line(1,0){3.8}} +% + \put(2,7){\line(1,0){1.8}} + \put(3,3.5){\vector(0,1){3.5}\vector(0,-1){3.5}} + \put(2.8,3.5){\makebox(0,0)[r]{$H_{\mathrm{Y}}$}} + \put(3,-2){\vector(0,1){2}} + \put(2.8,-1){\makebox(0,0)[r]{$D_{\mathrm{Y}}$}} +% + \put(4,7.2){\line(0,1){1.8}} + \put(11,7.2){\line(0,1){1.8}} + \put(6,8){\vector(-1,0){2}} + \put(9,8){\vector(1,0){2}} + \put(7.5,8){\makebox(0,0){$W_{\mathrm{Y}}$}} +% + \end{picture}\vspace{-\baselineskip} + \begin{align*} + W_{\mathrm{Y}} &= h_{\mathrm{D}}+d_{\mathrm{D}},\\ + H_{\mathrm{Y}} &= w_{\mathrm{D}},\\ + D_{\mathrm{Y}} &= 0\,\mathrm{pt} + \end{align*}% + }& + \parbox[c]{15\unitlength}{\begin{picture}(15,15)(0,-4) + \put(9,-0.2){\line(0,-1){2.8}} + \put(4,0){\DTOUeg} + \put(9, 7.2){\line(0,1){3.8}} +% + \put(2,7){\line(1,0){1.8}} + \put(2,0){\line(1,0){1.8}} + \put(3,5){\vector(0,1){2}} + \put(3,2){\vector(0,-1){2}} + \put(3,3.5){\makebox(0,0){$W_{\mathrm{T}}$}} +% + \put(4,7.2){\line(0,1){1.8}} + \put(11,7.2){\line(0,1){1.8}} + \put(6.5,8){\vector(-1,0){2.5}\vector(1,0){2.5}} + \put(10,8){\vector(-1,0){1}\vector(1,0){1}} + \put(10,8.2){\makebox(0,0)[b]{$H_{\mathrm{T}}$}} + \put(6.5,8.2){\makebox(0,0)[b]{$D_{\mathrm{T}}$}} +% + \end{picture}\vspace{-\baselineskip} + \begin{align*} + W_{\mathrm{T}} &= h_{\mathrm{D}}+d_{\mathrm{D}},\\ + H_{\mathrm{T}} &= d_{\mathrm{D}},\\ + D_{\mathrm{T}} &= h_{\mathrm{D}} + \end{align*}% + }& + \parbox[c]{15\unitlength}{\begin{picture}(15,15)(0,-4) + \put(6,-0.2){\line(0,-1){2.8}} + \put(4,7){\TATEeg} + \put(6, 7.2){\line(0,1){3.8}} +% + \put(2,7){\line(1,0){1.8}} + \put(2,0){\line(1,0){1.8}} + \put(3,5){\vector(0,1){2}} + \put(3,2){\vector(0,-1){2}} + \put(3,3.5){\makebox(0,0){$W_{\mathrm{D}}$}} +% + \put(4,7.2){\line(0,1){1.8}} + \put(11,7.2){\line(0,1){1.8}} + \put(5,8){\vector(-1,0){1}\vector(1,0){1}} + \put(8.5,8){\vector(-1,0){2.5}\vector(1,0){2.5}} + \put(5,8.2){\makebox(0,0)[b]{$H_{\mathrm{D}}$}} + \put(8.5,8.2){\makebox(0,0)[b]{$D_{\mathrm{D}}$}} +% + \end{picture}\vspace{-\baselineskip} + \begin{align*} + W_{\mathrm{D}} &= w_{\mathrm{T}},\\ + H_{\mathrm{D}} &= d_{\mathrm{T}},\\ + D_{\mathrm{D}} &= h_{\mathrm{T}} + \end{align*}% + }\\ +\bottomrule +\end{tabular} +\end{table} + + + +%<*en> +\paragraph{\cs{wd} and direction} +In \pTeX, \cs{wd},~\cs{ht},~\cs{dp} means the dimensions of a box register +\emph{with respact to the current direction}. +This means that the value of \cs{wd0} etc.\ might differ when the current direction is +different, even if \cs{box0} stores the same box. +However, this no longer applies in \LuaTeX-ja. + +\begin{LTXexample} +% yoko direction +\setbox0=\hbox to 20pt{foo} +\the\wd0,~\hbox{\tate\vrule\the\wd0} +\wd0=100pt +\the\wd0,~\hbox{\tate \the\wd0} +\end{LTXexample} + +To access box dimensions \emph{with respect to current direction}, +one have to use the following commands instead of \cs{wd} wtc. +\begin{cslist} + + \item[\cs{ltjgetwd}<num>\textrm{, }\cs{ltjgetht}<num>\textrm{, }% + \cs{ltjgetdp}<num>] +These commands return \emph{an internal dimension} of \cs{box<num>} with respect to +the current direction. One can use these in \cs{dimexpr} primitive, as the followings. +\begin{lstlisting} +\dimexpr 2\ltjgetwd42-3pt\relax, \the\ltjgetwd1701 +\end{lstlisting} +The following is an example. +\begin{LTXexample}[width=0.3\textwidth] +\parindent0pt +\setbox32767=\hbox{\yoko よこぐみ} +\fboxsep=0mm\fbox{\copy32767} +\vbox{\hsize=20mm +\yoko YOKO \the\ltjgetwd32767, \\ + \the\ltjgetht32767, \\ \the\ltjgetdp32767.} +\vbox{\hsize=20mm\raggedleft +\tate TATE \the\ltjgetwd32767, \\ + \the\ltjgetht32767, \\ \the\ltjgetdp32767.} +\vbox{\hsize=20mm\raggedleft +\dtou DTOU \the\ltjgetwd32767, \\ + \the\ltjgetht32767, \\ \the\ltjgetdp32767.} +\end{LTXexample} + + \item[\cs{ltjsetwd}<num>=<dimen>\textrm{, }\cs{ltjsetht}<num>=<dimen>\textrm{, }% + \cs{ltjsetdp}<num>=<dimen>] +These commands set the dimension of \cs{box<num>}. One does not need + to group the argument <num>; four calls of \cs{ltjsetwd} below have the same meaning. +\begin{lstlisting} +\ltjsetwd42 20pt, \ltjsetwd42=20pt, \ltjsetwd=42 20pt, \ltjsetwd=42=20pt +\end{lstlisting} + +\end{cslist} +%</en> +%<*ja> +\paragraph{\cs{wd} 達と組方向} +ボックスレジスタ \cs{box}<num> にセットされているボックスの幅・高さ・深さの取得や +変更にはそれぞれ \cs{wd},~\cs{ht},~\cs{dp} プリミティブを用いるのであった. +\pTeX ではこれらのプリミティブは,「現在の組方向におけるボックスの寸法」を指すもので, +同じボックスに対しても現在の組方向によって返る値は異なるもであった. + +\LuaTeX-jaにおいては状況が異なり,\cs{wd},~\cs{ht},~\cs{dp} が返す値は +現在の組方向には依存しない.下の例のように,横組のボックスが格納されていれば +\cs{wd}等は常に「横組におけるボックスの寸法」を意味する. + +\begin{LTXexample} +% yoko direction +\setbox0=\hbox to 20pt{foo} +\the\wd0,~\hbox{\tate\vrule\the\wd0} +\wd0=100pt +\the\wd0,~\hbox{\tate \the\wd0} +\end{LTXexample} + +\pTeX のように現在の組方向に応じたボックスの寸法の取得・設定を行うには, +代わりに次の命令を使用する. + +\begin{cslist} + + \item[\cs{ltjgetwd}<num>\textrm{, }\cs{ltjgetht}<num>\textrm{, }% + \cs{ltjgetdp}<num>] +現在の組方向に応じたボックスの寸法の取得を行う.結果は内部長さであるため, +\begin{lstlisting} +\dimexpr 2\ltjgetwd42-3pt\relax, \the\ltjgetwd1701 +\end{lstlisting} +のように \cs{wd}<num> の代わりとして扱うことができる. +使用例は以下の通りである. +\begin{LTXexample}[width=0.3\textwidth] +\parindent0pt +\setbox32767=\hbox{\yoko よこぐみ} +\fboxsep=0mm\fbox{\copy32767} +\vbox{\hsize=20mm +\yoko YOKO \the\ltjgetwd32767, \\ + \the\ltjgetht32767, \\ \the\ltjgetdp32767.} +\vbox{\hsize=20mm\raggedleft +\tate TATE \the\ltjgetwd32767, \\ + \the\ltjgetht32767, \\ \the\ltjgetdp32767.} +\vbox{\hsize=20mm\raggedleft +\dtou DTOU \the\ltjgetwd32767, \\ + \the\ltjgetht32767, \\ \the\ltjgetdp32767.} +\end{LTXexample} + + \item[\cs{ltjsetwd}<num>=<dimen>\textrm{, }\cs{ltjsetht}<num>=<dimen>\textrm{, }% + \cs{ltjsetdp}<num>=<dimen>] +現在の組方向に応じたボックスの寸法の設定を行う.\cs{afterassignment} を2回利用して +実装しているので,次の4通りは全て同じ意味である. +\begin{lstlisting} +\ltjsetwd42 20pt, \ltjsetwd42=20pt, \ltjsetwd=42 20pt, \ltjsetwd=42=20pt +\end{lstlisting} + +設定値は「横組」「縦組及びutod方向」「dtou方向」 +の3種ごとに独立して記録される.参考として,Gitリポジトリ内の + \verb+test/test55-boxdim_diffdir.{tex,pdf}+ を挙げておく. + +\end{cslist} +%</ja> + +%<*en> +\subsection{Getting current direction} +The \Param{direction} parameter returns the current direction, and +the \Param{boxdir} parameter (with the argument <num>) +returns the direction of a box register \cs{box}<num>. +The returned value of these parameters are a \emph{string}: +\begin{center} +\small +\begin{tabular}{>{\bfseries}lccccc} +\toprule +Direction&\emph{yoko}&\emph{tate}&\emph{dtou}&\emph{utod}&(empty)\\ +\midrule +Returned value&\texttt{4}&\texttt{3}&\texttt{1}&\texttt{11}&\texttt{0}\\ +\bottomrule +\end{tabular} +\end{center} +\begin{LTXexample}[width=0.3\textwidth] +\leavevmode\def\DIR{\ltjgetparameter{direction}} +\hbox{\yoko \DIR}, \hbox{\tate\DIR}, +\hbox{\dtou\DIR}, \hbox{\utod\DIR}, +\hbox{\tate$\hbox{tate math: \DIR}$} + +\setbox2=\hbox{\tate}\ltjgetparameter{boxdir}{2} +\end{LTXexample} +%</en> +%<*ja> +\subsection{組方向の取得} +「現在の組方向」や「<num>番のボックスの組方向」は, +\pTeX では \cs{ifydir} や \cs{ifybox}<num> といった条件判断文を使って +判断することができた. +しかし,\LuaTeX-jaはあくまでも\TeX マクロとLuaコードで +記述されており,それでは新たな条件判断命令を作るのは難しい. + +\LuaTeX-jaでは,\Param{direction}パラメータで現在の組方向を, +\Param{boxdir}パラメータ(と追加の引数<num>)によって +\cs{box}<num>の組方向をそれぞれ取得できるようにした. +戻り値は文字列である: +\begin{center} +\small +\begin{tabular}{>{\bfseries}lccccc} +\toprule +組方向&\emph{横組}&\emph{tate縦組}&\emph{dtou方向}&\emph{utod方向}&(未割り当て)\\ +\midrule +戻り値&\texttt{4}&\texttt{3}&\texttt{1}&\texttt{11}&\texttt{0}\\ +\bottomrule +\end{tabular} +\end{center} + +\begin{LTXexample}[width=0.3\textwidth] +\leavevmode\def\DIR{\ltjgetparameter{direction}} +\hbox{\yoko\DIR}, \hbox{\tate\DIR}, +\hbox{\dtou\DIR}, \hbox{\utod\DIR}, +\hbox{\tate$\hbox{tate math: \DIR}$} + +\setbox2=\hbox{\tate}\ltjgetparameter{boxdir}{2} +\end{LTXexample} + +これらを用いれば,例えば +\pTeX の \cs{ifydir},~\cs{ifybox200} と同等の条件判断を +\begin{lstlisting} +\ifnum\ltjgetparameter{direction}=4 +\ifnum\ltjgetparameter{boxdir}{200}=4 +\end{lstlisting} +のように行うことができる. +\cs{iftdir} は少々面倒であるが,8で割った余りが3であるか否かを判断すれば良いから +\begin{lstlisting} +\ifnum\numexpr + \ltjgetparameter{direction}-(\ltjgetparameter{direction}/8)*8=3 +\end{lstlisting} +とすればよい. +%</ja> + +%<*en> +\subsection{Overridden box primitives} +To cope with multiple directions, the following primitives are +overridden by \LuaTeX-ja, using~\verb+\protected\def+. +\begin{cslist}[style=standard] + \item[\cs{unhbox}<num>\textrm{, }\cs{unvbox}<num>\textrm{, }\cs{unhcopy}<num>\textrm{, }\cs{unvcopy}<num>] + \item[\cs{vadjust}\{<material>\}] + \item[\cs{insert}<number>\{<material>\}] + \item[\cs{lastbox}] + \item[\cs{raise}<dimen><box>\textrm{, }\cs{lower}<dimen><box>\textrm{\ etc., }\cs{vcenter}] + \item[\cs{vcenter}] +\end{cslist} +%</en> +%<*ja> +\subsection{プリミティブの再定義} +異なる組方向に対応するために,以下に挙げるプリミティブは +\LuaTeX-jaによる前処理もしくは後処理が行われるように +\ \verb+\protected\def+ により再定義してある. + +\begin{cslist} + \item[\cs{unhbox}<num>\textrm{, }\cs{unvbox}<num>\textrm{, }\cs{unhcopy}<num>\textrm{, }\cs{unvcopy}<num>] + ボックスの組方向が現在のリストと異なる場合は事前にエラーメッセージを出力する. + \pTeX と異なり,エラーを無視して無理矢理 \cs{unhbox}, \cs{unvbox} を + 続行させることもできるが,その場合の組版結果は保証しない. + \item[\cs{vadjust}\{<material>\}] 一旦プリミティブ本来の挙動を行う.その後,<material>の組方向が + 周囲の垂直リストの組方向と一致しない場合にエラーを出力し, + 該当の \cs{vadjust} を無効にする. + \item[\cs{insert}<number>\{<material>\}] + 一旦プリミティブ本来の挙動を行い,その後<material>内の各ボックス・罫線の直前に組方向を示 + すdirection whatsitを挿入する. + \item[\cs{lastbox}] ボックスの「中身」を現在の組方向に合わせるためのノード + (\textit{dir\_box}という)を必要ならば除去し, + 正しく「中身」のボックスが返されるように前処理をする. + \item[\cs{raise}<dimen><box>\textrm{, }\cs{lower}<dimen><box>\textrm{\ etc., }\cs{vcenter}] + 一方,こちらでは必要に応じて\textit{dir\_box}を作成する前処理を追加している. +\end{cslist} +%</ja> + +%<en>\section{Font Metric and Japanese Font} +%<ja>\section{フォントメトリックと和文フォント} +%<en>\subsection{\cs{jfont}} +%<ja>\subsection{\cs{jfont} 命令} +\label{ssec:jfont} + +%<*en> +To load a font as a Japanese font (for horizontal direction), you must use the +\cs{jfont} instead of~\cs{font}, while +\cs{jfont} admits the same syntax used in~\cs{font}. +\LuaTeX-ja automatically loads \Pkg{luaotfload} package, +so TrueType/OpenType fonts with features can be used for Japanese fonts: +%</en> +%<*ja> +フォントを(横組用)和文フォントとして読み込むためには,\cs{jfont} を +\ \cs{font} プリミティブの代わりに用いる. +\cs{jfont} の文法は \cs{font} と同じである. +\LuaTeX-jaは\Pkg{luaotfload}パッケージを自動的に読み込むので, +TrueType/OpenTypeフォントにfeatureを指定したものを和文フォントとして用いる +ことができる: +%</ja> +\begin{LTXexample}[width=0.3\textwidth] +\jfont\tradgt={file:KozMinPr6N-Regular.otf:script=latn;% + +trad;-kern;jfm=ujis} at 14pt +\tradgt 当/体/医/区 +\end{LTXexample} + +%<*en> +Note that the defined control sequence +(\cs{tradgt} in the example above) using \cs{jfont} is not a +\textit{font\_def} token, but a macro. +Hence the input like \verb+\fontname\tradgt+ +causes a error. We denote control sequences which are defined in +\cs{jfont} by <jfont\_cs>. +%</en> +%<*ja> +なお,\cs{jfont} で定義された制御綴(上の例だと \cs{tradgt}) +は\textit{font\_def}トークンではなくマクロである.従って,\verb+\fontname\tradgt+ のような +入力はエラーとなる.以下では \cs{jfont} で定義された +制御綴を<jfont\_cs>で表す. +%</ja> + +\paragraph{JFM} +%<*en> +a JFM has measurements of characters and +glues/kerns that are automatically inserted for Japanese +typesetting. The structure of JFM will be described in the next +subsection. At the calling of \cs{jfont}, you must specify +which JFM will be used for this font by the following keys: +%</en> +%<*ja> +JFMは文字と和文組版で自動的に挿入される +グルー/カーンの寸法情報を持っている.JFMの構造は次の節で述べる. +\cs{jfont} 命令の呼び出しの際には,どのJFMを用いるのかを以下のキーで +指定する必要がある: +%</ja> + + +\begin{table}[t] +%<en>\caption{Differences between horizontal JFMs shipped with \LuaTeX-ja} +%<ja>\caption{\LuaTeX-ja に同梱されている横組用JFMの違い} +%<en>\medskip +\label{tab-difjfm} +\ltjsetparameter{jacharrange={+3}} +\centering\small +\def\r#1#2{% + \hbox{\Large\vrule + \parbox[b]{7\zw}{% + \addjfontfeatures{YokoFeatures={Opacity=0.5, Color=#2, JFM=#1}}\noindent + ◆◆◆◆◆◆◆ + ある日モモちゃんがお使いで迷子になって泣きました. + }\vrule}} +\def\s#1#2{% + \Large + \parbox[b]{7\zw}{% + \addjfontfeatures{YokoFeatures={Opacity=0.5, Color=#2, JFM=#1}}\noindent + ちょっと!何 + }} +\def\t#1#2#3{\hbox to 0pt{\hss% + \setbox0=\hbox{\addjfontfeatures{YokoFeatures={JFM=#1}}\huge #3}% + \textcolor{#2}{\transparent{0.5}\vrule width 0.4pt height\ht0 depth\dp0}\kern-.2pt\copy0 + \textcolor{#2}{\transparent{0.5}\kern-\wd0\vrule width\wd0height .2pt depth .2pt + \kern-\wd0\raise\ht0\hbox{\vrule width\wd0height .2pt depth .2pt}% + \kern-\wd0\lower\dp0\hbox{\vrule width\wd0height .2pt depth .2pt}% + \kern-.2pt\vrule width 0.4pt height\ht0 depth \dp0}\hss}} +{\Large\tabcolsep0pt +\begin{tabular}{m{8\zw}m{8\zw}m{8\zw}} +\leavevmode\hbox to 0pt{\r{ujis}{blue}\hss}\r{jis}{black}& +\leavevmode\hbox to 0pt{\r{jis}{black}\hss}\r{min}{red}& +\leavevmode\hbox to 0pt{\r{ujis}{blue}\hss}\r{min}{red}\\ +\leavevmode\hbox to 0pt{\s{ujis}{blue}\hss}\s{jis}{black}& +\leavevmode\hbox to 0pt{\s{jis}{black}\hss}\s{min}{red}& +\leavevmode\hbox to 0pt{\s{ujis}{blue}\hss}\s{min}{red}\\ +\leavevmode\qquad\t{ujis}{blue}{漢}\t{jis}{black}{漢}\qquad + \t{ujis}{blue}{っ}\t{jis}{black}{っ}& +\leavevmode\qquad\t{jis}{black}{漢}\t{min}{red}{漢}\qquad + \t{jis}{black}{っ}\t{min}{red}{っ}& +\leavevmode\qquad\t{ujis}{blue}{漢}\t{min}{red}{漢}\qquad + \t{ujis}{blue}{っ}\t{min}{red}{っ}\\ +\end{tabular}\par} + +(\textcolor{blue}{Blue: \texttt{jfm-ujis.lua}}, +\textcolor{black}{Black: \texttt{jfm-jis.lua}}, +\textcolor{red}{Red: \texttt{jfm-min.lua}}) +\ltjsetparameter{jacharrange={-3}} +\end{table} + +\begin{cslist} +\item[jfm=<name>] +%<*en> +Specify the name of (horizontal) JFM. +If specified JFM has not been loaded, \LuaTeX-ja search and load +a file named \texttt{jfm-<name>.lua}. + +The following horizontal JFMs are shipped with \LuaTeX-ja: +%</en> +%<*ja> +用いる(横組用)JFMの名前を指定する.もし以前に指定されたJFMが読み込まれていなければ, +\texttt{jfm-<name>.lua}を読み込む.以下の横組用JFMが\LuaTeX-jaには同梱されている: +%</ja> +\begin{description} +%<*en> +\item[\tt jfm-ujis.lua] A standard horizontal JFM in \LuaTeX-ja. This JFM is + based on \verb+upnmlminr-h.tfm+, a metric for UTF/OTF package that + is used in \upTeX. When you use the \Pkg{luatexja-otf} package, you should use this JFM. +%</en> +%<*ja> +\item[\tt jfm-ujis.lua] \LuaTeX-jaの標準JFMである.このJFMは\upTeX で + 用いられるUTF/OTFパッケージ用の和文用TFMである \verb+upnmlminr-h.tfm+ を + 元にしている.\Pkg{luatexja-otf}パッケージを使うときはこのJFMを指定するべきである. +%</ja> +%<*en> +\item[\tt jfm-jis.lua] A counterpart for \verb+jis.tfm+, ``JIS font + metric'' which is widely used in \pTeX. A major difference between + \texttt{jfm-ujis.lua} and this \texttt{jfm-jis.lua} is that + most characters under \texttt{jfm-ujis.lua} are square-shaped, + while that under \texttt{jfm-jis.lua} are horizontal + rectangles. +%</en> +%<*ja> +\item[\tt jfm-jis.lua] \pTeX で広く用いられている「JISフォントメトリック」 + \verb+jis.tfm+ に相当するJFMである.\texttt{jfm-ujis.lua} とこの + \texttt{jfm-jis.lua} の主な違いは,\texttt{jfm-ujis.lua} ではほとんどの文字が + 正方形状であるのに対し,\texttt{jfm-jis.lua} では横長の長方形状であることと, + \texttt{jfm-ujis.lua} では「?」「!」の直後に半角空白が挿入されることである. +%</ja> +%<*en> +\item[\tt jfm-min.lua] A counterpart for \verb+min10.tfm+, which is one + of the default Japanese font metric shipped with \pTeX. +%</en> +%<*ja> +\item[\tt jfm-min.lua] \pTeX に同梱されているデフォルトの和文用TFM +(\verb+min10.tfm+)に相当し,行末で文字が揃うようにするために「っ」など一部の文字幅が変わっ + ている.\verb+min10.tfm+ については\cite{min10}が詳しい. +%</ja> +\end{description} +%<*en> +The difference among these three~JFMs is shown in \autoref{tab-difjfm}. +%</en> +%<*ja> +これら3つのJFMの違いは\autoref{tab-difjfm}に示した.表中の文例の一部には, +\cite{min10}の図3,~4のものを用いた. +%</ja> + +\begin{figure} +\begin{LTXexample}[width=0.3\textwidth] +\ltjsetparameter{differentjfm=both} +\jfont\F=file:KozMinPr6N-Regular.otf:jfm=ujis +\jfont\G=file:KozGoPr6N-Medium.otf:jfm=ujis +\jfont\H=file:KozGoPr6N-Medium.otf:jfm=ujis;jfmvar=hoge +\F ){\G 【】}( % halfwidth space + ){\H 『』}( % fullwidth space + +ほげ,{\G 「ほげ」}(ほげ)\par +ほげ,{\H 「ほげ」}(ほげ)% pTeX-like + +\ltjsetparameter{differentjfm=paverage} +\end{LTXexample} +\caption{Example of \texttt{jfmvar} key} +\label{fig:jfmvar} +\end{figure} + +%<*en> +\item[jfmvar=<string>] +Sometimes there is a need that \ldots. +%</en> +%<*ja> +\item[jfmvar=<string>] +標準では,JFMとサイズが同じで, + 実フォントだけが異なる2つの和文フォントは「区別されない」.例えば +\autoref{fig:jfmvar}において,最初の「)」と「【」の実フォントは異なるが, +JFMもサイズも同じなので,普通に「)【」と入力した時と同じように半角空きとなる. + +しかし,JFMとサイズが同じであっても,\texttt{jfmvar} キーの異なる +2つの和文フォント,例えば\autoref{fig:jfmvar}で言う \cs{F} と \cs{H}, +は「区別される」.異なる和文フォントに異なる \texttt{jfmvar} キーを割り当て, +かつ\Param{differentjfm}パラメータを \texttt{both} に設定すれば, +\pTeX と似た状況で組版されることになる. +%</ja> +\end{cslist} + +\begin{figure} +\begin{LTXexample}[pos=t] +\newcommand\test{\vrule ダイナミックダイクマ\vrule\\} +\jfont\KMFW = KozMinPr6N-Regular:jfm=prop;-kern at 17pt +\jfont\KMFK = KozMinPr6N-Regular:jfm=prop at 17pt % kern is activated +\jfont\KMPW = KozMinPr6N-Regular:jfm=prop;script=dflt;+pwid;-kern at 17pt +\jfont\KMPK = KozMinPr6N-Regular:jfm=prop;script=dflt;+pwid;+kern at 17pt +\begin{multicols}{2} +\ltjsetparameter{kanjiskip=0pt} +{\KMFW\test \KMFK\test \KMPW\test \KMPK\test} + +\ltjsetparameter{kanjiskip=3pt} +{\KMFW\test \KMFK\test \KMPW\test \KMPK\test} +\end{multicols} +\end{LTXexample} +\caption{Kerning information and \Param{kanjiskip}} +\label{fig:kern-jfm} +\end{figure} + +%<en>\paragraph{Using kerning information in a font} +%<ja>\paragraph{ペアカーニング情報の使用} +\label{para-kern} +%<*en> +Some fonts have information for inter-glyph spacing. +\LuaTeX-ja 20140324.0 or later treats kerning spaces like an italic correction; +any glue and/or kern from the JFM and a kerning space can coexist. +See \autoref{fig:kern-jfm} for detail. + +Note that in \cs{setmainjfont} etc.\ which are provided by \Pkg{luatexja-fontspec} +package, kerning option is set \emph{off} (\texttt{Kerning=Off}) by default, +because of the compatibility with previous versions of \LuaTeX-ja. +%</en> +%<*ja> +いくつかのフォントはグリフ間のスペースについての情報を持っている. +このカーニング情報は以前の\LuaTeX-ja とはあまり相性が良くなかったが, +バージョン20140324.0以降ではカーニングによる空白はイタリック補正と同様に扱うことになっている. +つまり,カーニング由来の空白とJFM由来のグルー・カーンは同時に入りうる. +\autoref{fig:kern-jfm}を参照. +\begin{itemize} + \item \emph{\cs{jfont} や, +NFSS2用の命令(\ref{ssec:chgfnt}節,\ref{ssec:nfsspat}節)における指定では +カーニング情報は標準で使用する}ことになっているようである. +言い換えれば,カーニング情報を使用しない設定にするには,面倒でも +\begin{lstlisting} +\jfont\hoge=KozMinPr6N-Regular:jfm=ujis;-kern at 3.5mm +\DeclareFontShape{JY3}{fuga}{m}{n} {<-> s*KozMinPr6N-Regular:jfm=ujis;-kern}{} +\end{lstlisting} +のように,\texttt{-kern} という指定を自分で追加しなければいけない. + \item +一方,\emph{\Pkg{luatexja-fontspec} の提供する \cs{setmainjfont}\ +などの命令の標準設定ではカーニング情報は使用しない}(\texttt{Kerning=Off}) +ことになっている.これは以前のバージョンの\LuaTeX-jaとの互換性のためである. +\end{itemize} +%</ja> + +%<*ja> +\paragraph{\texttt{extend}と\texttt{slant}} +OpenType機能と見かけ上同じような形式で指定できるものに, +\begin{description} +\item[\texttt{extend=}<extend>] 横方向に<extend>倍拡大する. +\item[\texttt{slant=}<slant>] <slant>に指定された割合だけ傾ける. +\end{description} +の2つがある. +\texttt{extend}や\texttt{slant}を指定した場合は,それに応じたJFMを指定すべきである% +\footnote{\LuaTeX-jaでは,これらに対するJFMを特に提供することはしない予定である.}. +例えば,次の例では無理やり通常のJFMを使っているために,文字間隔やイタリック補正量が +正しくない: +%</ja> +%<*en> +\paragraph{\texttt{extend} and \texttt{slant}} +The following setting can be specified as OpenType font features: +\begin{cslist}[style=standard] +\item[\texttt{extend=}<extend>] expand the font horizontally by <extend>. +\item[\texttt{slant=}<slant>] slant the font. +\end{cslist} +Note that \LuaTeX-ja doesn't adjust JFMs by these \texttt{extend} and \texttt{slant} +settings; you have to write new JFMs on purpose. +For example, the following example uses the standard JFM \texttt{jfm-ujis.lua}, hence +letter-spacing and the width of italic correction are not correct: +%</en> +\begin{LTXexample}[width=0.3\textwidth] +\jfont\E=KozMinPr6N-Regular:extend=1.5;jfm=ujis;-kern +\E あいうえお + +\jfont\S=KozMinPr6N-Regular:slant=1;jfm=ujis;-kern +\S あいう\/ABC +\end{LTXexample} + +%<*ja> +\paragraph{\texttt{ltjksp} 指定} +\label{pg:ltjksp} +\LuaTeX-ja標準では, +JFM中における \texttt{kanjiskip\_natural}, \texttt{kanjiskip\_stretch},\ +\texttt{kanjiskip\_shrink}キー(\pageref{pg:ksp_nat}ページ)の使用によって, +「JFM由来のグルーの他に,\Param{kanjiskip}の自然長/伸び量/縮み量の一部が +同じ場所に挿入される」という状況が起こりうる. +この機能を無効化し,バージョン20150922.0以前と同じような組版を得るためには +他のOpenType機能と同じように\ \texttt{-ltjksp}\ 指定を行えば良い. +\begin{LTXexample}[width=16\zw] +\leavevmode +\ltjsetparameter{kanjiskip=0pt plus 3\zw} +\vrule\hbox to 15\zw{あ「い」う,えお}\vrule + +\jfont\G=file:KozMinPr6N-Regular.otf% + :jfm=ujis;-ltjksp at 9.2487pt +\G\leavevmode% +\vrule\hbox to 15\zw{あ「い」う,えお}\vrule +\end{LTXexample} +なお, +\begin{lstlisting} + \jfont\G=file:KozMinPr6N-Regular.otf:jfm=ujis;-ltjksp;+ltjksp at 9.2487pt +\end{lstlisting} +のように \texttt{+ltjksp} 指定を行った場合は,\texttt{kanjiskip\_natural} など +3キーは再び有効化される.\texttt{-ltjksp}, \texttt{+ltjksp} を複数回指定した場合は, +最後に指定したものが有効となる. +%</ja> +%<*en> +\paragraph{\texttt{ltjksp}} +\label{pg:ltjksp} +\texttt{kanjiskip\_natural}, \texttt{kanjiskip\_stretch},\ +\texttt{kanjiskip\_shrink} keys (Page~\pageref{pg:ksp_nat}) makes tha +\LuaTeX-ja inserts not only a glue which is specified by a JFM, and also +the natural width/stretch part/shrink part of \Param{kanjiskip}. + +This functionality is disabled by \texttt{-ltjksp} specification. +\begin{LTXexample}[width=16\zw] +\leavevmode +\ltjsetparameter{kanjiskip=0pt plus 3\zw} +\vrule\hbox to 15\zw{あ「い」う,えお}\vrule + +\jfont\G=file:KozMinPr6N-Regular.otf% + :jfm=ujis;-ltjksp at 9.2487pt +\G\leavevmode% +\vrule\hbox to 15\zw{あ「い」う,えお}\vrule +\end{LTXexample} +%</en> + + + + +%<en>\subsection{\cs{tfont}} +%<ja>\subsection{\cs{tfont} 命令} +\label{ssec:tfont} + +\begin{comment} + {\catcode`\<=12\catcode`\>=12 +\begin{table}[t] +%<en>\caption{Differences between vertical JFMs shipped with \LuaTeX-ja} +%<ja>\caption{\LuaTeX-ja に同梱されている縦組用 JFM の違い} +%<en>\medskip +\label{tab-difjfm-tate} +\ltjsetparameter{jacharrange={+3}} +\small +\def\r#1#2{% + \hbox{\tate\Large\vrule + \parbox{7\zw}{% + \addjfontfeatures{TateFeatures={Opacity=0.5, Color=#2, JFM=#1}}\noindent + ◆◆◆◆◆◆◆ + ある日モモちゃんが「お使い」で迷子になって泣きました。 + }\vrule}} +\def\s#1#2{% + \hbox{\tate\Large + \parbox{7\zw}{% + \addjfontfeatures{TateFeatures={Opacity=0.5, Color=#2, JFM=#1}}\noindent + ちょっと!何 + }}} +\def\t#1#2#3{\hbox to 0pt{\hss% + \setbox0=\hbox{\addjfontfeatures{TateFeatures={JFM=#1}}\huge #3}% + \textcolor{#2}{\transparent{0.5}\vrule width 0.4pt height\ht0 depth\dp0}\kern-.2pt\copy0 + \textcolor{#2}{\transparent{0.5}\kern-\wd0\vrule width\wd0height .2pt depth .2pt + \kern-\wd0\raise\ht0\hbox{\vrule width\wd0height .2pt depth .2pt}% + \kern-\wd0\lower\dp0\hbox{\vrule width\wd0height .2pt depth .2pt}% + \kern-.2pt\vrule width 0.4pt height\ht0 depth \dp0}\hss}} + +\begin{minipage}{.7\textwidth} +\centering +\leavevmode\hbox to 0pt{\r{ujisv}{blue}\hss}\r{tmin}{red}\quad +\leavevmode\hbox to 0pt{\s{ujisv}{blue}\hss}\s{tmin}{red}\quad +\raise4\zw\hbox{\tate\Large\t{ujisv}{black}{漢}\t{tmin}{red}{漢}\qquad + \t{ujisv}{black}{っ}\t{tmin}{red}{っ}} +\end{minipage}% +\begin{minipage}{.3\textwidth} +\textcolor{blue}{Blue: \texttt{jfm-ujisv.lua}}\\ +\textcolor{red}{Red: \texttt{jfm-tmin.lua}} +\end{minipage} +\ltjsetparameter{jacharrange={-3}} +\end{table} +} +\end{comment} + +%<*en> +\cs{tfont} loads a font as a Japanese font for vertical direction. +This command admits the same syntax used in \cs{font}~and~\cs{jfont}. +A font defined by~\cs{tfont} differs the following points from that by~\cs{jfont}: +\begin{itemize} + \item OpenType Feature~\texttt{vrt2}% + \footnote{If the font does not define \texttt{vrt2} feature, + use \texttt{vert} instead.} is automatically activated, + unless \texttt{vert}~and//or~\texttt{vrt2} are explicitly activated + or deactivated (as the second line in the example below). +\begin{lstlisting} +\tfont\S=file:KozMinPr6N-Regular.otf:jfm=ujisv % vrt2 is automatically activated +\tfont\T=file:KozMinPr6N-Regular.otf:jfm=ujisv;-vert % vert and vrt2 are not activated +\tfont\U=file:ipaexm.ttf:jfm=ujisv + % vert is automatically activated, since this font does not have vrt2 +\end{lstlisting} + \item Sometimes \texttt{vert} and/or \texttt{vrt2} are not activated + while one specified activation of these feature. + This is because the font does not define these features in current combination of + script~tag and language~system~identifier. + + In this situation, \LuaTeX-ja performs all replacements which is defined in~\texttt{vert} + feature for \emph{some} scripts for \emph{some} languages. + \item Furthermore, a glyph is automatically rotated 90~degrees, + if it is not replaced by \texttt{vert} feature for \emph{any} script + for \emph{any} language, and if it is marked as `r''~or~``Tr'' in UAX~\#50. + \item One have to specify the name of vertical JFM in \texttt{jfm=<name>}. +\LuaTeX-ja ships following vertical JFMs: +\begin{description} +\item[\tt jfm-ujisv.lua] A standard vertical JFM in \LuaTeX-ja. This JFM is + based on \verb+upnmlminr-v.tfm+, a metric for UTF/OTF package that + is used in \upTeX. +\item[\tt jfm-tmin.lua] A counterpart for \verb+tmin10.tfm+, which is one + of the default Japanese font metric shipped with \pTeX. +\end{description} +\begin{figure}[!tb] +\begin{LTXexample}[pos=b] +\jfont\X=[KozMinPr6N-Regular.otf]:jfm=ujis +\tfont\U=[KozMinPr6N-Regular.otf]:jfm=ujisv +\tfont\V=[KozMinPr6N-Regular.otf]:jfm=ujisv;jpotf +\def\TEST#1#2{\leavevmode\hbox{#1#2\string#2 “引用,と句読点.”}} +\ttfamily\centering\TEST\yoko\X \quad \TEST\tate\U \quad \TEST\tate\V +\end{LTXexample} +\caption{\texttt{jpotf} ``feature''} +\label{fig:jpotf} +\end{figure} + + \item If \texttt{vert}~and/or~\texttt{vrt2} features are activated, + one can specify \texttt{jpotf} to additional substitutions. + By default, it substitutes ideographic comma/period for fullwidth comma/period, + and double prime quotation marks for double quotation marks + (See~\autoref{fig:jpotf}). +\end{itemize} +%</en> +%<*ja> +\cs{tfont} はフォントを縦組用の和文フォントとして読み込む命令であり, +\cs{tfont} の文法は \cs{jfont} と同じである. +\cs{tfont} で定義された縦組用和文フォントは, +以下の点が \cs{jfont} による横組用和文フォントとは異なる: +\begin{itemize} + \item 明示的に \texttt{vert}, \texttt{vrt2}(のいずれか)の + 有効・無効を指定した場合を除き,自動的に OpenType機能 \texttt{vrt2} の有効化が + 指定されたものとみなされる + \footnote{もしフォントが\texttt{vrt2}を定義していなかった場合,代わりに + \texttt{vert}を用いる.}. +\begin{lstlisting} +\tfont\S=file:KozMinPr6N-Regular.otf:jfm=ujisv % vrt2 is automatically activated +\tfont\T=file:KozMinPr6N-Regular.otf:jfm=ujisv;-vert % vert and vrt2 are not activated +\tfont\U=file:ipaexm.ttf:jfm=ujisv + % vert is automatically activated, since this font does not have vrt2 +\end{lstlisting} + \item \texttt{vert}, \texttt{vrt2} の少なくとも一つの有効を指定した場合にも関わらず, + script tagとlanguage system identifierの値の組み合わせによって + 実際には有効にならなかった場合,\LuaTeX-jaは + \begin{quote} + どれかのscript,~languageで定義されている\texttt{vert}による + (単一グリフから単一グリフへの)置換を全部適用する + \end{quote} + という挙動を取る\footnote{% + 例えば,Windows~7に付属しているSimHeiでは,\texttt{vert}はScriptが\texttt{hani}, + Languageが\texttt{CHN}という状況でのみ定義されている.しかし,\Pkg{luaotfload}では + このscript,~languageの組み合わせを指定することはできないので, + \Pkg{luaotfload}そのままでは\texttt{vert}を適用させることはできない. + }. + \item さらに,「いかなるscript,~languageでも\texttt{vert}により置換されない」グリフ + のうち,UAX~\#50で``r''もしくは``Tr''と指定されているものは90度自動回転させる. + \item \ref{ssec:math}節で述べる,数式中の和文フォントには縦組用和文フォントは指定できない. + \item \texttt{jfm=<name>}\ の部分には縦組用JFMを指定する. +以下の縦組用JFMが\LuaTeX-jaには同梱されている.%おり,違いを\autoref{tab-difjfm-tate}に示した. +\begin{description} +\item[\tt jfm-ujisv.lua] \LuaTeX-jaの標準縦組用JFMである.このJFMは\upTeX で + 用いられるUTF/OTFパッケージ用の和文用TFMである \verb+upnmlminr-v.tfm+ を + 元にしている. +\item[\tt jfm-tmin.lua] \pTeX に同梱されているデフォルトの和文用縦組TFM + である \verb+tmin10.tfm+ に相当し,\texttt{min10.tfm} と同様に + 「っ」など一部の文字幅が狭められている. +\end{description} + +\begin{figure}[!tb] +\begin{LTXexample}[pos=b] +\jfont\X=[KozMinPr6N-Regular.otf]:jfm=ujis +\tfont\U=[KozMinPr6N-Regular.otf]:jfm=ujisv +\tfont\V=[KozMinPr6N-Regular.otf]:jfm=ujisv;jpotf +\def\TEST#1#2{\leavevmode\hbox{#1#2\string#2 “引用,と句読点.”}} +\ttfamily\centering\TEST\yoko\X \quad \TEST\tate\U \quad \TEST\tate\V +\end{LTXexample} +\caption{\texttt{jpotf} ``feature''} +\label{fig:jpotf} +\end{figure} + + \item \texttt{vert}, \texttt{vrt2}の少なくとも片方が(明示的・自動的を問わず) + 有効になっていた場合,さらに\texttt{jpotf}を指定することで + 「通常では行わない縦組用字形への変換」を行うことができる. + + 標準では,この「変換」は全角のコンマ・ピリオドを句読点に, + また全角の二重引用符をダブルミニュートへ置き換える + \footnote{% + \texttt{jpotf}という名前にしたのは, + OTFパッケージの縦組用和文TFMでほぼ同じの処理(そちらではさらに一重引用符を + 「シングルミニュート」に置換する機能もあった)を行っていたことに由来する. + }.\autoref{fig:jpotf}を参照. + + ユーザ側で「変換」をカスタマイズしたい場合, + \verb+luatexja.jfont.register_vert_replace+ 関数に変更内容を記したテーブルを渡す. + 例えば縦組中では「あ」を「い」に置換し,また「,」は(「、」に置換せず)「,」のままに + したい場合は次のようにすれば良い. +\begin{lstlisting} +\directlua{luatexja.jfont.register_vert_replace{ + ['あ']='い', [',']=false, +}} +\end{lstlisting} + \verb+luatexja.jfont.register_vert_replace+ による変更はこの関数の\emph{実行後}に定義される + フォントについてのみ有効である. + +\end{itemize} + +なお,\pTeX では,\cs{font},~\cs{jfont},~\cs{tfont}のどれでも欧文フォント・横組用和文フォン +ト・縦組用和文フォントの定義が可能であったが,\LuaTeX-jaではそうでないので注意. +%</ja> + +%<en>\subsection{Default Japanese fonts and JFMs} +%<ja>\subsection{標準和文フォント・JFMの変更} +\label{ssec:cfg} +%<*en> +If following commands are defined at loading \LuaTeX-ja package, these change +default Japanese fonts and JFMs for them: +%</en> +%<*ja> +\LuaTeX-jaが読み込まれる前に以下の命令が定義されていた場合は, +それらが標準和文フォントやそれらに用いるJFMとして使われる. +%</ja> + +\begin{cslist}[style=standard] + \item[\cs{ltj@stdmcfont}] +%<en>The default Japanese font for the mincho family. +%<ja>明朝体として用いるフォント. + \item[\cs{ltj@stdgtfont}] +%<en>The default Japanese font for the gothic family. +%<ja>ゴシック体として用いるフォント. + \item[\cs{ltj@stdyokojfm}] +%<en>The default JFM for horizontal direction. +%<ja>標準で用いる横組用JFM. + \item[\cs{ltj@stdtatejfm}] +%<en>The default JFM for vertical direction. +%<ja>標準で用いる縦組用JFM. +\end{cslist} + +%<*en> +For example, +\begin{lstlisting} +\def\ltj@stdmcfont{IPAMincho} +\def\ltj@stdgtfont{IPAGothic} +\end{lstlisting} +makes that IPA~Mincho and IPA~Gothic will be used as default Japanese fonts, instead of +IPAex~Mincho and IPAex~Gothic. + +This feature is intended for classes which use special JFMs +\footnote{This is because commands has \texttt{@} in their names.}. +It is recommended to use \cs{luatexja-preset}~or~\cs{luatexja-fontspec} package +to select standard fonts in ordinary \LaTeX\ sources. +%</en> +%<*ja> +例えば +\begin{lstlisting} +\def\ltj@stdmcfont{IPAMincho} +\def\ltj@stdgtfont{IPAGothic} +\end{lstlisting} +と記述しておけば,標準和文フォントがIPA明朝・IPAゴシックへと変 +更される. + +この機能は,特別のJFMを用いるクラス +\footnote{例えば阿部紀行氏によるjlreqがそれにあたる.}% +などでの使用を意図しており,命令名に\texttt{@}が含まれることから +通常の\TeX/\LaTeX 文書での使用は意図していない. +通常の\LaTeX 文書では\Pkg{luatexja-preset}や\Pkg{luatexja-fontspec}などで +使用フォントを選択することを推奨する. +%</ja> + +%<*en> +For compatibility with earlier versions, +\LuaTeX-ja reads \texttt{luatexja.cfg} automatically if it is found by \LuaTeX. +One should not overuse this \texttt{luatexja.cfg}; it will overwrite +the definition of \cs{ltj@stdmcfont} and others. +%</en> +%<*ja> +旧バージョンとの互換性のため, +\LuaTeX から見える位置に\texttt{luatexja.cfg}があれば,\LuaTeX-jaはそれを読み込む. +しかし,\texttt{luatexja.cfg}内で\cs{ltj@stdmcfont}等が定義されていた場合はそちらが +優先されるので,もはや\texttt{luatexja.cfg}は使わないほうが良いだろう. +%</ja> + +%<en>\subsection{Prefix \texttt{psft}} +%<ja>\subsection{\texttt{psft}プリフィックス} +\label{ssec:psft} +%<*en> +Besides ``\texttt{file:}''\ and ``\texttt{name:}''\ prefixes which +are introduced in the \Pkg{luaotfload} package, +\LuaTeX-ja adds ``\texttt{psft:}''\ prefix in \cs{jfont} (and~\cs{font}), +to specify a ``name-only'' Japanese font which +will not be embedded to PDF. +Note that these non-embedded fonts under current \LuaTeX\ has Identity-H encoding, +and this violates the standard ISO32000-1:2008~(\cite{pdfstd}). + +\emph{OpenType font features, such as ``{\tt +jp90}'', +have no meaning in name-only fonts using ``{\tt psft:}''\ prefix, +because we can't expect what fonts are actually used by the PDF reader.} +Note that \texttt{extend}~and~\texttt{slant} settings (see~above) are supported +with \texttt{psft} prefix, because they are only simple linear transformations. +%</en> +%<*ja> +\Pkg{luaotfload}で使用可能になった +\texttt{file:}\ と \texttt{name:}\ のプリフィックスに加えて, +\cs{jfont}(と \cs{font} プリミティブ)では +\texttt{psft:}プリフィックスを用いることができる. +このプリフィックスを用いることで,PDFには埋め込まれない「名前だけの」 +和文フォントを指定することができる. +なお,現行の\LuaTeX で非埋め込みフォントを作成するとPDF内でのエンコーディングが +Identity-Hとなり,PDFの標準規格ISO32000-1:2008~(\cite{pdfstd})に非準拠になってしまう +ので注意してほしい. + +\emph{\texttt{psft} プリフィックスの下では +\texttt{+jp90} などのOpenType機能の効力はない. +非埋込フォントをPDFに使用すると,実際にどのようなフォントが +表示に用いられるか予測できないからである.}\ +\texttt{extend} と \texttt{slant} 指定は単なる変形のため +\texttt{psft} プリフィックスでも使用可能である. +%</ja> + +%<en>\paragraph{\texttt{cid} key} +%<ja>\paragraph{\texttt{cid}キー} +\label{para-cid} + +%<*en> +The default font defined by using \texttt{psft:} prefix is for Japanese typesetting; +it is Adobe-Japan1-7 CID-keyed font. +One can specify \texttt{cid} key to use other CID-keyed non-embedded fonts +for Chinese or Korean typesetting. +%</en> +%<*ja> +標準で\texttt{psft:}プリフィックスで定義されるフォントは日本語用のもので +あり,Adobe-Japan1-7のCIDに対応したものとなる.しかし,\LuaTeX-jaは中国語 +の組版にも威力を発揮することが分かり,日本語フォントでない非埋込フォント +の対応も必要となった.そのために追加されたのが\texttt{cid}キーである. + +\texttt{cid}キーに値を指定すると,そのCIDを持った非埋込フォントを定義することができる: +%</ja> +\begin{lstlisting}[numbers=left] +\jfont\testJ={psft:Ryumin-Light:cid=Adobe-Japan1-7;jfm=jis} % Japanese +\jfont\testD={psft:Ryumin-Light:jfm=jis} % default: Adobe-Japan1-7 +\jfont\testC={psft:AdobeMingStd-Light:cid=Adobe-CNS1-7;jfm=jis}% Traditional Chinese +\jfont\testG={psft:SimSun:cid=Adobe-GB1-5;jfm=jis} % Simplified Chinese +\jfont\testK={psft:Batang:cid=Adobe-Korea1-2;jfm=jis} % Korean +\jfont\testKR={psft:SourceHanSerifAKR9:cid=Adobe-KR-9;jfm=jis} % Korean +\end{lstlisting} +%<*en> +Note that the code above specifies \texttt{jfm-jis.lua}, which is for Japanese fonts, +as JFM for Chinese and Korean fonts. +%</en> +%<*ja> +上のコードでは中国語・韓国語用フォントに対してもJFMに +日本語用の\texttt{jfm-jis.lua}を指定しているので注意されたい. +%</ja> + +%<*en> +At present, \LuaTeX-ja supports only 5 values written in the sample code above. +Specifying other values, e.g., +%</en> +%<*ja> +今のところ,\LuaTeX-jaは上のサンプルコード中に書いた5つの値しかサポートしていない. +%</ja> +\begin{lstlisting} +\jfont\test={psft:Ryumin-Light:cid=Adobe-Japan2;jfm=jis} +\end{lstlisting} +%<*en> +produces the following error: +%</en> +%<*ja> +のようにそれら以外の値を指定すると,エラーが発生する: +%</ja> +\begin{lstlisting}[numbers=left] +! Package luatexja Error: bad cid key `Adobe-Japan2'. + +See the luatexja package documentation for explanation. +Type H <return> for immediate help. +<to be read again> + \par +l.78 + +? h +I couldn't find any non-embedded font information for the CID +`Adobe-Japan2'. For now, I'll use `Adobe-Japan1-6'. +Please contact the LuaTeX-ja project team. +? +\end{lstlisting} + +%<en>\subsection{Structure of a JFM file} +%<ja>\subsection{JFMファイルの構造} +\label{ssec:jfm-str} +%<en>A JFM file is a Lua script which has only one function call: +%<ja>JFMファイルはただ一つの関数呼び出しを含むLuaスクリプトである: +\begin{lstlisting} +luatexja.jfont.define_jfm { ... } +\end{lstlisting} +%<*en> +Real data are stored in the table which indicated above by +\verb+{ ... }+. So, the rest of this subsection are devoted to describe the +structure of this table. Note that all lengths in a JFM file are +floating-point numbers in design-size unit. +%</en> +%<*ja> +実際のデータは上で \verb+{ ... }+ で示されたテーブルの中に格納されている. +以下ではこのテーブルの構造について記す. +なお,JFMファイル中の長さは全てdesign-sizeを単位とする浮動小数点数であることに +注意する. +%</ja> + +\begin{cslist}[style=standard] + +\item[version=<version>] +%<en>(optional, default value is~1) +%<ja>(任意,既定値は1) + +%<*en> +The version JFM. Currently 1,~2,~and,~3 are supported +%</en> +%<*ja> +JFMのバージョン.1,~2,~3がサポートされる. +%</ja> + +\item[dir=<direction>] +%<en>(required) +%<ja>(必須) + +%<*en> +The direction of JFM. \texttt{'yoko'}~(horizontal) +or \texttt{'tate'}~(vertical) are supported. +%</en> +%<*ja> +JFMの書字方向.\texttt{'yoko'}(横組)と \texttt{'tate'}(縦組)がサポートされる. +%</ja> + +\item[zw=<length>] +%<en>(required) +%<ja>(必須) + +%<en>The amount of the length of the ``full-width''. +%<*ja> +「全角幅」の長さ.この量が \cs{zw} の長さとなる.\pTeX では +「全角幅」\texttt{1zw} は「文字クラス0の文字」の幅と決められていたが, +\LuaTeX-jaではここで指定する. +%</ja> + +\item[zh=<length>] +%<en>(required) +%<ja>(必須) + +%<en>The amount of the ``full-height'' (height + depth). +%<*ja> +「全角高さ」(height + depth)の長さ.通常は全角幅と同じ長さになるだろう. +\pTeX では 「全角高さ」\texttt{1zh} は「文字クラス0の文字」の高さと深さの和と決められていたが, +\LuaTeX-jaではここで指定する. +%</ja> + +\item[kanjiskip=\{<natural>, <stretch>, <shrink>\}] +%<en>(optional) +%<ja>(任意) + +%<*en> +This field specifies the ``ideal'' amount of \Param{kanjiskip}. As noted + in Subsection~\ref{subs-kskip}, if the parameter + \Param{kanjiskip} is \cs{maxdimen}, the value specified + in this field is actually used (if this field is not specified in + JFM, it is regarded as 0\,pt). Note that <stretch> and <shrink> + fields are in design-size unit too. +%</en> +%<*ja> +理想的な\Param{kanjiskip}の量を指定する.\ref{subs-kskip}節で述べたように, +もし\Param{kanjiskip}が \cs{maxdimen} の値ならば,このフィールドで指定された +値が実際には用いられる(指定なしは0\,ptとして扱われる).<stretch>と<shrink>のフィールドもdesign-size +が単位であることに注意せよ. +%</ja> + +\item[xkanjiskip=\{<natural>, <stretch>, <shrink>\}] +%<en>(optional) +%<ja>(任意) + +%<*en> +Like the \texttt{kanjiskip} field, this field specifies the ``ideal'' + amount of \Param{xkanjiskip}. +%</en> +%<*ja> +\texttt{kanjiskip}フィールドと同様に,\Param{xkanjiskip}の理想的な量を +指定する. +%</ja> +\end{cslist} + +%<*en> +\paragraph{Character classes} +Besides from above fields, a JFM file have several sub-tables those +indices are natural numbers. The table indexed by~$i\in\omega$ stores +information of \emph{character class}~$i$. At least, the character class~0 is +always present, so each JFM file must have a sub-table whose index is +\texttt{[0]}. Each sub-table (its numerical index is denoted by $i$) has +the following fields: +%</en> +%<*ja> +\paragraph{文字クラス} +上記のフィールドに加えて,JFMファイルはそのインデックスが自然数であるいくつかの +サブテーブルを持つ.インデックスが$i\in\omega$であるテーブルは\emph{文字クラス}$i$の +情報を格納する.少なくとも,文字クラス0は常に存在するので,JFMファイルはインデックス +が\texttt{[0]}のサブテーブルを持たなければならない.それぞれのサブテーブル +(そのインデックスを$i$で表わす)は以下のフィールドを持つ: +%</ja> + +\begin{cslist}[style=standard] +\item[chars=\{<character>, ...\}] +%<en>(required except character class~0) +%<ja>(文字クラス0を除いて必須) + +%<*en> +This field is a list of characters which are in this character + type~$i$. This field is optional if $i=0$, since all + \textbf{JAchar} which do not belong any character classes other + than 0 are in the character class 0 + (hence, the character class~0 contains most of + \textbf{JAchar}s). In the list, character(s) can be specified in the following form: +\begin{itemize} +\item a Unicode code point +\item the character itself (as a Lua string, like \hbox{\ltjsetparameter{autoxspacing=false}\verb+'あ'+}) +\item a string like \hbox{\ltjsetparameter{autoxspacing=false}\verb+'あ*'+} (the character followed by an asterisk) +\item several ``imaginary'' characters (We will describe these later.) +\end{itemize} +%</en> +%<*ja> +このフィールドは文字クラス$i$に属する文字のリストである.このフィールドは$i=0$の +場合には任意である(文字クラス0には,0以外の文字クラスに属するものを +除いた全ての\textbf{JAchar}が属するから).このリスト中で文字を指定するには,以下の方法がある: +\begin{itemize} +\item Unicode におけるコード番号 +\item 「\hbox{\ltjsetparameter{autoxspacing=false}\verb+'あ'+}」のような,文字それ自体 +\item 「\hbox{\ltjsetparameter{autoxspacing=false}\verb+'あ*'+}」のような,文字それ自体の後にアスタリスクをつけたもの +\item いくつかの「仮想的な文字」(後に説明する) +\end{itemize} +%</ja> + +\item[width=<length>, height=<length>, depth=<length>, italic=<length>] +%<en>(required) +%<ja>(必須) + +%<*en> +\begin{table}[t] + \centering +\begin{tabular}{llr} +\toprule +Direction of JFM&\textbf{\texttt{'yoko'} (horizontal)}&\multicolumn{1}{l}{\textbf{\texttt{'tate'} (vertical)}}\\ +\midrule +\texttt{width} field&\multicolumn{2}{c}{the width of the ``real'' glyph}\\ +\texttt{height} field&the height of the ``real'' glyph&0.0\\ +\texttt{depth} field&the depth of the ``real'' glyph&0.0\\ +\midrule +\texttt{italic} field&\multicolumn{2}{c}{0.0}\\ +\bottomrule +\end{tabular} +\caption{Default values of \texttt{width} field and other fields} +\label{tab-wid} +\end{table} +Specify the width of characters in character class~$i$, the height, the depth and +the amount of italic correction. All characters in character class~$i$ are regarded that its width, height, and depth are +as values of these fields. The default values are shown in \autoref{tab-wid}. +%</en> +%<*ja> +\begin{table}[t] + \centering +\begin{tabular}{llr} +\toprule +JFM書字方向&\emph{\texttt{'yoko'}(横組)}&\multicolumn{1}{l}{\emph{\texttt{'tate'}(縦組)}}\\ +\midrule +\texttt{width}&\multicolumn{2}{c}{「実際のグリフ」の幅}\\ +\texttt{height}&「実際のグリフ」の高さ&0.0\\ +\texttt{depth}&「実際のグリフ」の深さ&0.0\\ +\midrule +\texttt{italic}&\multicolumn{2}{c}{0.0}\\ +\bottomrule +\end{tabular} +\caption{\texttt{width} フィールド等の標準値} +\label{tab-wid} +\end{table} +文字クラス$i$に属する文字の幅,高さ,深さ,イタリック補正の量を指定する. +文字クラス$i$に属する全ての文字は,その幅,高さ,深さがこのフィールドで指定した +値であるものとして扱われる.省略時や,数でない値を指定した時には表\nobreak\ref{tab-wid}に + 示されている値を用いる.例えば,横組用JFMで \texttt{width} フィールドには数値以外の値を指 + 定した場合,文字の幅はその「実際の」グリフの幅となる.OpenTypeの \texttt{prop} featureと併用 + すれば,これによってプロポーショナル組を行うことができる. +%</ja> + +\item[left=<length>, down=<length>, align=<align>]\ + +%<*en> +These fields are for adjusting the position of the ``real'' glyph. Legal + values of \texttt{align} field are \texttt{'left'}, + \texttt{'middle'}, and \texttt{'right'}. If one of these + 3~fields are omitted, \texttt{left} and \texttt{down} are + treated as~0, and \texttt{align} field is treated as + \texttt{'left'}. +The effects of these 3~fields are indicated in +\autoref{fig:pos}~and~\autoref{fig:pos-tate}. +%</en> +%<*ja> +これらのフィールドは実際のグリフの位置を調整するためにある. +\texttt{align} フィールドに指定できる値は \texttt{'left'}, \texttt{'middle'}, +\texttt{'right'} のいずれかである.もしこれら3つのフィールドのうちの1つが省かれた +場合,\texttt{left} と \texttt{down} は0,\texttt{align} フィールドは +\ \texttt{'left'} であるものとして扱われる. +これら3つのフィールドの意味については\autoref{fig:pos}(横組用和文フォント), +\autoref{fig:pos-tate}(縦組用和文フォント)で説明する. +%</ja> + +%<*en> +In most cases, \texttt{left} and \texttt{down} fields are~0, while +it is not uncommon that the \texttt{align} field is \texttt{'middle'} or \texttt{'right'}. +For example, setting the \texttt{align} field to \texttt{'right'} is practically needed +when the current character class is the class for opening delimiters'. +%</en> +%<*ja> +多くの場合,\texttt{left}と\texttt{down}は0である一方, +\texttt{align}フィールドが\texttt{'middle'}や\texttt{'right'}であることは +珍しいことではない. +例えば,\texttt{align}フィールドを\texttt{'right'}に指定することは, +文字クラスが開き括弧類であるときに実際必要である. +%</ja> + +\begin{figure}[!tb] +\begin{minipage}{0.4\textwidth}% +\begin{center}\unitlength=10pt\small +\begin{picture}(15,12)(-1,-4) +\color{b_gray}% jfm +\put(0,0){\vrule width 12\unitlength height 8\unitlength depth 3\unitlength} + +\color{b_pink}% step1 +\put(-1,-1.5){\vrule width 6\unitlength height 7\unitlength depth 2.5\unitlength} + +\color{red}% real glyph +\thicklines +\put(-1,-1.5){\vector(0,1){7}\vector(0,-1){2.5}\vector(1,0){6}} +\put(5,-1.5){\line(0,1){7}\line(0,-1){2.5}} +\put(-1,5.5){\line(1,0){6}} +\put(-1,-4){\line(1,0){6}} + +\color{b_green}% real glyph +\put(3,0){\vrule width 6\unitlength height 7\unitlength depth 2.5\unitlength} + +\color{black}% jfm +\thicklines +\put(0,0){\vector(0,1){8}\line(0,-1){3}\vector(1,0){12}} +\put(12,0){\line(0,1){8}\vector(0,-1){3}} +\put(0,8){\line(1,0){12}} +\put(0,-3){\line(1,0){12}} +\put(0.2,4){\makebox(0,0)[l]{\texttt{height}}} +\put(12.2,-1.5){\makebox(0,0)[l]{\texttt{depth}}} +\put(6,0.2){\makebox(0,0)[b]{\texttt{width}}} + +\color{green}% step1 +\thicklines +\put(3,0){\vector(0,1){7}\vector(0,-1){2.5}\vector(1,0){6}} +\put(9,0){\line(0,1){7}\line(0,-1){2.5}} +\put(3,7){\line(1,0){6}} +\put(3,-2.5){\line(1,0){6}} +\newsavebox{\eqdist} +\savebox{\eqdist}(0,0)[b]{% + \thinlines + \put(-0.08,0.2){\line(0,-1){0.4}}% + \put(0.08,0.2){\line(0,-1){0.4}}} +\put(1.5,0){\usebox{\eqdist}} +\put(10.5,0){\usebox{\eqdist}} + +\color{blue}% shifted +\thicklines +\put(3,-1.5){\vector(-1,0){4}} +\put(1,-1.7){\makebox(0,0)[t]{\texttt{left}}} +\put(3,0){\vector(0,-1){1.5}} +\put(3.2,-0.75){\makebox(0,0)[l]{\texttt{down}}} +\end{picture} +\end{center} +\end{minipage}% +\begin{minipage}{0.6\textwidth}% +%<*en> +Consider a Japanese character node which belongs to +a character class whose the \texttt{align} +field is \texttt{'middle'}. +%</en> +%<*ja> +\texttt{align}フィールドの値が \texttt{'middle'} であるような文字クラスに属する +和文文字ノードを考えよう. +%</ja> +\begin{itemize} +\item +%<*en> +The black rectangle is the imaginary body of the node. +Its width, height, and depth are specified by JFM. +%</en> +%<*ja> +黒色の長方形はノードの枠であり, +その幅,高さ,深さはJFMによって指定されている. +%</ja> +\item +%<*en> +Since the \texttt{align} field is \texttt{'middle'}, +the ``real'' glyph is centered horizontally (the green rectangle) first. +%</en> +%<*ja> +\texttt{align}フィールドは \texttt{'middle'} なので, +実際のグリフの位置はまず水平方向に中央揃えしたものとなる(緑色の長方形). +%</ja> +\item +%<*en> +Furthermore, the glyph is shifted according to values of fields + \texttt{left} and \texttt{down}. The ultimate position of the real + glyph is indicated by the red rectangle. +%</en> +%<*ja> +さらに,グリフは \texttt{left} と \texttt{down} の値に従ってシフトされる. +最終的な実際のグリフの位置は赤色の長方形で示された位置になる. +%</ja> +\end{itemize} +\end{minipage} +\medskip + +\caption{% +%<en>The position of the real glyph (horizontal Japanese fonts) +%<ja>横組和文フォントにおける「実際の」グリフの位置 +} +\label{fig:pos} +\end{figure} +\begin{figure}[!tb] +\begin{minipage}{0.4\textwidth}% +\begin{center}\unitlength=10pt\small +\begin{picture}(15,12)(-6,0) +\color{b_gray}% jfm +\put(-6,0){\vrule width 12\unitlength height 11\unitlength} + +\color{b_pink}% real glyph +\put(-6.5,5.5){\vrule width 8\unitlength height 6\unitlength depth 3\unitlength} + +\color{red}% real glyph +\thicklines +\put(-6.5,5.5){\vector(0,1){6}\vector(0,-1){3}\vector(1,0){8}} +\put( 1.5,5.5){\line(0,1){6}\line(0,-1){3}} +\put(-6.5,11.5){\line(1,0){8}} +\put(-6.5,2.5){\line(1,0){8}} + +\color{b_green}% step1 +\put(-4,3){\vrule width 8\unitlength height 6\unitlength depth 3\unitlength} + +\color{black}% jfm +\thicklines +\put(0,11){\vector(1,0){6}\vector(-1,0){6}\vector(0,-1){11}} +\put(0,0){\line(1,0){6}\line(-1,0){6}} +\put(-6,0){\line(0,1){11}} +\put( 6,0){\line(0,1){11}} +\put( 3,10.8){\makebox(0,0)[t]{\texttt{height}}} +\put(-3,10.8){\makebox(0,0)[t]{\texttt{depth}}} +\put(0.2,5.5){\makebox(0,0)[l]{\texttt{width}}} + +\color{green}% step1 +\thicklines +\put(-4,3){\vector(0,1){6}\vector(0,-1){3}\vector(1,0){8}} +\put( 4,3){\line(0,1){6}\line(0,-1){3}} +\put(-4,9){\line(1,0){8}} +\put(-4,0){\line(1,0){8}} +\savebox{\eqdist}(0,0)[b]{% + \thinlines + \put(-0.08,0.2){\line(0,-1){0.4}}% + \put(0.08,0.2){\line(0,-1){0.4}}} +\put(2,9){\usebox{\eqdist}} +\put(-2,9){\usebox{\eqdist}} + + +\color{blue}% shifted +\thicklines +\put(-4,3){\vector(0,1){2.5}} +\put(-3.8,4.25){\makebox(0,0)[l]{\texttt{left}}} +\put(-4,5.5){\vector(-1,0){2.5}} +\put(-5.,5.7){\makebox(0,0)[b]{\texttt{down}}} +\end{picture} +\end{center} +\end{minipage}% +\begin{minipage}{0.6\textwidth}% +%<*en> +(\dots) +%</en> +%<*ja> +\texttt{align}フィールドの値が \texttt{'right'} であるような文字クラスに属する +和文文字を考えよう. +\begin{itemize} +\item +実際のグリフの「垂直位置」は,まずベースラインが文字の物理的な左右方向の中央を通る +位置となる. +\item +また,この場合 \texttt{align} フィールドは \texttt{'right'} なので, +「水平位置」は字送り方向に「右寄せ」したものとなる(緑色の長方形). +\item +その後さらに \texttt{left} と \texttt{down} の値に従ってシフトされる +のは横組用和文フォントと変わらない. +\end{itemize} +%</ja> +\end{minipage} +\medskip + +\caption{% +%<en>The position of the real glyph (vertical Japanese fonts) +%<ja>縦組和文フォントにおける「実際の」グリフの位置 +} +\label{fig:pos-tate} +\end{figure} + +\item[kern={\{[$j$]=<kern>, [$j'$]=\{<kern>, [ratio=<ratio>]\}, ...\}}] +\nopagebreak +\item[glue={\{[$j$]=\{<width>, <stretch>, <shrink>, [ratio=<ratio>, ...]\}, ...\}}]\leavevmode +%<*ja> + +文字クラス$i$の文字と$j$の文字の間に挿入されるカーンやグルーの量を指定する. + +<ratio>は,グルーの自然長のうちどれだけの割合が「後の文字」由来かを示す量で, +$0$から$+1$の実数値をとる.省略時の値は$0.5$である. +このフィールドの値は\Param{differentjfm}の値が +\texttt{pleft},~\texttt{pright},~\texttt{paverage}の値のときのみ実際に用いられる. + +例えば,\cite{x4051}では,句点と中点の間には, +句点由来の二分空きと中点由来の四分空きが挿入されるが,この場合には +\begin{itemize} +\item <width>には$0.5+0.25=0.75$を指定する. +\item <ratio>には$0.25/(0.5+0.25)=1/3$を指定する. +\end{itemize} +%</ja> +%<*en> +\ + +Specifies the amount of kern or glue which will be inserted +between characters in character class~$i$ and those in character class~$j$. + +<ratio> specifies how much the glue is originated in the ``right'' character. +It is a real number between 0 and 1, and treated as 0.5 if omitted. For example, +The width of a glue between an ideographic full stop ``。'' +and a fullwidth middle dot ``・'' is three-fourth of fullwidth, +namely halfwidth from the ideographic full stop, and +quarter-width from the fullwidth middle dot. In this case, +we specify <ratio> to $0.25/(0.5+0.25)=1/3$. +%</en> + +%<*ja> +グルーの指定においては,上記に加えて各 \texttt{[$j$]} の各サブテーブル内に +次のキーを指定できる, +\begin{cslist}[style=standard] +\item[priority=<priority>] + \Pkg{luatexja-adjust}による優先順位付き + 行長調整(\ref{ssec:adj}節)において,このグルーの優先度を指定する.許される値は以下の通り: + \begin{description} + \item[バージョン1] $-4$から$+3$の間の整数 + \item[バージョン2以降] $-4$から$+3$の間の整数の2つ組\texttt{\{<stretch>, <shrink>\}}か, + または$-4$から$+3$の間の整数.<stretch>, <shrink>はそれぞれこのグルーが伸びるときの優先度,縮むときの + 優先度であり,単に整数$i$が指定された場合は\texttt{\{$i$, $i$\}}であると解釈される. + \end{description} + ここで指定する値は,大きい値ほど「先に伸ばされる」「先に縮ませる」ことを意味しており,省略時の値 + は0である.範囲外の値が指定されたときの動作は未定義である. +\item[kanjiskip\_natural=<num>\textrm{, }% + kanjiskip\_stretch=<num>\textrm{, }kanjiskip\_shrink=<num>]\leavevmode + \label{pg:ksp_nat} + +JFMによって本来挿入されるグルーの他に +\Param{kanjiskip}分の空白を自然長(\texttt{kanjiskip\_natural}),伸び量(\texttt{kanjiskip\_stretch}), +縮み量(\texttt{kanjiskip\_shrink})ごとに挿入する\footnote{本来\Param{xkanjiskip}が挿入される場所においては + \Param{xkanjiskip}分の空白を自然長・伸び量・縮み量ごとに.追加できる.}% +ための指定である.いずれも省略された場合のデフォルト値は0(追加しない)である. + +例えば,\LuaTeX-jaの横組標準JFMの \texttt{jfm-ujis.lua} では, +\begin{itemize} + \item 通常の文字「あ」と開き括弧類の間に入るグルーは,自然長・縮み量半角,伸び量0のグルー +となっているが,さらに\Param{kanjiskip}の伸び量に \texttt{kanjiskip\_stretch}(ここでは1)を掛け + た分だけ伸びることが許される. + \item 同様に,閉じ括弧類(全角コンマ「,」も含む)と通常の文字「う」「え」の間にも +自然長・縮み量半角,伸び量0のグルー +となっているが,さらに\Param{kanjiskip}の伸び量に \texttt{kanjiskip\_stretch}(ここでは1)を掛け + た分だけ伸びることが許される. + \item 一方,開き括弧類と通常の文字の間,また通常の文字と閉じ括弧類の間は + 自然長・縮み量・伸び量0のグルーだが,\Param{kanjiskip}の縮み量に + \texttt{kanjiskip\_shrink}(ここでは1)を掛けた分だけ縮むことが許される. +\end{itemize} +となっている.従って,以下のような組版結果を得る. + +\medskip +\begin{LTXexample}[width=16\zw] +\leavevmode +\ltjsetparameter{kanjiskip=0pt plus 3\zw} +\vrule\hbox to 15\zw{あ「い」う,えお}\vrule + +\vrule\hbox{あ「い」う,えお}\vrule\par +\ltjsetparameter{kanjiskip=0pt minus \zw} +\vrule\hbox to 6.5\zw{あ「い」う,えお}\vrule +\end{LTXexample} + +\end{cslist} +%</ja> +%<*en> +In case of glue, one can specify following additional keys in each \texttt{[$j$]} + subtable: +\begin{cslist}[style=standard] +\item[priority=<priority>] +An integer in $[-4,3]$ (treated as 0 if omitted), or +a pair of these integers \texttt{\{<stretch>, <shrink>\}} (version 2~or~later). +This is +used only in line adjustment with priority by \Pkg{luatexja-adjust} +(see Subsection~\ref{ssec:adj}). Higher value means the glue is easy to stretch, +and is also easy to shrink. +\item[kanjiskip\_natural=<num>\textrm{, }% + kanjiskip\_stretch=<num>\textrm{, }kanjiskip\_shrink=<num>]\leavevmode + +These keys specifies the amount of the natural width of \Param{kanjiskip} +(the stretch/shrink part, respectively) which will be inserted +in addition to the original JFM glue. Default values of them are all 0. + +As an example, in \texttt{jfm-ujis.lua}, the standard JFM in horizontal writing, we have +\begin{itemize} + \item Between an ordinal letter ``あ'' and an ideographic opening bracket, we have +a glue whose natural part and shrink part are both half-width, while its stretch part is + zero. However, this glue also can be stretched + as much as the stretch part of \Param{kanjiskip} times the value of + \texttt{kanjiskip\_stretch} key (1 in this case). + \item Between an ideographic closeing brackets (the ideographic comma ``,'' + is included) and an ordinal letter, we have the same glue. + Again, this glue also can be stretched + as much as the stretch part of \Param{kanjiskip} times the value of + \texttt{kanjiskip\_stretch} key (1 in this case). + \item Between an ideographic opening bracket and an ordinal letter + and between an ordinal letter and an ideographic closing bracket, + we have a glue whose natural part and stretch part are both zero, while its shrink part as much as + the shrink part of \Param{kanjiskip}. +\end{itemize} +Hence we have the following result: + +\medskip +\begin{LTXexample}[width=16\zw] +\leavevmode +\ltjsetparameter{kanjiskip=0pt plus 3\zw} +\vrule\hbox to 15\zw{あ「い」う,えお}\vrule + +\vrule\hbox{あ「い」う,えお}\vrule\par +\ltjsetparameter{kanjiskip=0pt minus \zw} +\vrule\hbox to 6.5\zw{あ「い」う,えお}\vrule +\end{LTXexample} + +\end{cslist} +%</en> + +\item[end\_stretch=<kern>, end\_shrink=<kern>] +%<*ja> +(任意,バージョン1のみ) + +優先順位付き行長調整が有効であり,かつ現在の文字クラスの文字が行 + 末に来た時に,行長を詰める調整・伸ばす調整のた + めにこの文字と行末の間に挿入可能なカーンの大きさを指定する. +%</ja> +%<*en> +(optional, version~1 only) +%</en> + + \item[end\_adjust=\{<kern>, <kern>, ...\}] +%<*ja> +(任意,バージョン2以降) + +優先順位付き行長調整が有効であり,かつ現在の文字クラスの文字が + 行末に来た時に,この文字と行末の間には指定された値のいずれかの大きさのカーンが + 挿入される(\autoref{ssec:adj}参照). + +バージョン1における +\begin{lstlisting}[escapechar=\$] + end_stretch = $a$, end_shrink = $b$ +\end{lstlisting} +という指定は,バージョン2以降では次の指定と同じになる. +\begin{lstlisting}[escapechar=\$] + end_adjust = {$-b$, 0.0, $a$} +\end{lstlisting} +もし真ん中の \texttt{0.0} がない場合は,$a$か$-b$かいずれかのカーンが常に行末に追加される. +%</ja> +%<*en> +(optional, version~2 or~later) +%</en> + +\end{cslist} + +%<*ja> +\paragraph{文字クラスの決定} +文字からその文字の属する文字クラスを算出する過程について, +次の内容を含んだ \texttt{jfm-test.lua} を用いて説明する. +%</ja> +%<*en> +\paragraph{Character to character classes} +We explain how the character class of a character is determined, +using \texttt{jfm-test.lua} which contains the following: +%</en> +\begin{lstlisting} + [0] = { + chars = { '漢' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + }, + [2000] = { + chars = { '。', 'ヒ' }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + }, +\end{lstlisting} +%<ja>ここで,次のような入力とその実行結果を考える: +%<en>Now consider the following input/output: +\begin{LTXexample}[width=0.3\textwidth] +\jfont\a=file:KozMinPr6N-Regular.otf:jfm=test;+hwid +\setbox0\hbox{\a ヒ漢} +\the\wd0 +\end{LTXexample} +%<*en> +Now we look why the above source outputs 15\,pt. +\begin{enumerate} +\item The character ``ヒ'' is converted to its half width form ``ヒ'' by \verb+hwid+ feature. +\item According to the JFM, the character class of ``ヒ'' is 2000, hence its width is halfwidth. +\item The character class of ``漢'' is zero, hence its width is fullwidth. +\item Hence the width of \cs{hbox} equals to 15\,pt. +\end{enumerate} +This example shows that the character class of a character is generally determined \emph{after +applying font features by \Pkg{luaotfload}}. +%</en> +%<*ja> +上記の出力結果が,15\,ptとなっているのは理由によるものである: +\begin{enumerate} +\item \verb+hwid+ featureによって「ヒ」が半角幅のグリフ「ヒ」と置き換わる(\Pkg{luaotfload} による処理). +\item JFMによれば,この「ヒ」のグリフの文字クラスは2000である. +\item 以上により文字クラス2000とみなされるため,結果として「ヒ」の幅は半角だと認識される. +\end{enumerate} +この例は,\emph{文字クラスの決定はOpenType機能の適用によるグリフ置換の結果に基づく}ことを +示している. +%</ja> + +%<*en> +However, if the class determined by the glyph after application of features is zero, +\LuaTeX-ja adopts the class determined by the glyph \emph{before} application of features. +The following input is an example. +%</en> +%<*ja> +但し,JFMによって決まる置換後のグリフの文字クラスが0である場合は,置換前の文字クラスを採用する. +%</ja> +\begin{LTXexample}[width=0.3\textwidth] +\jfont\a=file:KozMinPr6N-Regular.otf:jfm=test;+vert +\a 漢。\inhibitglue 漢 +\end{LTXexample} +%<*en> +Here, the character class of the ideographic full stop ``。''~(\texttt{U+3002}) is determined +as follows: +\begin{enumerate} +\item As the case of ``ヒ'', the ideographic full stop ``。'' is converted to its vertical + form ``\char"FE12''~(\texttt{U+FE12}) by \verb+vert+ feature.%" +\item The character class of ``\char"FE12'', according to the JFM is \emph{zero}. +\item However, \LuaTeX-ja remembers that this ``\char"FE12'' is obtained from ``。'' by + font features. The character class of ``。'' is \emph{non-zero value}, namely, 2000. +\item Hence the ideographic full stop ``。'' in above belongs the character class~2000. +\end{enumerate} +%</en> +%<*ja> +ここで,句点「。」(\texttt{U+3002})の文字クラスは,以下のようにして決まる. +\begin{enumerate} +\item \Pkg{luaotfload}によって縦組用句点のグリフに置き換わる. +\item 置換後のグリフは \texttt{U+FE12} であり,JFMに従えば文字クラスは\emph{0}と判定される. +\item この場合,置換前の横組用句点のグリフによって文字クラスを判定する. +\item 結果として,上の出力例中の句点の文字クラスは2000となる. +\end{enumerate} +%</ja> + + +%<ja>\paragraph{仮想的な文字} +%<en>\paragraph{Imaginary characters} +%<*en> +As described before, you can specify several ``imaginary characters'' in +\texttt{chars} field. The most of these characters are regarded as the +characters of class 0 in \pTeX. +As a result, \LuaTeX-ja can control typesetting finer than \pTeX. +The following is the list of imaginary characters: +%</en> +%<*ja> +上で説明した通り,\texttt{chars}フィールド中にはいくつかの「特殊文字」も +指定可能である.これらは,大半が\pTeX のJFMグルーの挿入処理ではみな「文字 +クラス0の文字」として扱われていた文字であり,その結果として\pTeX より細か +い組版調整ができるようになっている.以下でその一覧を述べる: +%</ja> + +\begin{cslist} +%%\item['diffmet'] +%%<en>Used at a boundary between two \textbf{JAchar}s whose JFM or size is different. +%%<ja>JFMやサイズが異なる2つの\textbf{JAchar}の間の境界として用いられる. + +\item['boxbdd'] +%<*en> +The beginning/ending of a hbox, and the beginning of a noindented (i.e., began by \cs{noindent}) paragraph. +If a hbox~$b$ begins (resp.~ends) a glue or kern between this ``charater'' and a \textbf{JAchar}, +\textbf{JAglue} won't be inserted before(resp.~after) the hbox~$b$. +\Param{kanjiskip}~and~\Param{xkanjiskip} around a hbox. +%</en> +%<*ja> +hboxの先頭と末尾,及びインデントされていない(\cs{noindent} で開始された)段落の先頭を表す. +この「文字」との間に設定したグルー・カーンがボックス$b$の先頭(もしくは末尾)に来た場合, + そのボックス$b$の直前(もしくは直後)には和文処理グルーは入らない. +%</ja> + +\item['parbdd'] +%<en>The beginning of an (indented) paragraph. +%<ja>通常の(\cs{noindent} で開始されていない)段落の先頭. + +\item['jcharbdd'] +%<en>A boundary between \textbf{JAchar} and anything else. +%<*ja> +\textbf{JAchar}と「その他のもの」との境界. + +バージョン2以前では\textbf{ALchar},箱,罫線(rule),glue,~kernなどいろいろなものと\textbf{JAchar}の境界に対して +本特殊文字が用いられていたが, +バージョン3以降では\ \texttt{'jcharbdd'}, \texttt{'alchar'}, \texttt{'nox\_alchar'}, +\texttt{'glue'} と細分化され, +\texttt{'jcharbdd'} は主に\textbf{JAchar}とボックスや罫線(rule)との境界に使われるようになった. +%</ja> + +\item['alchar', 'nox\_alchar'] +%<*en> +(version 3~or~later) A boundary between \textbf{JAchar} and \textbf{ALchar}. +%</en> +%<*ja> +(バージョン3以降)\textbf{JAchar}と\textbf{ALchar}との境界. +\textbf{JAchar}と\textbf{ALchar}の間に\Param{xkanjiskip}が入ることが可能な場合は +\ \texttt{'alchar'}\ が,そうでない場合は\ \texttt{'nox\_alchar'}\ が用いられる +(この区別は\textbf{ALchar}側の\Param{alxspmode}の値によってのみ行われる). +%</ja> + +\item['glue'] +%<en>(version 3~or~later) A boundary between \textbf{JAchar}, and, a glue or kern. +%<ja>(バージョン3以降)\textbf{JAchar}とglue,kernとの境界. + +\item[$-1$] +%<en>The left/right boundary of an inline math formula. +%<ja>行中数式と地の文との境界. +\end{cslist} + +%<en>\paragraph{Porting JFM from \pTeX} +%<ja>\paragraph{\pTeX 用和文用TFMの移植} + +% ToDo: English version. + +%<*en> +See Japanese version of this manual. +%</en> + +%<*ja> +以下に,\pTeX 用に作られた和文用TFMを\LuaTeX-ja用に移植する場合の注意点を挙げておく. +\begin{itemize} +\item 実際に出力される和文フォントのサイズがdesign sizeとなる. +このため,例えば$1\,\textrm{zw}$がdesign sizeの0.962216倍であるJISフォン + トメトリック等を移植する場合は,次のようにするべきである: +\begin{itemize} +\item JFM中の全ての数値を$1/0.962216$倍しておく. +\item \TeX ソース中で使用するところで,サイズ指定を0.962216倍にする. + \LaTeX でのフォント宣言なら,例えば次のように: +\begin{lstlisting} +\DeclareFontShape{JY3}{mc}{m}{n}{<-> s*[0.962216] psft:Ryumin-Light:jfm=jis}{} +\end{lstlisting} +\end{itemize} +\item 上に述べた特殊文字は,\texttt{'boxbdd'}を除き文字クラスを全部0とする + (JFM中に単に書かなければよい). +\item \texttt{'boxbdd'}については,それのみで一つの文字クラスを形成し,その + 文字クラスに関してはグルー/カーンの設定はしない. + +これは,\pTeX では, + hboxの先頭・末尾とインデントされていない(\cs{noindent} で開始さ + れた)段落の先頭にはJFMグルーは入らないという仕様を実現させるためである. +\item \pTeX の組版を再現させようというのが目的であれば以上の注意を守れば十分である. + +ところで,\pTeX では通常の段落の先頭にJFMグルーが残るという仕様があるので, + 段落先頭の開き括弧は全角二分下がりになる.全角下がりを実現させるに + は,段落の最初に手動で \cs{inhibitglue} を追加するか,あるいは + \ \cs{everypar} のハックを行い,それを自動化させるしかなかった. + +一方,\LuaTeX-jaでは,\texttt{'parbdd'}によって,それがJFM側で調整できるよ +うになった.例えば,\LuaTeX-ja同梱のJFMのように,\texttt{'boxbdd'}と同じ文字クラスに +\texttt{'parbdd'}を入れれば全角下がりとなる. + +\begin{LTXexample}[width=0.4\textwidth] +\jfont\g=KozMinPr6N-Regular:jfm=test \g +\parindent1\zw\noindent{}◆◆◆◆◆ +\par 「◆◆←二分下がり +\par 【◆◆←全角下がり +\par 〔◆◆←全角二分下がり +\end{LTXexample} +\end{itemize} + +但し,\cs{everypar} を利用している場合にはこの仕組みは正しく動かない. +そのような例としては箇条書き中の \cs{item} で始まる段落があり,\Pkg{ltjsclasses}では +人工的に「\texttt{'parbdd'}の意味を持つ」whatsitノードを作ることによって対処している% +\footnote{\texttt{ltjsclasses.dtx} を参照されたい. +JFM側で一部の対処ができることにより,\Pkg{jsclasses}のようにif文の判定はしていない.}. +%</ja> + + +%<en>\subsection{Math font family} +%<ja>\subsection{数式フォントファミリ} +\label{ssec:math} + +%<*en> +\TeX\ handles fonts in math formulas by 16~font families\footnote{Omega, +Aleph, \LuaTeX~and $\varepsilon$-\kern-.125em(u)\pTeX\ can handles 256~families, but +an external package is needed to support this in plain \TeX\ and +\LaTeX.}, and each family has three fonts: +\cs{textfont}, \cs{scriptfont} and \cs{scriptscriptfont}. +%</en> +%<*ja> +\TeX\ は数式フォントを16のファミリ\footnote{Omega, Aleph, \LuaTeX,そして + $\varepsilon$-\kern-.125em(u)\pTeX\ では256の数式ファミリを扱うことができるが, + これをサポートするためにplain \TeX と\LaTeX では外部パッケージを読み込む必要が + ある.}で管理し,それぞれのファミリは3つのフォントを持っている: +\cs{textfont}, \cs{scriptfont} そして \cs{scriptscriptfont} である. +%</ja> + +%<*en> +\LuaTeX-ja's handling of Japanese fonts in math formulas is similar; +\autoref{tab-math} shows counterparts to \TeX's primitives for math +font families. There is no relation between the value of +\cs{fam} and that of \cs{jfam}; with appropriate settings, +you can set both \cs{fam} and \cs{jfam} to the same value. +Here <jfont\_cs> in the argument of \Param{jatextfont} etc.\ is +a control sequence which is defined by \cs{jfont}, i.e., +a \emph{horizontal} Japanese font. +%</en> +%<*ja> +\LuaTeX-jaの数式中での和文フォントの扱いも同様である. +\autoref{tab-math}は数式フォントファミリに対する \TeX のプリミティブと対応する +ものを示している.\cs{fam} と \cs{jfam} の値の間には関係はなく, +適切な設定の下では \cs{fam} と \cs{jfam} の両方に同じ値を設定することができる. +\Param{jatextfont} 他の第2引数<jfont\_cs>は,\cs{jfont} で定義された +\emph{横組用}和文フォントである.\cs{tfont} で定義された +\emph{縦組用}和文フォントを指定することは想定していない. +%</ja> + +\begin{table}[!tb] +%<en>\caption{Commands for Japanese math fonts} +%<ja>\caption{和文数式フォントに対する命令} +\label{tab-math} +%<en>\medskip +\centering +\def\{{\char`\{}\def\}{\char`\}}\small +\begin{tabular}{ll} +\toprule +%<en>\bf Japanese fonts&\bf alphabetic fonts\\ +%<ja>\bf 和文フォント&\bf 欧文フォント\\ +\midrule +\cs{jfam}${}\in [0,256)$&\cs{fam}\\ +\tt\Param{jatextfont}\,=\{<jfam>,<jfont\_cs>\}&\tt\cs{textfont}<fam>=<font\_cs>\\ +\tt\Param{jascriptfont}\,=\{<jfam>,<jfont\_cs>\}&\tt\cs{scriptfont}<fam>=<font\_cs>\\ +\tt\Param{jascriptscriptfont}\,=\{<jfam>,<jfont\_cs>\}&\tt\cs{scriptscriptfont}<fam>=<font\_cs>\\ +\bottomrule +\end{tabular} +\end{table} + +%<en>\subsection{Callbacks} +%<ja>\subsection{コールバック} + +%<*en> +\LuaTeX-ja also has several callbacks. These callbacks can +be accessed via \verb+luatexbase.add_to_callback+ function and so on, as other callbacks. +%</en> +%<*ja> +\LuaTeX 自体のものに加えて,\LuaTeX-jaもコールバックを持っている. +これらのコールバックには,他のコールバックと同様に \verb+luatexbase.add_to_callback+ +関数などを用いることでアクセスすることができる. +%</ja> +\begin{description}[font=\bfseries, style=nextline] +%<en>\item[\texttt{luatexja.load\_jfm} callback] +%<ja>\item[\texttt{luatexja.load\_jfm}コールバック] +%<*en> +With this callback you can overwrite JFMs. +This callback is called when a new JFM is loaded. +%</en> +%<*ja> +このコールバックを用いることでJFMを上書きすることができる. +このコールバックは新しいJFMが読み込まれるときに呼び出される. +%</ja> + +\begin{lstlisting}[numbers=left] +function (<table> jfm_info, <string> jfm_name) + return <table> new_jfm_info +end +\end{lstlisting} + +%<*en> +The argument \verb+jfm_info+ contains a table similar to the table in a JFM file, except +this argument has \texttt{chars} field which contains character codes + whose character class is not~0. +%</en> +%<*ja> +引数 \verb+jfm_info+ はJFMファイルのテーブルと似たものが格納されるが, +クラス0を除いた文字のコードを含んだ\texttt{chars}フィールドを持つ点が異なる. +%</ja> + +%<*en> +An example of this callback is the \texttt{ltjarticle} class, with + forcefully assigning character class~0 to \texttt{'parbdd'} + in the JFM \texttt{jfm-min.lua}. +%</en> +%<*ja> +このコールバックの使用例は\texttt{ltjarticle}クラスにあり, +\texttt{jfm-min.lua}中の\texttt{'parbdd'}を強制的にクラス0に割り当てている. +%</ja> + +%<en>\item[\texttt{luatexja.define\_jfont} callback] +%<ja>\item[\texttt{luatexja.define\_jfont}コールバック] +%<*en> +This callback and the next callback form a pair, and you can assign characters + which do not have fixed code points in Unicode to non-zero character classes. +This \texttt{luatexja.define\_font} callback is called just when new Japanese font is loaded. +%</en> +%<*ja> +このコールバックと次のコールバックは組をなしており,Unicode中に固定された文字コード +番号を持たない文字を非零の文字クラスに割り当てることができる. +このコールバックは新しい和文フォントが読み込まれたときに呼び出される. +%</ja> + +\begin{lstlisting}[numbers=left] +function (<table> jfont_info, <number> font_number) + return <table> new_jfont_info +end +\end{lstlisting} +%<*en> +\verb+jfont_info+ has the following fields, +\emph{which may not overwritten by a user}: +\begin{description} +\item[\texttt{size}] +The font size specified at \cs{jfont} in scaled points ($1\,\mathrm{sp}=2^{-16}\,\mathrm{pt}$). +\item[\texttt{zw}, \texttt{zh}, \texttt{kanjiskip}, \texttt{xkanjiskip}] +These are scaled value of those specified by the JFM, by the font size. +\item[\texttt{jfm}] +The internal number of the JFM. +\item[\texttt{var}] +The value of \texttt{jfmvar}~key, which is specified at \cs{jfont}. +The default value is the empty string. +\item[\texttt{chars}] +The mapping table from character codes to its character classes.\\ +The specification \texttt{[i].chars=\{<character>, ...\}} in the JFM will be stored in this + field as \texttt{chars=\{[<character>]=\,$i$, ...\}}. +\item[\texttt{char\_type}] +For $i\in\omega$, \texttt{char\_type[$i$]} is information of characters whose class is + $i$, and has the following fields: +\begin{itemize} + \item \texttt{width},~\texttt{height}, \texttt{depth}, + \texttt{italic}, \texttt{down},~\texttt{left}\ are just + scaled value of those specified by the JFM, by the font size. + \item \texttt{align} is a number which is determined from \texttt{align}~field in the JFM: +\[ + \begin{cases} + 0&\text{\texttt{'left'} (default)}\\0.5&\text{\tt 'middle'}\\1&\text{\tt 'right'} + \end{cases} +\] +\end{itemize} +For $i$,~$j\in \omega$, \texttt{char\_type[$i$][$j$]} stores a kern or a glue which will be inserted +between character class~$i$ and class~$j$. +\end{description} +%</en> +%<*ja> +\verb+jfont_info+ は最低限以下のフィールドを持つが,これらを書き換えてはならない: +\begin{cslist} +\item[size] +実際に使われるフォントサイズ(sp単位).$1\,\mathrm{sp}=2^{-16}\,\mathrm{pt}$. +\item[zw\textrm{, }zh\textrm{, }kanjiskip\textrm{, }xkanjiskip] +JFMファイルで指定されているそれぞれの値をフォントサイズに合わせてスケーリングしたものを +sp単位で格納している. +\item[jfm] +利用されているJFMを識別するための番号. +\item[var] +\cs{jfont},~\cs{tfont} で指定された \texttt{jfmvar} キーの値(未指定のときは空文字列). +\item[chars] +文字コードから文字クラスへの対応が記述されたテーブル.\\ +JFM内の \texttt{[i].chars=\{<character>, ...\}} という指定は\ +\texttt{chars=\{[<character>]=\,$i$, ...\}} という形式に変換されている. +\item[char\_type] +$i\in\omega$に対して,\texttt{char\_type[$i$]} は文字クラス$i$の文字の寸法を格納しており, +以下のフィールドを持つ. +\begin{itemize} + \item \texttt{width},~\texttt{height}, \texttt{depth}, + \texttt{italic}, \texttt{down},~\texttt{left}\ は +JFMで指定されているそれぞれの値をスケーリングしたものである. + \item \texttt{align} はJFMで指定されている値によって, +\[ + \begin{cases} + 0&\text{\texttt{'left'}や省略時}\\0.5&\text{\tt 'middle'}\\1&\text{\tt 'right'} + \end{cases} +\] +のいずれかの値をとる. +\end{itemize} +$i$,~$j\in \omega$に対して,\texttt{char\_type[$i$][$j$]} は +文字クラス$i$の文字と$j$の文字の間に挿入されるグルーやカーンを格納している. +\begin{itemize} + \item 間に入るものがカーンであれば,この値は\ +\texttt{[$j$]=\{[1]=<kern\_node>, ratio=<ratio>\}} であり, +<kern\_node>はカーンを表すノードである\footnote{% + バージョン20150420.0以降ではノードのアクセス手法にdirect access + modelを用いているため,ノードそのものを表すユーザーデータではなく, + 内部で参照のために使われる添字(整数)である. +}. + \item グルーであれば,この値は以下のキーを持つテーブルである. + \begin{description} + \item[\texttt{width}, \texttt{stretch}, \texttt{shrink}] + グルーのそれぞれ自然長,伸び量,縮み量をsp単位で表したもの. + \item[\texttt{priority}] バ(ージョン2以降の)JFMでの指定 \texttt{\{<stretch>,<shrink>\}} を + \[ + (\text{<stretch>}+4)\cdot 8+\text{<shrink>}+4 + \] + として0--63の整数にパックしたもの. + \item[\texttt{ratio}, \texttt{kanjiskip\_natural}, \texttt{kanjiskip\_stretch}, \texttt{kanjiskip\_shrink}] + JFM中の同名のフィールドの値がそのまま使われている. + \end{description} +\end{itemize} +\item[ascent\textrm{, }descent] + 縦組時に個々のグリフを90度回転させる場合,そのグリフは(実際の高さ・深さにかかわらず) + 便宜的に高さ\texttt{ascent},深さ\texttt{descent}を持つものだと想定して回転させる. + この仕様は\Pkg{luaotfload}がOpenTypeフォントのVORGテーブルを読まないための暫定的なものである. +\item[chars\_cbcache] +文字クラス決定の処理で.キャッシュとして使われる. +\end{cslist} +%</ja> + +%<*en> +The returned table \verb+new_jfont_info+ also should include these fields, but +you are free to add more fields (to use them in the \texttt{luatexja.find\_char\_class} callback). +The \verb+font_number+ is a font number. +%</en> +%<*ja> +戻り値の \verb+new_jfont_info+ テーブルも上に述べたフィールドをそのまま含まなければならないが, +それ以外にユーザが勝手にフィールドを付け加えることは自由である. +\verb+font_number+ はフォント番号である. +%</ja> + +%<*en> +A good example of this and the next callbacks is the \Pkg{luatexja-otf} + package, supporting \verb+"AJ1-xxx"+ form for Adobe-Japan1 + CID characters in a JFM. This callback doesn't replace any + code of \LuaTeX-ja. +%</en> +%<*ja> +これと次のコールバックの良い使用例は\Pkg{luatexja-otf}パッケージであり, +JFM中でAdobe-Japan1 CIDの文字を \verb+"AJ1-xxx"+ の形で指定するために +用いられている. +%</ja> + +%<en>\item[\texttt{luatexja.find\_char\_class} callback] +%<ja>\item[\texttt{luatexja.find\_char\_class}コールバック] +%<*en> +This callback is called just when \LuaTeX-ja is trying to determine which + character class a character \verb+chr_code+ belongs. +A function used in this callback should be in the following form: +%</en> +%<*ja> +このコールバックは\LuaTeX-jaが \verb+chr_code+ の文字がどの文字クラスに +属するかを決定しようとする際に呼び出される. +このコールバックで呼び出される関数は次の形をしていなければならない: +%</ja> +\begin{lstlisting}[numbers=left] +function (<number> char_class, <table> jfont_info, <number> chr_code) + if char_class~=0 then return char_class + else + .... + return (<number> new_char_class or 0) + end +end +\end{lstlisting} + +%<*en> +The argument \verb+char_class+ is the result of \LuaTeX-ja's default + routine or previous function calls in this callback, hence + this argument may not be 0. Moreover, the returned + \verb+new_char_class+ should be as same as \verb+char_class+ when \verb+char_class+ + is not~0, otherwise you will overwrite the \LuaTeX-ja's + default routine. +%</en> +%<*ja> +引数 \verb+char_class+ は\LuaTeX-jaのデフォルトルーチンか,このコールバックの +直前の関数呼び出しの結果を含んでおり,したがってこの値は0ではないかもしれない. +さらに,戻り値の \verb+new_char_class+ は \verb+char_class+ が非零のときには +\verb+char_class+ の値と同じであるべきで,そうでないときは\LuaTeX-jaの +デフォルトルーチンを書き換えることになる. +%</ja> + +%<en>\item[\texttt{luatexja.set\_width} callback] +%<ja>\item[\texttt{luatexja.set\_width}コールバック] +%<*en> +This callback is called when \LuaTeX-ja is trying to encapsule a + \textbf{JAchar} \textit{glyph\_node}, to adjust its + dimension and position. +%</en> +%<*ja> +このコールバックは\LuaTeX-jaが\textbf{JAchar}の寸法と位置を調節するために +その\textit{glyph\_node}をカプセル化しようとする際に呼び出される. +%</ja> +\begin{lstlisting}[numbers=left] +function (<table> shift_info, <table> jfont_info, <table> char_type) + return <table> new_shift_info +end +\end{lstlisting} + +%<*en> +The argument \verb+shift_info+ and the returned \verb+new_shift_info+ have +\texttt{down} and \texttt{left} fields, which are the amount of shifting + down/left the character in a scaled point. +%</en> +%<*ja> +引数 \verb+shift_info+ と戻り値の \verb+new_shift_info+ は +\texttt{down}と\texttt{left}のフィールドを持ち,これらの値は +文字の下/左へのシフト量(sp単位)である. +%</ja> + +%<*en> +A good example is \Pkg{test/valign.lua}. +After loading this file, the vertical position of glyphs is automatically +adjusted; the ratio $(\hbox{height}:\hbox{depth})$ of glyphs is adjusted +to be that of letters in the character class~0. For example, suppose that +\begin{itemize} +\item The setting of the JFM: $(\hbox{height})=88x$, $(\hbox{depth})=12x$ + (the standard values of Japanese OpenType fonts); +\item The value of the real font: $(\hbox{height})=28y$, $(\hbox{depth})=5y$ + (the standard values of Japanese TrueType fonts). +\end{itemize} +Then, the position of glyphs is shifted up by +%</en> +%<*ja> +良い例が\Pkg{test/valign.lua}である.このファイルが読み込まれた状態では, + JFM内で規定された文字クラス0の文字における$(\hbox{高 + さ}):(\hbox{深さ})$の比になるように,実際のフォントの出力上 + 下位置が自動調整される.例えば, +\begin{itemize} +\item JFM側の設定:$(\hbox{高さ})=88x$, $(\hbox{深さ})=12x$% +(和文OpenTypeフォントの標準値) +\item 実フォント側の数値:$(\hbox{高さ})=28y$, $(\hbox{深さ})=5y$(和文TrueTypeフォントの標準値) +\end{itemize} +となっていたとする.すると,実際の文字の出力位置は,以下の量だけ上にずらされることとなる: +%</ja> +\[ + \frac{88x}{88x+12x} (28y+5y) - 28y = \frac{26}{25}y= 1.04y. +\] +\end{description} + +%<en>\section{Parameters} +%<ja>\section{パラメータ} +\subsection{\cs{ltjsetparameter}} +\label{ssec:param} + +%<*en> +As described before, \cs{ltjsetparameter} and \cs{ltjgetparameter} are +commands for accessing most parameters of \LuaTeX-ja. One of the main +reason that \LuaTeX-ja didn't adopted the syntax similar to that of \pTeX\ +(\textit{e.g.},~\verb+\prebreakpenalty`)=10000+) +is the position of \verb+hpack_filter+ callback in the source +of \LuaTeX, see Section~\ref{sec-para}. +%</en> +%<*ja> +先に述べたように,\LuaTeX-jaの内部パラメータにアクセスするには +\cs{ltjsetparameter}(または \cs{ltjglobalsetparameter})と \cs{ltjgetparameter} を用いる. +\LuaTeX-jaが\pTeX のような文法(例えば,\verb+\prebreakpenalty`)=10000+)を +採用しない理由の一つは,\LuaTeX のソースにおける \verb+hpack_filter+ +コールバックの位置にある.\ref{sec-para}章を参照. +%</ja> + +%<*en> +\cs{ltjsetparameter} and \cs{ltjglobalsetparameter} are commands +for assigning parameters. These take one argument which is a +\texttt{<key>=<value>} list. +The difference between these two commands is the +scope of assignment; +\cs{ltjsetparameter} does a local assignment and +\cs{ltjglobalsetparameter} does a global one. +They also obey the value of \cs{globaldefs}, like other assignments. +%</en> +%<*ja> +\cs{ltjsetparameter} と \cs{ltjglobalsetparameter} はパラメータを +指定するための命令で,\texttt{<key>=<value>}のリストを +引数としてとる.両者の違いはスコープであり, +\cs{ltjsetparameter} はローカルな設定を行うのに対し, +\cs{ltjglobalsetparameter} はグローバルな設定を行う. +また,他のパラメータ指定と同様に \cs{globaldefs} の値にも従う. +%</ja> + +%<*en> +The following is the list of parameters which can be specified by the +\cs{ltjsetparameter} command. [\cs{cs}] indicates the counterpart +in \pTeX, and symbols beside each parameter has the following meaning: +%</en> +%<*ja> +以下は \cs{ltjsetparameter} に指定することができるパラメータの一覧である. +[\cs{cs}]は\pTeX における対応物を示す. +また,それぞれのパラメータの右上の記号には次の意味がある: +%</ja> +\begin{itemize} +%<*en> +\item ``$\ast$'' : values at the end of a paragraph or a hbox are +adopted in the whole paragraph or the whole hbox. +%</en> +%<*ja> +\item ``$\ast$'':段落やhboxの終端での値がその段落/hbox全体で用いられる. +%</ja> +%<*en> +\item ``\dagger'': assignments are always global. +%</en> +%<*ja> +\item ``\dagger'':指定は常にグローバルになる. +%</ja> +\end{itemize} + +\begin{cslist}[style=standard] +\item[\DParam{jcharwidowpenalty}\,=<penalty>$^\ast$] [\cs{jcharwidowpenalty}]\ + +%<*en> +Penalty value for suppressing orphans. This penalty is inserted just + after the last \textbf{JAchar} which is not regarded as a + (Japanese) punctuation mark. +%</en> +%<*ja> +パラグラフの最後の字が孤立して改行されるのを防ぐためのペナルティの値. +このペナルティは(日本語の)句読点として扱われない最後の\textbf{JAchar}の直後に +挿入される. +%</ja> + +\item[\DParam{kcatcode}\,=\{<chr\_code>,<natural number>\}$^\ast$]\ + +%<*en> +An additional attributes which each character whose character code is <chr\_code> has. +At version~20120506.0 or later, the lowermost bit of <natural number> indicates + whether the character is considered as a punctuation mark + (see the description of \Param{jcharwidowpenalty} above). +%</en> +%<*ja> +文字コードが<chr\_code>の文字が持つ付加的な属性値. +バージョン20120506.0以降では,<natural number>の最下位ビットが,その文字が句読点と +みなされるかどうかを表している(上の\Param{jcharwidowpenalty}の記述を参照). +%</ja> + +\item[\DParam{prebreakpenalty}\,=\{<chr\_code>,<penalty>\}$^\ast$] [\cs{prebreakpenalty}]\ + +%<*ja> +文字コード<chr\_code>の\textbf{JAchar}が行頭にくることを抑止するために, + この文字の前に挿入/追加されるペナルティの量を指定する. + +例えば閉じ括弧「〗」は絶対に行頭にきてはならないので, +\begin{lstlisting} +\ltjsetparameter{prebreakpenalty={`〙,10000}} +\end{lstlisting} +と,最大値の10000が標準で指定されている.他にも,小書きのカナなど,絶対禁止とい + うわけではないができれば行頭にはきて欲しくない場合に,0と + 10000の間の値を指定するのも有用であろう. + +\pTeX では,\cs{prebreakpenalty}, \cs{postbreakpenalty}において, +\begin{itemize} +\item 一つの文字に対して,pre, postどちらか一つしか指定することができない% + \footnote{後から指定した方で上書きされる.} +\item pre, post合わせて256文字分の情報を格納することしかできない +\end{itemize} +という制限があったが,\LuaTeX-jaではこれらの制限は解消されている. +%</ja> +%<*en> +Set a penalty which is inserted automatically before the character <chr\_code>, +to prevent a line starts from this character. For example, a line cannot started +with one of closing brackets ``〗'', so \LuaTeX-ja sets +\begin{lstlisting} +\ltjsetparameter{prebreakpenalty={`〙,10000}} +\end{lstlisting} +by default. + +\pTeX\ has following restrictions on \cs{prebreakpenalty} and \cs{postbreakpenalty}, +but they don't exist in \LuaTeX-ja: +\begin{itemize} + \item Both \cs{prebreakpenalty} and \cs{postbreakpenalty} cannot be set +for the same character. + \item We can set \cs{prebreakpenalty} and \cs{postbreakpenalty} up to 256~characters. +\end{itemize} +%</en> + +\item[\DParam{postbreakpenalty}\,=\{<chr\_code>,<penalty>\}$^\ast$] + [\cs{postbreakpenalty}]\ + +%<*ja> +文字コード<chr\_code>の\textbf{JAchar}が行末にくることを抑止するために, + この文字の後に挿入/追加されるペナルティの量を指定する. +%</ja> +%<*en> +Set a penalty which is inserted automatically after the character <chr\_code>, +to prevent a line ends with this character. +%</en> + +\item[\DParam{jatextfont}\,=\{<jfam>,<jfont\_cs>\}$^\ast$] +%<en>[\cs{textfont} in \TeX] +%<ja>[\TeX の \cs{textfont}] +\item[\DParam{jascriptfont}\,=\{<jfam>,<jfont\_cs>\}$^\ast$] +%<en>[\cs{scriptfont} in \TeX] +%<ja>[\TeX の \cs{scriptfont}] +\item[\DParam{jascriptscriptfont}\,=\{<jfam>,<jfont\_cs>\}$^\ast$] +%<en>[\cs{scriptscriptfont} in \TeX] +%<ja>[\TeX の \cs{scriptscriptfont}] +\item[\DParam{yjabaselineshift}\,=<dimen>]\ +\item[\DParam{yalbaselineshift}\,=<dimen>] [\cs{ybaselineshift}] +\item[\DParam{tjabaselineshift}\,=<dimen>]\ +\item[\DParam{talbaselineshift}\,=<dimen>] [\cs{tbaselineshift}] + +\item[\DParam{jaxspmode}\,=\{<chr\_code>,<mode>\}$^\ast$]\ + +%<*en> +Set whether inserting \Param{xkanjiskip} is allowed before/after a \textbf{JAchar} whose character code is <chr\_code>. +The followings are allowed for <mode>: +%</en> +%<*ja> +文字コードが<chr\_code>の\textbf{JAchar}の前/後ろに\Param{xkanjiskip}の +挿入を許すかどうかの設定. +以下の<mode>が許される: +%</ja> +\begin{description} +%<en>\item[0, \texttt{inhibit}] Insertion of \Param{xkanjiskip} is inhibited before the character, nor after the character. +%<ja>\item[0, \texttt{inhibit}] \Param{xkanjiskip}の挿入は文字の前/後ろのいずれでも禁止される. +%<en>\item[1, \texttt{preonly}] Insertion of \Param{xkanjiskip} is allowed before the character, but not after. +%<ja>\item[1, \texttt{preonly}] \Param{xkanjiskip}の挿入は文字の前では許されるが,後ろでは許されない. +%<en>\item[2, \texttt{postonly}] Insertion of \Param{xkanjiskip} is allowed after the character, but not before. +%<ja>\item[2, \texttt{postonly}] \Param{xkanjiskip}の挿入は文字の後ろでは許されるが,前では許されない. +%<en>\item[3, \texttt{allow}] Insertion of \Param{xkanjiskip} is allowed both before the character and after the character. This is the default value. +%<ja>\item[3, \texttt{allow}] \Param{xkanjiskip}の挿入は文字の前/後ろのいずれでも許される.これがデフォルトの値である. +\end{description} +%<*en> +This parameter is similar to the \cs{inhibitxspcode} primitive of \pTeX, but not compatible with \cs{inhibitxspcode}. +%</en> +%<*ja> +このパラメータは\pTeX の \cs{inhibitxspcode} プリミティブと似ているが, +互換性はない. +%</ja> +\item[\DParam{alxspmode}\,=\{<chr\_code>,<mode>\}$^\ast$] [\cs{xspcode}]\ + +%<*en> +Set whether inserting \Param{xkanjiskip} is allowed before/after a + \textbf{ALchar} whose character code is <chr\_code>. + The followings are allowed for <mode>: +%</en> +%<*ja> +文字コードが<chr\_code>の\textbf{ALchar}の前/後ろに\Param{xkanjiskip}の +挿入を許すかどうかの設定. +以下の<mode>が許される: +%</ja> +\begin{description} +%<en>\item[0, \texttt{inhibit}] Insertion of \Param{xkanjiskip} is inhibited before the character, nor after the character. +%<ja>\item[0, \texttt{inhibit}] \Param{xkanjiskip}の挿入は文字の前/後ろのいずれでも禁止される. +%<en>\item[1, \texttt{preonly}] Insertion of \Param{xkanjiskip} is allowed before the character, but not after. +%<ja>\item[1, \texttt{preonly}] \Param{xkanjiskip}の挿入は文字の前では許されるが,後ろでは許されない. +%<en>\item[2, \texttt{postonly}] Insertion of \Param{xkanjiskip} is allowed after the character, but not before. +%<ja>\item[2, \texttt{postonly}] \Param{xkanjiskip}の挿入は文字の後ろでは許されるが,前では許されない. +%<en>\item[3, \texttt{allow}] Insertion of \Param{xkanjiskip} is allowed before the character and after the character. This is the default value. +%<ja>\item[3, \texttt{allow}] \Param{xkanjiskip}の挿入は文字の前/後ろのいずれでも許される.これがデフォルトの値である. +\end{description} +%<*en> +Note that parameters \Param{jaxspmode} and \Param{alxspmode} share a common table, hence these two parameters are synonyms of each other. +%</en> +%<*ja> +\Param{jaxspmode}と\Param{alxspmode}は共通のテーブルを用いているため, +これら2つのパラメータは互いの別名となっていることに注意する. +%</ja> + +\item[\DParam{autospacing}\,=<bool>] [\cs{autospacing}] +\item[\DParam{autoxspacing}\,=<bool>] [\cs{autoxspacing}] +\item[\DParam{kanjiskip}\,=<skip>$^\ast$] [\cs{kanjiskip}]\ + +%<*ja> +デフォルトで2つの\textbf{JAchar}の間に挿入されるグルーである. +通常では,\pTeX と同じようにフォントサイズに比例して変わることはない. +しかし,自然長が \cs{maxdimen} の場合は,例外的に和文フォントのJFM側で指定されている +値を採用(こちらはフォントサイズに比例)することになっている. +%</ja> +%<*en> +The default glue which inserted between two \textbf{JAchar}s. +Changing current Japanese font does not alter this parameter, as \pTeX. + +If the natural width of this parameter is \cs{maxdimen}, \LuaTeX-ja uses +the value which is specified in the JFM for current Japanese font (See Subsection~\ref{ssec:jfm-str}). +%</en> + +\item[\DParam{xkanjiskip}\,=<skip>$^\ast$] [\cs{xkanjiskip}]\ + +%<*ja> +デフォルトで\textbf{JAchar}と\textbf{ALchar}の間に挿入されるグルーである. +\Param{kanjiskip}と同じように,通常ではフォントサイズに比例して変わることはないが, +自然長が \cs{maxdimen} の場合が例外である. +%</ja> +%<*en> +The default glue which inserted between a \textbf{JAchar} and an + \textbf{ALchar}. +Changing current font does not alter this parameter, as \pTeX. + +As \Param{kanjiskip}, if the natural width of this parameter is \cs{maxdimen}, \LuaTeX-ja uses +the value which is specified in the JFM for current Japanese font (See Subsection~\ref{ssec:jfm-str}). +%</en> + + +\item[\DParam{differentjfm}\,=<mode>$^\dagger$]\ + +%<*en> +Specify how glues/kerns between two \textbf{JAchar}s whose JFM (or size) are different. +The allowed arguments are the followings: +%</en> +%<*ja> +JFM(もしくはサイズ)が異なる2つの\textbf{JAchar}の間にグルー/カーンをどのように +入れるかを指定する. +許される値は以下の通り: +%</ja> +\begin{quote} +\texttt{average}, +\texttt{both}, +\texttt{large}, +\texttt{small}, +\texttt{pleft}, +\texttt{pright}, +\texttt{paverage} +\end{quote} +%<*en> +The default value is \texttt{paverage}. \dots +%</en> +%<*ja> +デフォルト値は \texttt{paverage} である. +各々の値による差異の詳細は\ref{ssec:cluster-wa}節の「『右空白』の算出」を参照してほしい. +%</ja> + +\item[\DParam{jacharrange}\,=<ranges>] +\item[\DParam{kansujichar}\,=\{<digit>, <chr\_code>\}$^\ast$] [\cs{kansujichar}] + +\item[\DParam{direction}\,=<dir>\ \hbox{\rm (always local)}]\ + +%<*en> +Assigning to this parameter has the same effect as +\cs{yoko}~(if $\hbox{<dir>}=4$), \cs{tate}~(if $\hbox{<dir>}=3$), +\cs{dtou}~(if $\hbox{<dir>}=1$) or \cs{utod}~(if $\hbox{<dir>}=11$). +If the argument <dir> is not one of 4,~3, 1~nor~11, +the behavior of this assignment is undefined. +%</en> +%<*ja> +組方向を変更する \cs{yoko}~(if $\hbox{<dir>}=4$), \cs{tate}~(if $\hbox{<dir>}=3$), +\cs{dtou}~(if $\hbox{<dir>}=1$), \cs{utod}~(if $\hbox{<dir>}=11$) と同じ役割を持つ. +利用可能な状況もこれら4命令と同一である.引数<dir>が4,~3, 1,~11のいずれでも無いときの +動作は未定義である. +%</ja> + +\end{cslist} + + +\subsection{\cs{ltjgetparameter}} +\label{ssec:getpar} +%<*en> +\cs{ltjgetparameter} is a control sequence for acquiring parameters. It +always takes a parameter name as first argument. +%</en> +%<*ja> +\cs{ltjgetparameter} はパラメータの値を取得するための命令であり, +常にパラメータの名前を第一引数にとる. +%</ja> +\begin{LTXexample} +\ltjgetparameter{differentjfm}, +\ltjgetparameter{autospacing}, +\ltjgetparameter{kanjiskip}, +\ltjgetparameter{prebreakpenalty}{`)}. +\end{LTXexample} + +%<*en> +\emph{The return value of\/ \cs{ltjgetparameter} is +always a string}, which is outputted by \texttt{tex.write()}. +Hence any character other than space~``\texttt{\char32}''~(\texttt{U+0020}) has the category code +12~(other), while the space has 10~(space). +%</en> +%<*ja> +\emph{\cs{ltjgetparameter} の戻り値は常に文字列である.} +これは\texttt{tex.write()}によって出力しているためで,空白「\texttt{\char32}」 +(\texttt{U+0020})を除いた文字のカテゴリーコードは全て12~(other)となる. +一方,空白のカテゴリーコードは10~(space)である. +%</ja> + +\begin{itemize} +\item +%<*en> +If first argument is one of the +following, no additional argument is needed. +%</en> +%<*ja> +第1引数が次のいずれかの場合には,追加の引数は必要ない. +%</ja> +\begin{quote} +\sffamily +jcharwidowpenalty, yjabaselineshift, yalbaselineshift, autospacing, autoxspacing,\\ +kanjiskip, xkanjiskip, differentjfm, direction +\end{quote} +%<*en> +Note that \verb+\ltjgetparameter{autospacing}+~and~\verb+\ltjgetparameter{autoxspacing}+ +returns 1 or 0, not +\texttt{true}~nor~\texttt{false}. +%</en> +%<*ja> +\verb+\ltjgetparameter{autospacing}+ と \verb+\ltjgetparameter{autoxspacing}+ は, +\texttt{true}や\texttt{false}を返すの\emph{ではなく}, +1か0のいずれかを返すことに注意, +%</ja> + +\item +%<*en> +If first argument is one of the +following, an additional argument---a character code, for example---is needed. +%</en> +%<*ja> +第1引数が次のいずれかの場合には,さらに文字コードを第2引数としてとる. +%</ja> +\begin{quote} +\sffamily +kcatcode, prebreakpenalty, postbreakpenalty, jaxspmode, alxspmode +\end{quote} +%<*en> +\verb+\ltjgetparameter{jaxspmode}{...}+~and~\verb+\ltjgetparameter{alxspmode}{...}+ +returns 0,~1, 2,~or~3, instead of \texttt{preonly} etc. +%</en> +%<*ja> +\verb+\ltjgetparameter{jaxspmode}{...}+ や \verb+\ltjgetparameter{alxspmode}{...}+\ +は,\texttt{preonly} などといった文字列ではなく,0から3までの値を返す. +%</ja> + +\item +%<*en> +\verb+\ltjgetparameter{jacharrange}{+<range>\verb+}+ returns \texttt{0} +if ``characters which belong to the character range~<range> are \textbf{JAchar}'', +\texttt{1} if ``\dots~are \textbf{ALchar}''. +Although there is no character range~$-1$, specifying $-1$ to <range> does not cause an + error (returns 1). +%</en> +%<*ja> +\verb+\ltjgetparameter{jacharrange}{+<range>\verb+}+ は,<range>が\textbf{JAchar}達の +範囲ならば0を,そうでなければ1を返す.「$-1$番の文字範囲」は存在しないが,<range>に$-1$を +指定してもエラーは発生しない(1を返す). +%</ja> + +\item +%<*en> +For an integer~<digit> between 0~and~9, + \verb+\ltjgetparameter{kansujichar}{+<digit>\verb+}+ returns the character code +of the result of \cs{kansuji}<digit>. +%</en> +%<*ja> +0--9の数<digit>に対して, +\verb+\ltjgetparameter{kansujichar}{+<digit>\verb+}+ は,\cs{kansuji}<digit>で出力され + る文字の文字コードを返す. +%</ja> + +\item +%<*en> +\verb+\ltjgetparameter{adjustdir}+ returns a integer which represents +the direction of the surrounding vertical list. +As \Param{direction}, the return value 1 means \emph{down-to-up} direction, +3 means \emph{tate} direction (vertical typesetting), +and 4 means \emph{yoko} direction (horizontal typesetting). +%</en> +%<*ja> +\verb+\ltjgetparameter{adjustdir}+ は,周囲のvboxの組方向(言い換えれば, +\cs{vadjust} で用いられる組方向)を表す数値を返す. +\Param{direction}と同様に,1は \cs{dtou} 方向を, +3は縦組みを,4は横組みを表す. +%</ja> + +\item +%<*en> +For an integer~<reg\_num> between 0~and~65535, +\verb+\ltjgetparameter{boxdim}{+<reg\_num>\verb+}+ returns the direction of +\cs{box}<reg\_num>. If this box register is void, the returned value is zero. +%</en> +%<*ja> +0--65535の数<reg\_num>に対して, +\verb+\ltjgetparameter{boxdim}{+<reg\_num>\verb+}+ は,\cs{box}<reg\_num>に +格納されているボックスの組方向を表す.もしこのレジスタが空の場合は,0が返される. +%</ja> + +\item +%<*en> +The following parameter names \emph{cannot be specified} in \cs{ltjgetparameter}. +%</en> +%<*ja> +次のパラメータ名を \cs{ltjgetparameter} に指定することはできない. +%</ja> +\begin{quote} +\sffamily +jatextfont, jascriptfont, jascriptscriptfont, jacharrange +\end{quote} + +\item +%<*en> +\verb+\ltjgetparameter{chartorange}{+<chr\_code>\verb+}+ returns +the range number which <chr\_code> belongs to +(although there is no parameter named ``chartorange''). + +If <chr\_code> is between 0 and 127, this <chr\_code> does not belong to +any character range. In this case, + \verb+\ltjgetparameter{chartorange}{+<chr\_code>\verb+}+ +returns $-1$. + +Hence, one can know whether <chr\_code> is \textbf{JAchar} or not +by the following: +%</en> +%<*ja> +\verb+\ltjgetparameter{chartorange}{+<chr\_code>\verb+}+ によって +<chr\_code>の属する文字範囲の番号を知ることができる. + +<chr\_code>に0--127の値を指定した場合(このとき,<chr\_code>が属する +文字範囲は存在しない)は$-1$が返る. + +そのため,<chr\_code>が\textbf{JAchar}か\textbf{ALchar}かは +次で知ることができる: +%</ja> +\begin{quote} +\ttfamily \verb+\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{+% + <chr\_code>\verb+}}+\\\null\hfill\verb+% 0 if JAchar, 1 if ALchar+ +\end{quote} + +%<*en> +\item Because the returned value is string, the following conditionals do not work +if \Param{kanjiskip} (or~\Param{xkanjiskip}) has the stretch part or the shrink part. +\begin{lstlisting} +\ifdim\ltjgetparameter{kanjiskip}>\z@ ... \fi +\ifdim\ltjgetparameter{xkanjiskip}>\z@ ... \fi +\end{lstlisting} +The correct way is using a temporary register. +\begin{lstlisting} +\@tempskipa=\ltjgetparameter{kanjiskip} \ifdim\@tempskipa>\z@ ... \fi +\@tempskipa=\ltjgetparameter{xkanjiskip}\ifdim\@tempskipa>\z@ ... \fi +\end{lstlisting} +%</en> +%<*ja> +\item 返り値が文字列であることから,\Param{kanjiskip}や\Param{xkanjiskip}を直接 +\ \cs{ifdim} を使って比較することは望ましくない.伸び量や縮み量を持っている時には, +次はエラーを発生させる: +\begin{lstlisting} +\ifdim\ltjgetparameter{kanjiskip}>\z@ ... \fi +\ifdim\ltjgetparameter{xkanjiskip}>\z@ ... \fi +\end{lstlisting} +レジスタに一旦代入するのが良い: +\begin{lstlisting} +\@tempskipa=\ltjgetparameter{kanjiskip} \ifdim\@tempskipa>\z@ ... \fi +\@tempskipa=\ltjgetparameter{xkanjiskip}\ifdim\@tempskipa>\z@ ... \fi +\end{lstlisting} +%</ja> + +\end{itemize} + + +%<*en> +\subsection{Alternative Commands to \cs{ltjsetparameter}} +The basic method to set parameters of \LuaTeX-ja is to use +\cs{ltjsetparameter}~or~\cs{ltjglobalsetparameter}. +However, these commands are slow, because they parse a key-value list, +so several alternative commands are used in \LuaTeX-ja. +\emph{This subsection is not for general \LuaTeX-ja users.} + +\paragraph{Setting \Param{kanjiskip}~or~\Param{xkanjiskip}} +In \Pkg{ltjsclasses}, every size-changing command such as \cs{Large} +changes \cs{kanjiskip}~and~\cs{xkanjiskip}. +But a simple implementation, as the code below, is slow since +two key-value lists are parsed by \cs{ltjsetparameter}: +\begin{lstlisting} + \ltjsetparameter{kanjiskip=0\zw plus .1\zw minus .01\zw} + \@tempskipa=\ltjgetparameter{xkanjiskip} + \ifdim\@tempskipa>\z@ + \if@slide + \ltjsetparameter{xkanjiskip=0.1em} + \else + \ltjsetparameter{xkanjiskip=0.25em plus 0.15em minus 0.06em} + \fi + \fi +\end{lstlisting} + +Hence, \LuaTeX-ja defines more primitive commands, namely \cs{ltj@setpar@global}, +\cs{ltjsetkanjiskip}, and~\cs{ltjsetxkanjiskip}. Here +\begin{quote} + \lstinline+\ltj@setpar@global\ltjsetkanjiskip 10pt+ +\end{quote} +and \lstinline+\ltjsetparameter{kanjiskip=10pt}+ has the same effect. +The actual code of \Pkg{ltjsclasses} is shown below: +\begin{lstlisting} + \ltj@setpar@global + \ltjsetkanjiskip{\z@ plus .1\zw minus .01\zw} + \@tempskipa=\ltjgetparameter{xkanjiskip} + \ifdim\@tempskipa>\z@ + \if@slide + \ltjsetxkanjiskip.1em + \else + \ltjsetxkanjiskip.25em plus .15em minus .06em + \fi + \fi +\end{lstlisting} + +Note that using \cs{ltjsetkanjiskip}~or~\cs{ltjsetxkanjiskip} alone, +that is, without executing \cs{ltj@setpar@global} in advance, is \emph{not} supported. +%</en> + +%<*ja> +\subsection{\cs{ltjsetparameter} の代替} +原則として各種内部パラメータの設定には \cs{ltjsetparameter} もしくは +\ \cs{ltjglobalsetparameter}\ を用いることになるが, +\cs{ltjsetparameter} の実行には時間がかかるという難点があり, +\LuaTeX-ja の内部ではより高速に実行できる別の形式を用いている. +\emph{本節は一般利用者むけの内容ではない.} + +\paragraph{\Param{kanjiskip}, \Param{xkanjiskip}の設定} +\pLaTeXe 新ドキュメントクラスでは, +\begin{lstlisting} +\def\@setfontsize#1#2#3{% + ... + \kanjiskip=0zw plus .1zw minus .01zw + \ifdim\xkanjiskip>\z@ + \if@slide \xkanjiskip=0.1em \else + \xkanjiskip=0.25em plus 0.15em minus 0.06em + \fi + \fi} +\end{lstlisting} +と,フォントサイズを変更するごとに \cs{kanjiskip}, \cs{xkanjiskip} を変更している. +この \cs{@setfontsize} は文書の中で多数回実行されるので. +\LuaTeX-ja 用に素直に書き換えた +\begin{lstlisting} + \ltjsetparameter{kanjiskip=0\zw plus .1\zw minus .01\zw} + \@tempskipa=\ltjgetparameter{xkanjiskip} + \ifdim\@tempskipa>\z@ + \if@slide + \ltjsetparameter{xkanjiskip=0.1em} + \else + \ltjsetparameter{xkanjiskip=0.25em plus 0.15em minus 0.06em} + \fi + \fi +\end{lstlisting} +としたのではタイプセットが遅くなってしまう. +そこで,\cs{ltjsetparameter} の中で +\begin{itemize} +\item \cs{globaldefs} の値を読み取る \cs{ltj@setpar@global} +\item \Param{kanjiskip} の設定を行う \cs{ltjsetkanjiskip} +\item \Param{xkanjiskip} の設定を行う \cs{ltjsetxkanjiskip} +\end{itemize} +を独立させ,\Pkg{ltjsclasses}では, +\begin{lstlisting} + \ltj@setpar@global + \ltjsetkanjiskip{\z@ plus .1\zw minus .01\zw} + \@tempskipa=\ltjgetparameter{xkanjiskip} + \ifdim\@tempskipa>\z@ + \if@slide + \ltjsetxkanjiskip.1em + \else + \ltjsetxkanjiskip.25em plus .15em minus .06em + \fi + \fi +\end{lstlisting} +としている. +\cs{ltj@setpar@global}を直前に実行せず,単独で +\cs{ltjsetkanjiskip}, \cs{ltjsetxkanjiskip}を実行することは想定されていないので注意. + + + +\paragraph{ベースライン補正量の設定} +\pLaTeX の\Pkg{ascmac}パッケージでは,縦組の欧文ベースライン補正量の一時待避・復帰処理に +\ \cs{@saveybaselineshift}\ という寸法レジスタを用い +\begin{lstlisting} +\@savetbaselineshift\tbaselineshift\tbaselineshift\z@ +... +\tbaselineshift\@savetbaselineshift +\end{lstlisting} +という処理を行っている. + +これを\LuaTeX-ja 用に \cs{ltjsetparameter} を使って書き直すと, +\begin{lstlisting} +\@savetbaselineshift\ltjgetparameter{talbaselineshift} +\ltjsetparameter{talbaselineshift=\z@} +... +\ltjsetparameter{talbaselineshift=\@savetbaselineshift} +\end{lstlisting} +となる. + +さて,縦組の欧文ベースライン補正量\Param{talbaselineshift}は, +実際には \cs{ltj@tablshift} という属性レジスタに格納されている +(\ref{sec-para}\nobreak 節参照).属性レジスタは長さではなく整数値を格納する\footnote{% + 従って,\texttt{\textbackslash @savetbaselineshift=\textbackslash ltj@tablshift}\ + のように記述することはできない.属性レジスタを \cs{tbaselineshift} という名称にしなかっ + たのはそのためである. +}ものであり,\cs{ltj@tablshift} は補正量を sp 単位で保持することから, +上記のコードと同じ内容をより速い以下のコードで実現することができる. +\begin{lstlisting} +\@savetbaselineshift\ltj@tablshift sp% +\ltj@tablshift\z@ +... +\ltj@tablshift\@savetbaselineshift +\end{lstlisting} +この手法は \Pkg{ascmac} パッケージの\LuaTeX-ja対応パッチ \Pkg{lltjp-tascmac.sty} で +実際に用いられている.\Pkg{lltjp-tascmac.sty} は自動的に読み込まれるので, +ユーザは何も気にせず普通に \Pkg{ascmac} パッケージを \cs{usepackage} で読みこめば良い. +%</ja> + + +%<en>\section{Other Commands for plain \TeX\ and \LaTeXe} +%<ja>\section{plainでも\LaTeX でも利用可能なその他の命令} +%<en>\subsection{Commands for compatibility with \pTeX} +%<ja>\subsection{\pTeX 互換用命令} + +%<*en> +The following commands are implemented for compatibility with \pTeX. +Note that the former five commands don't support JIS~X~0213, but only JIS~X~0208. +The last \cs{kansuji} converts an integer into its Chinese numerals. +%</en> +%<*ja> +以下の命令は\pTeX との互換性のために実装されている.そのため,JIS~X~0213には対応せず, +\pTeX と同じようにJIS~X~0208の範囲しかサポートしていない. +%</ja> +\begin{center} +\cs{kuten}, \cs{jis}, \cs{euc}, \cs{sjis}, \cs{ucs}, \cs{kansuji} +\end{center} +%<*en> +These six commands takes an internal integer, and returns a \emph{string}. +%</en> +%<*ja> +これら6命令は内部整数を引数とするが,実行結果は\textbf{文字列}であることに注意. +%</ja> +\begin{LTXexample} +\newcount\hoge +\hoge="2423 %" +\the\hoge, \kansuji\hoge\\ +\jis\hoge, \char\jis\hoge\\ +\kansuji1701 +\end{LTXexample} + +%<*en> +To change characters of Chinese numerals for each digit, set \Param{kansujichar} parameter: +\begin{LTXexample} +\ltjsetparameter{kansujichar={1,`壹}} +\ltjsetparameter{kansujichar={7,`漆}} +\ltjsetparameter{kansujichar={0,`零}} +\kansuji1701 +\end{LTXexample} +%</en> + + +\subsection{\cs{inhibitglue}} +%<*en> +\cs{inhibitglue} suppresses the insertion of \textbf{JAglue}. +The following is an example, using a special JFM that there will be a glue between +the beginning of a box and ``あ'', and also between ``あ''~and~``ウ''. +%</en> +%<*ja> +\cs{inhibitglue} は\textbf{JAglue}の挿入を抑制する. +以下は,ボックスの始めと「あ」の間,「あ」「ウ」の間にグルーが入る特別なJFMを用いた例で +ある. +%</ja> + +\begin{LTXexample}[width=0.4\textwidth] +\jfont\g=file:KozMinPr6N-Regular.otf:jfm=test \g +\fbox{\hbox{あウあ\inhibitglue ウ}} +\inhibitglue\par\noindent あ1 +\par\inhibitglue\noindent あ2 +\par\noindent\inhibitglue あ3 +\par\hrule\noindent あoff\inhibitglue ice +\end{LTXexample} + +%<*en> +With the help of this example, we remark the specification of \cs{inhibitglue}: +%</en> +%<*ja> +この例を援用して,\cs{inhibitglue} の仕様について述べる. +%</ja> +\begin{itemize} +%<*en> +\item The call of \cs{inhibitglue} in the (internal) vertical mode is + simply ignored. +%</en> +%<*ja> +\item \emph{\cs{inhibitglue} の垂直モード中での呼び出しは意味を持たない}\footnote{% + この点は\TeX~Live~2014での\pTeX における \cs{inhibitglue} の仕様変更と同じである. +}. +4行目の入力で有効にならないのは,\cs{inhibitglue} の時点では垂直モードであり, +\cs{noindent} の時点で水平モードになるからである. +%</ja> + +%<*en> +\item The call of \cs{inhibitglue} in the (restricted) horizontal + mode is only effective on the spot; does not get over boundary of + paragraphs. Moreover, \cs{inhibitglue} cancels ligatures and + kernings, as shown in the last line of above example. +%</en> +%<*ja> +\item \cs{inhibitglue} の(制限された)水平モード中での呼び出しはその場でのみ + 有効であり,段落の境界を乗り越えない. + さらに,\cs{inhibitglue} は上の例の最終行のように(欧文における)リガチャとカーニングを + 打ち消す.これは,\cs{inhibitglue} が内部的には「現在のリスト中にwhatsitノードを + 追加する」ことを行なっているからである. +%</ja> + +%<*en> +\item The call of \cs{inhibitglue} in math mode is just ignored. +%</en> +%<*ja> +\item \cs{inhibitglue} を数式モード中で呼び出した場合はただ無視される. +%</ja> + +%<*ja> +\item \LaTeX で\LuaTeX-ja を使用する場合は, +\cs{inhibitglue} の代わりとして \verb+\<+ を使うことができる. +既に \verb+\<+ が定義されていた場合は,\LuaTeX-ja の読み込みで強制的に上書きされるので +注意すること. +%</ja> +\end{itemize} + + +\subsection{\cs{ltjfakeboxbdd}, \cs{ltjfakeparbegin}} +%<*en> +Sometimes \texttt{'parbdd'}~and~\texttt{'boxbdd'} specifications~look like ``fail'', +especially in paragraphs inside list environments. +This is because \cs{everypar} inserts some nodes such as boxes and kerns, so +the ``first letter'' in a paragraph is in fact not the first letter. +%</en> +%<*ja> +リスト環境内での\cs{item}で始まる各項目などでは, +「段落最初の鍵括弧が余計に半角字下げされる」など, +JFMにある\texttt{'parbdd'}, \texttt{'boxbdd'}の指定が見かけ上破綻していることがある. + +これは\TeX が\cs{everypar}を用いて段落開始時に記号類や空白などを挿入してしまっているため, +段落最初の鍵括弧が実際には段落最初のノードではないことに起因する.以下に例を示した. +%</ja> +\begin{LTXexample}[width=0.3\textwidth] +\parindent1\zw +\noindent ああああああああ\par % for comparison +「ああああああ \par % normal paragraph + +\everypar{\null} +「ああああああ \par % ??? +\end{LTXexample} +%<*en> +\cs{ltjfakeboxbdd}~and~\cs{ltjfakeparbegin} primitives resolve this situation. +\begin{itemize} + \item \cs{ltjfakeparbegin} creates a node which indicates + ``beginning of an indented paragraph'' to the insertion process of \textbf{JAglue}. + \item \cs{ltjfakeboxbdd} creates a node which indicates + ``beginning/ending of a box'' to the insertion process of \textbf{JAglue}. +\end{itemize} +As an example, the example above can be improved as follows: +%</en> +%<*ja> +\cs{ltjfakeboxbdd}, \cs{ltjfakeparbegin}はこの状況を改善する命令である. +実際には\cs{everypar}の末尾にこれらを追加するという使い方がほとんどになるだろう. +\begin{itemize} + \item \cs{ltjfakeparbegin}は,実行された箇所が「インデントあり段落の開始」であると\LuaTeX-jaの + 和文処理グルー挿入処理に認識させる.この命令の直前に\textbf{JAchar}があった場合, + この文字の後ろに入るグルー等の処理については未定義である + \footnote{% + この命令と同等の内容は,\cs{dirrctlua}の形で\Pkg{ltjsclasses}内で以前から使われていた. + 一般ユーザでも利用しやすくするため,バージョン20170505.0で新たに命令として定義した. + }. + \item \cs{ltjfakeboxbdd}は,実行された箇所が「ボックスの先頭と末尾」であると\LuaTeX-jaの + 和文処理グルー挿入処理に認識させる. +\end{itemize} +例えば,先ほどの例に対して適用すると,次のようになる. +%</ja> +\begin{LTXexample}[width=0.3\textwidth] +\parindent1\zw +\noindent ああああああああ\par % for comparison +「ああああああ \par % normal paragraph + +\everypar{\null\ltjfakeparbegin} +「ああああああ \par +\end{LTXexample} + + +\subsection{\cs{ltjdeclarealtfont}} +\label{ssec:altfont} +%<*en> +Using \cs{ltjdeclarealtfont}, one can ``compose'' more than one Japanese fonts. +This \cs{ltjdeclarealtfont} uses in the following form: +\begin{quote} +\ttfamily \textbackslash ltjdeclarealtfont<base\_font\_cs><alt\_font\_cs>\{<range>\} +\end{quote} +where <base\_font\_cs>~and~<alt\_font\_cs> are defined by \cs{jfont}. +Its meaning is +\begin{quote} +If the current Japanese font is <base\_font\_cs>, characters which belong to <range> +is typeset by another Japanese font <alt\_font\_cs>, instead of <base\_font\_cs>. +\end{quote} +Here <range> is a comma-separated list of character codes, but also accepts negative integers: +$-n$~($n≥1$) means that all characters of character classes~$n$, with respect to JFM used +by <base\_font\_cs>. Note that characters which do not exist in <alt\_font\_cs> are +ignored. + +For example, if \cs{hoge} uses \texttt{jfm-ujis.lua}, the standard JFM of \LuaTeX-ja, +then +\begin{lstlisting} +\ltjdeclarealtfont\hoge\piyo{"3000-"30FF, {-1}-{-1}} +\end{lstlisting} +does +\begin{quote} +If the current Japanese font is \cs{hoge}, \texttt{U+3000}--\texttt{U+30FF} +and characters in class~1 (ideographic opening brackets) +are typeset by \cs{piyo}. +\end{quote} +%</en> +%<*ja> +\cs{jfont} の書式を見ればわかるように,基本的には\LuaTeX-jaにおける1つの和文フォントに +使用出来る「実際のフォント」は1つである. +しかし,\cs{ltjdeclarealtfont} を用いると,この原則から外れることができる. + +\cs{ltjdeclarealtfont} は以下の書式で使用する: +\begin{quote} +\ttfamily \textbackslash ltjdeclarealtfont<base\_font\_cs><alt\_font\_cs>\{<range>\} +\end{quote} +これは「現在の和文フォント」が<base\_font\_cs>であるとき, +<range>に属する文字は<alt\_font\_cs>を用いて組版される,という意味である. +\begin{itemize} + \item <base\_font\_cs>, <alt\_font\_cs>は +\cs{jfont} によって定義された和文フォントである. + \item <range>は文字コードの範囲を表すコンマ区切りのリストであるが, + 例外として負数$-n$は「<base\_font\_cs>のJFMの文字クラス$n$に属する全ての文字」 + を意味する. + +<range>中に<alt\_font\_cs>中に実際には存在しない文字が指定された場合は, +その文字に対する設定は無視される. +\end{itemize} + +例えば,\cs{hoge} のJFMが\LuaTeX-ja標準の +\ \texttt{jfm-ujis.lua} であった場合, +\begin{lstlisting} +\ltjdeclarealtfont\hoge\piyo{"3000-"30FF, {-1}-{-1}} +\end{lstlisting} +は「\cs{hoge} を利用しているとき, +\texttt{U+3000}--\texttt{U+30FF}と +文字クラス1(開き括弧類)中の文字だけは \cs{piyo} を用いる」 +ことを設定する.\verb+{-1}-{-1}+ という変わった指定の仕方をしているのは, +普通に \texttt{-1} と指定したのでは正しく$-1$と読み取られないという +マクロの都合による. +%</ja> + +%<*ja> +\subsection{\cs{ltjalchar} と \cs{ltjjachar}} +文字コードが$\text{<chr\_code>}~(\geq 128=\mathtt{0x80})$の文字を +\ \cs{char} プリミティブを使い \cs{char}<chr\_code> として出力させると, +その文字の属する文字範囲(\ref{ssec:setrange}節参照)によって +\textbf{ALchar}か\textbf{JAchar}か,つまり欧文フォントで出力されるか和文フォントで出力され +るかが決まる. + +文字範囲の設定を無視し,文字コードが$\text{<chr\_code>}~(\geq 128=\mathtt{0x80})$の文字を強制的に +\textbf{ALchar}, \textbf{JAchar}で出力する命令がそれぞれ +\ \cs{ltjalchar},~\cs{ltjjachar} である.使用方法は \cs{char} と同じく +\ \cs{ltjalchar}<chr\_code>, \cs{ltjjachar}<chr\_code>とすればよい. +<chr\_code>が127以下の場合は,\cs{ltjjachar} であっても\textbf{ALchar}として出力されること +に注意. + +以下は\ref{ssec:setrange}節に載せた例に,\cs{char} の動作を追加したものである. +\begin{LTXexample}[width=0.25\textwidth] +\gtfamily\large % default, ALchar, JAchar +¶, \char`¶, \ltjalchar`¶, \ltjjachar`¶\\ % default: ALchar +α, \char`α, \ltjalchar`α, \ltjjachar`α % default: JAchar +\end{LTXexample} +%</ja> + +%<en>\section{Commands for \LaTeXe} +%<ja>\section{\LaTeXe 用の命令} + +%<*en> +\subsection{Loading Japanese fonts in \LaTeXe} +\label{ssec:ltx-jfm} +From versoin~20190107, +\emph{\LuaTeX-ja does not load Japanese fonts for horizontal direction and + that for vertical direction at same time}, +to reduce the number of loaded fonts. +This will save time for typesetting and memory consumption of Lua side (\cite{tc18ltja}). + +\begin{itemize} + \item \cs{selectfont} loads (and chooses) only the Japanese font for current direction, + and does not load the Japanese font for other direction + (\LuaTeX-ja only detects its size and JFM, to calculate the amount of shifting the baseline). + + \item Direction changing commands (\cs{yoko},~\cs{tate}, \cs{dtou},~\cs{utod}) are patched to + include the following process: + \begin{quote} + If the Japanese font for new direction is not loaded, + \LuaTeX-ja loads it automatically. + \end{quote} + Original commands are saved as \cs{ltj@@orig@yoko} etc. + + \item Specifying Japanese font command which is + defined by \cs{jfont},~\cs{tfont}, or~\cs{DeclareFixedFont} directly + actually loads (and selects) the Japanese font. + For example, \textbf{JAchar}s in \cs{box0} will be typeset in \cs{HOGE}, + in the following code: +\begin{lstlisting} + % in horizontal direction (\yoko) + \DeclareFixedFont\HOGE{JT3}{gt}{m}{n}{12} % JT3: for vertical direction + \HOGE + \setbox0=\hbox{\tate あいう} +\end{lstlisting} + \end{itemize} +%</en> + +%<*ja> +\subsection{\LaTeXe 下での和文フォントの読み込み} +\label{ssec:ltx-jfm} +バージョン20190107以降では,\LaTeXe の下で\LuaTeX-jaを使用した際に, +\emph{横組用和文フォントと縦組み用和文フォントを両方一度に読み込み・選択せずに, + 実際にそれぞれを使う組方向になったときに行う}という方針にした. +これは実際に読み込むフォント数を削減することで, +タイプセットにかかる時間と(主にLuaの)メモリ消費を削減するためである(\cite{tc18ltja}). + +\begin{itemize} + \item \cs{selectfont}は横組用・縦組用和文フォントのうち,現在の組方向で使う方を + 実際に読み込み(・選択し),そうでない方は「フォントサイズとJFMのみ\LuaTeX-jaが把握している状態」 + (以下,\emph{JFM把握状態})とする. + + \item 組方向変更命令\cs{yoko},~\cs{tate}, \cs{dtou},~\cs{utod}には + \begin{quote} + 新たな組方向での和文フォントが読み込まれていない(JFM把握状態)ならば, + 現在のエンコーディング・ファミリ・シリーズ・シェイプから改めて読み込む(または選択する) + \end{quote} + 処理が付け加えられている. + もとの「組方向を変更するだけ」の命令は\cs{ltj@@orig@yoko}のように\texttt{ltj@@orig@}が前についた + 命令に保存されている. + + \item \cs{jfont},~\cs{tfont},~\cs{DeclareFixedFont}で定義された和文フォントは + その時点で実際にフォントが読み込まれる.すなわち,以下のコードにおいて, + \cs{box0}中の\textbf{JAchar}は\cs{HOGE}でタイプセットされる. +\begin{lstlisting} + % in horizontal direction (\yoko) + \DeclareFixedFont\HOGE{JT3}{gt}{m}{n}{12} % JT3: for vertical direction + \HOGE + \setbox0=\hbox{\tate あいう} +\end{lstlisting} + \end{itemize} +%</ja> + +%<en>\subsection{Patch for NFSS2} +%<ja>\subsection{NFSS2へのパッチ} +\label{ssec:nfsspat} + +%<*en> +Japanese patch for NFSS2 in \LuaTeX-ja +is based on \texttt{plfonts.dtx} which plays the same role in \pLaTeXe. +We will describe +commands which are not described in Subsection~\ref{ssec:chgfnt}. +%</en> +%<*ja> +\LuaTeX-jaのNFSS2への日本語パッチは +\pLaTeXe で同様の役割を果たす \texttt{plfonts.dtx} をベースに, +和文エンコーディングの管理等をLuaで書きなおしたものである. +ここでは\ref{ssec:chgfnt}節で述べていなかった命令について +記述しておく. +%</ja> + +\begin{cslist}% +\item[\normalfont\bfseries % +%<ja>追加の長さ変数達 +%<en>additonal dimensions +] +%<*en> +Like \pLaTeXe, \LuaTeX-ja defines the following dimensions +for information of current Japanese font: +%</en> +%<*ja> +\pLaTeXe と同様に,\LuaTeX-jaは「現在の和文フォントの情報」を格納する長さ変数 +%</ja> +\begin{quote} + \cs{cht}~(height), \cs{cdp}~(depth), \cs{cHT}~(sum of former two),\\ + \cs{cwd}~(width), \cs{cvs}~(lineskip), \cs{chs}~(equals to \cs{cwd}) +\end{quote} +%<en>and its \cs{normalsize} version: +%<ja>と,その \cs{normalsize} 版である +\begin{quote} + \cs{Cht}~(height), \cs{Cdp}~(depth), + \cs{Cwd}~(width), \\\cs{Cvs}~(equals to \cs{baselineskip}), + \cs{Chs}~(equals to \cs{cwd})% +%<en>. +\end{quote} +%<*ja> +を定義している.なお,\cs{cwd} と \cs{zw},また +\cs{cHT} と \cs{zh} は一致しない可能性がある.なぜなら, +\cs{cwd},~\cs{cHT} は「あ」の寸法から決定されるのに対し, +\cs{zw} と \cs{zh} はJFMに指定された値に過ぎないからである. +%</ja> +%<*en> +Note that \cs{cwd}~and~\cs{cHT} may differ from \cs{zw}~and~\cs{zh} +respectively. +On the one hand the former dimensions are determined from the character ``あ'', +but on the other hand \cs{zw}~and~\cs{zh} are specified by JFM. +%</en> + + +\item[\cs{DeclareYokoKanjiEncoding}\{<encoding>\}\{<text-settings>\}\{<math-settings>\}] +%<en>\ \\[\dimexpr-\medskipamount-2\baselineskip\relax] +%<ja>\ \\[\dimexpr-2\baselineskip\relax] +\item[\cs{DeclareTateKanjiEncoding}\{<encoding>\}\{<text-settings>\}\{<math-settings>\}] + +%<*en> +In NFSS2 under \LuaTeX-ja, distinction between alphabetic fonts + and Japanese fonts are only made by their + encodings. For example, encodings OT1 and T1 are encodings for + alphabetic fonts, and Japanese fonts cannot + have these encodings. These command define a new encoding + scheme for Japanese font families. +%</en> +%<*ja> +\LuaTeX-jaのNFSS2においては,欧文フォントと和文フォントは +そのエンコーディングによってのみ区別される. +例えば,OT1とT1のエンコーディングは欧文フォントのエンコーディングであり, +和文フォントはこれらのエンコーディングを持つことはできない. +これらコマンドは横組用・縦組用和文フォントのための新しいエンコーディングを +それぞれ定義する. +%</ja> + +\item[\cs{DeclareKanjiEncodingDefaults}\{<text-settings>\}\{<math-settings>\}] +%<en>\ \\[\dimexpr-\medskipamount-2\baselineskip\relax] +%<ja>\ \\[\dimexpr-2\baselineskip\relax] +\item[\cs{DeclareKanjiSubstitution}\{<encoding>\}\{<family>\}\{<series>\}\{<shape>\}] +%<en>\ \\[\dimexpr-\medskipamount-2\baselineskip\relax] +%<ja>\ \\[\dimexpr-2\baselineskip\relax] +\item[\cs{DeclareErrorKanjiFont}\{<encoding>\}\{<family>\}\{<series>\}\{<shape>\}\{<size>\}] + +%<*en> +The above 3~commands are just the counterparts for \cs{DeclareFontEncodingDefaults} and~others. +%</en> +%<*ja> +上記3つのコマンドはちょうどNFSS2 の \cs{DeclareFontEncodingDefaults} などに対応するものである. +%</ja> + +\item[\cs{reDeclareMathAlphabet}\{<unified-cmd>\}\{<al-cmd>\}\{<ja-cmd>\}] + +% ToDo: en +%<*ja> +和文・欧文の数式用フォントファミリを一度に変更する命令を作成する. +具体的には,欧文数式用フォントファミリ変更の命令<al-cmd>(\cs{mathrm} 等)と,和文数式用フォ + ントファミリ変更の命令<ja-cmd>(\cs{mathmc} 等)の2つを同時に行う命令として + <unified-cmd>を(再)定義する.実際の使用では<unified-cmd>と + <al-cmd>に同じものを指定する,すなわち,<al-cmd>で和文側も変 + 更させるようにするのが一般的と思われる. + +本命令は +\begin{center}\tt +<unified-cmd>\{<arg>\}\quad$\longrightarrow$\quad +(<al-cmd>の1段展開結果)\{<ja-cmd>の1段展開結果)\{<arg>\}\} +\end{center} +と定義を行うので,使用には注意が必要である: +%<en>\vspace{-\medskipamount} +\begin{itemize} +\item <al-cmd>,~<ja-cmd>は既に定義されていなければならない. + \cs{reDeclareMathAlphabet}\\の後に +両命令の内容を再定義しても,<unified-cmd>の内容にそれは反映されない. +\item <al-cmd>,~<ja-cmd>に\verb+\@mathrm+などと \texttt{@} をつけた命令を指定した時の動作は保証できない. +\end{itemize} +%</ja> + +\item[\cs{DeclareRelationFont}\{<ja-encoding>\}\{<ja-family>\}\{<ja-series>\}\{<ja-shape>\}\\* + \null\hfill\{<al-encoding>\}\{<al-family>\}\{<al-series>\}\{<al-shape>\}] +%<*en> +This command sets the ``accompanied'' alphabetic font (given by the latter 4~arguments) +with respect to a Japanese font given by the former 4~arguments. +%</en> +%<*ja> +いわゆる「従属欧文」を設定するための命令である.前半の4引数で表される和文フォントに対して, +そのフォントに対応する「従属欧文」のフォントを後半の4引数により与える. +%</ja> +\item[\cs{SetRelationFont}] +%<*en> +This command is almost same as \cs{DeclareRelationFont}, except that this command does a local +assignment, where \cs{DeclareRelationFont} does a global assignment. +%</en> +%<*ja> +このコマンドは \cs{DeclareRelationFont} とローカルな指定であることを除いて +ほとんど同じである(\cs{DeclareRelationFont} はグローバル). +%</ja> + +\item[\cs{userelfont}] +%<*en> +(Only)~at the next call of \cs{selectfont}, + change current alphabetic font encoding/family/\dots\ to the `accompanied' alphabetic + font family with respect to current Japanese font family, + which was set by + \cs{DeclareRelationFont} or \cs{SetRelationFont}. + + The following is an example of \cs{SetRelationFont} and \cs{userelfont}: +%</en> +%<*ja> +次回(のみ)の\cs{selectfont}の実行時に,現在の欧文フォントのエンコーディング/ファミリ/…… を, +\cs{DeclareRelationFont} か \cs{SetRelationFont} で指定された +現在の和文フォントに対応する「従属欧文」フォントに変更する. + + 以下に \cs{SetRelationFont} と \cs{userelfont} の例を +紹介しておこう.\cs{userelfont} の使用によって,「abc」の部分のフォントが +Latin Modern Sans Serif (TU/lmss/m/n) に変わっていることがわかる. +%</ja> +\begin{LTXexample}[width=0.3\textwidth] +\makeatletter +\SetRelationFont{JY3}{\k@family}{m}{n}{TU}{lmss}{m}{n} + % \k@family: current Japanese font family +\userelfont\selectfont あいうabc +\end{LTXexample} + +\item[\cs{adjustbaseline}] +%<*en> +In \pLaTeXe, \cs{adjustbaseline} sets \cs{tbaselineshift} +to match the vertical center of ``M'' and that of ``あ'' in vertical typesetting: +\[ +\text{\cs{tbaselineshift}} \leftarrow +\frac{(h_{\text{M}}+d_{\text{M}}) - (h_{\text{あ}}+d_{\text{あ}})}2 + + d_{\text{あ}} - d_{\text{M}}, +\] +where $h_{a}$~and~$d_{a}$ denote the height of ``$a$'' and the depth, respectively. +In \LuaTeX-ja, this \cs{adjustbaseline} does similar task, namely setting the + \Param{talbaselineshift} parameter. +If the \LaTeX\ is 2015/10/01 release or later, \LuaTeX-ja use a Japanese +character whose character class is zero, instead of `あ'. +%</en> +%<*ja> +\pLaTeXe では,\cs{adjustbaseline} は縦組時に「M」と「あ」の中心線を一致させるために, +\cs{tbaselineshift} を設定する役割を持っていた: +\[ +\text{\cs{tbaselineshift}} \leftarrow +\frac{(h_{\text{M}}+d_{\text{M}}) - (h_{\text{あ}}+d_{\text{あ}})}2 + + d_{\text{あ}} - d_{\text{M}}, +\] +ここで,$h_{a}$,~$d_{a}$はそれぞれ「$a$」の高さ・深さを表す. +\LuaTeX-jaにおいても\cs{adjustbaseline} は同様に\Param{talbaselineshift}パラメータの調整処 + 理を行っている. + +同時に,これも\pLaTeXe の \cs{adjustbaseline} で同様の処理が行われていたが, +「漢」の寸法を元に(本節の最初に述べた,小文字で始まる)\cs{cht}, \cs{cwd} +といった長さ変数を設定する. + +なお,\LaTeX が2015/10/01版以降の場合は,「あ」「漢」の代わりに +「文字クラス0の和文文字」を用いる. +%</ja> + +\item[\cs{fontfamily}\{<family>\}] +%<*en> +As in \LaTeXe, this command changes current font family (alphabetic, Japanese,~\emph{or both}) +to <family>. See Subsection~\ref{ssec:fontfamilycmd} for detail. +%</en> +%<*ja> +元々の\LaTeXe におけるものと同様に,このコマンドは現在のフォントファミリ(欧文, +和文,\emph{もしくは両方})を<family>に変更する.詳細は\ref{ssec:fontfamilycmd}節を参照すること. +%</ja> + + +\begin{figure}[!tb] +\begin{LTXexample}[pos=b] +\DeclareKanjiFamily{JY3}{edm}{} +\DeclareFontShape{JY3}{edm}{m}{n} {<-> s*KozMinPr6N-Regular:jfm=ujis;}{} +\DeclareFontShape{JY3}{edm}{m}{green}{<-> s*KozMinPr6N-Regular:jfm=ujis;color=007F00}{} +\DeclareFontShape{JY3}{edm}{m}{blue} {<-> s*KozMinPr6N-Regular:jfm=ujis;color=0000FF}{} +\DeclareAlternateKanjiFont{JY3}{edm}{m}{n}{JY3}{edm}{m}{green}{"4E00-"67FF,{-2}-{-2}} +\DeclareAlternateKanjiFont{JY3}{edm}{m}{n}{JY3}{edm}{m}{blue}{ "6800-"9FFF} +{\kanjifamily{edm}\selectfont +日本国民は、正当に選挙された国会における代表者を通じて行動し、……} +\end{LTXexample} +%<ja>\caption{\cs{DeclareAlternateKanjiFont} の使用例} +%<en>\caption{An example of \cs{DeclareAlternateKanjiFont}} +\label{fig:altkanji} +\end{figure} + +\item[\cs{DeclareAlternateKanjiFont}\{<base-encoding>\}\{<base-family>\}\{<base-series>\}\{<base-shape>\}\\ + \null\hfill\{<alt-encoding>\}\{<alt-family>\}\{<alt-series>\}\{<alt-shape>\}\{<range>\}] +%<*ja> +\ref{ssec:altfont}節の\ +\cs{ltjdeclarealtfont} と同様に,前半の4引数の +和文フォント(基底フォント)のうち<range>中の文字を +第5から第8引数の和文フォントを使って組むように指示する. +使用例を図\nobreak\ref{fig:altkanji}に載せた. + +\begin{itemize} + \item +\cs{ltjdeclarealtfont} では基底フォント・置き換え先和文フォントはあらかじめ定義されてい + ないといけない(その代わり即時発効)であったが, +\cs{DeclareAlternateKanjiFont} の設定が +実際に効力が発揮するのは,書体変更やサイズ変更を行った時, +あるいは(これらを含むが)\cs{selectfont} が実行された時である. + \item +段落やhboxの最後での設定値が段落/hbox全体にわたって通用する点や, +<range>に負数$-n$を指定した場合,それが「基底フォントの文字クラス$n$に属する文字全体」 +と解釈されるのは \cs{ltjdeclarealtfont} と同じである. +\end{itemize}% +%</ja> +%<*en> +As \cs{ltjdeclarealtfont}~(Subsection~\ref{ssec:altfont}), +characters in <range> of the Japanese font (we say the \emph{base font}) +which specified by first 4 arguments are typeset +by the Japanese font which specified by fifth to eighth arguments +(we say the \emph{alternate font}). +An example is shown in \autoref{fig:altkanji}. + +\begin{itemize} + \item +In \cs{ltjdeclarealtfont}, the base font and the alternate font must be already defined. +But this \cs{DeclareAlternateKanjiFont} is not so. +In other words, \cs{DeclareAlternateKanjiFont} is effective only after +current Japanese font is changed, or only after \cs{selectfont} is executed. + \item \dots +\end{itemize}% +\vspace{-\medskipamount} +%</en> +\end{cslist} + + +%<*en> +Furthermore, \LuaTeX-ja applies patches which enables NFSS2 commands, +such~as \cs{DeclareSymbolFont}~and~\cs{SetSymbolFont}, to specify +Japanee fonts as math fonts. + +Specifying \texttt{disablejfam} option in \cs{usepackage} prevents +applying these patches. +Hence one cannot write Japanese Characters in math mode directly +if \texttt{disablejfam} option is specified. +The code below does not work either: +\begin{lstlisting} +\DeclareSymbolFont{mincho}{JY3}{mc}{m}{n} +\DeclareSymbolFontAlphabet{\mathmc}{mincho} +\end{lstlisting} +%</en> +%<*ja> +この他にも,標準では +\cs{DeclareSymbolFont}, \cs{SetSymbolFont} などの命令で +(NFSS2の枠組みで)数式フォントとして日本語フォントを使えるようにするためのパッチを当てている. + +一方,\texttt{disablejfam}オプション指定時には,これらのパッチを当てないので +\begin{lstlisting} +\DeclareSymbolFont{mincho}{JY3}{mc}{m}{n} +\DeclareSymbolFontAlphabet{\mathmc}{mincho} +\end{lstlisting} +のように設定しても,数式モード中に直に日本語を記述することはできない. +\verb|$\mathmc{あ}$| のように \cs{mathmc} で囲んでもできない. +%</ja> + +%<en>\subsection{Detail of \cs{fontfamily} command} +%<ja>\subsection{\cs{fontfamily}コマンドの詳細} +\label{ssec:fontfamilycmd} +%<*en> +In this subsection, we describe when \cs{fontfamily}<family> changes current +Japanese/alphabetic font family. Basically, current Japanese fotn family is changed to +<family> if it is recognized as a Japanese font family, and similar with alphabetic font +family. There is a case that current Japanese/alphabetic font family are both changed to +<family>, and another case that <family> isn't recognized as a Japanese/alphabetic font +family either. + +\paragraph{Recognition as Japanese font family} +First, Whether Japanese font family will be changed is determined in following order. +This order is very similar to \cs{fontfamily} in \pLaTeXe, but we re-implemented in Lua. +We use an auxiliary list~$N_{\mathrm{J}}$. +%</en> +%<*ja> +本節では,\cs{fontfamily}<family> がいつ和文/欧文フォントファミリを変更するかについて解説 +する.基本的には,<family>が和文フォントファミリだと認識されれば和文側が,欧文フォントファ +ミリだと認識されれば欧文側が変更される.どちらとも認識されれば和文・欧文の両方が変わるこ +とになるし,当然どちらとも認識されないこともある. + +\paragraph{和文フォントファミリとしての認識} +まず,<family>が和文フォントファミリとして認識されるかは以下の順序で決定される. +これは\pLaTeXe の \cs{fontfamily} にとても似ているが,ここではLuaによって実装している. +補助的に「和文フォントファミリではないと認識された」ファミリを格納したリスト$N_{\mathrm{J}}$を用いる. +%</ja> +\begin{enumerate} +%<*en> +\item If the family~<family> has been defined already by \cs{DeclareKanjiFamily}, + <family> is recognized as a Japanese font family. + Note that <family> need not be defined under \emph{current} Japanese font encoding. +%</en> +%<*ja> +\item ファミリ<family>が既に \cs{DeclareKanjiFamily} によって定義されている場合, + <family>は和文フォントファミリであると認識される. + ここで,<family>は現在の和文フォントエンコーディングで定義されていなくてもよい. +%</ja> +%<*en> +\item If the family~<family> has been listed in a list~$N_{\mathrm{J}}$, this means + that <family> is not a Japanese font family. +%</en> +%<*ja> +\item ファミリ<family>がリスト$N_{\mathrm{J}}$に既に含まれていれば,それは + <family>が和文フォントファミリではないことを意味する. +%</ja> +%<*en> +\item If the \Pkg{luatexja-fontspec} package is loaded, we stop here, and <family> is not + recognized as a Japanese font family. + + If the \Pkg{luatexja-fontspec} package is \emph{not} loaded, +now \LuaTeX-ja looks whether there exists a Japanese font encoding~<enc> such that + a font definition named \texttt{<enc><family>.fd} (the file name is + all lowercase) exists. If so, <family> is recognized as a Japanese font family (the font definition file won't be loaded here). + If not, <family> is not a Japanese font family, and + <family> is appended to the list~$N_{\mathrm{J}}$. +%</en> +%<*ja> +\item もし\Pkg{luatexja-fontspec}パッケージが読み込まれていれば,ここで終了であり, +<family>は和文フォントファミリとして認識されないことになる. + +もし\Pkg{luatexja-fontspec}パッケージが読み込まれていなければ,和文エンコーディング<enc>で +フォント定義ファイル\texttt{<enc><family>.fd}(ファイル名は全て小文字)が存在するようなも + のがあるかどうかを調べる. +存在すれば,<family>は和文フォントファミリと認識される(フォント定義ファイルは読み込まれな + い). +存在しなければ,<family>は和文フォントファミリでないと認識され,リスト$N_{\mathrm{J}}$に<family>を追加することでそれを記憶する. + +%</ja> +\end{enumerate} + +%<*en> +\paragraph{Recognition as alphabetic font family} +Next, whether alphabetic font family will be changed is determined in following order. +We use auxiliary lists $F_{\mathrm{A}}$~and~$N_{\mathrm{A}}$, +%</en> +%<*ja> +\paragraph{欧文フォントファミリとしての認識} +同様に,<family>が和文フォントファミリとして認識されるかは以下の順序で決定される. +補助的に「欧文フォントファミリと既に認識された」ファミリのリスト$F_{\textrm{A}}$と, +「欧文フォントファミリではないと認識された」ファミリを格納したリスト$N_{\mathrm{A}}$を用いる. +%</ja> + +\begin{enumerate} +%<*en> +\item If the family~<family> has been listed in a list~$F_{\mathrm{A}}$, + <family> is recognized as an alphabetic font family. +%</en> +%<*ja> +\item ファミリ<family>がリスト$F_{\mathrm{A}}$に既に含まれていれば, + <family>は欧文フォントファミリと認識される. +%</ja> +%<*en> +\item If the family~<family> has been listed in a list~$N_{\mathrm{A}}$, this means + that <family> is not an alphabetic font family. +%</en> +%<*ja> +\item ファミリ<family>がリスト$N_{\mathrm{A}}$に既に含まれていれば,それは + <family>が欧文フォントファミリではないことを意味する. +%</ja> +%<*en> +\item If there exists an alphabetic font encoding such that the family~<family> has been + defined under it, <family> is recognized as an alphabetic font family, and + to memorize this, <family> is appended to the list~$F_{\mathrm{A}}$. +%</en> +%<*ja> +\item ある欧文フォントエンコーディング下でファミリ<family>が定義されていれば, + <family>は欧文フォントファミリと認識され,リスト$F_{\mathrm{A}}$に<family>を追加することでこのことを記憶する. +%</ja> +%<*en> +\item Now \LuaTeX-ja looks whether there exists an alphabetic font encoding~<enc> such that + a font definition named \texttt{<enc><family>.fd} (the file name is + all lowercase) exists. If so, current alphabetic font family will be changed to + <family>~(the font definition file won't be loaded here). + If not, current alphabetic font family won't be changed, and + <family> is appended to the list~$N_{\mathrm{A}}$. +%</en> +%<*ja> +\item 最終段階では,欧文エンコーディング<enc>で +フォント定義ファイル\texttt{<enc><family>.fd}(ファイル名は全て小文字)が存在するようなも + のがあるかどうかを調べる. +存在すれば,<family>は欧文フォントファミリと認識される(フォント定義ファイルは読み込まれない). +存在しなければ,<family>は欧文フォントファミリと認識されないので,リスト$N_{\mathrm{A}}$に + <family>を追加してそのことを記憶する. +%</ja> +\end{enumerate} + +%<*en> +Also, each call of \cs{DeclareFontFamily} \emph{after} loading of \LuaTeX-ja makes +the second argument (family) is appended to the list~$F_{\mathrm{A}}$. +%</en> +%<*ja> +また,\cs{DeclareFontFamily}が\LuaTeX-jaの読み込み後に実行された場合は, +第2引数(ファミリ名)が自動的に$F_{\mathrm{A}}$に追加される. +%</ja> + +%<*en> +The above order is very similar to \cs{fontfamily} in \pLaTeXe, but more complicated (clause~3.). +This is because \pLaTeXe\ is a \emph{format} however \LuaTeX-ja is not, +hence \LuaTeX-ja does not know calls of \cs{DeclareFontFamily} \emph{before} itself is +loaded. +%</en> +%<*ja> +以上の方針は\pLaTeXe における \cs{fontfamily} にやはり類似しているが,3.が加わり若干複雑になっている. +それは\pLaTeXe がフォーマットであるのに対し\LuaTeX-jaはそうでないため, +\LuaTeX-jaは自身が読み込まれる前にどういう\cs{DeclareFontFamily}の呼び出しがあったか +把握できないからである. +%</ja> + +%<en>\paragraph{Remarks} +%<ja>\paragraph{注意} +%<*en> +Of course, there is a case that <family> is not recognized as a Japanese font family, nor +an alphabetic font family. +In this case, \LuaTeX-ja treats ``the argument <family> is wrong'', so +set both current alphabetic and Japanese font family to <family>, +to use the default family for font substitution. +%</en> +%<*ja> +さて,引数によっては,「和文フォントファミリとも欧文フォントファミリも認識されなかった」 +という事態もあり得る. + この場合,引数<family>は不正だった,ということになるので, +和文・欧文の両方のフォントファミリを<family>に設定し,代用フォントが使われるに任せることにする. +%</ja> + +%<*en> +\subsection{Notes on \cs{DeclareTextSymbol}} +From \LaTeX~2017/01/01, the standard encoding of \LuaLaTeX\ is changed to the \texttt{TU} +encoding. This menas that symbols defined by \texttt{T1}~and~\texttt{TS1} encodings can be used +without loading any package. To produces these symbols in alphabetic fonts in \LuaTeX-ja, +\LuaTeX-ja patches \cs{DeclareTextSymbol}, and reloads \texttt{tuenc.def}. + +Under original definition of \cs{DeclareTextSymbol}, +internal commands which is defined by \cs{DeclareTextSymbol} (such as \cs{T1\cs{textquotedblleft}}) +are \textit{chardef} tokens. However, this no longer holds in \LuaTeX-ja; +for example, the meaning of \cs{TU\cs{textquotedblleft}} is \cs{ltjalchar8220\ltjalchar"2423 }. +%</en> +%<*ja> +\subsection{\cs{DeclareTextSymbol}使用時の注意} +\LaTeX~(2017/01/01)以降では,\texttt{TU}エンコーディングが標準となり,特に何もしなくても +\texttt{T1},~\texttt{TS1}エンコーディングで定義されていた記号類が +使えるようになった.\LuaTeX-jaではこれらの命令によって記号が欧文フォントで出力されるようにするため, +\cs{DeclareTextSymbol}命令を改変し,そして\texttt{TU}エンコーディングの定義である +\texttt{tuenc.def}を再読込している. + +従来は \cs{DeclareTextSymbol} で内部的に定義された\cs{T1\cs{textquotedblleft}}といった命令は +\textit{chardef}トークンであった.しかし前段落で述べた改変によりもはやそうではなくなっており,例えば +\cs{TU\cs{textquotedblleft}}は \cs{ltjalchar8220\ltjalchar"2423 } という定義になっている.%" +%</ja> + +\begin{table}[t] + \centering\small + \caption{strut}\label{tab:strutbox}\medskip + \begin{tabular}{llcccl} + \toprule + \textbf{box}&\textbf{direction}&\textbf{width}&\textbf{height}&\textbf{depth} + &\textbf{user command}\\ + \midrule + \cs{ystrutbox}&yoko&0&0.7\cs{baselineskip}&0.3\cs{baselineskip}&\cs{ystrut}\\\midrule + \cs{tstrutbox}&tate, utod&0&0.5\cs{baselineskip}&0.5\cs{baselineskip}&\cs{tstrut}\\\midrule + \cs{dstrutbox}&dtou&0&0.7\cs{baselineskip}&0.3\cs{baselineskip}&\cs{dstrut}\\\midrule + \cs{zstrutbox}&---&0&0.7\cs{baselineskip}&0.3\cs{baselineskip}&\cs{zstrut}\\\bottomrule + \end{tabular} +\end{table} +%<*en> +\subsection{\cs{strutbox}} +As \pLaTeX~(2017/04/08 or later), \cs{strutbox} is \emph{a macro} which is expanded to one of +\cs{ystrutbox},~\cs{tstrutbox},~and~\cs{dstrutbox} +(all of them are shown in \autoref{tab:strutbox}), according to the current direction. +Similarly, \cs{strut} now uses one of these boxes. +%</en> +%<*ja> +\subsection{\cs{strutbox}} +\pLaTeX~2017/04/08以降と同じように, +\cs{strutbox}は現在の組方向によって\cs{ystrutbox}, \cs{tstrutbox}, \cs{dstrutbox}の +いずれかに展開される\emph{マクロ}となっている(これらについては\autoref{tab:strutbox}参照). +同様に\cs{strut}もこの3\nobreak ボックスのいずれかを組方向によって使い分けるようになっている. + +\cs{zstrutbox}はutod方向(\pTeX でいう縦数式ディレクション)で使われる支柱ボックスであるが, +実際に使われるのは\cs{zstrut}が明示的に発行された時,そして +\Pkg{lltjext}パッケージで追加される組方向指定で \texttt{<u>} を指定した時,および +周囲が縦組の状況で \texttt{<z>} を指定した時に限られている. +%</ja> + +%<*en> +\section{Addon packages} +\LuaTeX-ja has several addon packages. +These addons are written as \LaTeX\ packages, but +\Pkg{luatexja-otf} and~\Pkg{luatexja-adjust} can be loaded in plain \LuaTeX\ +by \cs{input}. +%</en> +%<*ja> +\section{拡張パッケージ} +\LuaTeX-jaには(動作には必須ではないが)自由に読み込める拡張が付属している. +これらは\LaTeX のパッケージとして制作しているが, +\Pkg{luatexja-otf}と\Pkg{luatexja-adjust}についてはplain \LuaTeX でも\ +\cs{input} で読み込み可能である. +%</ja> +\subsection{\Pkg{luatexja-fontspec}} +\label{ssec:fontspec2} +%<*en> +As described in Subsection~\ref{ssec:fontspec}, this optional package +provides the counterparts for several commands defined in the +\Pkg{fontspec} package (requires \Pkg{fontspec}~v2.4). +In addition to OpenType font features in the original \Pkg{fontspec}, +the following ``font features'' specifications are allowed for +the commands of Japanese version: +%</en> +%<*ja> +\ref{ssec:fontspec}節で述べたように,この追加パッケージは\Pkg{fontspec}% +パッケージで定義されているコマンドに対応する和文フォント用のコマンドを提供する. + +\Pkg{fontspec}パッケージで指定可能な各種OpenType機能に加えて,和文版のコマンドには +以下の「フォント機能」を指定することができる: +%</ja> + + +\begin{cslist} +\item[CID=<name>\textrm{, }JFM=<name>\textrm{, }JFM-var=<name>] + +%<*en> +These 3 keys correspond to \texttt{cid}, \texttt{jfm} and +\texttt{jfmvar} keys for \cs{jfont}~and~\cs{tfont} respectively. +See Subsections~\ref{ssec:jfont} and \ref{ssec:psft} for details + of \texttt{cid}, \texttt{jfm} and +\texttt{jfmvar} keys. + +The \texttt{CID} key is effective only when with \texttt{NoEmbed} +described below. The same JFM cannot be used in both horizontal Japanese fonts and + vertical Japanese fonts, hence the \texttt{JFM} key +will be actually used in \texttt{YokoFeatures}~and~\texttt{TateFeatures} keys. +%</en> +%<*ja> +これら3つのキーはそれぞれ \cs{jfont},~\cs{tfont}に対する +\texttt{cid}, \texttt{jfm}, \texttt{jfmvar}キーとそれぞれ対応する. +\texttt{cid}, \texttt{jfm}, \texttt{jfmvar}キーの詳細は\ref{ssec:jfont}節 + と\ref{ssec:psft}節を参照. + +\texttt{CID} キーは下の \texttt{NoEmbed} と合わせて用いられたときのみ有効である. +また,横組用JFMと縦組用JFMは共用できないため,実際に \texttt{JFM} キーを用いる際は +後に述べる\ \texttt{YokoFeatures} キーや \texttt{TateFeatures}\ の中で用いる +ことになる. +%</ja> + +\item[NoEmbed] +%<*en> +By specifying this key, one can use ``name-only'' Japanese font which +will not be embedded in the output PDF file. See Subsection~\ref{ssec:psft}. +%</en> +%<*ja> +これを指定することで,PDFに埋め込まれない「名前だけ」のフォントを指定することが +できる.\ref{ssec:psft}節を参照. +%</ja> + +\begin{figure}[!tb] +\begin{LTXexample}[width=0.25\textwidth] +\jfontspec[ + YokoFeatures={Color=007F00}, TateFeatures={Color=00007F}, + TateFont=KozGoPr6N-Regular +]{KozMinPr6N-Regular} +\hbox{\yoko 横組のテスト}\hbox{\tate 縦組のテスト} +\addjfontfeatures{Color=FF0000} +\hbox{\yoko 横組}\hbox{\tate 縦組} +\end{LTXexample} +%<ja>\caption{\texttt{TateFeatures} 等の使用例} +%<en>\caption{An example of \texttt{TateFeatures} etc.} +\label{fig:yokotate-fontspec} +\end{figure} + +\item[Kanjiskip=<bool>] +%<*ja> +\pageref{pg:ltjksp}ページで説明した \verb+\jfont+ 中での \texttt{ltjksp} 指定と +同一の効力を持ち, +JFM中における \texttt{kanjiskip\_natural}, \texttt{kanjiskip\_stretch},\ +\texttt{kanjiskip\_shrink}キー(\pageref{pg:ksp_nat}ページ)の有効/無効を切り替える. +標準値は \texttt{true} である. +%</ja> + +\item[TateFeatures=\{<features>\}\textrm{, }TateFont=<font>] +%<*en> +The \texttt{TateFeatures} key specifies font features which are only turned~on in +vertical writing, such as \texttt{Style=VerticalKana}~(\texttt{vkna} feature). +Similarly, the \texttt{TateFont} key specifies the Japanese font which will be used only + in vertical writing. +A demonstrarion is shown in \autoref{fig:yokotate-fontspec}. +%</en> +%<*ja> +縦組において使用されるフォントや,縦組においてのみ適用されるフォント機能達を +指定する.使用例は\autoref{fig:yokotate-fontspec}参照. +%</ja> + +\item[YokoFeatures=\{<features>\}] +%<*en> +The \texttt{YokoFeatures} key specifies font features which are only turned~on in +horizontal writing,. +A demonstrarion is shown in \autoref{fig:yokotate-fontspec}. +%</en> +%<*ja> +同様に,横組においてのみ適用されるフォント機能達を +指定する.使用例は\autoref{fig:yokotate-fontspec}参照. +%</ja> + + +\begin{figure}[!tb] +\begin{LTXexample}[pos=b] +\jfontspec[ + AltFont={ + {Range="4E00-"67FF, Color=007F00}, + {Range="6800-"9EFF, Color=0000FF}, + {Range="3040-"306F, Font=KozGoPr6N-Regular}, + } +]{KozMinPr6N-Regular} +日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、 +諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、…… +\end{LTXexample} +%<ja>\caption{\texttt{AltFont} の使用例} +%<en>\caption{An example of \texttt{AltFont}} +\label{fig:altkanji-fontspec} +\end{figure} + +\item[AltFont] + +%<*en> +As \cs{ltjdeclarealtfont}~(Subsection~\ref{ssec:altfont}) and +\cs{DeclareAlternateKanjiFont}~(Subsection~\ref{ssec:nfsspat}), +with this key, one can typeset some Japanese characters +by a different font and/or using different features. +The \texttt{AltFont} feature takes a comma-separated list of comma-separated lists, +as the following: +%</en> +%<*ja> +\ref{ssec:altfont}節の \cs{ltjdeclarealtfont} や, +\ref{ssec:nfsspat}節の \cs{DeclareAlternateKanjiFont} と同様に, +このキーを用いると一部の文字を異なったフォントや機能たちを使って組むことができる. +\texttt{AltFont} キーに指定する値は,次のように二重のコンマ区切りリストである: +%</ja> +\begin{lstlisting}[escapechar=\#] +AltFont = { + ... + { Range=#\LARG range>#, #\LARG features>#}, + { Range=#\LARG range>#, Font=#\LARG font~name>#, #\LARG features># }, + { Range=#\LARG range>#, Font=#\LARG font~name># }, + ... +} +\end{lstlisting} +%<*en> +Each sublist should have the \texttt{Range} key +(sublist which does not contain \texttt{Range} key is simply ignored). +A demonstrarion is shown in \autoref{fig:altkanji-fontspec}. +%</en> +%<*ja> +各部分リストには \texttt{Range} キーが必須である(含まれない部分リストは +単純に無視される).指定例は\autoref{fig:altkanji-fontspec}に示した. +%</ja> +\end{cslist} + +%<*ja> +なお,\Pkg{luatexja-fontspec} 読み込み時には和文フォント定義ファイル% +\texttt{<ja-enc><family>.fd}は全く参照されなくなる. +%</ja> + + +%<*en> +\paragraph{Remark on \texttt{AltFont}, \texttt{YokoFeatures}, \texttt{TateFeatures} keys} +\leavevmode\par +In \texttt{AltFont},~\texttt{YokoFeatures},~\texttt{TateFeatures} keys, +one cannot specify per-shape settings such as \texttt{BoldFeatures}. +For example, +\begin{lstlisting} +AltFont = { + { Font=HogeraMin-Light, BoldFont=HogeraMin-Bold, + Range="3000-"30FF, BoldFeatures={Color=007F00} } +} +\end{lstlisting} +does \emph{not} work. Instead, one have to write +\begin{lstlisting} +UprightFeatures = { + AltFont = { { Font=HogeraMin-Light, Range="3000-"30FF, } }, +}, +BoldFeatures = { + AltFont = { { Font=HogeraMin-Bold, Range="3000-"30FF, Color=007F00 } }, +} +\end{lstlisting} + +On the other hand, \texttt{YokoFeatures}, \texttt{TateFeatures} and \texttt{TateFont} +keys can be specified in each list in the \texttt{AltFont} key. Also, +one can specify \texttt{AltFont} inside \texttt{YokoFeatures},~\texttt{TateFeatures}. + +Note that features which are specified in \texttt{YokoFeatures}~and~\texttt{TateFeatures} +are always interpreted \emph{after} other ``direction-independent'' features. +This explains why \cs{addjfontfeatures} at~line~6 in~\autoref{fig:yokotate-fontspec} +has no effect, because a color specification is already done in +\texttt{YokoFeatures}~and~\texttt{TateFeatures} keys. +%</en> +%<*ja> +\paragraph{\texttt{AltFont}, \texttt{YokoFeatures}, \texttt{TateFeatures} 等の制限} +\texttt{AltFont},~\texttt{YokoFeatures},~\texttt{TateFeatures}の各キーは +シェイプ別に指定されるべきものであり, +内部では \texttt{BoldFeatures} などのシェイプ別の指定は行うことが出来ない. +例えば. +\begin{lstlisting} +AltFont = { + { Font=HogeraMin-Light, BoldFont=HogeraMin-Bold, + Range="3000-"30FF, BoldFeatures={Color=007F00} } +} +\end{lstlisting} +のように指定することは出来ず, +\begin{lstlisting} +UprightFeatures = { + AltFont = { { Font=HogeraMin-Light, Range="3000-"30FF, } }, +}, +BoldFeatures = { + AltFont = { { Font=HogeraMin-Bold, Range="3000-"30FF, Color=007F00 } }, +} +\end{lstlisting} +のように指定しなければならない. + +一方,\texttt{AltFont} キー内の各リストでは +\ \texttt{YokoFeatures},~\texttt{TateFeatures} 及び \texttt{TateFont} キーを +指定することは可能であり.また\ \texttt{YokoFeatures},~\texttt{TateFeatures} キーの +中身に \texttt{AltFont} を指定することができる. + +また,\autoref{fig:yokotate-fontspec}後半部では6行目の色の指定が効かず, +2行目で指定した\ \texttt{YokoFeatures},~\texttt{TateFeatures}\ による色の指定が有効になっ +たままである.これは\emph{\ \texttt{YokoFeatures},~\texttt{TateFeatures}\ による +OpenType機能指定は +組方向に依存しないOpenType機能の指定より後に解釈される}からである. + +%</ja> + + +\subsection{\Pkg{luatexja-otf}} +\label{ssec:ltjotf} +%<*en> +This optional package supports typesetting glyphs +by specifying a CID number. +The package \Pkg{luatexja-otf} offers the following 2~low-level +commands: +%</en> +%<*ja> +この追加パッケージはCID番号による文字の出力をサポートする. +\Pkg{luatexja-otf}は以下の2つの低レベルコマンドを提供する: +%</ja> +\begin{cslist} +\item[\cs{CID}\{<number>\}] +%<*en> +Typeset a glyph whose CID number is <number>. +If the Japanese font is neither Adobe-Japan1,~Adobe-GB1, Adobe-CNS1, +Adobe-Korea1,~nor~Adobe-KR CID-keyed font, +\LuaTeX-ja treats that <number> is a CID number of Adobe-Japan1 character collection, +and tries to typeset a ``most suitable glyph''. +%</en> +%<*ja> +CID番号が<number>の文字を出力する. +もし現在の和文フォントがAdobe-Japan1,~Adobe-GB1, Adobe-CNS1, Adobe-Korea1,~Adobe-KRの + いずれのCID-keyed fontでもない場合,<number>はAdobe-Japan1のCID番号であると解釈し + 「適切なグリフ」\footnote{% + 特に縦組用グリフのCID番号を指定した場合は(LuaTeX-ja 20190504.0以降では若干改良されているが) + 意図しない結果になる可能性が高い. + なお,バージョン20190708.0以降では,CIDからグリフへの選択にグリフ名の情報を使用していない. + また,フォントにIVDコレクションAdobe-Japan1が含まれていれば,その情報を用いて + グリフを選択する. +}を出力する. +%</ja> + +\item[\cs{UTF}\{<hex\_number>\}] +%<*en> +Typeset a character whose character code is <hex\_number> (in hexadecimal). +This command is similar to \verb+\char"+<hex\_number>,\ %" +but please remind remarks below. +%</en> +%<*ja> +文字コードが(16進で)<hex\_number>の文字を出力する. +このコマンドは \verb+\char"+<hex\_number>と似ているが,下の注意を参照すること.%" +%</ja> +\end{cslist} + +%<*ja> +このパッケージは,マクロ集 \texttt{luatexja-ajmacros.sty}\footnote{\Pkg{otf}パッケージ付属の井上浩一氏によるマクロ集 +\texttt{ajmacros.sty} に対して +漢字コードをUTF-8にしたり,plain \LuaTeX でも利用可能にするという +修正を加えたものである.}\ も自動的に読み込む. +\texttt{luatexja-ajmacros.sty} は, +そのため,\Pkg{luatexja-otf} を読みこめば \texttt{ajmacros.sty} マクロ集にある \cs{aj半角} などのマクロもそのまま使うことができる. +%</ja> +%<*en> +This package automatically loads \texttt{luatexja-ajmacros.sty}, which is slightly +modified version of \texttt{ajmacros.sty}\footnote{Useful macros by iNOUE Koich!, for the +\Pkg{japanese-otf} package.}. +Hence one can use macros which sre defined in \texttt{ajmacros.sty}, such as~\cs{aj半角}. +%</en> + +%<en>\paragraph{Remarks} +%<ja>\paragraph{注意} +%<*en> +Characters by \cs{CID} and \cs{UTF} commands are different from +ordinary characters in the following points: +%</en> +%<*ja> +\cs{CID} と \cs{UTF} コマンドによって出力される文字は +以下の点で通常の文字と異なる: +%</ja> +\begin{itemize} +%<*en> +\item Always treated as \textbf{JAchar}s. +%</en> +%<*ja> +\item 常に\textbf{JAchar}として扱われる. +%</ja> +%<*en> +\item In vertical direction, \texttt{vert}/\texttt{vrt2} feature are automatically applied to + characters by \cs{UTF}, regardless these feature are not activated in current Japanese font. +%</en> +%<*ja> +\item 縦組時には,現在の縦組用和文フォントで \texttt{vert}/\texttt{vrt2} 機能が + 有効か無効かを問わず,\cs{UTF} で出力される文字にはこれらのOpenType機能が働いた字形になる. +%</ja> +%<*en> +\item Processing codes for supporting other OpenType features (for example, + glyph replacement and kerning) by the \Pkg{luaotfload} package + is not performed to these characters. +%</en> +%<*ja> +\item その他のOpenType機能(例えばグリフ置換やカーニング)をサポートするための + \Pkg{luaotfload}パッケージのコードはこれらの文字には働かない. +%</ja> +\end{itemize} + +%<en>\paragraph{Additional syntax of JFM} +%<ja>\paragraph{JFMへの記法の追加} + +%<*en> +The package \Pkg{luatexja-otf} extends the syntax of JFM; the entries of \texttt{ +chars} table in JFM now allows a string in the form +\verb+'AJ1-xxx'+, which stands for the character +whose CID number in Adobe-Japan1 is \verb+xxx+. + +This extended notation is used in the standard JFM \texttt{jfm-ujis.lua} +to typeset halfwidth Hiragana glyphs (CID~516--598) in halfwidth. +%</en> +%<*ja> +\Pkg{luatexja-otf}パッケージを読み込むと, +JFMの\texttt{chars}テーブルのエントリとして \verb+'AJ1-xxx'+ の形の文字列が +使えるようになる.これはAdobe-Japan1におけるCID番号が \verb+xxx+ の文字を表す. + +この拡張記法は,標準JFM~\texttt{jfm-ujis.lua}で,半角ひらがなのグリフ(CID~516--598)を +正しく半角幅で組むために利用されている. +%</ja> + +\subsection{\Pkg{luatexja-adjust}} +\label{ssec:adj} +\begin{figure}[t] +\def\sq{% + \hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{% + \hskip\dimexpr-.5\zw-.2pt\vrule width.4pt height.08\zw depth.12\zw% + \hskip\dimexpr.5\zw-.2pt\relax}\hss}} +\def\sb{\hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{% + ■\hskip\dimexpr-.5\zw-.2pt\vrule width.4pt height.08\zw depth.12\zw% + \hskip\dimexpr.5\zw-.2pt\relax}\hss}} +\newbox\gridbox +\def\outbox#1{{\Large% + \ltjsetparameter{kanjiskip=0pt plus .2\zw minus .2\zw}% + \setbox\gridbox=\hbox to 20\zw{\sq\sq\sq\sq\sb\sq\sq\sq\sq\sb\sq\sq\sq\sq\sb\sq\sq\sq\sq\sb}% + \hbox{\textcolor{cyan}{\copy\gridbox}\hskip-20\zw% + \vbox{\hsize=20\zw\noindent\leftskip0pt\rightskip0pt\parfillskip0pt#1}\vrule}% +}} + +{\centering +\begin{tabular}{lc} +\toprule +no adjustment&\outbox{以上の原理は,「包除原理」とよく呼ばれるが\hskip-.5\zw\null}\\ +without priority&% +\ltjdisableadjust +\outbox{以上の原理は,「包除原理」とよく呼ばれるが}% +\ltjenableadjust\\ +with priority&% +\outbox{以上の原理は,「包除原理」とよく呼ばれるが} +%<en>\ltjdisableadjust +\\ +\bottomrule +\end{tabular}\par} +\medskip + +\fakefn{}{The value of +\Param{kanjiskip} is 0\,pt${}^{+1/5\,\mathrm{em}}_{-1/5\,\mathrm{em}}$ in this figure, +for making the difference obvious.} +%<ja>\caption{行長調整}\label{fig:adj} +%<en>\caption{Line adjustment}\label{fig:adj} +\end{figure} + + +%<*en> +(see Japanese version of this manual) +%</en> +%<*ja> +この追加パッケージは以下の機能を提供する.詳細な仕様については\ref{sec-adjspec}章を参照してほしい. +\begin{description} + \item[行末文字の位置調整] + \pTeX では,(是非はともかく)「行末の読点はぶら下げか二分取りか全角取りのいずれかに」のように + 行末文字と実際の行末の位置関係を2通り以上にすることは面倒であった. + 和文フォントメトリックだけでは「常に行末の読点はぶら下げ」といったことしかできず, + 前の文に書いたことを実現するには + \begin{lstlisting} +\def\。{% + \penalty10000 % 禁則ペナルティ + \hbox to0pt{。\hss}\penalty0 % ぶら下げの場合 + \kern.5\zw\penalty0 % 二分取りの場合 + \kern.5\zw\penalty0 % 全角取りの場合 +} +\end{lstlisting} + のような命令を定義し,文中の全ての句点を \lstinline+\。+ で書くことが必要だった. + + \Pkg{luatexja-adjust}パッケージは,上で述べた行末文字と実際の行末との位置関係を + 2通り以上から自動的に選択する機能を提供する. + \pdfTeX と同じように,「\TeX による行分割の後で行末文字の位置を補正する」方法と + 「行分割の過程で行末文字の位置を考慮に入れる」方法を選べるようにした + (\Pkg{luatexja-adjust}パッケージの既定では前者). + + \item[優先順位付きの行長調整] + \pTeX では,行長調整において優先度の概念が存在しなかったため,図 + \ref{fig:adj}上段における半角分の半端は,\autoref{fig:adj}中段のように,鍵 + 括弧周辺の空白と和文間空白(\Param{kanjiskip})の両方によって負担される.し + かし,「日本語組版処理の要件」\cite{jlreq}やJIS~X~4051~\cite{x4051}におい + ては,このような状況では半端は鍵括弧周辺の空白のみで負担し,その他の和文 + 文字はベタ組で組まれる(\autoref{fig:adj}下段)ことになっている. + \Pkg{luatexja-adjust}パッケージの提供する第2の機能は, + \cite{jlreq}や\cite{x4051}における規定のような,優先順位付き + の行長調整である. + \begin{itemize} + \item 優先度付き行長調整は,段落を行分割した後に個々の行について行われるものである. + そのため,行分割の位置は変化することはない. + + \verb+\hbox{...}+ といった「途中で改行できない水平ボックス」では(たとえ幅が指定されていても)無効である. + \item 優先度付き行長調整を行うと,和文処理グルーの自然長は変化しないが,伸び量や縮み量は + 一般に変化する.そのため,既に組まれた段落を \cs{unhbox} などを利用して組み直す処理を + 行う場合には注意が必要である. + \end{itemize} + + \item[「中身までみた」行送り計算] + 複数行に渡る文章を組版するときには行間に空きが入ることが普通である. + \TeX では各行が一つずつの水平ボックスをなしていることを思い出すと,隣り合った + 2つの行(つまり水平ボックス)の間の空きは次のようにして決まるのだった: + \begin{itemize} + \item 「通常に組んだときの行間」$d$を,\cs{baselineskip}から + 「前の行」の深さと「次の行」の高さを加えたものを引いた値とする. + \item $d\ge\cs{lineskiplimit}$の場合, + 標準の行送り\cs{baselineskip}で組んでも十分な間隔があると判断され, + 2行の間には長さ$d$の空白が挿入される.つまり行送りは\cs{baselineskip}. + \item {\catcode`\<=12$d<\cs{lineskiplimit}$}の場合, + 2行の間には長さ\cs{lineskip}の空白が挿入される. + そのため(設定値によるが,多くの場合)行送りは\cs{baselineskip}より広がる. + \end{itemize} + + \begin{figure}[t] + \noindent\centering + \begin{minipage}[b]{18\zw} + \ltjenableadjust[profile=false, linestep=false] + ……だから,①より$\dfrac{a^2}{b} = \dfrac{1+\sqrt{5}}2$.\\ + よって$b=\dfrac{1-\sqrt{5}}2$である.\\ + これを②式に代入すると…… + \par\vskip\abovecaptionskip + \ltjenableadjust[profile=false, linestep=false] + \par\centering\leavevmode{\small (a)} + \end{minipage}% + \kern2\zw + \begin{minipage}[b]{18\zw} + \ltjenableadjust[profile] + ……だから,①より$\dfrac{a^2}{b} = \dfrac{1+\sqrt{5}}2$.\\ + よって$b=\dfrac{1-\sqrt{5}}2$である.\\ + これを②式に代入すると…… + \par\vskip\abovecaptionskip + \ltjenableadjust[profile=false, linestep=false] + \par\centering\leavevmode{\small (b)} + \end{minipage}\par + \caption{高い行が連続したときの状況}\label{fig:linegap1} + \end{figure} + + ここで,\TeX は行送りの決定で「高さ・深さを取っているものが + 行のどの水平位置にあるか」は一切考慮しないことに注意してほしい.そのため, + \autoref{fig:linegap1}~(a)のように「必要以上に行間が空いて見える」状況が起こることがある. + + \Pkg{luatexja-adjust}パッケージでは,「通常に組んだときの行間」$d$を + 各行の中身の文字・グルー・ボックスの寸法を勘案して計算するという方法を + 利用できるようにした.この機能を使うと,\autoref{fig:linegap1}~(b)のように + 行間の空きが必要以上に大きくなることを避けることができる. + \begin{itemize} + \item 段落中の隣り合った二行だけでなく,行間の空きは + 新たに水平ボックス$h$を(内部・外部問わず)垂直モードで追加した時にも自動で挿入される. + その場合には,前段落で述べた「中身までみる」処理は + \begin{itemize} + \item 現在のリストにおける最後のノード + \footnote{最後のノードが\cs{parskip}によるグルーであった場合のみ + さらに一つ前のノードを参照する}が水平ボックス$h'$であり,かつ + \item \cs{prevdepth}の値とその$h'$の深さの値が一致している + \end{itemize} + 場合にのみ発動するようにしている. + \item 行の中身に水平ボックス$h''$が入ってくることもあるが,その場合は$h''$の中身の高さ・深さまでは + 参照せず,あくまでも$h''$自身の高さ・深さのみを参照する. + 参照するようにしてしまうと,\cs{smash}など手動で行った高さ・深さ調整の意味がなくなってしまうからである. + \end{itemize} + + \begin{figure}[t] + \noindent\centering + \begin{minipage}[b]{16\zw} + \ltjenableadjust[profile] + ……だから,①より$\dfrac{a^2}{b}= \dfrac{1+\sqrt{5}}2$.\\ + よって$b=\dfrac{1-\sqrt{5}}2$である.\\ + これを②式に代入すると…… + \par\vskip\abovecaptionskip + \ltjenableadjust[profile=false, linestep=false] + \par\centering\leavevmode{\small (a): 無効} + \end{minipage}% + \kern2\zw + \begin{minipage}[b]{16\zw} + \ltjsetparameter{linestep_factor=0.25} + \ltjenableadjust[profile, linestep] + ……だから,①より$\dfrac{a^2}{b} = \dfrac{1+\sqrt{5}}2$.\\ + よって$b=\dfrac{1-\sqrt{5}}2$である.\\ + これを②式に代入すると…… + \par\vskip\abovecaptionskip + \ltjenableadjust[profile=false, linestep=false] + \par\centering\leavevmode{\small (b): $0.25$\cs{baselineskip}刻み} + \end{minipage}\par\medskip + \begin{minipage}[b]{16\zw} + \ltjsetparameter{linestep_factor=0.5} + \ltjenableadjust[profile, linestep] + ……だから,①より$\dfrac{a^2}{b} = \dfrac{1+\sqrt{5}}2$.\\ + よって$b=\dfrac{1-\sqrt{5}}2$である.\\ + これを②式に代入すると…… + \par\vskip\abovecaptionskip + \ltjenableadjust[profile=false, linestep=false] + \par\centering\leavevmode{\small (c): 0.5\cs{baselineskip}刻み} + \end{minipage}% + \kern2\zw + \begin{minipage}[b]{16\zw} + \ltjsetparameter{linestep_factor=1} + \ltjenableadjust[profile, linestep] + ……だから,①より$\dfrac{a^2}{b} = \dfrac{1+\sqrt{5}}2$.\\ + よって$b=\dfrac{1-\sqrt{5}}2$である.\\ + これを②式に代入すると…… + \par\vskip\abovecaptionskip + \ltjenableadjust[profile=false, linestep=false] + \par\centering\leavevmode{\small (d): \cs{baselineskip}刻み} + \end{minipage}\par + \caption{段階的な行送り増加}\label{fig:linegap2} + \end{figure} + + \item[段階的な行送り調整] + 既に述べたように, + 「通常に組んだときの行間」$d$が\cs{lineskiplimit}より小さい場合,\TeX 標準では + 行間は\cs{lineskip}となるのだった. + このとき行送りは「前の行の深さ」,「次の行の高さ」,\cs{lineskip}の3つの和になるわけだが, + 場合によっては行送りを「\cs{baselineskip}の整数倍」などと切りのいい値に揃えたいという状況が + 考えられなくもない. + + \Pkg{luatexja-adjust}パッケージでは,{\catcode`\<=12$d<\cs{lineskiplimit}$}のときに + 行送りを\cs{baselineskip}の\Param{linestep\_factor}倍ずつ増減させて + \begin{quote} + 行間が\cs{lineskip}以上となるような, + 最小の$(1+k\cdot \Param{linestep\_factor})\cs{baselineskip}$($k$は整数)の値 + \end{quote} + とする機能を利用できるようにした. + \autoref{fig:linegap2}の(a)がこの機能を無効にした状況で,(b),~(c),~(d)が + それぞれ\Param{linestep\_factor}を0.25,~0.5,~1とした状況である. + + なお,この機能は表組時(\cs{halign},~\cs{valign})には無効である. + \LaTeX における表組環境(tabular, arrayなど)では,\cs{baselineskip},~\cs{lineskip}はどちらも0に設定されているので + (代わりに各行に\cs{@arstrut}という支柱が入る)ために意味がないことと, + 数式を内部で表組を使って組むalign環境などではかえって行間が不揃いになってしまうからである. +\end{description} + +\Pkg{luatexja-adjust}パッケージは,上記で述べた4機能を有効化/無効化するための +以下の命令を提供する.これらはすべてグローバルに効力を発揮する. + +\begin{cslist} +\item[\cs{ltjenableadjust[...]}] +\verb+...+ に指定したkey-valueリストに従い,「行末文字の位置調整」「優先順位付きの行長調整」 + 「『中身までみた』行送り計算」「段階的な行送り調整」を有効化/無効化する. +指定できるキーは以下の通り. +\begin{description} + \item[\texttt{lineend=[false,true,extended]}] + 行末文字の位置調整の機能を無効化(\texttt{false}),「行分割後に調整」の形で有効化(\texttt{true}), + 「行分割の過程で考慮」の形で有効化(\texttt{extended})する. + \item[\texttt{priority=[false,true]}] + 優先順位付きの行長調整を無効化(\texttt{false}),または有効化(\texttt{true}). + \item[\texttt{profile=[false,true]}] + 「中身までみた」行送り計算を無効化(\texttt{false}),または有効化(\texttt{true}). + \item[\texttt{linestep=[false,true]}] + 段階的な行送り調整を無効化(\texttt{false}),または有効化(\texttt{true}). +\end{description} +どのキーともキー名のみを指定した場合は値として\texttt{true}が指定されたものと扱われる. + +互換性の為,オプション無しでただ\cs{ltjenableadjust}が呼び出された場合は, +\begin{lstlisting} +\ltjenableadjust[lineend=true,priority=true] +\end{lstlisting} +と扱われる. + +\item[\cs{ltjdisableadjust}] +\Pkg{luatexja-adjust}パッケージの機能を無効化する. +\begin{lstlisting} +\ltjenableadjust[lineend=false,priority=false,profile=false,linestep=false] +\end{lstlisting} +と同義. +\end{cslist} + +また,次のパラメータが\cs{ltjsetparameter}内で +追加される.いずれもグローバルに効力を発揮する. +\begin{cslist}[style=standard] +\item[\DParam{stretch\_priority}\,=\{<list>\}] +\Param{kanjiskip}, \Param{xkanjiskip},および「\textbf{JAglue}以外のグルー」を, +「行を自然長より伸ばす」場合の調整に用いる優先度を指定する. + +指定方法は,<list>の中にkey-value listの形で +\begin{lstlisting} +stretch_priority={kanjiskip=-35,xkanjiskip=-25,others=50} +\end{lstlisting} +のようにして行う.キー名\texttt{kanjiskip},~\texttt{xkanjiskip}については +そのままの意味であり, +\texttt{others}キーが「\textbf{JAglue}以外のグルー」を表す. +各キーの値は,JFMグルーにおける「優先度$i$」を$10i$に対応させた整数値であり, + 大きい方が先に伸ばされることを意味している. + 初期値は +\begin{lstlisting} +{kanjiskip=-35,xkanjiskip=-25,others=50} +\end{lstlisting} +であり,「優先度$-4$」と指定されているJFMグルーが最も伸びにくいようになっている. + +\item[\DParam{shrink\_priority}\,=\{<list>\}] +同様に,「行を自然長より縮める」場合の調整に用いる優先度を指定する. +それ以外は\Param{stretch\_priority}と指定の形式は変わらない(初期値も変わらない). + + \item[\DParam{linestep\_factor}\,=<float>] + 段階的な行送り調整の際,\cs{baselineskip}の自然長の何倍単位で行送りを変えるかを指定する. + 0を指定すると無効になるのと変わらない.また負数を指定すると, + その絶対値が指定されたかのように扱われる. + 初期値は0.5(つまり半行単位)である. + + \item[\DParam{profile\_hgap\_factor}\,=<float>] + 「中身まで見た」行送り計算の際, + 前の行にある深さが大きいものと次の行にある高さが大きいものが + 水平方向にどれだけ離れていないといけないかを + 「\cs{lineskip}の自然長の何倍か」で指定する. + 負数を指定すると,その絶対値が指定されたかのように扱われる. + 初期値は1(つまり\cs{lineskip}(の自然長))である. +\end{cslist} +%</ja> + +\subsection{\Pkg{luatexja-ruby}} +%<*en> +This addon package provides functionality of ``ruby'' (\emph{furigana}) annotations +using callbacks of \LuaTeX-ja. +There is no detailed manual of \Pkg{luatexja-ruby.sty} in English. +(Japanese manual is another PDF file, \url{luatexja-ruby.pdf}.) +%</en> +%<*ja> +この追加パッケージは,\LuaTeX-jaの機能を利用したルビ(振り仮名)の組版機能を提供する. +前後の文字種に応じた前後への自動進入や, +行頭形・行中形・行末形の自動的な使い分けが特徴である. + +ルビ組版に設定可能な項目や注意事項が多いため,本追加パッケージの詳細な説明は +使用例と共に \url{luatexja-ruby.pdf}\ という別ファイルに載せている. +この節では簡単な使用方法のみ述べる. +%</ja> + +\begin{description} +%<*en> + \item[Group-ruby] +By default, ruby characters (the second argument of \cs{ruby}) +are attached to base characters (the first argument), as one object. +This type of ruby is called \emph{group-ruby}. +%</en> +%<*ja> + \item[グループルビ] 標準ではグループルビの形で組まれる.第1引数に親文字, +第2引数にルビを記述する. +%</ja> +\begin{LTXexample}[width=0.3\textwidth] +東西線\ruby{妙典}{みようでん}駅は……\\ +東西線の\ruby{妙典}{みようでん}駅は……\\ +東西線の\ruby{妙典}{みようでん}という駅……\\ +東西線\ruby{葛西}{かさい}駅は…… +\end{LTXexample} +%<*en> +As the above example, ruby hangover is allowed on the Hiragana before/after +its base characters. +%</en> +%<ja> この例のように,標準では前後の平仮名にルビ全角までかかるようになっている. + +%<*en> +\item[Mono-ruby] +To attach ruby characters to each base characters (\emph{mono-ruby}), +one should use \cs{ruby} multiple times: +%</en> +%<*ja> + \item[モノルビ] 親文字を1文字にするとモノルビとなる. +2文字以上の熟語をモノルビの形で組みたい場合は,面倒でも +その数だけ \cs{ruby} を書く必要がある. +%</ja> +\begin{LTXexample}[width=0.3\textwidth] +東西線の\ruby{妙}{みよう}\ruby{典}{でん}駅は…… +\end{LTXexample} + +%<*en> + \item[Jukugo-ruby] +Vertical bar~\verb+|+ denotes a boundary of \emph{groups}. +%</en> +%<*ja> + \item[熟語ルビ] 引数内の縦棒 \verb+|+ はグループの区切りを表し, +複数グループのルビは熟語ルビとして組まれる. +\cite{x4051}にあるように, +どのグループでも「親文字」が対応するルビ以上の長さの場合は +各グループごとに,そうでないときは全体をまとめて1つのグループルビとして組まれる. +\cite{jlreq}で規定されている組み方とは異なるので注意. +%</ja> +\begin{LTXexample} +\ruby{妙|典}{みよう|でん}\ +\ruby{葛|西}{か|さい}\ +\ruby{神楽|坂}{かぐら|ざか} +\end{LTXexample} +%<*en> +If there are multiple groups in one \cs{ruby} call, +A linebreak between two groups is allowed. +%</en> +%<ja> 複数ルビではグループとグループの間で改行が可能である. +\begin{LTXexample}[width=0.3\textwidth] +\vbox{\hsize=6\zw\noindent + \hbox to 2.5\zw{}\ruby{京|急|蒲|田}{けい|きゆう|かま|た} + \hbox to 2.5\zw{}\ruby{京|急|蒲|田}{けい|きゆう|かま|た} + \hbox to 3\zw{}\ruby{京|急|蒲|田}{けい|きゆう|かま|た} +} +\end{LTXexample} +\end{description} + +%<*en> +If the width of ruby characters are longer than that of base characters, +\cs{ruby} automatically selects the appropriate form +among the line-head form, the line-middle form, and the line-end form. +%</en> +%<*ja> +また,ルビ文字のほうが親文字よりも長い場合は,自動的に +行頭形・行中形・行末形のいずれか適切なものを選択する. +%</ja> +\begin{LTXexample}[width=0.3\textwidth] +\vbox{\hsize=8\zw\noindent +\null\kern3\zw ……を\ruby{承}{うけたまわ}る + \kern1\zw ……を\ruby{承}{うけたまわ}る\\ +\null\kern5\zw ……を\ruby{承}{うけたまわ}る +} +\end{LTXexample} + + +%<*ja> +\subsection{\Pkg{lltjext}} +\pLaTeX では縦組用の拡張として \Pkg{plext} パッケージが用意されていたが, +それを\LuaTeX-ja用に書きなおしたものが本追加パッケージ \Pkg{lltjext} である. + +従来の \Pkg{plext} パッケージとの違いは, +{\catcode`\<=12 +\begin{itemize} + \item 組方向オプション \texttt{<y>}(横組),\texttt{<t>}(縦組), +\texttt{<z>}\ の他に\ \texttt{<d>}(dtou方向),\texttt{<u>}(utod方向)を追加した. +\texttt{<z>} と \texttt{<u>} の違いは,\texttt{<z>} が(\Pkg{plext} パッケージと同様に) +周囲の組方向が縦組のときにしか意味を持たない + \footnote{% + 周囲の組方向が縦組以外のときは,\texttt{<z>} を指定しても中身の組方向は周囲の組方向と変わらない. + }% +のに対し,\texttt{<u>} にはそのような制限がないことである. + \item 連数字用命令 \cs{rensuji} における位置合わせオプション \texttt{[l]}, \texttt{[c]}, + \texttt{[r]} の挙動を若干変更した. +\end{itemize} +} + +%</ja> +%<*en> +\subsection{\texttt{lltjext.sty}} +\pLaTeX\ supplies additional macros for vertical writing in the \Pkg{plext} package. +The \Pkg{lltjext} package which we want to describe here is the \LuaTeX-ja +counterpart of the \Pkg{plext} package. +%</en> + +%<*ja> +念の為,本 \Pkg{lltjext} パッケージで追加・変更している命令の一覧を載せておく. +\begin{cslist} +\item[tabular\textrm{, }array\textrm{, }minipage環境] +これらの環境は, +\begin{lstlisting} +\begin{tabular}<dir>[pos]{table spec} ... \end{tabular} +\begin{array}<dir>[pos]{table spec} ... \end{array} +\begin{minipage}<dir>[pos]{width} ... \end{minipage} +\end{lstlisting} +のように,組方向オプション \texttt{\<dir\>} が拡張されている. +既に述べたように,組方向オプションに指定できる値は以下の5つであり, +それ以外を指定した時や無指定時は周囲の組方向と同じ組方向になる. +\begin{description} + \item[y] 横組(\cs{yoko}) + \item[t] 縦組(\cs{tate}) + \item[z] 周囲が縦組の時はutod方向,それ以外はそのまま + \item[d] dtou方向 + \item[u] utod方向 +\end{description} +\item[\cs{parbox}\<<dir>\>{[<pos>]}\{<width>\}\{<contents>\}] +\cs{parbox} 命令も同様に,組方向の指定ができるように拡張されている. + +\item[\cs{pbox}\<<dir>\>{[<width>][<pos>]}\{<contents>\}] +組方向<dir>で<contents>の中身をLRモードで組む命令である. +<width>が正の値であるときは,ボックス全体の幅がその値となる. +その際,中身は<pos>の値に従い,左寄せ(\texttt{l}),右揃え(\texttt{r}), +中央揃え(それ以外)される. +\item[picture環境] +図表作成に用いる\texttt{picture}環境も, +\begin{lstlisting} +\begin{picture}<dir>(x_size, y_size)(x_offset,y_offset) + ... +\end{picture} +\end{lstlisting} +と組方向が指定できるように拡張されている. +$x$成分の増加方向は字送り方向,$y$成分の増加方向は行送り方向の\emph{反対方向}となる. +\Pkg{plext} パッケージと同様に +内部ではベースライン補正(\Param{yalbaselineshift}パラメータなど)の影響を受けないように, +\cs{put},~\cs{line}, \cs{vector}, \cs{dashbox}, \cs{oval},~\cs{circle}も +ベースライン補正を受けないように再定義されている. + +\item[\cs{rensuji}{[<pos>]}\{<contents>\}\textrm{, }\cs{rensujiskip}] + +\item[\cs{Kanji}\{<counter\_name>\}] + +\item[\cs{kasen}\{<contents>\}\textrm{, }\cs{bou}\{<contents>\}\textrm{, + }\cs{boutenchar}] + +\item[参照番号] +\end{cslist} +%</ja> +%<*en> +\begin{cslist} +\item[tabular\textrm{, }array\textrm{, }minipage\textrm{ environments}] +These environments are extended by \texttt{\<dir\>}, which specifies the direction, +as follows: +\begin{lstlisting} +\begin{tabular}<dir>[pos]{table spec} ... \end{tabular} +\begin{array}<dir>[pos]{table spec} ... \end{array} +\begin{minipage}<dir>[pos]{width} ... \end{minipage} +\end{lstlisting} +This option permits one of the following five values. If none of them is specified, +the direction inside the environment is same as that outside the enviromnent. +\begin{description} + \item[y] \emph{yoko} direction (horizontal writing) + \item[t] \emph{tate} direction (vertical writing) + \item[z] \emph{utod} direction if direction outside the env.\ is \emph{tate}. + \item[d] \emph{dtou} direction + \item[u] \emph{utod} direction +\end{description} +\item[\cs{parbox}\<<dir>\>{[<pos>]}\{<width>\}\{<contents>\}] +\cs{parbox} command is also extended by \texttt{\<<dir>\>}. + +\item[\cs{pbox}\<<dir>\>{[<width>][<pos>]}\{<contents>\}] +This commands typeset <contents> in LR-mode, in <dir> direction. +If <width> is positive, the width of the box becomes this <width>. +In this case, <contents> will be aligned to left (when <pos> is \texttt{l}), +center (\texttt{c}), or~right (\texttt{r}). + +\item[picture\textrm{\ environment}] +\texttt{picture} environment also extended by \texttt{\<<dir>\>}, as follows: +\begin{lstlisting} +\begin{picture}<dir>(x_size, y_size)(x_offset,y_offset) + ... +\end{picture} +\end{lstlisting} + +\item[\cs{rensuji}{[<pos>]}\{<contents>\}\textrm{, }\cs{rensujiskip}] + +\item[\cs{Kanji}\{<counter\_name>\}] + +\item[\cs{kasen}\{<contents>\}\textrm{, }\cs{bou}\{<contents>\}\textrm{, + }\cs{boutenchar}] + +\item[参照番号] +\end{cslist} +%</en> + +%<*ja> +\paragraph{表組他の揃え位置} +表組(\texttt{array}, \texttt{tabular}環境),\cs{parbox}命令,\cs{minipage}環境の +揃え位置については\autoref{tab:lltjext_dir}を参照.\pLaTeX~2017-07-29と +できるだけ同じ挙動になるようにしている.\autoref{tab:lltjext_dir}中のA--Dの意味は次の通り. + +\begin{table} + \caption{\Pkg{lltjext}パッケージにおける表組・\cs{parbox}命令他の揃え位置} + \label{tab:lltjext_dir} + {\centering + \begin{tabular}{lcccc} + \toprule + ↓中身\周囲→&\cs{yoko}&\cs{tate}&\cs{utod}&\cs{dtou}\\ + \midrule + \cs{yoko}&A&B&B&B\\ + \cs{tate}&B&A&D&C\\ + \cs{utod}&B&D&A&C\\ + \cs{dtou}&B&C&C&A\\ + \bottomrule + \end{tabular}\par} +\end{table} + +\begin{description} + \item[A] 周囲の組方向と中身の組方向が同じ場合. + \begin{itemize} + \item \texttt{[t]}指定のとき: + 中身の先頭行のベースラインが周囲のベースラインと一致する. + 表組で先頭行の上に罫線があった場合は,それがベースラインの位置 + \footnote{\LuaTeX-jaでは和文側のベースラインの位置も上下移動できることに注意. + そのため「和文ベースライン」の位置に来るとは限らない.}となる. + \item \texttt{[c]}指定のとき: + 中身の上下の中心が周囲の数式の軸を通る. + \item \texttt{[b]}指定のとき: + 中身の最終行のベースラインが周囲のベースラインと一致する. + 表組で最終行の下に罫線があった場合は,それがベースラインの位置となる. + \end{itemize} + \item[B] 周囲の組方向と中身の組方向が90度ずれている場合. + \begin{itemize} + \item \texttt{[t]}指定のとき: + 表組においては,上端が周囲のベースラインと一致する. + \cs{parbox}や\cs{minipage}環境においては,上端が周囲の和文文字の上端と一致する. + \item \texttt{[c]}指定のとき: + 中身の上下の中心が周囲の数式の軸を通る. + \item \texttt{[b]}指定のとき: + 表組においては,下端が周囲のベースラインと一致する. + \cs{parbox}や\cs{minipage}環境においては,下端が周囲の和文文字の下端と一致する. + \end{itemize} + \item[C] 周囲の組方向と中身の組方向が180度ずれている場合. + \cs{parbox}や\cs{minipage}環境においては,上のBの場合と同じ挙動である.表組においては, + Aで\texttt{[t]}と\texttt{[b]}を入れ替えた + \begin{itemize} + \item \texttt{[t]}指定のとき: + 中身の最終行のベースラインが周囲のベースラインと一致する. + 最終行の下に罫線があった場合は,それがベースラインの位置となる. + \item \texttt{[c]}指定のとき: + 中身の上下の中心が周囲の数式の軸を通る. + \item \texttt{[b]}指定のとき: + 中身の先頭行のベースラインが周囲のベースラインと一致する. + 表組で先頭行の上に罫線があった場合は,それがベースラインの位置となる. + \end{itemize} + \item[D] 通常の縦組(\cs{tate})と「縦数式ディレクション」に相当する\cs{utod}方向が絡んだ場合. + \cs{parbox}や\cs{minipage}環境においては,上のBの場合と同じ挙動である.表組においては, + \begin{itemize} + \item \texttt{[t]}指定のとき: + 中身の先頭行の欧文ベースラインが周囲の欧文ベースラインと一致する. + \item \texttt{[c]}指定のとき: + 中身の上下の中心が周囲の数式の軸を通る. + \item \texttt{[b]}指定のとき: + 中身の最終行の欧文ベースラインが周囲の欧文ベースラインと一致する. + \end{itemize} +\end{description} +%</ja> + +\subsection{\Pkg{luatexja-preset}} +\label{ssec:preset} + +%<*en> +As described in Subsection~\ref{ssec:preset-abst}, +One can load the \Pkg{luatexja-preset} +package to use several ``presets'' of Japanese fonts. +This package provides functions in a part of \Pkg{japanese-otf} package (changing fonts) +and a part of \Pkg{PXchfon} package (presets) by Takayuki Yato. + +Options which are given in \cs{usepackage} but not described in this~subsection +are simply passed to the \Pkg{luatexja-fontspec}\footnote{if \texttt{nfssonly} option is +\emph{not} specified; in this case these options are simply ignored.}. +For example, the line~5 in below example is equivalent to lines 1--3. +%</en> +%<*ja> +\ref{ssec:preset-abst}節で述べたように,よく使われている和文フォント設定を一行で指定できるようにしたのが +\Pkg{luatexja-preset}パッケージである.このパッケージは, +\Pkg{otf}パッケージの一部(多書体化)と八登崇之氏による\Pkg{PXchfon}パッケージの一部(プリセット指定) +とを合わせたような格好をしている. + +パッケージ読み込み時に渡されたオプションのうち, +本節にないものを指定した場合,それらはそのまま +\Pkg{luatexja-fontspec}パッケージに渡される\footnote{\texttt{nfssonly} オプションが +指定されていた場合は,\Pkg{luatexja-fontspec}パッケージは読み込まれないので単純に無視され +る.}.例えば,下の1--3行目は5行目のように一行にまとめることができる. +%</ja> +\begin{lstlisting} +\usepackage[no-math]{fontspec} +\usepackage[match]{luatexja-fontspec} +\usepackage[kozuka-pr6n]{luatexja-preset} +%%-------- +\usepackage[no-math,match,kozuka-pr6n]{luatexja-preset} +\end{lstlisting} + +%<en>\subsubsection{General Options} +%<ja>\subsubsection{一般的なオプション} +\label{sssec:ltjpreset-general} + +\begin{cslist}[before*=] +\item[fontspec% +%<en>\textrm{~(enabled by default)} +%<ja>\emph{\gtfamily (既定)} +] +%<*en> +With this option, Japanese fonts are selected using functionality of +the \Pkg{luatexja-fontspec} package. This means that the \Pkg{fontspec} package is + automatically loaded by this package. + +If you need to pass some options to \Pkg{fontspec}, you can load \Pkg{fontspec} manually +before \Pkg{luatexja-preset}: +%</en> +%<*ja> +\Pkg{luatexja-fontspec}パッケージの機能を用いて和文フォントを選択する. +これは,\Pkg{fontspec}パッケージが自動で読み込まれることを意味する. + +もし\Pkg{fontspec}パッケージに何らかのオプションを渡す必要がある +\footnote{例えば,数式フォントまで置換されてしまい,\cs{mathit}によってギリシャ文字の +斜体大文字が出なくなる,など.}場合は, +次のように\Pkg{luatexja-preset}の前に\Pkg{fontspec}を手動で読みこめば良い: +%</ja> +\begin{lstlisting} +\usepackage[no-math]{fontspec} +\usepackage[...]{luatexja-preset} +\end{lstlisting} + +\item[nfssonly] +%<*en> +With this option, selecting Japanese fonts won't be performed using the functionality of + the \Pkg{fontspec} package, but only standard NFSS2 (hence without + \cs{addjfontfeatures} etc.). +This option is ignored when \Pkg{luatexja-fontspec} package is loaded. + +When this option is specified, \Pkg{fontspec}~and~\Pkg{luatexja-fontspec} are +\emph{not} loaded by default. Nevertheless, +the package\Pkg{fontspec} can coexist with the option, as the following: +\begin{lstlisting} +\usepackage{fontspec} +\usepackage[hiragino-pron,nfssonly]{luatexja-preset} +\end{lstlisting} +In this case, one can use \cs{setmainfont} etc.\ to select \emph{alphabetic} fonts. +%</en> +%<*ja> +\LaTeX 標準のフォント選択機構(NFSS2)を用いて +\texttt{ltjpm}$n$(明朝),\texttt{ltjpg}$n$(ゴシック), +それに後に述べる\texttt{deluxe}オプションが指定された場合には +\texttt{ltjpmg}$n$(丸ゴシック)という +和文フォントファミリを定義% +\footnote{% + $n$は自然数であり,\cs{ltjapplypreset}の実行(この命令は\Pkg{luatexja-preset}パッケージ + 読み込み時に自動的に実行される)ごとに増加していく. +}し,これらを用いる. + +本オプション指定時には\Pkg{fontspec}・\Pkg{luatexja-fontspec}パッケージは +自動では読み込まれない,しかし, +\begin{lstlisting} +\usepackage{fontspec} +\usepackage[hiragino-pron,nfssonly]{luatexja-preset} +\end{lstlisting} +のようにすれば,このオプションを指定すれば +欧文フォントを\Pkg{fontspec}パッケージの機能を使って指定することができる. + +一方,\Pkg{luatexja-preset}パッケージ読み込み時に +既に\Pkg{luatexja-fontspec}パッケージが読み込まれている場合は +\texttt{nfssonly}オプションは無視される. +%</ja> + +\item[match] +%<*en> +If this option is specified, usual family-changing commands such as +\cs{rmfamily},~\cs{textrm}, \cs{sffamily},~\dots\ also change Japanese font family. +This option is passed to \Pkg{luatexja-fontspec}, if \texttt{fontspec} +option is specifed. +%</en> + +%<*ja> +このオプションが指定されると,「\pLaTeXe 新ドキュメントクラス」のように\ +\cs{rmfamily}, \verb+\textrm{...}+, \cs{sffamily} 等が +欧文フォントだけでなく和文フォントも変更するようになる. +\ \texttt{fontspec}\ +オプションが有効になっている場合は,このオプションは \Pkg{luatexja-fontspec} パッケージへと渡される. +%</ja> + + +\item[nodeluxe% +%<en>\textrm{~(enabled by default)} +%<ja>\emph{\gtfamily (既定)} +] +%<*en> +The nagation of \texttt{deluxe} option. +Use one-weighted \textit{mincho} and \textit{gothic} font families. +This means that \verb+\mcfamily\bfseries+, \verb+\gtfamily\bfseries+ and +\verb+\gtfamily\mdseries+ use the same font. +%</en> +%<*ja> +\texttt{deluxe}オプションの否定. +\LaTeXe 環境下の標準設定のように,明朝体・ゴシック体を各1ウェイトで使用する. +より具体的に言うと,この設定の下では +\ \verb+\mcfamily\bfseries+, \verb+\gtfamily\bfseries+, +\verb+\gtfamily\mdseries+はみな同じフォントとなる. +%</ja> +\item[deluxe] +%<*en> +Use the mincho family with three weights (light, medium, and~bold), +the gothic family with three weights (medium, bold, and extra~bold), and \textit{rounded gothic}% +\footnote{Provided by \cs{mgfamily} and \cs{textmg}, +because ``rounded gothic'' is called \textit{maru gothic} (丸ゴシック) in Japanese.}. +Mincho light and gothic extra~bold can be by +\cs{mcfamily}\cs{ltseries}~and~\cs{gtfamily}\cs{ebseries}, respectively. + +\begin{itemize} + \item Some presets do not have the light weight of mincho. + In this case, we substitute the medium weight for the light weight. + \item \Pkg{luatexja-preset} does not produce an error (only produces a warning), even if + (one of) fonts for \cs{mcfamily}\cs{ltseries}, \cs{gtfamily}\cs{ebseries}, \cs{mgfamily} + do not exist. +\end{itemize} +%</en> +%<*ja> +明朝体・ゴシック体各3ウェイトと, +丸ゴシック体 (\cs{mgfamily}, \verb+\textmg{...}+) を利用可能にする. +明朝体は細字・中字・太字の3ウェイトがあり, +明朝体の細字は \cs{mcfamily}\cs{ltseries} で利用できる. +また,ゴシック体は中字・太字・極太の3ウェイトがあり, +ゴシック体の極太は \cs{gtfamily}\cs{ebseries} で利用できる% +\footnote{過去との互換性のため,\cs{gtebfamily}, \cs{textgteb\{...\}} も + 依然として利用可能である.}. + +\begin{itemize} + \item プリセット設定によっては明朝体細字が用意されていないものもある.その場合は + 明朝体中字が代用される. + \item 明朝体細字,ゴシック体極太,丸ゴシック体の3フォントについては + 実際にフォントをロードする前に存在するかチェックを行う. + 存在しなかったものについては警告を発し, + それぞれ明朝体中字.ゴシック体太字,ゴシック体太字で代用する. +\end{itemize} +%</ja> +\item[expert] +%<*en> +Use horizontal/vertical kana alternates, and define a command \cs{rubyfamily} to use kana +characters designed for ruby. +%</en> +%<*ja> +横組・縦組専用仮名を用いる.また,\cs{rubyfamily} でルビ用仮名が使用可能となる\footnote{% + \cs{rubyfamily}とはいいつつ,実際にはフォントファミリを切り替えるのではない(通常では + OpenType機能の有効化であり,\texttt{nfssonly} 指定時にはシェイプを \texttt{rb} に切り替える). +}. +%</ja> +\item[bold] +%<*en> +Substitute bold series of gothic for bold series of mincho. +If \texttt{nodeluxe} option is enabled, medium series of gothic is also changed, +since we use same font for both series of gothic. +%</en> +%<*ja> +「明朝の太字」をゴシック体の太字によって代替する. +もし\texttt{nodeluxe}オプションが指定されている場合は,ゴシック体は1ウェイトしか使用されな + いため, +「ゴシック体の中字」も同時に変更されることになる. +%</ja> +\item[jis90\textrm{,~}90jis] +%<en>Use JIS~X~0208:1990 glyph variants if possible. +%<ja>出来る限りJIS~X~0208:1990の字形を使う. +\item[jis2004\textrm{,~}2004jis] +%<en>Use JIS~X~0213:2004 glyph variants if possible. +%<ja>出来る限りJIS~X~0213:2004の字形を使う. +\item[jfm\_yoko=<jfm>] +%<*en> +Use the JFM \texttt{jfm-<jfm>.lua} for horizontal direction, instead of \texttt{jfm-ujis.lua}~(default JFM). +%</en> +%<*ja> +横組用和文フォントで用いるJFMを\texttt{jfm-<jfm>.lua}にする.このオプションがない時は +\LuaTeX\nobreakdash -ja標準の\texttt{jfm-ujis.lua}が用いられる. +%</ja> +\item[jfm\_tate=<jfm>] +%<*en> +Use the JFM \texttt{jfm-<jfm>.lua} for vertical direction, instead of \texttt{jfm-ujisv.lua}~(default JFM). +%</en> +%<*ja> +縦用和文フォントで用いるJFMを\texttt{jfm-<jfm>.lua}にする.このオプションがない時は +\LuaTeX-ja標準の\texttt{jfm-ujisv.lua}が用いられる. +%</ja> + +\item[jis] +%<en>Same as \texttt{jfm\_yoko=jis}. +%<ja>\texttt{jfm\_yoko=jis}と同じ.ここで用いるJFM\texttt{jfm-jis.lua}はJISフォントメトリックを元にしたものである. + +\end{cslist} +%<*en> +Note that \texttt{jis90},~\texttt{90jis}, \texttt{jis2004}~and~\texttt{2004jis} only affect with mincho, +gothic (and, possibly rounded gothic) families defined by this package. +We didn't taken account of when more than one options among them are specified. +%</en> +%<*ja> +\texttt{jis90},~\texttt{90jis}, \texttt{jis2004},~\texttt{2004jis}については本パッケージで定義された +明朝体・ゴシック体(・丸ゴシック体)にのみ有効である. +これら4オプションのうち複数が同時に指定された場合の動作については全く考慮していない. +%</ja> + +%<en>\subsubsection{Presets which support multi weights} +%<ja>\subsubsection{多ウェイト用プリセットの一覧} +\label{sssec:ltjpreset-multi} + +%<*en> +Besides \texttt{bizud}, \texttt{morisawa-pro},~and~\texttt{morisawa-pr6n} presets, +fonts are specified by font name, not by file name. +In following tables, starred fonts (e.g.~KozGo\dots-Regular) are used for medium series of \textit{gothic}, +\emph{if and only if \texttt{deluxe} option is specified}. +%</en> +%<*ja> +\texttt{bizud}, \texttt{morisawa-pro}, \texttt{morisawa-pr6n}以外はフォントの指定は +(ファイル名でなく)フォント名で行われる. +以下の表において,*\,つきのフォント(e.g.,~KozGo\dots-Regular)は,\emph{\texttt{deluxe}オプション指定時に} +ゴシック体中字として用いられるものを示している. +%</ja> +\begin{cslist}[style=standard] + \item[kozuka-pro] Kozuka Pro (Adobe-Japan1-4) fonts. +%<en> \\*[-\dimexpr\medskipamount+\baselineskip\relax] + \item[kozuka-pr6] Kozuka Pr6 (Adobe-Japan1-6) fonts. +%<en> \\*[-\dimexpr\medskipamount+\baselineskip\relax] + \item[kozuka-pr6n] Kozuka Pr6N (Adobe-Japan1-6, JIS04-savvy) fonts. + +%<*en> +Kozuka Pro/Pr6N fonts are bundled with Adobe's software, such as Adobe~InDesign. +There is not rounded gothic family in Kozuka fonts. +%</en> +%<*ja> +小塚Pro書体・Pr6N書体はAdobe InDesign等のAdobe製品にバンドルされている. +「小塚丸ゴシック」は存在しないので,便宜的に小塚ゴシックHによって代用している. +%</ja> +\begin{center}\small +\begin{tabular}{lllll} +\toprule +\bfseries family&\bfseries series&\ttfamily kozuka-pro&\ttfamily kozuka-pr6&\ttfamily kozuka-pr6n\\ +\midrule + &light&KozMinPro-Light&KozMinProVI-Light&KozMinPr6N-Light\\ +%<en>\textit{mincho}% +%<ja>\textgt{明朝}% + &medium&KozMinPro-Regular&KozMinProVI-Regular&KozMinPr6N-Regular\\ + &bold&KozMinPro-Bold&KozMinProVI-Bold&KozMinPr6N-Bold\\ +\midrule + &&KozGoPro-Regular*&KozGoProVI-Regular*&KozGoPr6N-Regular*\\ + &\smash{\raisebox{1.5ex}{medium}} + &KozGoPro-Medium&KozGoProVI-Medium&KozGoPr6N-Medium\\ +\cmidrule(l){2-5} +%<en>\smash{\raisebox{2ex}{\textit{gothic}}}% +%<ja>\smash{\raisebox{2ex}{\gt ゴシック}}% + &bold&KozGoPro-Bold&KozGoProVI-Bold&KozGoPr6N-Bold\\ + &extra bold&KozGoPro-Heavy&KozGoProVI-Heavy&KozGoPr6N-Heavy\\ +\midrule +%<en>\textit{rounded gothic} +%<ja>\gt 丸ゴシック +&&KozGoPro-Heavy&KozGoProVI-Heavy&KozGoPr6N-Heavy\\ +\bottomrule +\end{tabular} +\end{center} + + \item[hiragino-pro] Hiragino Pro (Adobe-Japan1-5) fonts. +%<en> \\*[-\dimexpr\medskipamount+\baselineskip\relax] + \item[hiragino-pron] Hiragino ProN (Adobe-Japan1-5, JIS04-savvy) fonts. + +%<*en> +Hiragino fonts (except Hiragino~Mincho~W2) are bundled with Mac OS~X 10.5 or later. +Some editions of a Japanese word-processor ``一太郎2012'' includes Hiragino ProN fonts. +Note that fonts for gothic extra~bold (HiraKakuStd[N]-W8) only contains characters in +Adobe-Japan1-3 character collection, while others contains those in +Adobe-Japan1-5 character collection. +%</en> +%<*ja> +ヒラギノフォントは,Mac OS~X以外にも,一太郎2012の上位エディションにもバンドルされている. +極太ゴシック体として用いるヒラギノ角ゴW8は,Adobe-Japan1-3の範囲しかカバーしていない +Std/StdNフォントであり,その他はAdobe-Japan1-5対応である. + +なお,明朝体細字として用いるヒラギノ明朝体W2はOS~Xや一太郎にはバンドルされておらず, +別途購入する必要がある. +%</ja> +\begin{center}\small +\begin{tabular}{llll} +\toprule +\bf family&\bf series&\tt hiragino-pro&\tt hiragino-pron\\ +\midrule + &light&Hiragino~Mincho~Pro~W2&Hiragino~Mincho~ProN~W2\\ +%<en>\textit{mincho}% +%<ja>\textgt{明朝}% + &medium&Hiragino~Mincho~Pro~W3&Hiragino~Mincho~ProN~W3\\ + &bold&Hiragino~Mincho~Pro~W6&Hiragino~Mincho~ProN~W6\\ +\midrule + &&Hiragino~Kaku~Gothic~Pro~W3*&Hiragino~Kaku~Gothic~ProN~W3*\\ + &\smash{\raisebox{1.5ex}{medium}} + &Hiragino~Kaku~Gothic~Pro~W6&Hiragino~Kaku~Gothic~ProN~W6\\ +\cmidrule(l){2-4} +%<en>\smash{\raisebox{2ex}{\textit{gothic}}}% +%<ja>\smash{\raisebox{2ex}{\gt ゴシック}}% + &bold&Hiragino~Kaku~Gothic~Pro~W6&Hiragino~Kaku~Gothic~ProN~W6\\ + &extra bold&Hiragino~Kaku~Gothic~Std~W8&Hiragino~Kaku~Gothic~StdN~W8\\ +\midrule +%<en>\textit{rounded gothic} +%<ja>\gt 丸ゴシック +&&Hiragino~Maru~Gothic~Pro~W4&Hiragino~Maru~Gothic~ProN~W4\\ +\bottomrule +\end{tabular} +\end{center} + +%<ja>\newpage +\item[bizud] BIZ UD fonts (by Morisawa Inc.) bundled with + Windows~10 October 2018 Update. +\begin{center}\small +\begin{tabular}{ll>{\ttfamily}l} +\toprule +\textbf{family}&\textbf{series}\\ +\midrule +%<en>\textit{mincho} +%<ja>\textgt{明朝}% + &&BIZ-UDMinchoM.ttc\\ +\midrule + &medium&BIZ-UDGothicR.ttc\\ +\cmidrule(l){2-3} +%<en>\textit{gothic}% +%<ja>\gt ゴシック + &bold&BIZ-UDGothicB.ttc\\ + &extra bold&BIZ-UDGothicB.ttc\\ +\midrule +%<en>\textit{rounded gothic} +%<ja>\gt 丸ゴシック +&&BIZ-UDGothicB.ttc\\ +\bottomrule +\end{tabular} +\end{center} + +%<en>\newpage + + \item[morisawa-pro] Morisawa Pro (Adobe-Japan1-4) fonts. +%<en> \\*[-\dimexpr\medskipamount+\baselineskip\relax] + \item[morisawa-pr6n] Morisawa Pr6N (Adobe-Japan1-6, JIS04-savvy) fonts. +\begin{center}\footnotesize +\begin{tabular}{ll>{\tt}l>{\tt}l} +\toprule +\bf family&\bf series&morisawa-pro&morisawa-pr6n\\ +\midrule + &medium&A-OTF-RyuminPro-Light.otf&A-OTF-RyuminPr6N-Light.otf\\ +%<en>\smash{\raisebox{1.5ex}{\textit{mincho}}}% +%<ja>\smash{\raisebox{1.5ex}{\gt 明朝}}% + &bold&A-OTF-FutoMinA101Pro-Bold.otf&A-OTF-FutoMinA101Pr6N-Bold.otf\\ +\midrule + &medium + &A-OTF-GothicBBBPro-Medium.otf&A-OTF-GothicBBBPr6N-Medium.otf\\ +%<en>\textit{gothic}% +%<ja>\gt ゴシック + &bold&A-OTF-FutoGoB101Pro-Bold.otf&A-OTF-FutoGoB101Pr6N-Bold.otf\\ + &extra bold&A-OTF-MidashiGoPro-MB31.otf&A-OTF-MidashiGoPr6N-MB31.otf\\ +\midrule +%<en>\textit{rounded gothic} +%<ja>\gt 丸ゴシック +&&A-OTF-Jun101Pro-Light.otf&A-OTF-ShinMGoPr6N-Light.otf\\ +\bottomrule +\end{tabular} +\end{center} + + + \item[yu-win] Yu fonts bundled with Windows~8.1. +%<en> \\*[-\dimexpr\medskipamount+\baselineskip\relax] + \item[yu-win10] Yu fonts bundled with Windows~10. +%<en> \\*[-\dimexpr\medskipamount+\baselineskip\relax] + \item[yu-osx] Yu fonts bundled with OSX~Mavericks. +\begin{center}\small +\begin{tabular}{lllll} +\toprule +\bf family&\bf series&\texttt{yu-win}&\texttt{yu-win10}&\texttt{yu-osx}\\ +\midrule + &light&YuMincho-Light&YuMincho-Light&(YuMincho~Medium)\\ +%<en>\textit{mincho}% +%<ja>\textgt{明朝}% + &medium&YuMincho-Regular&YuMincho-Regular&YuMincho~Medium\\ + &bold&YuMincho-Demibold&YuMincho-Demibold&YuMincho~Demibold\\ +\midrule + &&YuGothic-Regular*&YuGothic-Regular*&YuGothic~Medium*\\ + &\smash{\raisebox{1.5ex}{medium}}% + &YuGothic-Regular&YuGothic-Medium&YuGothic~Medium\\ +\cmidrule(l){2-5} +%<en>\textit{gothic}% +%<ja>\gt ゴシック + &bold&YuGothic-Bold&YuGothic-Bold&YuGothic~Bold\\ + &extra bold&YuGothic-Bold&YuGothic-Bold&YuGothic~Bold\\ +\midrule +%<en>\textit{rounded gothic} +%<ja>\gt 丸ゴシック +&&YuGothic-Bold&YuGothic-Bold&YuGothic~Bold\\ +\bottomrule +\end{tabular} +\end{center} + +\item[moga-mobo] MogaMincho, MogaGothic, and MoboGothic. +%<en> \\*[-\dimexpr\medskipamount+\baselineskip\relax] +\item[moga-mobo-ex] MogaExMincho, MogaExGothic, and MoboExGothic. +%<en>\par These fonts can be downloaded from \url{http://yozvox.web.fc2.com/}. +%<ja>これらのフォントは \url{http://yozvox.web.fc2.com/} からダウンロードできる. +\begin{center}\small +\begin{tabular}{llll} +\toprule +\bf family&\bf series&\bf default, \texttt{90jis}~option&\bf \texttt{jis2004} option\\ +\midrule + &medium&Moga90Mincho&MogaMincho\\ +%<en>\smash{\raisebox{1.5ex}{\textit{mincho}}}% +%<ja>\smash{\raisebox{1.5ex}{\gt 明朝}}% + &bold&Moga90Mincho Bold&MogaMincho Bold\\ +\midrule + &medium&Moga90Gothic&MogaGothic\\ +%<en>\textit{gothic}% +%<ja>\gt ゴシック + &bold&Moga90Gothic Bold&MogaGothic Bold\\ + &extra bold&Moga90Gothic Bold&MogaGothic Bold\\ +\midrule +%<en>\textit{rounded gothic} +%<ja>\gt 丸ゴシック +&&Mobo90Gothic&MoboGothic\\ +\bottomrule +\end{tabular} +\end{center} +%<en>When \texttt{moga-mobo-ex} is specified, the font ``MogaEx90Mincho'' etc.\ are used. +%<ja>\texttt{moga-mobo-ex}オプション指定時にはMogaEx90MinchoなどのExが名前についたフォントが使われる. + +\item[ume] Ume Mincho and Ume Gothic. +%<en>\par These fonts can be downloaded from\\\hfill \url{https://ja.osdn.net/projects/ume-font/wiki/FrontPage}. +%<ja>これらのフォントは \url{https://ja.osdn.net/projects/ume-font/wiki/FrontPage} からダウンロードできる. +\begin{center}\small +\begin{tabular}{lll} +\toprule +\bf family&\bf series&\bf default\\ +\midrule + &medium&Ume Mincho\\ +%<en>\smash{\raisebox{1.5ex}{\textit{mincho}}}% +%<ja>\smash{\raisebox{1.5ex}{\gt 明朝}}% + &bold&Ume Mincho\\ +\midrule + &&Ume Gothic*\\ + &\smash{\raisebox{1.5ex}{medium}}&Ume Gothic O5\\ +\cmidrule(l){2-3} +%<en>\textit{gothic}% +%<ja>\gt ゴシック + &bold&Ume Gothic O5\\ + &extra bold&Ume Gothic O5\\ +\midrule +%<en>\textit{rounded gothic} +%<ja>\gt 丸ゴシック +&&Ume Gothic O5\\ +\bottomrule +\end{tabular} +\end{center} + +%<en>\newpage + \item[sourcehan] Source Han Serif and Source Han Sans fonts (Language-specific OTF \textit{or} OTC) +%<en> \\*[-\dimexpr\medskipamount+\baselineskip\relax] + \item[sourcehan-jp] Source Han Serif JP and Source Han Sans JP fonts (Region-specific Subset OTF) +\begin{center}\small +\def\AD#1#2{Source Han #1 #2&Source Han #1 JP #2}% +\begin{tabular}{lllll} +\toprule +\bf family&\bf series&\texttt{sourcehan}&\texttt{sourcehan-jp}\\ +\midrule + &light&\AD{Serif}{Light}\\ +%<en>\textit{mincho}% +%<ja>\textgt{明朝}% + &medium&\AD{Serif}{Regular}\\ + &bold&\AD{Serif}{Bold}\\ +\midrule + &&\AD{Sans}{Regular*}\\ + &\smash{\raisebox{1.5ex}{medium}} + &\AD{Sans}{Medium}\\ +\cmidrule(l){2-4} +%<en>\smash{\raisebox{2ex}{\textit{gothic}}}% +%<ja>\smash{\raisebox{2ex}{\gt ゴシック}}% + &bold&\AD{Sans}{Bold}\\ + &extra bold&\AD{Sans}{Heavy}\\ +\midrule +%<en>\textit{rounded gothic} +%<ja>\gt 丸ゴシック +&&\AD{Sans}{Heavy}\\ +\bottomrule +\end{tabular} +\end{center} + + + \item[noto-otc] Noto Serif CJK and Noto Sans CJK fonts (OTC) +%<en> \\*[-\dimexpr\medskipamount+\baselineskip\relax] + \item[noto-otf] Noto Serif CJK and Noto Sans CJK fonts (Language-specific OTF) +\begin{center}\small +\def\AD#1#2{Noto #1 CJK #2&Noto #1 CJK JP #2}% +\begin{tabular}{lllll} +\toprule +\bf family&\bf series&\texttt{noto-otc}&\texttt{noto-otf}\\ +\midrule + &light&\AD{Serif}{Light}\\ +%<en>\textit{mincho}% +%<ja>\textgt{明朝}% + &medium&\AD{Serif}{Regular}\\ + &bold&\AD{Serif}{Bold}\\ +\midrule + &&\AD{Sans}{Regular*}\\ + &\smash{\raisebox{1.5ex}{medium}} + &\AD{Sans}{Medium}\\ +\cmidrule(l){2-4} +%<en>\smash{\raisebox{2ex}{\textit{gothic}}}% +%<ja>\smash{\raisebox{2ex}{\gt ゴシック}}% + &bold&\AD{Sans}{Bold}\\ + &extra bold&\AD{Sans}{Black}\\ +\midrule +%<en>\textit{rounded gothic} +%<ja>\gt 丸ゴシック +&&\AD{Sans}{Black}\\ +\bottomrule +\end{tabular} +\end{center} + +\end{cslist} +%<en>\subsubsection{Presets which do not support multi weights} +%<ja>\subsubsection{単ウェイト用プリセット一覧} +\label{sssec:ltjpreset-single} + +%<*en> +Next, we describe settings for using only single weight. +%</en> +%<*ja> +次に,単ウェイト用の設定を述べる.この4設定では +明朝体太字・丸ゴシック体はゴシック体と同じフォントが用いられる. +%</ja> +\par\nobreak\medskip +{\centering\small +\begin{tabular}{lllll} +\toprule +&\tt noembed&\tt ipa&\tt ipaex&\tt ms\\ +\midrule +%<*en> +\it mincho&Ryumin-Light (non-embedded) +&IPA Mincho&IPAex Mincho&MS Mincho\\ +\it gothic&GothicBBB-Medium (non-embedded) +&IPA Gothic&IPAex Gothic&MS Gothic\\ +%</en> +%<*ja> +\gtfamily 明朝&Ryumin-Light(非埋込) +&IPA明朝&IPAex明朝&MS明朝\\ +\gtfamily ゴシック&GothicBBB-Medium(非埋込) +&IPAゴシック&IPAexゴシック&MSゴシック\\ +%</ja> +\bottomrule +\end{tabular}\par\medskip} + +%<en>\subsubsection{Presets which use HG fonts} +%<ja>\subsubsection{HGフォントを使うプリセット} +\label{sssec:ltjpreset-hg} +%<*en> +We can use HG~fonts bundled with Microsoft~Office for realizing multiple weights. +In the table below, starred fonts (e.g., IPA~Gothic*) are used +only if \texttt{jis2004} or \texttt{nodeluxe} option is spefified. +%</en> +%<*ja> +すぐ前に書いた単ウェイト用設定を,Microsoft Office等に付属するHGフォントを使って +多ウェイト化した設定もある.以下の表では,*~付きのフォント(例:IPAゴシック*)は +\texttt{jis2004}と\texttt{nodeluxe}のいずれかのオプションが有効になっているときに使われる. +%</ja> +\par\nobreak\medskip +{\centering\small +\begin{tabular}{lllll} +\toprule +\textbf{family}&\textbf{series}&\tt ipa-hg&\tt ipaex-hg&\tt ms-hg\\ +\midrule +%<*en> +&medium&IPA Mincho&IPAex Mincho&MS Mincho\\ +\smash{\raisebox{1.5ex}{\textit{mincho}}}% +&bold&HG Mincho E&HG Mincho E&HG Mincho E\\\midrule +&&IPA Gothic*&IPAex Gothic*&MS Gothic*\\ +&\smash{\raisebox{1.5ex}{medium}}% +&HG Gothic M&HG Gothic M&HG Gothic M\\\cmidrule{2-5} +\textit{gothic}&bold&HG Gothic E&HG Gothic E&HG Gothic E\\\cmidrule{2-5} +&extra bold&HG Soei Kaku Gothic UB&HG Soei Kaku Gothic UB&HG Soei Kaku Gothic UB\\\midrule +\textit{rounded gothic}&& +HG MaruGothic M PRO&HG MaruGothic M PRO&HG MaruGothic M PRO\\ +%</en> +%<*ja> +&medium&IPA明朝&IPAex明朝&MS明朝\\ +\smash{\raisebox{1.5ex}{\textgt{明朝}}}% +&bold&HG明朝E&HG明朝E&HG明朝E\\\midrule +&&IPAゴシック*&IPAexゴシック*&MSゴシック*\\ +&\smash{\raisebox{1.5ex}{medium}}% +&HGゴシックM&HGゴシックM&HGゴシックM\\\cmidrule{2-5} +\textgt{ゴシック}&bold&HGゴシックE&HGゴシックE&HGゴシックE\\\cmidrule{2-5} +&extra bold&HG創英角ゴシックUB&HG創英角ゴシックUB&HG創英角ゴシックUB\\\midrule +\textgt{丸ゴシック}&& +HG丸ゴシックM-PRO&HG丸ゴシックM-PRO&HG丸ゴシックM-PRO\\ +%</ja> +\bottomrule +\end{tabular}\par\medskip} + +%<*en> +Note that HG~Mincho~E, HG~Gothic~E, HG Soei Kaku Gothic UB, and HG Maru Gothic PRO +are internally specified by: +\begin{description} +\item[default] by font name (\texttt{HGMinchoE}, etc.). +\item[\texttt{jis90}, \texttt{90jis}] by file name (\texttt{hgrme.ttc}, \texttt{hgrge.ttc}, \texttt{hgrsgu.ttc}, \texttt{hgrsmp.ttf}). +\item[\texttt{jis2004}, \texttt{2004jis}] by file name (\texttt{hgrme04.ttc}, \texttt{hgrge04.ttc}, \texttt{hgrsgu04.ttc}, \texttt{hgrsmp04.ttf}). +\end{description} +%</en> +%<*ja> +なお,HG明朝E・HGゴシックE・HG創英角ゴシックUB・HG丸ゴシック体PROの4つについては,内部で +\begin{description} +\item[標準] フォント名(\texttt{HGMinchoE} など) +\item[\texttt{jis90}, \texttt{90jis}指定時] ファイル名 (% +\texttt{hgrme.ttc}, \texttt{hgrge.ttc}, \texttt{hgrsgu.ttc}, \texttt{hgrsmp.ttf}) +\item[\texttt{jis2004}, \texttt{2004jis}指定時] ファイル名 (% +\texttt{hgrme04.ttc}, \texttt{hgrge04.ttc}, \texttt{hgrsgu04.ttc}, \texttt{hgrsmp04.ttf}) +\end{description} +として指定を行っているので注意すること. +%</ja> + +%<en>\subsubsection{Define/Use Custom Presets} +%<ja>\subsubsection{新たなプリセットの定義} + +%<*ja> +バージョン20170904.0以降では,自分で新たなプリセットを定義することが出来るようになった. +以下に説明する2命令はプリアンブルでしか実行できない. +%</ja> +%<*en> +From version~20170904.0, one can define new presets using \cs{ltjnewpreset}, +and use them by \cs{ltjapplypreset}. These two commands can only be used in the preamble. +%</en> +\begin{cslist} + \item[\cs{ltjnewpreset}\{<name>\}\{<specification>\}] +%<*ja> + 新たに<name>という名称のプリセットを定義する.この名称は, + すでに定義されているプリセット名や, + \ref{sssec:ltjpreset-general}で定義されているオプション,さらに + 次の9つと重複してはならない. + \begin{quote} + \ttfamily + mc mc-l mc-m mc-bx gt gt-m gt-bx gt-eb mg-m + \end{quote} + + <specification>は,プリセット名や以下のキー達のコンマ区切りリストを指定する: + \begin{description} + \item[\ttfamily mc-l=<font>] 明朝体細字(\cs{mcfamily}\cs{ltseries}) + \item[\ttfamily mc-m=<font>] 明朝体中字(\cs{mcfamily}\cs{mdseries}) + \item[\ttfamily mc-bx=<font>] 明朝体太字(\cs{mcfamily}\cs{bfseries}) + \item[\ttfamily gt-m=<font>] ゴシック体中字(\cs{gtfamily}\cs{mdseries}) + \item[\ttfamily gt-bx=<font>] ゴシック体太字(\cs{gtfamily}\cs{bfseries}) + \item[\ttfamily gt-eb=<font>] ゴシック体太字(\cs{gtfamily}\cs{ebseries}) + \item[\ttfamily mg-m=<font>] 丸ゴシック体(\cs{mgfamily}) + \item[\ttfamily mc=<font>] 明朝体の細字・中字・太字全部を設定. + 以下を指定したことと同じである: + \begin{quote} + \ttfamily mc-l=<font>, mc-m=<font>, mc-bx=<font> + \end{quote} + \item[\ttfamily gt=<font>] ゴシック体の中字・太字・極太全部を設定. + 以下を指定したことと同じである: + \begin{quote} + \ttfamily gt-m=<font>, gt-bx=<font>, gt-eb=<font> + \end{quote} + \end{description} + なお,パッケージ読み込み時に \texttt{deluxe} が有効でない場合は, + 上記9キーのうち\texttt{mc}, \texttt{gt}しか実質的に意味を持たない. +%</ja> +%<*en> + Define new preset~<name>. This <name> cannot be same as other presets, + options described in Subsubsection~\ref{sssec:ltjpreset-general}, nor + following nine strings: + \begin{quote} + \ttfamily + mc mc-l mc-m mc-bx gt gt-m gt-bx gt-eb mg-m + \end{quote} + + <specification> is a comma-separated list which consists of + other presets and/or the following keys: + \begin{description} + \item[\ttfamily mc-l=<font>] mincho light + \item[\ttfamily mc-m=<font>] mincho medium + \item[\ttfamily mc-bx=<font>] mincho bold + \item[\ttfamily gt-m=<font>] gothic medium + \item[\ttfamily gt-bx=<font>] gothic bold + \item[\ttfamily gt-eb=<font>] gothic extra~bold + \item[\ttfamily mg-m=<font>] rounded gothic + \item[\ttfamily mc=<font>] Same as + \begin{quote} + \ttfamily mc-l=<font>, mc-m=<font>, mc-bx=<font> + \end{quote} + \item[\ttfamily gt=<font>] Same as + \begin{quote} + \ttfamily gt-m=<font>, gt-bx=<font>, gt-eb=<font> + \end{quote} + \end{description} + If \texttt{deluxe} is not specified at loading the package, + only \texttt{mc}~and~\texttt{gt} keys (among above 9~keys) have a meaning. +%</en> + \item[\cs{ltjnewpreset}*\{<name>\}\{<specification>\}] +%<*ja> + \cs{ltjnewpreset}とほぼ同じであるが,こちらはすでに定義されているプリセット名 + を<name>に指定した場合にはエラーを出さずに定義を置き換える. +%</ja> +%<*en> + Almost same as \cs{ltjnewpreset}. However, if <name> matches a preset which already defined, + this command simply overwrite it. +%</en> + \item[\cs{ltjapplypreset}\{<name>\}] +%<ja> <name>で指定されたプリセットを使って和文フォントを設定する. +%<en> Set Japanese font families using preset~<name>. +\end{cslist} + +%<*ja> +なお,\cs{ltjnewpreset}の第二引数<specification>に含まれる +プリセット名は\cs{ltjnewpreset}の時点で定義されている必要はなく, +\cs{ltjapplypreset}で実際に使うときに定義されていれば良い. +そのため,次のような記述も可能である: +\begin{lstlisting} + \ltjnewpreset{hoge}{piyo,mc-bx=HiraMinProN-W6} + \ltjnewpreset{piyo}{mg-m=HiraMaruProN-W4} + \ltjapplypreset{hoge} +\end{lstlisting} + +\paragraph{注意} +\cs{ltjnewpreset}で定義したプリセットには以下の制限がある. +\begin{itemize} + \item 非埋め込みのフォントを指定することはできない. + \item \texttt{ipa-hg}などのいくつかのプリセットでは + 「\texttt{90jis}, \texttt{jis2004}が指定されているか否かでフォントの指定を変える」処理が + 行われていたが,\cs{ltjnewpreset}で定義したプリセットではこの処理は働かない. + HGフォントやモガ明朝などを使うプリセットを定義する場合には注意すること. +\end{itemize} +%</ja> +%<*en> +Note that \cs{ltjnewpreset} does not ``expand'' the definition to define a preset. +This means that one can write as the following: +\begin{lstlisting} + \ltjnewpreset{hoge}{piyo,mc-bx=HiraMinProN-W6} + \ltjnewpreset{piyo}{mg-m=HiraMaruProN-W4} + \ltjapplypreset{hoge} +\end{lstlisting} + +\paragraph{Restrictions} +Presets which are defined by \cs{ltjnewpreset} have following restrictions: +\begin{itemize} + \item One cannot specify non-embedded fonts (such as Ryumin-Light). + \item Some presets, such as \texttt{ipa-hg}, have a feature that + fonts are changed according to whether \texttt{90jis}~or~\texttt{jis2004} is speified. + This feature is not usable in presets which are defined by \cs{ltjnewpreset}. +\end{itemize} +%</en> + + +\clearpage +%<en>\part{Implementations} +%<ja>\part{実装} +\label{part-imp} +%<en>\section{Storing Parameters} +%<ja>\section{パラメータの保持} +\label{sec-para} +%<en>\subsection{Used dimensions, attributes and whatsit nodes} +%<ja>\subsection{\LuaTeX-jaで用いられるレジスタとwhatsitノード} + +%<*en> +Here the following is the list of dimensions and attributes which are used in \LuaTeX-ja. +%</en> +%<*ja> +以下は\LuaTeX-jaで用いられる寸法レジスタ(dimension),属性レジスタ(attribute)の +リストである. +%</ja> +\begin{list}{}{% +\def\makelabel{\ttfamily}\advance\leftmargin1\zw +\def\dim#1{\item[\textbackslash #1\ \textrm{(dimension)}]} +\def\cnt#1{\item[\textbackslash #1\ \textrm{(counter)}]} +\def\attr#1{\item[\textbackslash #1\ \textrm{(attribute)}]} +} + +\dim{jQ} +%<*en> +\cs{jQ} is equal to + $1\,\textrm{Q}=0.25\,\textrm{mm}$, where ``Q''~(also called ``級'') is + a unit used in Japanese phototypesetting. +So one should not change the value of this dimension. +%</en> +%<*ja> +\cs{jQ} は写植で用いられた$1\,\textrm{Q}=0.25\,\textrm{mm}$% +(「級」とも書かれる)に等しい.したがって, +この寸法レジスタの値を変更してはならない. +%</ja> + +\dim{jH} +%<*en> +There is also a unit called ``歯'' which equals to $0.25\,\textrm{mm}$ and + used in Japanese phototypesetting. +This \cs{jH} is the same \cs{dimen} register as \cs{jQ}. +%</en> +%<*ja> +同じく写植で用いられていた単位として「歯」があり,これも$0.25\,\textrm{mm}$と +等しい.この \cs{jH} は \cs{jQ} と同じ寸法レジスタを指す. +%</ja> + +\dim{ltj@zw} +%<*en> +A temporal register for the ``full-width'' of current Japanese font. +The command \cs{zw} sets this register to the correct value, and +``return'' this register itself. +%</en> +%<*ja> +現在の和文フォントの「全角幅」を保持する一時レジスタ. +\cs{zw} 命令は,このレジスタを適切な値に設定した後, +「このレジスタ自体を返す」. +%</ja> + +\dim{ltj@zh} +%<*en> +A temporal register for the ``full-height'' (usually the sum of height of imaginary body and its depth) of current Japanese font. +The command \cs{zh} sets this register to the correct value, and +``return'' this register itself. +%</en> +%<*ja> +現在の和文フォントの「全角高さ」(通常,高さと深さの和)を保持する一時レジスタ. +\cs{zh} 命令は,このレジスタを適切な値に設定した後, +「このレジスタ自体を返す」. +%</ja> + +\attr{jfam} +%<*en> +Current number of Japanese font family for math formulas. +%</en> +%<*ja> +数式用の和文フォントファミリの現在の番号. +%</ja> + +\attr{ltj@curjfnt} +%<*en> +If this attribute is a positive number, it stores the font number of current Japanese font for horizontal direction. +If this attribute is negative, it means that the Japanese font for horizontal direction is +not loaded---\LuaTeX-ja only knows its size and JFM. +%</en> +%<*ja> +基本的には現在の横組用和文フォントのフォント番号を格納しているが, +\LaTeX 下で使用する場合は($-2$以下の)負数となることがある. + 負数の場合は「横組用和文フォントは実際には読み込まれておらず,そのフォントサイズとJFMだけが + \LuaTeX-jaが把握している」状態を表す. +%</ja> + +\attr{ltj@curtfnt} +%<*en> +Similar to \cs{ltj@curjfnt}, but with current Japanese font for vertical direction. +%</en> +%<*ja> +縦組用和文フォントに関する\cs{ltj@curjfnt}と同様の値. +%</ja> + +\attr{ltj@charclass} +%<*en> +The character class of a \textbf{JAchar}. This attribute is only set on a + \textit{glyph\_node} which contains a \textbf{JAchar}. +%</en> +%<*ja> +\textbf{JAchar}の文字クラス.\textbf{JAchar}が格納された\textit{glyph\_node}でのみ使われる. +%</ja> + +\attr{ltj@yablshift} +%<*en> +The amount of shifting the baseline of alphabetic fonts in scaled point ($2^{-16}\,\textrm{pt}$). +%</en> +%<*ja> +スケールド・ポイント($2^{-16}\,\textrm{pt}$)を単位とした欧文フォントのベースラインの移動量. +%</ja> + +\attr{ltj@ykblshift} +%<*en> +The amount of shifting the baseline of Japanese fonts in scaled point ($2^{-16}\,\textrm{pt}$). +%</en> +%<*ja> +スケールド・ポイント($2^{-16}\,\textrm{pt}$)を単位とした和文フォントのベースラインの移動量. +%</ja> + +\attr{ltj@tablshift} +\attr{ltj@tkblshift} + +\attr{ltj@autospc} +%<*en> +Whether the auto insertion of \Param{kanjiskip} is allowed at the node. +%</en> +%<*ja> +そのノードで\Param{kanjiskip}の自動挿入が許されるかどうか. +%</ja> + +\attr{ltj@autoxspc} +%<*en> +Whether the auto insertion of \Param{xkanjiskip} is allowed at the node. +%</en> +%<*ja> +そのノードで\Param{xkanjiskip}の自動挿入が許されるかどうか. +%</ja> + +\attr{ltj@icflag} +%<*en> +An attribute for distinguishing ``kinds'' of a node. One of the following value is +assigned to this attribute: +%</en> +%<*ja> +ノードの「種類」を区別するための属性.以下のうちのひとつが値として割り当てられる: +%</ja> +\begin{description} +\item[\textit{italic} (1)] +%<*en> +Kerns from italic correction (\verb+\/+), or from kerning information of a Japanese font. +These kerns are ``ignored'' in the insertion process of \textbf{JAglue}, +unlike explicit \cs{kern}. +%</en> +%<*ja> +イタリック補正(\verb+\/+)によるカーン, +または \Pkg{luaotfload} によって挿入されたフォントのカーニング情報由来のカーン. +これらのカーンは通常の \cs{kern} とは異なり, +\textbf{JAglue}の挿入処理においては透過する. +%</ja> + +\item[\textit{packed} (2)] + +\item[\textit{kinsoku} (3)] +%<*en> +Penalties inserted for the word-wrapping process (\emph{kinsoku shori}) of Japanese characters. +%</en> +%<ja>禁則処理のために挿入されたペナルティ. +\item[\mathversion{bold}$(\textit{from\_jfm}-2)$--$(\textit{from\_jfm}+2)$~(4--8)] +%<en>Glues/kerns from JFM. +%<ja>JFM由来のグルー/カーン. +\item[\textit{kanji\_skip}~(9), \textit{kanji\_skip\_jfm}~(10)] +%<en>Glues from \Param{kanjiskip}. +%<ja>和文間空白\Param{kanjiskip}を表すグルー. +\item[\textit{xkanji\_skip}~(11), \textit{xkanji\_skip\_jfm}~(12)] +%<en>Glues from \Param{xkanjiskip}. +%<ja>和欧文間空白\Param{xkanjiskip}を表すグルー. +\item[\textit{processed} (13)] +%<en>Nodes which is already processed by \ldots. +%<ja>\LuaTeX-ja の内部処理によって既に処理されたノード. +\item[\textit{ic\_processed} (14)] +%<*en> +Glues from an italic correction, but already processed in the insertion process of \textbf{JAglue}s. +%</en> +%<ja>イタリック補正に由来するグルーであって,既に \textbf{JAglue} 挿入処理にかかったもの. +\item[\textit{boxbdd} (15)] +%<en>Glues/kerns that inserted just the beginning or the ending of an hbox or a paragraph. +%<ja>hboxか段落の最初か最後に挿入されたグルー/カーン. +\end{description} + +%<*ja> +また,挿入処理の結果であるリストの最初のノードでは,\verb+\ltj@icflag+ の値に +\textit{processed\_begin\_flag}~(128)が追加される.これによって,\cs{unhbox} が +連続した場合でも「ボックスの境界」が識別できるようになっている. +%</ja> + +\attr{ltj@kcat\,$i$} +%<*en> +Where $i$~is a natural number which is less than~7. +These 7~attributes store bit~vectors indicating which character block is regarded as a block of \textbf{JAchar}s. +%</en> +%<*ja> +$i$は7より小さい自然数. +これら7つの属性レジスタは,どの文字ブロックが\textbf{JAchar}のブロックとして +扱われるかを示すビットベクトルを格納する. +%</ja> + +\attr{ltj@dir} +%<*ja> +\textit{direction}~whatsit(後述)において組方向を示すために,あるいは\textit{dir\_box}の + 組方向を用いる.\textit{direction}~whatsitにおいては値は +\begin{quote} + \textit{dir\_dtou} (1), \textit{dir\_tate} (3), + \textit{dir\_yoko} (4), \textit{dir\_utod} (11) +\end{quote} +のいずれかであり,\textit{dir\_box}ではこれらに次を加えた値をとる(\ref{sec-dir-imp}章参照). +%</ja> +\begin{description} +\item[\textit{dir\_node\_auto} (128)] +%<ja> 異なる組方向に配置するために自動的に作られたボックス. +\item[\textit{dir\_node\_manual} (256)] +%<ja> \cs{ltjsetwd} によって「ボックスの本来の組方向とは異なる組方向での寸法」を +%<ja> 設定したときに,それを記録するためのボックス. +\end{description} +%<ja> \TeX 側から見える値,つまり \verb+\the\ltj@dir+ の値は常に0である. + +\cnt{ltjlineendcomment} +%<*ja> + \LuaTeX-jaは\textbf{JAchar}で入力行が終了した場合,その直後にコメント文字を + おくことで余計な空白が挿入されることを防いでいる. + \cs{ltjlineendcomment}はその際のコメント文字のUnicodeにおける符号位置を指定する + (詳細は\ref{ssec:lineend}節を参照). + + \LuaTeX-jaにおける既定値は$\texttt{"FFFFF}=1048575$であり, + ユーザは内部動作を熟知していない限りこのカウンタの値を変更してはならない. + \cs{ltjlineendcomment}の値がUnicodeの範囲外(負や,$\texttt{"10FFFF}=1114111$を超えた場合) + にくることは想定されていない. +%</ja> +\end{list} + +%<*en> +Furthermore, \LuaTeX-ja uses several user-defined whatsit nodes for +internal processing. All those nodes except \emph{direction} whatsits +store a natural number (hence its \texttt{type} is 100). +\emph{direction} whatsits store a node list, hence its \texttt{type} is 110. +Their \texttt{user\_id} (used for distinguish user-defined whatsits) +are allocated by \texttt{luatexbase.newuserwhatsitid}. +%</en> +%<*ja> +さらに,\LuaTeX-jaはいくつかのuser-defined whatsit nodeを内部処理に用いる. +\textit{direction} whatsitはノードリストを格納するが, +それ以外のwhatsitノードの \texttt{type} は100であり,ノードは自然数を格納している. +user-defined whatsitを識別するための \texttt{user\_id} は\ +\texttt{luatexbase.newuserwhatsitid} により確保されており, +下の見出しは単なる識別用でしかない. +%</ja> +\begin{description} +\item[\textit{inhibitglue}] +%<*en> +Nodes for indicating that \cs{inhibitglue} is + specified. The \texttt{value} field of these nodes doesn't matter. +%</en> +%<*ja> +\cs{inhibitglue} が指定されたことを示すノード.これらのノードの\ +\texttt{value} フィールドは意味を持たない. +%</ja> + +\item[\textit{stack\_marker}] +%<*en> +Nodes for \LuaTeX-ja's stack system (see the next + subsection). The \texttt{value} field of these nodes is + current group level. +%</en> +%<*ja> +\LuaTeX-jaのスタックシステム(次の節を参照)のためのノード. +これらのノードの \texttt{value} フィールドは現在のグループネストレベルを表す. +%</ja> + +\item[\textit{char\_by\_cid}] +%<*en> +Nodes for \textbf{JAchar} which the callback process of + \Pkg{luaotfload} won't be applied, and the character code is + stored in the \texttt{value} field. Each node of this type are + converted to a \textit{glyph\_node} \emph{after} + the callback process of luaotfload. +Nodes of this type is used in \cs{CID}, \cs{UTF} and IVS support. +%</en> +%<*ja> +\Pkg{luaotfload}のコールバックによる処理が適用されない\textbf{JAchar}のためのノードで, +\texttt{value} フィールドに文字コードが格納されている. +この種類のノードはそれぞれが\Pkg{luaotfload}のコールバックの処理の +\emph{後で}\textit{glyph\_node}に変換される. +\cs{CID}, \cs{UTF}やIVS対応処理でこの種類のノードが利用されている. +%</ja> + +\item[\textit{replace\_vs}] +%<*en> +Similar to \textit{char\_by\_cid} whatsits above. +These nodes are for \textbf{ALchar} which the callback process of + \Pkg{luaotfload} won't be applied. +%</en> +%<*ja> +上の\textit{char\_by\_cid}と同様に, +これらのノードは\Pkg{luaotfload}のコールバックによる処理が適用されない\textbf{ALchar}のた + めものである. +%</ja> + +\item[\textit{begin\_par}] +%<*en> +Nodes for indicating beginning of a paragraph. +A paragraph which is started by \cs{item} in list-like environments has a horizontal box +for its label before the actual contents. So \dots +%</en> +%<*ja> +「段落の開始」を意味するノード. +\texttt{list}環境,\texttt{itemize}環境などにおいて,\cs{item} で始まる各項目は…… +%</ja> + +\item[\textit{direction}] + +\end{description} + +%<*en> +These whatsits will be removed during the process of inserting \textbf{JAglue}s. +%</en> +%<*ja> +これらのwhatsitノードは\textbf{JAglue}の挿入処理の間に取り除かれる. +%</ja> + +%<en>\subsection{Stack system of \LuaTeX-ja} +%<ja>\subsection{\LuaTeX-jaのスタックシステム} +\label{ssec:stack} + +%<en>\paragraph{Background} +%<ja>\paragraph{背景} +%<*en> +\LuaTeX-ja has its own stack system, and most parameters of \LuaTeX-ja +are stored in it. To clarify the reason, imagine the parameter +\Param{kanjiskip} is stored by a skip, and consider the following +source: +%</en> +%<*ja> +\LuaTeX-jaは独自のスタックシステムを持ち,\LuaTeX-jaのほとんどのパラメータは +これを用いて保持されている.その理由を明らかにするために, +\Param{kanjiskip}パラメータがスキップレジスタで保持されているとし, +以下のコードを考えてみよう: +%</ja> +\begin{LTXexample} +\ltjsetparameter{kanjiskip=0pt}ふがふが.% +\setbox0=\hbox{% + \ltjsetparameter{kanjiskip=5pt}ほげほげ} +\box0.ぴよぴよ\par +\end{LTXexample} + +%<*en> +As described in Subsection~\ref{ssec:param}, the only effective value of +\Param{kanjiskip} in an hbox is the latest value, so the value of +\Param{kanjiskip} which applied in the entire hbox should be 5\,pt. +However, by the implementation method of \LuaTeX, this ``5\,pt'' cannot be +known from any callbacks. In the \texttt{tex/packaging.w}, which is a +file in the source of \LuaTeX, there are the following codes: +%</en> +%<*ja> +\ref{ssec:param}節で述べたように,あるhboxの中で効力を持つ +\Param{kanjiskip}の値は最後に現れた値のみであり,したがってボックス全体に適用される +\Param{kanjiskip}は5\,ptであるべきである.しかし,\LuaTeX の実 +装を観察すると,この5\,ptという長さはどのコールバックからも知ることはできないことがわかる. +\LuaTeX のソースファイルの1つ \texttt{tex/packaging.w} の中に, +以下のコードがある: +%</ja> +\begin{lstlisting}[numbers=left,firstnumber=1226] +void package(int c) +{ + scaled h; /* height of box */ + halfword p; /* first node in a box */ + scaled d; /* max depth */ + int grp; + grp = cur_group; + d = box_max_depth; + unsave(); + save_ptr -= 4; + if (cur_list.mode_field == -hmode) { + cur_box = filtered_hpack(cur_list.head_field, + cur_list.tail_field, saved_value(1), + saved_level(1), grp, saved_level(2)); + subtype(cur_box) = HLIST_SUBTYPE_HBOX; +\end{lstlisting} +%<*en> +Notice that \texttt{unsave()} is executed \emph{before} +\texttt{filtered\_hpack()}, where \texttt{hpack\_filter} callback is +executed) here. So ``5\,pt'' in the above source is orphaned at +\texttt{unsave()}, and hence it can't be accessed from \texttt{hpack\_filter} +callback. +%</en> +%<*ja> +\texttt{unsave()} が \texttt{filtered\_hpack()}(これは \texttt{hpack\_filter} コールバックが +実行されるところである)の\emph{前に}実行されていることに注意する. +したがって,上記ソース中で5\,ptは \texttt{unsave()} のところで捨てられ, +\texttt{hpack\_filter} コールバックからはアクセスすることができない. +%</ja> + +%<en>\paragraph{Implementation} +%<ja>\paragraph{解決法} + +%<*en> +The code of stack system is based on that in a post of Dev-luatex mailing list\footnote{% +\texttt{[Dev-luatex] tex.currentgrouplevel}, a post at 2008/8/19 by Jonathan Sauer.}. +%</en> +%<*ja> +スタックシステムのコードはDev-luatexメーリングリストのある投稿\footnote{% +\texttt{[Dev-luatex] tex.currentgrouplevel}: Jonathan Sauerによる2008/8/19の投稿.}を +ベースにしている. +%</ja> + +%<*en> +These are two \TeX\ count registers for maintaining information: +\verb+\ltj@@stack+ for the stack level, and \verb+\ltj@@group@level+ for +the \TeX's group level when the last assignment was done. Parameters +are stored in one big table named \texttt{charprop\_stack\_table}, where +\texttt{charprop\_stack\_table[$i$]} stores data of stack level~$i$. If +a new stack level is created by \cs{ltjsetparameter}, all data of the +previous level is copied. +%</en> +%<*ja> +情報を保持するために,2つの\TeX の整数レジスタを用いている: +\verb+\ltj@@stack+ にスタックレベル,\verb+\ltj@@group@level+ に最後の代入が +なされた時点での\TeX のグループレベルを保持している. +パラメータは\texttt{charprop\_stack\_table}という名前のひとつの大きなテーブルに +格納される.ここで,\texttt{charprop\_stack\_table[$i$]}はスタックレベル$i$の +データを格納している.もし新しいスタックレベルが \cs{ltjsetparameter} によって +生成されたら,前のレベルの全てのデータがコピーされる. +%</ja> + +%<*en> +To resolve the problem mentioned in above paragraph ``Background'', \LuaTeX-ja uses +another trick. When the stack level is about to be increased, a whatsit +node whose type, subtype and value are 44~(\textit{user\_defined}), +\textit{stack\_marker} and the current group level respectively is appended to the current +list (we refer this node by \textit{stack\_flag}). This enables us to +know whether assignment is done just inside a hbox. Suppose that the +stack level is~$s$ and the \TeX's group level is~$t$ just after the hbox +group, then: +%</en> +%<*ja> +上の「背景」で述べた問題を解決するために,\LuaTeX-jaでは次の手法を用いる: +スタックレベルが増加するするとき,type, subtype, valueがそれぞれ +44~(\textit{user\_defined}), \textit{stack\_marker},そして現在のグループレベルであるwhatsitノード +を現在のリストに付け加える(このノードを\textit{stack\_flag}とする). +これにより,あるhboxの中で代入がなされたかどうかを知ることが可能 +となる.スタックレベルを$s$,そのhbox groupの直後の\TeX のグループレベルを +$t$とすると: +%</ja> +\begin{itemize} +%<*en> +\item If there is no \textit{stack\_flag} node in the list of the contents of the hbox, then + no assignment was occurred inside the hbox. Hence values of + parameters at the end of the hbox are stored in the stack + level~$s$. +%</en> +%<*ja> +\item もしそのhboxの中身を表すリストの中に\textit{stack\_flag}ノードがなければ, + hboxの中では代入は起こらなかったということになる. + したがって,そのhboxの終わりにおけるパラメータの値はスタックレベル$s$に + 格納されている. +%</ja> + +%<*en> +\item If there is a \textit{stack\_flag} node whose value is~$t+1$, then + an assignment was occurred just inside the hbox group. Hence + values of parameters at the end of the hbox are stored in the + stack level~$s+1$. +%</en> +%<*ja> +\item もし値が$t+1$の\textit{stack\_flag}ノードがあれば,その + hboxの中で代入が起こったことになる. + したがって,hboxの終わりにおけるパラメータの値はスタックレベル$s+1$に + 格納されている. +%</ja> + +%<*en> +\item If there are \textit{stack\_flag} nodes but all of their values + are more than~$t+1$, then an assignment was occurred in the box, + but it is done in more internal group. Hence values of + parameters at the end of the hbox are stored in the stack + level~$s$. +%</en> +%<*ja> +\item もし\textit{stack\_flag}ノードがあるがそれらの値が全て$t+1$より大きい + 場合,そのボックスの中で代入が起こったが,それは「より内部の」グループで + 起こったということになる.したがって,hboxの終わりでのパラメータの + 値はスタックレベル$s$に格納されている. +%</ja> +\end{itemize} + +%<*en> +Note that to work this trick correctly, assignments to +\verb+\ltj@@stack+ and \verb+\ltj@@group@level+ have to be local always, +regardless the value of \cs{globaldefs}. +To solve this problem, we use another trick: the assignment +\hbox{\verb+\directlua{tex.globaldefs=0}+} is always local. +%</en> +%<*ja> +このトリックを正しく働かせるためには,\verb+\ltj@@stack+ と \verb+\ltj@@group@level+ への +代入は \cs{globaldefs} の値によらず常にローカルでなければならないことに注意する. +この問題は \hbox{\verb+\directlua{tex.globaldefs=0}+}(この代入は常にローカル)を +用いることで解決している. +%</ja> + +%<*en> +\subsection{Lua functions of the stack system} +In this subsection, we will see how a user use \LuaTeX-ja's stack system to +store some data which obeys the grouping of \TeX. +%</en> +%<*ja> +\subsection{スタックシステムで使用される関数} +本節では,ユーザが\LuaTeX-jaのスタックシステムを使用して, +\TeX のグルーピングに従うような +独自のデータを取り扱う方法を述べる. +%</ja> + +%<*en> +The following function can be used to store data into a stack: +\begin{lstlisting} +luatexja.stack.set_stack_table(index, <any> data) +\end{lstlisting} +Any values which except \texttt{nil}~and~NaN are usable as \textit{index}. +However, a user should use only negative integers or strings as \textit{index}, +since natural numbers are used by \LuaTeX-ja itself. +Also, whether \textit{data} is stored locally or globally +is determined by \texttt{luatexja.isglobal} +(stored globally if and only if \texttt{luatexja.isglobal == 'global'}). +%</en> +%<*ja> +スタックに値を設定するには,以下のLua関数を呼び出せば良い: +\begin{lstlisting} +luatexja.stack.set_stack_table(<any> index, <any> data) +\end{lstlisting} +直感的には,スタックテーブル中のインデックス\textit{index}の値を\textit{data}にする,という意味である. +\textit{index}の値としては \texttt{nil} とNaN以外の任意の値を使えるが, +自然数は\LuaTeX-jaが使用する(将来の拡張用も含む)ので, +ユーザが使用する場合は負の整数値か文字列の値にすることが望ましい. +また,ローカルに設定されるかグローバルに設定されるかは,\texttt{luatexja.isglobal} の値に依存する +(グローバルに設定されるのは,\texttt{luatexja.isglobal == 'global'} であるちょうどその時). +%</ja> + +%<*en> +Stored data can be obtained as the return value of +\begin{lstlisting} +luatexja.stack.get_stack_table(index, <any> default, <number> level) +\end{lstlisting} +where \textit{level} is the stack level, which is usually the value of \verb+\ltj@@stack+, +and \textit{default} is the default value which will be returned if no values are stored +in the stack table whose level is \textit{level}. +%</en> +%<*ja> +スタックの値は, +\begin{lstlisting} +luatexja.stack.get_stack_table(<any> index, <any> default, <number> level) +\end{lstlisting} +の戻り値で取得できる.\textit{level}はスタックレベルであり, +通常は \verb+\ltj@@stack+ の値を指定することになるだろう. +\textit{default}はレベル\textit{level}のスタックに値が設定されていなかった場合に +返すデフォルト値である. +%</ja> + +\begin{figure}[tb] +\begin{lstlisting}[numbers=left, firstnumber=380] +\protected\def\ltj@setpar@global{% + \relax\ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}% + \else\directlua{luatexja.isglobal=''}\fi +} +\protected\def\ltjsetparameter#1{% + \ltj@setpar@global\setkeys[ltj]{japaram}{#1}\ignorespaces} +\protected\def\ltjglobalsetparameter#1{% + \relax\ifnum\globaldefs<0\directlua{luatexja.isglobal=''}% + \else\directlua{luatexja.isglobal='global'}\fi% + \setkeys[ltj]{japaram}{#1}\ignorespaces} +\end{lstlisting} +%<ja>\caption{パラメータ設定命令の定義} +%<en>\caption{Definiton of parameter setting commands} +\label{fig:setpar-def} +\end{figure} + +%<*en> +\subsection{Extending Parameters} +Keys for \cs{ltjsetparameter}~and~\cs{ltjgetparameter} can be extended, +as in \Pkg{luatexja-adjust}. +%</en> +%<*ja> +\subsection{パラメータの拡張} +ここでは,\Pkg{luatexja-adjust}で行なっているように, +\cs{ltjsetparameter},~\cs{ltjgetparameter}に指定可能なキーを追加する方法 +を述べる. +%</ja> + +%<*en> +\paragraph{Setting parameters} +\autoref{fig:setpar-def} shows the \emph{most outer} definition of +two commands, +\cs{ltjsetparameter} and \cs{ltjglobalsetparameter}. +Most important part is the last \cs{setkeys}, +which is offered by the \Pkg{xkeyval} package. + +Hence, to add a key in \cs{ltjsetparameter}, one only have to add a key +whose prefix is \texttt{ltj} and whose family is \texttt{japaram}, as the following. +\begin{lstlisting} +\define@key[ltj]{japaram}{...}{...} +\end{lstlisting} + +\cs{ltjsetparameter}~and~\cs{ltjglobalsetparameter} automatically sets +\texttt{luatexja.isglobal}. Its meaning is the following. +\begin{align} + \texttt{luatexja.isglobal} = +\begin{cases} + \texttt{'global'}&\text{global}\\ + \texttt{''}&\text{local} +\end{cases} +\end{align} +This is determined not only by command name +(\cs{ltjsetparameter}~or~\cs{ltjglobalsetparameter}), +but also by the value of \cs{globaldefs}. +%</en> +%<*ja> +\paragraph{パラメータの設定} +\cs{ltjsetparameter} と,\cs{ltjglobalsetparameter} の定義は\autoref{fig:setpar-def}の +のようになっている. +本質的なのは最後の \cs{setkeys} で,これは\Pkg{xkeyval}パッケージの提供する命令である. + +このため,\cs{ltjsetparameter} に指定可能なパラメータを追加するには, +<prefix>を \texttt{ltj},<family>を \texttt{japaram} としたキーを +\begin{lstlisting} +\define@key[ltj]{japaram}{...}{...} +\end{lstlisting} +のように定義すれば良いだけである. +なお,パラメータ指定がグローバルかローカルかどうかを示す \texttt{luatexja.isglobal} が, +\begin{align} + \texttt{luatexja.isglobal} = +\begin{cases} + \texttt{'global'}&\text{パラメータ設定はグローバル}\\ + \texttt{''}&\text{パラメータ設定はローカル} +\end{cases} +\end{align} +として自動的にセットされる\footnote{命令が \cs{ltjglobalsetparameter} かどうかだけでは +なく,実行時の \cs{globaldefs} の値にも依存して定まる.}. +%</ja> + +%<*en> +\paragraph{Getting parameters} +\cs{ltjgetparameter} is implemented by a Lua script. + +For parameters that do not need additional arguments, one only have to +define a function in the table \verb+luatexja.unary_pars+. +For example, with the following function, +\verb+\ltjgetparameter{hoge}+ returns a \emph{string} \texttt{42}. +\begin{lstlisting}[numbers=left] +function luatexja.unary_pars.hoge (t) + return 42 +end +\end{lstlisting} +Here the argument of \verb+luatexja.unary_pars.hoge+ is +the stack level of \LuaTeX-ja's stack system (see Subsection~\ref{ssec:stack}). + +On the other hand, for parameters that need an additional argument +(this must be an integer), one have to define a function in +\verb+luatexja.binary_pars+ first. For example, +\begin{lstlisting}[numbers=left] +function luatexja.binary_pars.fuga (c, t) + return tostring(c) .. ', ' .. tostring(42) +end +\end{lstlisting} +Here the first argument $t$ is the stack level, as before. +The second argument $c$ is just the second argument of \cs{ltjgetparameter}. + +For parameters that need an additional argument, one also have to +execute the \TeX\ code like +\begin{lstlisting} +\ltj@@decl@array@param{fuga} +\end{lstlisting} +to indicate that ``the parameter \texttt{fuga} needs an additional argument''. +%</en> +%<*ja> +\paragraph{パラメータの取得} +一方,\cs{ltjgetparameter} はLuaスクリプトによって実装されている. +値を取得するのに追加引数の要らないパラメータについては,\verb+luatexja.unary_pars+\ +内に処理内容を記述した関数を定義すれば良い.例えば,Luaスクリプトで +\begin{lstlisting}[numbers=left] +function luatexja.unary_pars.hoge (t) + return 42 +end +\end{lstlisting} +を実行すると,\verb+\ltjgetparameter{hoge}+ は \texttt{42} という\emph{文字列}を返す. +関数 \verb+luatexja.unary_pars.hoge+ の引数$t$は,\ref{ssec:stack}節で述べた +\LuaTeX-jaのスタックシステムにおけるスタックレベルである. +戻り値はいかなる値であっても,最終的には文字列として出力されることに注意. + +一方,追加引数(\emph{数値しか許容しない})が必要なパラメータについては, +まずLuaスクリプトで処理内容の本体を記述しておく: +\begin{lstlisting}[numbers=left] +function luatexja.binary_pars.fuga (c, t) + return tostring(c) .. ', ' .. tostring(42) +end +\end{lstlisting} +引数$t$は,先に述べた通りのスタックレベルである.一方,引数$c$は\ +\cs{ltjgetparameter} の第2引数を表す数値である. +しかしこれだけでは駄目で, +\begin{lstlisting} +\ltj@@decl@array@param{fuga} +\end{lstlisting} +を実行し,\TeX インターフェース側に +「\verb+\ltjgetparameter{fuga}+ は追加引数が必要」ということを通知する必要がある. +%</ja> + +%<en>\section{Linebreak after a Japanese Character} +%<ja>\section{和文文字直後の改行} +\label{sec-lbreak} +%<en>\subsection{Reference: behavior in \pTeX} +%<ja>\subsection{参考:\pTeX の動作} +%<*en> +In~\pTeX, a line break after a Japanese character doesn't emit a space, +since words are not separated by spaces in Japanese writings. However, +this feature isn't fully implemented in \LuaTeX-ja due to the +specification of callbacks in~\LuaTeX. To clarify the difference between +\pTeX~and~\LuaTeX, We briefly describe the handling of a line break in~\pTeX, in +this subsection. + +\pTeX's input processor can be described in terms of a finite state +automaton, as that of~\TeX\ in~Section~2.5 of~\cite{texbytopic}. The +internal states are as follows: +\begin{itemize} +\item State~$N$: new line +\item State~$S$: skipping spaces +\item State~$M$: middle of line +\item State~$K$: after a Japanese character +\end{itemize} +The first three states---$N$,~$S$, and~$M$---are as same as \TeX's input +processor. State~$K$ is similar to state~$M$, and is entered after +Japanese characters. The diagram of state transitions are indicated in +\autoref{fig:ptexipro}. Note that \pTeX\ doesn't leave state~$K$ +after ``beginning/ending of a group'' characters. +%</en> + +%<*ja> +欧文では文章の改行は単語間でしか行わない.そのため,\TeX では,(文字の直後の)改行は +空白文字と同じ扱いとして扱われる.一方,和文ではほとんどどこでも改行が可能なため, +\pTeX では和文文字の直後の改行は単純に無視されるようになっている. + +このような動作は,\pTeX が\TeX からエンジンとして拡張されたことによって可能になったことである. +\pTeX の入力処理部は,\TeX におけるそれと同じように,有限オートマトンとして記述することができ, +以下に述べるような4状態を持っている. + +\begin{itemize} +\item State~$N$: 行の開始. +\item State~$S$: 空白読み飛ばし. +\item State~$M$: 行中. +\item State~$K$: 行中(和文文字の後). +\end{itemize} +また,状態遷移は,\autoref{fig:ptexipro}のようになっており,図中の数字は +カテゴリーコードを表している.最初の3状態は\TeX の入力処理部と同じであり, +図中から状態$K$と「$j$」と書かれた矢印を取り除けば,\TeX の入力処理部と同 +じものになる. + +この図から分かることは, +\begin{quote} +行が和文文字(とグループ境界文字)で終わっていれば,改行は無視される +\end{quote} +ということである. +%</ja> + +\begin{figure}[!tb] +\let\sp\textvisiblespace\small +\begin{minipage}{.6\textwidth}% +\begin{center} +\unitlength=6.5mm\sf\mathversion{bold} +\begin{tikzpicture}[ + ->, auto, shorten >=1pt +] +\node [shape=rectangle, font=\scriptsize] (init) at (2,7) {start}; +\node [shape=circle,draw, fill=b_cyan] (newline) at (4,7) {$N$}; +\node [shape=circle,draw, fill=b_cyan] (midline) at (4,4) {$M$}; +\node [shape=circle,draw, fill=b_cyan] (skipspc) at (8,7) {$S$}; +\node [shape=circle,draw, fill=b_pink] (kanji) at (8,4) {$K$}; +\node [shape=rectangle,draw, fill=b_green] (scanacs) at (6,8) {scan a c.s.}; +\node (endk) at (8,2.5) {} ; +\node (endm) at (4,2.5) {} ; +\node (ends) at (8,8.5) {} ; +\node (endn) at (4,8.5) {} ; +\begin{scope}[font=\scriptsize] +\path (newline) edge [bend right] node [left]{G, O} (midline) + (init) edge node {} (newline) + (midline) edge [bend right=10] node {10} (skipspc) + (skipspc) edge [bend right] node [left,right=10,above=7]{G, O} (midline) + (skipspc) edge [loop right] node {10} (skipspc) + (newline) edge [loop right] node {10} (newline) + (scanacs) edge [bend left] node [left=3,below]{$(*)$} (skipspc) + (scanacs) edge [bend right] node [right=30,above=20]{$(*)$} (midline) + (midline) edge node {5\ [\sp]} (endm) + (midline) edge [loop left] node {G, O} (midline) + (skipspc) edge node [right] {5} (ends) + (newline) edge node {5 [\cs{par}]} (endn); +\begin{scope}[red] +\path (newline) edge [bend right] node [right=25,below=3]{J} (kanji) + (midline) edge node [below]{J} (kanji) + (kanji) edge [bend left] node {O} (midline) + (kanji) edge node {10} (skipspc) + (kanji) edge [loop right] node {G, J} (kanji) + (skipspc) edge [bend left] node {J} (kanji) + (kanji) edge node {5} (endk) +; +\end{scope} +\end{scope} +\end{tikzpicture} +\end{center} +\end{minipage}% +\begin{minipage}{.4\textwidth} +\begin{description} +\item[\textsf{G}] Beginning of group (usually \verb+{+)\\ + and ending of group (usually \verb+}+). +\item[\textsf{J}] Japanese characters. +\item[\textsf{5}] \textit{end-of-line} (usually \verb+^+\verb+^J+). +\item[\textsf{10}] space (usually \sp). +\item[\textsf{O}] other characters, whose category code is in $\{3,4,6,7,8,11,12,13\}$. +\item[\textsf{[\sp]}, \textsf{[\cs{par}]}] +emits a space, or~\cs{par}. +\end{description} +\end{minipage} +\begin{itemize} +\item We omitted about category codes +9~(\textit{ignored}), 14~(\textit{comment}), and~15~(\textit{invalid}) +from the above diagram. We also ignored the input like ``\verb+^+\verb+^A+'' or ``\verb+^+\verb+^df+''. +\item When a character whose category code is 0 (\textit{escape character}) is seen by \TeX, +the input processor scans a control sequence (\textsf{scan a c.s.}). +These paths are not shown in the above diagram. + +After that, the state is changed to State~$S$ (skipping blanks) in most cases, but +to State~$M$ (middle of line) sometimes. +\end{itemize} +%<en>\caption{State transitions of \pTeX's input processor} +%<ja>\caption{\pTeX の入力処理部の状態遷移} +\label{fig:ptexipro} +\end{figure} + + +%<en>\subsection{Behavior in \LuaTeX-ja} +%<ja>\subsection{\LuaTeX-jaの動作} + \label{ssec:lineend} +%<*en> +States in the input processor of \LuaTeX\ is the same as that of \TeX, +and they can't be customized by any callbacks. Hence, we can only use +\verb+process_input_buffer+ and \verb+token_filter+ callbacks for to +suppress a space by a line break which is after Japanese characters. + +However, \verb+token_filter+ callback cannot be used either, since a +character in category code 5~(\textit{end-of-line}) is converted into an space +token \emph{in the input processor}. So we can use only the +\verb+process_input_buffer+ callback. This means that suppressing a +space must be done \emph{just before} an input line is read. + +Considering these situations, handling of an end-of-line in \LuaTeX-ja are as follows: +\begin{quote} +A character whose character code is \cs{ltjlineendcomment}% +\footnote{Its default value is \texttt{"FFFFF}, so \texttt{U+FFFFF} is used. +The category code of \texttt{U+FFFFF} is set to 14~(\textit{comment}) by +\LuaTeX-ja.} is appended to an input line, \emph{before \LuaTeX\ actually +process it}, if and only if the following three conditions are satisfied: +\begin{enumerate} +\item The category code of \cs{endlinechar}% +\footnote{Usually, it is $\langle$\textit{return}$\rangle$ + (whose character code is 13).} is 5~(\textit{end-of-line}). +\item The category code of \cs{ltjlineendcomment} itself is 14~(\textit{comment}). +\item The input line matches the following ``regular expression'': +\[ + (\text{any char})^*(\textbf{JAchar}) + \bigl(\{\text{catcode}=1\}\cup\{\text{catcode}=2\}\bigr)^* +\] +\end{enumerate} +\end{quote} + +\paragraph{Remark} +The following example shows the major difference from the behavior of \pTeX. +\begin{LTXexample} +\fontspec[Ligatures=TeX]{Linux Libertine O} +\ltjsetparameter{autoxspacing=false} +\ltjsetparameter{jacharrange={-6}}xあ +y\ltjsetparameter{jacharrange={+6}}zい +u +\end{LTXexample} +It is not strange that ``あ'' does not printed in the above output. +This is because \TeX\ Gyre\ Termes does not contain ``あ'', and because +``あ'' in line~3 is considered as an \textbf{ALchar}. + +Note that there is no space before ``y'' in the output, but +there is a space before ``u''. This follows from following reasons: +\begin{itemize} +\item When line~3 is processed by \texttt{process\_input\_buffer} callback, +``あ'' is considered as an \textbf{JAchar}. +Since line~3 ends with an \textbf{JAchar}, +the comment character (whose character code is \cs{ltjlineendcomment}) is appended to this line, +and hence the linebreak immediately after this line is ignored. +\item When line~4 is processed by \texttt{process\_input\_buffer} callback, +``い'' is considered as an \textbf{ALchar}. +Since line~4 ends with an \textbf{ALchar}, the linebreak immediately after this line +emits a space. +\end{itemize} +%</en> + +%<*ja> +\LuaTeX の入力処理部は\TeX のそれと全く同じであり,コールバックによりユーザが +カスタマイズすることはできない.このため,改行抑制の目的でユーザが利用で +きそうなコールバックとしては,\verb+process_input_buffer+や +\verb+token_filter+に限られてしまう.しかし,\TeX の入力処理部をよく見る +と,後者も役には経たないことが分かる:改行文字は,入力処理部によってトー +クン化される時に,カテゴリーコード10の32番文字へと置き換えられてしまうた +め,\verb+token_filter+で非標準なトークン読み出しを行おうとしても,空白文 +字由来のトークンと,改行文字由来のトークンは区別できないのだ. + +すると,我々のとれる道は,\verb+process_input_buffer+を用いて +\LuaTeX の入力処理部に引き渡される前に入力文字列を編集するというものしかない. +以上を踏まえ,\LuaTeX-jaにおける「和文文字直後の改行抑制」の処理は,次のようになっている: + +\begin{quote} +各入力行に対し,\emph{その入力行が読まれる前の内部状態で} +以下の3条件が満たされている場合,\LuaTeX-jaは\cs{ltjlineendcomment}番の文字 +\footnote{\cs{ltjlineendcomment}の既定値は\texttt{"FFFFF}であるので, + 既定では\texttt{U+FFFFF}が使われることになる.この文字はコメント文字として扱われるように + \LuaTeX-ja内部で設定をしている.}% +を末尾に追加する.よって,その場合に改行は空白とは見做されないこととなる. +\begin{enumerate} +\item \cs{endlinechar}の文字\footnote{普通は,改行文字(文字コード13番)である.} +のカテゴリーコードが5~(\textit{end-of-line})である. +\item \cs{ltjlineendcomment}のカテゴリーコードが14~(\textit{comment})である. +\item 入力行は次の「正規表現」にマッチしている: +\[ + (\text{any char})^*(\textbf{JAchar}) + \bigl(\{\text{catcode}=1\}\cup\{\text{catcode}=2\}\bigr)^* +\] +\end{enumerate} +\end{quote} + +この仕様は,前節で述べた\pTeX の仕様にできるだけ近づけたものとなっている.条件1.は, +\texttt{lstlisting}系環境などの日本語対応マクロを書かなくてすませるためのものである. + +しかしながら,\pTeX と完全に同じ挙動が実現できたわけではない. +次のように,\textbf{JAchar}の範囲を変更したちょうどその行においては挙動が異なる: +\begin{LTXexample} +\fontspec[Ligatures=TeX]{TeX Gyre Termes} +\ltjsetparameter{autoxspacing=false} +\ltjsetparameter{jacharrange={-6}}xあ +y\ltjsetparameter{jacharrange={+6}}zい +u +\end{LTXexample} +上ソース中の「あ」は\textbf{ALchar}(欧文扱い)であり. +ここで使用している欧文フォント\TeX\ Gyre Termesは「あ」を含まない. +よって,出力に「あ」は現れないことは不思議ではない. +それでも,\pTeX とまったく同じ挙動を示すならば,出力は +「\hbox{\ltjsetparameter{autoxspacing=false}x yzいu}」となるはずである.しかし,実際には +上のように異なる挙動となっているが,それは以下の理由による: +\begin{itemize} +\item 3行目を \texttt{process\_input\_buffer} で処理する時点では, + 「あ」は\textbf{JAchar}(和文扱い)である.よって3行目は\textbf{JAchar}で終わることになり, + \cs{ltjlineendcomment}番のコメント文字が追加される. + よって,直後の改行文字は無視されることになり,空白は入らない. +\item 4行目を \texttt{process\_input\_buffer} で処理する時点では, + 「い」は\textbf{ALchar}である.よって4行目は\textbf{ALchar}で終わることになり, + 直後の改行文字は空白に置き換わる. +\end{itemize} +このため,トラブルを避けるために,\textbf{JAchar}の範囲を\cs{ltjsetparameter}で編集した場合, +その行はそこで改行するようにした方がいいだろう. +%</ja> + +%<*ja> + +%<en>\section{Insertion of JFM glues, \Param{kanjiskip} and \Param{xkanjiskip}} +%<ja>\section{JFMグルーの挿入,\Param{kanjiskip}と\Param{xkanjiskip}} +\label{sec-jfmglue} +%<en>\subsection{Overview} +%<ja>\subsection{概要} + +\LuaTeX-jaにおける \textbf{JAglue} の挿入方法は,\pTeX のそれとは全く異なる. +\pTeX では次のような仕様であった: +\begin{itemize} +\item JFMグルーの挿入は,和文文字を表すトークンを元に水平リストに(文字を表す)<char\_node>を +追加する過程で行われる. +\item \Param{xkanjiskip}の挿入は,hboxへのパッケージングや行分割前に行われる. +\item \Param{kanjiskip}はノードとしては挿入されない.パッケージングや行分割の計算時に +「和文文字を表す2つの<char\_node>の間には\Param{kanjiskip}がある」ものとみなされる. +\end{itemize} +しかし,\LuaTeX-jaでは,hboxへのパッケージングや行分割前に全ての +\textbf{JAglue},即ちJFMグルー・\Param{xkanjiskip}・\Param{kanjiskip}の +3種類を一度に挿入することになっている.これは,\LuaTeX において欧文の合字・ +カーニング処理がノードベースになったことに対応する変更である. + +\LuaTeX-jaにおける\textbf{JAglue}挿入処理では,次節で定義する +「クラスタ」を単位にして行われる.大雑把にいうと,「クラスタ」は文字とそれに付随す +るノード達(アクセント位置補正用のカーンや,イタリック補正)をまとめたもの +であり,2つのクラスタの間には,ペナルティ,\cs{vadjust},whatsitなど,行組版 +には関係しないものがある. + + +%<en>\subsection{Definition of a Cluster} +%<ja>\subsection{「クラスタ」の定義} + +\def\OA{$\text{\sf O}_{\text{\sf A}}$} +\def\OB{$\text{\sf O}_{\text{\sf B}}$} +\def\NA{$\text{\sf N}_{\text{\sf A}}$} +\def\NB{$\text{\sf N}_{\text{\sf B}}$} +\begin{defn} +%<*en> +A \emph{cluster} is consecutive nodes in one of the following forms, +with the \textit{id} of it: +%</en> +%<*ja> +\emph{クラスタ}は以下の形のうちのどれかひとつをとるノードのリストである: +%</ja> +\begin{enumerate} +%<*en> +\item Nodes whose value of\ \verb+\ltj@icflag+ is in $[3,15)$. These + nodes come from a hbox which is already packaged, by unpackaging + (\cs{unhbox}). + The \textit{id} of the cluster is \textit{id\_pbox}. +%</en> +%<*ja> +\item その \verb+\ltj@icflag+ の値が$[3,15)$に入るノードのリスト. + これらのノードはある既にパッケージングされたhboxから \cs{unhbox} で + アンパックされたものである. + この場合,クラスタの\textit{id}は\textit{id\_pbox}である. +%</ja> + +%<*en> +\item A inline math formula, including two \textit{math\_node}s at the boundary of it. + The \textit{id} of the cluster is \textit{id\_math}. +%</en> +%<*ja> +\item インライン数式でその境界に2つの\textit{math\_node}を含むもの. + この場合,クラスタの\textit{id}は\textit{id\_math}である. +%</ja> + +%<*en> +\item A \textit{glyph\_node}~$p$, which represents a \textbf{JAchar}, with nodes which relate with it: +%</en> +%<*ja> +\item \textbf{JAchar}を表す\textit{glyph\_node}~$p$とそれに関係するノード: +%</ja> +\begin{enumerate} +%<*en> +\item[(a)] A kern for the italic correction of~$p$. +%</en> +%<*ja> +\item[(a)] $p$のイタリック補正のためのカーン. +%</ja> + +%<*en> +\item[(b)] An accent attached to $p$ by \cs{accent}. +%</en> +%<*ja> +\item[(b)] \cs{accent} による$p$に付随したアクセント. +%</ja> +\end{enumerate} +\[ +\overbrace{% + \Node{kern}{$\mathit{subtype}=2$}\longrightarrow +\left\{\begin{array}{c} +\Node{glyph}{accent}\\\noalign{\medskip} +\Node{hbox}{accent (shifted vert.)} +\end{array}\right\}\longrightarrow +\Node{kern}{$\mathit{subtype}=2$}}^{\text{(b)}} +\longrightarrow +\Node{glyph}{$p$}\longrightarrow +\overbrace{% +\Node{kern}{italic corr.}}^{\text{(a)}} +\] + +%<*en> +In this case, the \textit{id} is \textit{id\_jglyph}. +%</en> +%<*ja> +この場合の\textit{id}は\textit{id\_jglyph}である. +%</ja> + +%<*en> +\item A list which begins from a \textit{glyph\_node} which represents a \textbf{ALchar}, + and consists of \textbf{ALchar} \textit{glyph\_node}s, + kerns for adjusting accents~(its subtype is 2), kerns for italic corrections and + kerns which are automatically inserted by \LuaTeX~or~luaotfload. + In this case, the \textit{id} is \textit{id\_glyph}. +%</en> +%<*ja> +\item \textbf{ALchar}を表す\textit{glyph\_node},\cs{accent} によるアクセント位置補正用の + カーン(subtypeが2),そしてイタリック補正・カーニングによって挿入されたカーン達が連続 + したもの.この場合の\textit{id}は\textit{id\_glyph}である. +%</ja> + +%<*en> +\item An box-like node, that is, an hbox, a vbox, a rule (\cs{vrule}) and an \textit{unset\_node}. +The \textit{id} of the cluster is \textit{id\_hlist} if the node is an + hbox which is not shifted vertically, or \textit{id\_box\_like} + otherwise. +%</en> +%<*ja> +\item 水平ボックス(hbox),垂直ボックス,罫線 (\cs{vrule}), + そして\textit{unset\_node}. + クラスタの\textit{id}は垂直に移動していないhboxならば\textit{id\_hlist}, + そうでなければ\textit{id\_box\_like}となる. +%</ja> + +%<*en> +\item A glue, a kern whose subtype is not 2~(\textit{accent}), and a discretionary break. +The \textit{id} of the cluster is \textit{id\_glue}, \textit{id\_kern} + and \textit{id\_disc}, respectively. +%</en> +%<*ja> +\item グルー,subtypeが 2~(\textit{accent})ではないカーン,そしてdiscretionary break. + その\textit{id} of the clusterはそれぞれ\textit{id\_glue}, \textit{id\_kern},そして + \textit{id\_disc}である. +%</ja> +\end{enumerate} +%<*en> +We use \textit{Np}, \textit{Nq} and \textit{Nr} to denote a cluster. +%</en> +%<*ja> +以下では\textit{Np}, \textit{Nq}, \textit{Nr}でクラスタを表す. +%</ja> +\end{defn} + +\paragraph{\textit{id}の意味} +$\mathit{Np}.\mathit{id}$の意味を述べるとともに, +「先頭の文字」を表す\textit{glyph\_node}~$\mathit{Np}.\mathit{head}$と, +「最後の文字」を表す\textit{glyph\_node}~$\mathit{Np}.\mathit{tail}$を次のように定義する. +直感的に言うと,\textit{Np}は$\mathit{Np}.\mathit{head}$で始まり$\mathit{Np}.\mathit{tail}$で終わるような単語, +と見做すことができる.これら$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$は +説明用に準備した概念であって,実際のLuaコード中にそのように書かれているわけではないことに注意. + +\begin{description} +\item[\textit{id\_jglyph}] \textbf{JAchar}(和文文字).\\ +$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$は,その\textbf{JAchar}を表している +\textit{glyph\_node}そのものである. +\item[\textit{id\_glyph}] \textbf{JAchar}(和文文字)以外のものを表す\textit{glyph\_node}~$p$.\\ +多くの場合,$p$は\textbf{ALchar}(欧文文字)を格納しているが,「ffi」などの合字によって作られた +\textit{glyph\_node}である可能性もある. +前者の場合,$\mathit{Np}.\mathit{head}$,~$\mathit{Np}.\mathit{tail} = p$である. +一方,後者の場合, +\begin{itemize} +\item $\mathit{Np}.\mathit{head}$は, +合字の構成要素の先頭→(その\textit{glyph\_node}における)合字の構成要素の先頭→…… +と再帰的に検索していってたどり着いた\textit{glyph\_node}である. +\item $\mathit{Np}.\mathit{last}$は,同様に末尾→末尾→と検索してたどり着いた\textit{glyph\_node}である. +\end{itemize} +\item[\textit{id\_math}] インライン数式.\\ +便宜的に,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$ともに +「文字コード$-1$の欧文文字」とおく. +\item[\textit{id\_hlist}] 縦方向にシフトされていないhbox.\\ +この場合,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$はそれぞれ$p$の内容を表すリストの, +先頭・末尾のノードである. +\medskip +\begin{itemize} +\item 状況によっては,\TeX ソースで言うと +\begin{lstlisting} +\hbox{\hbox{abc}...\hbox{\lower1pt\hbox{xyz}}} +\end{lstlisting} +のように,$p$の内容が別のhboxで開始・終了している可能性も十分あり得る.そのような場合, +$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$の算出は, +\emph{垂直方向にシフトされていない}hboxの +場合だけ内部を再帰的に探索する.例えば上の例では,$\mathit{Np}.\mathit{head}$は文字「a」を表すノードであり, +一方$\mathit{Np}.\mathit{tail}$は垂直方向にシフトされたhbox, +\verb+\lower1pt\hbox{xyz}+ に対応するノードである. +\item また,先頭にアクセント付きの文字がきたり,末尾にイタリック補正用のカーンが +来ることもあり得る.この場合は,クラスタの定義のところにもあったように,それらは無視して算出を行う. +\item 最初・最後のノードが合字によって作られた\textit{glyph\_node}のときは,それぞれに対して\textit{id\_glyph}% +と同様に再帰的に構成要素をたどっていく. +\end{itemize} +\item[\textit{id\_pbox}] 「既に処理された」ノードのリストであり,これらのノードが二度処理を受けないために +まとめて1つのクラスタとして取り扱うだけである. +\textit{id\_hlist}と同じ方法で$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$を算出する, +\item[\textit{id\_disc}] discretionary break (\verb+\discretionary{pre}{post}{nobreak}+).\\ +\textit{id\_hlist}と同じ方法で$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$を算出するが, +第3引数の \texttt{nobreak}(行分割が行われない時の内容)を使う.言い換えれば,ここで行分割が発生した時の状況は +全く考慮に入れない. +\item[\textit{id\_box\_like}] \textit{id\_hlist}とならないboxや,rule.\\ +この場合は,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$のデータは利用されないので,2つの算出は無意味である. +敢えて明示するならば,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$は共にnil値である. +\item[他] 以上にない\textit{id}に対しても,$\mathit{Np}.\mathit{head}$, $\mathit{Np}.\mathit{tail}$の算出は無意味. +\end{description} + +\paragraph{クラスタの別の分類} +さらに,JFMグルー挿入処理の実際の説明により便利なように,\textit{id}とは別のクラスタの分類を行っておく. +挿入処理では2つの隣り合ったクラスタの間に +空白等の実際の挿入を行うことは前に書いたが,ここでの説明では,問題にしているクラスタ\textit{Np}は「後ろ側」のクラスタである +とする.「前側」のクラスタについては,以下の説明で\textit{head}が\textit{last}に置き換わることに注意すること. +\begin{description} +\item[和文A] リスト中に直接出現している\textbf{JAchar}. +\textit{id}が\textit{id\_jglyph}であるか,\\ +\textit{id}が\textit{id\_pbox}であって$\mathit{Np}.\mathit{head}$が\textbf{JAchar}であるとき. + +\item[和文B] リスト中のhboxの中身の先頭として出現した\textbf{JAchar}.和文Aとの違いは,これの前に +JFMグルーの挿入が行われない(\Param{xkanjiskip},~\Param{kanjiskip}は入り得る)ことである.\\ +\textit{id}が\textit{id\_hlist}か\textit{id\_disc}であって$\mathit{Np}.\mathit{head}$が\textbf{JAchar}であるとき. + +\item[欧文] リスト中に直接/hboxの中身として出現している「\textbf{JAchar}以外の文字」.次の3つの場合が該当: +\begin{itemize} +\item \textit{id}が\textit{id\_glyph}である. +\item \textit{id}が\textit{id\_math}である(つまりこのクラスタは1つの文中数式をなす). +\item \textit{id}が\textit{id\_pbox}か\textit{id\_hlist}か\textit{id\_disc}であって,$\mathit{Np}.\mathit{head}$が\textbf{ALchar}. +\end{itemize} +\item[箱] box,またはそれに類似するもの.次の2つが該当: +\begin{itemize} +\item \textit{id}が\textit{id\_pbox}か\textit{id\_hlist}か\textit{id\_disc}であって,$\mathit{Np}.\mathit{head}$が\textit{glyph\_node}でない. +\item \textit{id}が\textit{id\_box\_like}である. +\end{itemize} + +\end{description} + +\subsection{段落/hboxの先頭や末尾} +\paragraph{先頭部の処理} +まず,段落/hboxの一番最初にあるクラスタ\textit{Np}を探索する. +hboxの場合は何の問題もないが,段落の場合では以下のノード達を事前に読み飛ばしておく: +\begin{itemize} +\item \cs{parindent} 由来のhbox($\mathit{subtype}=3$) +\item \textit{subtype}が44~(\textit{user\_defined})でないようなwhatsit +\end{itemize} +これは,\cs{parindent}由来のhboxがクラスタを構成しないようにするためである. + +次に,\textit{Np}の直前に空白$g$を必要なら挿入する: +\begin{enumerate} +\item この処理が働くような\textit{Np}は\textsf{和文A}である. +\item 問題のリストが字下げありの段落(\cs{parindent} 由来のhboxあり)の場合は, +この空白$g$は「文字コード \texttt{'parbdd'} の文字」と\textit{Np}の間に入るグルー/カーンである. +\item そうでないとき(\verb+noindent+ で開始された段落やhbox)は, +$g$は「文字コード \texttt{'boxbdd'} の文字」と\textit{Np}の間に入るグルー/カーンである. +\end{enumerate} +ただし,もし$g$がglueであった場合,この挿入によって\textit{Np}による行分割が新たに可能になるべきではない. +そこで,以下の場合には,$g$の直前に \cs{penalty10000} を挿入する: +\begin{itemize} +\item 問題にしているリストが段落であり,かつ +\item \textit{Np}の前には予めペナルティがなく,$g$はglue. +\end{itemize} + +\paragraph{末尾の処理} +末尾の処理は,問題のリストが段落のものかhboxのものかによって異なる. +後者の場合は容易い:最後のクラスタを\textit{Nq}とおくと,\textit{Nq}と「文字コード\ +\texttt{'boxbdd'} の文字」の間に入るグルー/カーンを, +\textit{Nq}の直後に挿入するのみである. + +一方.前者(段落)の場合は,リストの末尾は常に \cs{penalty10000} と, +\cs{parfillskip} 由来のグルーが存在する.%よって,最後のクラスタ\textit{Np}は +%この \cs{parfillskip} 由来のグルーとなり,実質的な中身の最後はその1つ前のクラスタ\textit{Nq}となる. +段落の最後の「通常の\textbf{JAchar}${}+{}$句点」が独立した行となるのを防ぐために, +\Param{jcharwidowpenalty}の値の分だけ適切な場所のペナルティを増やす. + +ペナルティ量を増やす場所は,\textit{head}が\textbf{JAchar}であり, +かつその文字の\Param{kcatcode}が偶数であるような +最後のクラスタの直前にあるものたちである% +\footnote{大雑把に言えば,\Param{kcatcode}が奇数であるような\textbf{JAchar}% +を約物として考えていることになる. +\Param{kcatcode}の最下位ビットはこの\Param{jcharwidowpenalty}用にのみ利用される.}. + +\subsection{概観と典型例:2つの「和文A」の場合} +\label{ssec:cluster-wa} +先に述べたように,2つの隣り合ったクラスタ,\textit{Nq}と\textit{Np}の間には, +ペナルティ,\cs{vadjust},whatsitなど,行組版には関係しないものがある.模式的に表すと, +\[ + \Node{cluster}{\textit{Nq}}\longrightarrow +\overbrace{ +\Node{penalty}{$p$}\longrightarrow \cdots\longrightarrow \Node{whatsit}{}}^{\textrm{(a)}} +\longrightarrow \Node{cluster}{\textit{Np}} +\] +のようになっている.間の(a)に相当する部分には,何のノードもない場合ももちろんあり得る. +そうして,JFMグルー挿入後には,この2クラスタ間は次のようになる: +\[ + \Node{cluster}{\textit{Nq}}\longrightarrow%\Node{kern}{左空白}\longrightarrow +\overbrace{ +\Node{penalty}{$p+x$}\longrightarrow \cdots\longrightarrow +\Node{whatsit}{}}^{\textrm{(a)}}\longrightarrow +\Node{glue or kern}{\raisebox{-.2\zw}{右空白}}\longrightarrow +\Node{cluster}{\textit{Np}} +\] + +以後,\emph{典型的な例として,クラスタ\textit{Nq}と\textit{Np}が共に\textsf{\textmd{和文A}}である場合を見ていこう,} +この場合が全ての場合の基本となる. + +\paragraph{「右空白」の算出} +まず,「右空白」にあたる量を算出する.通常はこれが,隣り合った2つの\textbf{JAchar}間に入る空白量となる. +\begin{description} +\item[JFM由来{[M]}] JFMの文字クラス指定によって入る空白を以下によって求める.この段階で空白量が未定義(未指定)だった場合, + デフォルト値\Param{kanjiskip}を採用することとなるので,次へ. +\begin{enumerate} +\item もし両クラスタの間で \cs{inhibitglue} が実行されていた場合(証としてwhatsitノードが自動挿入される), + 代わりに\Param{kanjiskip}が挿入されることとなる.次へ. +\item \textit{Nq}と\textit{Np}が同じJFM・同じ\texttt{jfmvar}キー・同じサイズの和文フォントであったならば, + 共通に使っているJFM内で挿入される空白(グルーかカーン)が決まっているか調べ,決まっていればそれを採用. +\item 1.でも2.でもない場合は,JFM・\texttt{jfmvar}・サイズの3つ組は\textit{Nq}と\textit{Np}で異なる. +この場合,まず +\[ +\vcenter{\halign{\hfil$#:={}$&\inhibitglue#\inhibitglue\cr +gb&(\textit{Nq}と「使用フォントが\textit{Nq}のそれと同じで,\hfil\cr +\omit&\quad 文字コードが\textit{Np}のそれの文字」との間に入るグルー/カーン)\hfil\cr +ga&(\inhibitglue 「使用フォントが\textit{Np}のそれと同じで,\hfil\cr +\omit&\quad 文字コードが\textit{Nq}のそれの文字」と\textit{Np}との間に入るグルー/カーン)\hfil\cr +}} +\] +として,前側の文字のJFMを使った時の空白(グルー/カーン)と,後側の文字のJFMを使った時のそれを求める. + +$\mathit{gb}$,~$\mathit{ga}$それぞれに対する<ratio>の値を$d_b$,~$d_a$とする. +\begin{itemize} +\item +$\mathit{ga}$と$\mathit{gb}$の両方が未定義であるならば,JFM由来のグルーは挿入されず, +\Param{kanjiskip}を採用することとなる. +どちらか片方のみが未定義であるならば,次のステップでその未定義の方は長さ0のkernで,<ratio>の値は0であるかのように扱われる. +\item +\Param{diffrentjfm}の値が \texttt{pleft}, \texttt{pright}, + \texttt{paverage} のとき, +<ratio>の指定に従って比例配分を行う. +JFM由来のグルー/カーンは以下の値となる: +\[ + f\left(\frac{1-d_b}2\textit{gb} + \frac{1+d_b}2\textit{ga}, +\frac{1-d_a}2\textit{gb} + \frac{1+d_a}2\textit{ga}\right) +\] +ここで.$f(x,y)$は +\[ + f(x,y)=\begin{cases} +x&\text{if\ }\Param{diffrentjfm}=\texttt{pleft};\\ +y&\text{if\ }\Param{diffrentjfm}=\texttt{pright};\\ +(x+y)/2&\text{if\ }\Param{diffrentjfm}=\texttt{paverage}; +\end{cases}. +\] +\item +\Param{differentjfm}がそれ以外の値の時は,<ratio>の値は無視され,JFM由来のグルー/カーンは以下の値となる: +\[ + f(\textit{gb},\textit{ga}) +\] +ここで.$f(x,y)$は +\[ + f(x,y)=\begin{cases} +\min(x,y)&\text{if\ }\Param{diffrentjfm}=\texttt{small};\\ +\max(x,y)&\text{if\ }\Param{diffrentjfm}=\texttt{large};\\ +(x+y)/2&\text{if\ }\Param{diffrentjfm}=\texttt{average};\\ +x+y&\text{if\ }\Param{diffrentjfm}=\texttt{both}; +\end{cases}. +\] +\end{itemize} +\end{enumerate} + +例えば, +\begin{lstlisting} +\jfont\foo=psft:Ryumin-Light:jfm=ujis;-kern +\jfont\bar=psft:GothicBBB-Medium:jfm=ujis;-kern +\jfont\baz=psft:GothicBBB-Medium:jfm=ujis;jfmvar=piyo;-kern +\end{lstlisting} +という3フォントを考え, +\[ + \overbrace{\Node{glyph}{\cs{ foo}, `あ'}}^{p} +\longrightarrow \overbrace{\Node{glyph}{\cs{bar}, `い'}}^{q} +\longrightarrow \overbrace{\Node{glyph}{\cs{baz}, `う'}}^{r} +\] +という3ノードを考える(それぞれ単独でクラスタをなす). +この場合,$p$と$q$の間は,実フォントが異なるにもかかわらず2.の状況となる一方で, +$q$と$r$の間は(実フォントが同じなのに)\texttt{jfmvar} キーの内容が異なるので3.の状況となる. +\item[\Param{kanjiskip}~{[K]}] 上の[M]において空白が定まらなかった場合, +以下で定めた量「右空白」として採用する. +この段階においては,\cs{inhibitglue} は効力を持たないため, +結果として,2つの\textbf{JAchar}間には常に何らかのグルー/カーンが挿入されることとなる. +\begin{enumerate} +\item 両クラスタ(厳密には$\mathit{Nq}.\mathit{tail}$,$\mathit{Np}.\mathit{head}$)の中身の文字コードに対する +\Param{autospacing}パラメタが両方ともfalseだった場合は,長さ0のglueとする. +\item ユーザ側から見た\Param{kanjiskip}パラメタの自然長が$\cs{maxdimen}=(2^{30}-1)\,{\rm sp}$で +なければ,\Param{kanjiskip}パラメタの値を持つglueを採用する. +\item 2.でない場合は,\textit{Nq}, \textit{Np}で使われているJFMに指定されている\Param{kanjiskip}の値を用いる. +どちらか片方のクラスタだけが\textbf{JAchar}(\textsf{和文A}・\textsf{和文B})のときは,そちらのクラスタで使われている +JFM由来の値だけを用いる.もし両者で使われているJFMが異なった場合は,上の[M]~3.と同様の方法を用いて調整する. +\end{enumerate} +\end{description} +%\paragraph{「左空白」の算出とそれに伴う補正} +%「左空白」は過去のバージョンでは定義していたが,このバージョンでは +%挿入は一切行われない(機能自体削除している). +%しかし,仕様は流動的であり,将来復活する可能性もあるため,マニュアル中の記述は今のところ極力変更しない. +\paragraph{禁則用ペナルティの挿入} +まず, +\[ + a:=(\text{\textit{Nq}{\footnotemark}の文字に対する\Param{postbreakpenalty}の値}) ++(\text{\textit{Np}{\footnotemark}の文字に対する\Param{prebreakpenalty}の値}) +\] +とおく\footnotetext{厳密にはそれぞれ$\mathit{Nq}.\mathit{tail}$,$\mathit{Np}.\mathit{head}$.}. +ペナルティは通常$[-10000,10000]$の整数値をとり,また$\pm 10000$は正負の無限大を意味することになっているが,この$a$の +算出では単純な整数の加減算を行う. + +$a$は禁則処理用に\textit{Nq}と\textit{Np}の間に加えられるべきペナルティ量である. +\begin{description} +\item[P-normal~{[PN]}] +\textit{Nq}と\textit{Np}の間の(a)部分にペナルティ(\textit{penalty\_node})があれば処理は簡単である: +それらの各ノードにおいて,ペナルティ値を($\pm 10000$を無限大として扱いつつ)$a$だけ増加させればよい. +また,$10000 + (-10000) = 0$としている. + +少々困るのは,(a)部分にペナルティが存在していない場合である. +直感的に,補正すべき量$a$が0でないとき,その値をもつ\textit{penalty\_node}を作って +「右空白」の(もし未定義なら\textit{Np}の)直前に挿入…… +ということになるが,実際には僅かにこれより複雑である. +\begin{itemize} +\item 「右空白」がカーンであるとき, +それは「\textit{Nq}と\textit{Np}の間で改行は許されない」ことを意図している.そのため, +この場合は$a\neq 0$であってもペナルティの挿入はしない. +\item そうでないないときは,$a\neq 0$ならば\textit{penalty\_node}を作って挿入する. +%\item 「左空白」がカーンとしてきっちり定義されている時(このとき,「右空白」はカーンでない), +%この「左空白」の直後での行分割を許容しないといけないので,$a=0$であっても +%\textit{penalty\_node}を作って挿入する. +%\item 以上のどれでもないときは,$a\neq 0$ならば\textit{penalty\_node}を作って挿入する. +\end{itemize} +\end{description} + +\def\gkf#1#2#3{\sf$\displaystyle\vphantom{\Bigg(}% + \frac{\hbox to 4\zw{\hss#2\hss}}{\hbox{#3}}$} +\begin{table}[t] +%<en>\caption{Summary of JFM glues} +%<ja>\caption{JFM グルーの概要} +\label{tab-jfmglue} +%<en>\medskip +\begin{center} +\small +\begin{tabular}{c|cccccc} +\toprule +{\bf\textit{Np}}↓&\sf 和文A&\sf 和文B&\sf 欧文&\sf 箱&\sf glue&\sf kern\\\midrule +\sf 和文A& +\gkf{E}{M→K}{PN}& +\gkf{---}{\OA →K}{PN}& +\gkf{---}{\NA →X}{PN}& +\gkf{---}{\OA}{PA}& +\gkf{---}{\OA}{PN}& +\gkf{---}{\OA}{PS}\\ +\sf 和文B& +\gkf{E}{\OB→K}{PA}& +\gkf{---}{K}{PS}& +\gkf{---}{X}{PS}\\ +\sf 欧文& +\gkf{E}{\NB →X}{PA}& +\gkf{---}{X}{PS}\cr +\sf 箱&\gkf{E}{\OB}{PA}\\ +\sf glue&\gkf{E}{\OB}{PN}\\ +\sf kern&\gkf{E}{\OB}{PS}\\ +\bottomrule +\end{tabular} +\end{center} +\begin{quote} +%<*en> +In the table above, {\small\gkf{E}{M→K}{PN}} means that +%</en> +%<*ja> +上の表において,{\small\gkf{E}{M→K}{PN}}は次の意味である: +%</ja> +\begin{enumerate} +%<*en> +\item To determine the ``right-space'', \LuaTeX-ja first attempts by the method ``\textsf{JFM-origin~[M]}''. +If this attempt fails, \LuaTeX-ja use the method ``\textsf{\Param{kanjiskip}~[K]}''. +%</en> +%<*ja> +\item 「右空白」を決めるために,\LuaTeX-ja はまず「JFM由来{[M]}」の方法を試みる. + これが失敗したら,\LuaTeX-ja は「\Param{kanjiskip}~{[K]}」の方法を試みる. +%</ja> + +% %<*en> +% \item The ``left space'' between \textit{Nq}~and~\textit{Np} is +% determined by the method ``\textsf{line-end~[E]}''. +% %</en> +% %<*ja> +% \item \textit{Nq} と \textit{Np} の間の「左空白」は「\textsf{line-end~[E]}」の +% 方法で決定される. +% %</ja> + +%<*en> +\item \LuaTeX-ja adopts the method ``\textsf{P-normal~[PN]}'' to adjust the penalty + between two clusters for \emph{kinsoku shori}. +%</en> +%<*ja> +\item \LuaTeX-jaは2つのクラスタの間の禁則処理用のペナルティを設定するために「\textsf{P-normal~[PN]}」の方法を採用する. +%</ja> +\end{enumerate} +\end{quote} +\end{table} + +\subsection{その他の場合} +本節の内容は\autoref{tab-jfmglue}にまとめてある. + +\paragraph{和文Aと欧文の間} +\textit{Nq}が\textsf{和文A}で,\textit{Np}が\textsf{欧文}の場合,JFMグルー挿入処理は次のようにして行われる. +\begin{itemize} +\item 「右空白」については,まず以下に述べる\textsf{欧文境界B~[\NB]}により空白を決定しようと試みる. +それが失敗した場合は,\textsf{\Param{xkanjiskip}~[X]}によって定める. +%\item 「左空白」については,既に述べた\textsf{line-end~[E]}をそのまま採用する.それに伴う「右空白」の補正も%同じ. +\item 禁則用ペナルティも,以前述べた\textsf{P-normal~[PN]}と同じである. +\end{itemize} +\begin{description} +\item[欧文境界B~{[\NB]}] 以下で求めた量を「右空白」として採用する. +この処理は\textsf{JFM-origin~[M]}の変種と考えて良く, +典型例は「和文の閉じ括弧と欧文文字の間に入る半角アキ」である. +\begin{enumerate} +\item もし両クラスタの間で \cs{inhibitglue} が実行されていた場合% +(証としてwhatsitノードが自動挿入される),未定義. +\item そうでなければ, +\textit{Nq}と「文字コードが$x$の文字」との間に入るグルー/カーンとする. +この$x$は次の場合分けによる: + \begin{itemize} + \item $\mathit{Np}.\mathit{id}$が\textit{id\_math}のとき(つまりクラスタ\textit{Np}が文中数式を表す) + ときは,$x=-1$. + \item \textit{Np}の中身の中身の文字コードについて,「直前への\Param{xkanjiskip}の挿入」が禁止されている +(つまり,\Param{jaxspmode}~(or \Param{alxspmode})パラメタが偶数)ときは, + $x=\text{\texttt{'nox\_alchar'}}$. + \item 以上のいずれでもないときは,$x=\text{\texttt{'alchar'}}$. + \end{itemize} +\end{enumerate} +\item[\Param{xkanjiskip}~{[X]}] +この段階では,\textsf{\Param{kanjiskip}~[K]}のときと同じように, +以下で定めた量を「右空白」として採用する. +\cs{inhibitglue} は効力を持たない. +\begin{enumerate} +\item 以下のいずれかの場合は,\Param{xkanjiskip}の挿入は抑止される.しかし,実際には行分割を許容するために,長さ0のglueを採用する: +\begin{itemize} +\item 両クラスタにおいて,それらの中身の文字コードに対する\Param{autoxspacing}パラメタが共にfalseである. +\item \textit{Nq}の中身の文字コードについて,「直後への\Param{xkanjiskip}の挿入」が禁止されている +(つまり,\Param{jaxspmode}~(or \Param{alxspmode})パラメタが2以上). +\item \textit{Np}の中身の文字コードについて,「直前への\Param{xkanjiskip}の挿入」が禁止されている +(つまり,\Param{jaxspmode}~(or \Param{alxspmode})パラメタが偶数). +\end{itemize} +\item ユーザ側から見た\Param{xkanjiskip}パラメタの自然長が$\cs{maxdimen}=(2^{30}-1)\,{\rm sp}$で +なければ,\Param{xkanjiskip}パラメタの値を持つglueを採用する. +\item 2.でない場合は,\textit{Nq}, \textit{Np}(\textsf{和文A}/\textsf{和文B}なのは片方だけ) +で使われているJFMに指定されている\Param{xkanjiskip}の値を用いる. +\end{enumerate} +\end{description} + +\paragraph{欧文と和文Aの間} +\textit{Nq}が\textsf{欧文}で,\textit{Np}が\textsf{和文A}の場合,JFMグルー挿入処理は上の場合とほぼ同じである. +\textsf{和文A}のクラスタが逆になるので,\textsf{欧文境界B~[\NB]}の部分が変わるだけである. +\begin{itemize} +\item 「右空白」については,まず以下に述べる\textsf{欧文境界A~[\OA]}により空白を決定しようと試みる. +それが失敗した場合は,\textsf{\Param{xkanjiskip}~[X]}によって定める. +%\item \textit{Nq}が和文でないので,「左空白」は算出されない. +\item 禁則用ペナルティは,以前述べた\textsf{P-normal~[PN]}と同じである. +\end{itemize} +\begin{description} +\item[欧文境界A~{[\NA]}] これは\textsf{欧文境界B~[\NB]}で\textit{Np}と\textit{Nq}の役割が + 交換されたものと思えば良い. + この処理で定まる空白の典型例は,欧文文字と和文の開き括弧との間に入る半角アキである. +\begin{enumerate} +\item もし両クラスタの間で \cs{inhibitglue} が実行されていた場合(証としてwhatsitノードが自動挿入される), + 未定義. +\item そうでなければ, +「文字コードが$x$の文字」と\textit{Np}との間に入るグルー/カーンと定める. +$x$は\textit{Nq}から\textsf{欧文境界B~[\NB]}におけるそれと同じ方法で定めるが, +\texttt{'nox\_alchar'}か\texttt{'alchar'}は +\begin{quote} + \textit{Nq}の中身の文字コードについて,「直後への\Param{xkanjiskip}の挿入」が禁止されている +(つまり,\Param{jaxspmode}~(or \Param{alxspmode})パラメタが2以上). +\end{quote} + か否かで判断する. +\end{enumerate} +\end{description} + +\paragraph{和文Aと箱・グルー・カーンの間} +\textit{Nq}が\textsf{和文A}で,\textit{Np}が\textsf{箱}・グルー・カーンのいずれかであった場合, +両者の間に挿入されるJFMグルーについては同じ処理である.しかし,そこでの行分割に対する仕様が異なるので, +ペナルティの挿入処理は若干異なったものとなっている. +\begin{itemize} +\item 「右空白」については,以下に述べる\textsf{Boundary-B~[\OB]}により空白を決定しようと試みる. +それが失敗した場合は,「右空白」は挿入されない. +%\item 「左空白」については,既に述べた\textsf{line-end~[E]}の算出方法をそのまま採用する.それに伴う「右空白」の補正も同じ. +\item 禁則用ペナルティの処理は,後ろのクラスタ\textit{Np}の種類によって異なる. +なお,$\mathit{Np}.\mathit{head}$は無意味であるから, +「$\mathit{Np}.\mathit{head}$に対する\Param{prebreakpenalty}の値」は0とみなされる.言い換えれば, +\[ + a:=(\text{\textit{Nq}の文字に対する\Param{postbreakpenalty}の値}). +\] +\begin{description} +\item[箱] \textit{Np}が\textsf{箱}であった場合は,両クラスタの間での行分割は +(明示的に両クラスタの間に \cs{penalty10000} があった場合を除き)いつも許容される.そのため, +ペナルティ処理は,後に述べる\textsf{P-allow~[PA]}が\textsf{P-normal~[PN]}の代わりに用いられる. +\item[グルー] \textit{Np}がグルーの場合,ペナルティ処理は\textsf{P-normal~[PN]}を用いる. +\item[カーン] \textit{Np}がカーンであった場合は,両クラスタの間での行分割は +(明示的に両クラスタの間にペナルティがあった場合を除き)許容されない. +ペナルティ処理は,後に述べる\textsf{P-suppress~[PS]}を使う. +\end{description} +これらの\textsf{P-normal~[PN]},\textsf{P-allow~[PA]},\textsf{P-suppress~[PS]}の違いは, +\textit{Nq}と\textit{Np}の間(以前の図だと(a)の部分)にペナルティが存在しない場合にのみ存在する. +\end{itemize} + +\begin{description} +\item[Boundary-B~{[\OB]}] この処理は\textsf{欧文境界B~[\NB]}と同様であり, + $x$が次によって決まることのみが異なる: + \begin{itemize} + \item \textit{Np}がグルーやカーンのときは,$x=\text{\texttt{'glue'}}$. + \item そうでない(\textit{Np}が\textsf{箱})ときは,$x=\text{\texttt{'jcharbdd'}}$. + \end{itemize} +\item[P-allow~{[PA]}] +\textit{Nq}と\textit{Np}の間の(a)部分にペナルティがあれば,\textsf{P-normal~[PN]}と同様に, +それらの各ノードにおいてペナルティ値を$a$だけ増加させる. + +(a)部分にペナルティが存在していない場合, +\LuaTeX-ja は\textit{Nq}と\textit{Np}の間の行分割を可能にしようとする. +そのために,以下のいずれかの場合に$a$をもつ\textit{penalty\_node}を作って +「右空白」の(もし未定義なら\textit{Np}の)直前に挿入する: +\begin{itemize} +\item 「右空白」がグルーでない(カーンか未定義)であるとき. +\item $a\neq 0$のときは,「右空白」がグルーであっても\textit{penalty\_node}を作る. +\end{itemize} + +\item[P-suppress~{[PS]}] +\textit{Nq}と\textit{Np}の間の(a)部分にペナルティがあれば,\textsf{P-normal~[PN]}と同様に, +それらの各ノードにおいてペナルティ値を$a$だけ増加させる. + +(a)部分にペナルティが存在していない場合, +\textit{Nq}と\textit{Np}の間の行分割は元々不可能のはずだったのであるが, +\LuaTeX-ja はそれをわざわざ行分割可能にはしない. +そのため,「右空白」がglueであれば,その直前に \cs{penalty10000} を挿入する. +\end{description} + +\paragraph{箱・グルー・カーンと和文Aの間} +\textit{Np}が\textsf{箱}・グルー・カーンのいずれかで,\textit{Np}が\textsf{和文A}であった場合は, +すぐ上の(\textit{Nq}と\textit{Np}の順序が逆になっている)場合と同じである. +%が,「左空白」がなくなることにのみ注意. +\begin{itemize} +\item 「右空白」については,以下に述べる\textsf{Boundary-A~[\OA]}により空白を決定しようと試みる. +それが失敗した場合は,「右空白」は挿入されない. +%\item \textit{Nq}が和文でないので,「左空白」は算出されない. +\item 禁則用ペナルティの処理は,\textit{Nq}の種類によって異なる. +$\mathit{Nq}.\mathit{tail}$は無意味なので, +\[ + a:=(\text{\textit{Np}の文字に対する\Param{prebreakpenalty}の値}). +\] +\begin{description} +\item[箱] \textit{Nq}が\textsf{箱}の場合は,\textsf{P-allow~[PA]}を用いる. +\item[グルー] \textit{Nq}がグルーの場合は,\textsf{P-normal~[PN]}を用いる. +\item[カーン] \textit{Nq}がカーンの場合は,\textsf{P-suppress~[PS]}を用いる. +\end{description} +\end{itemize} + +\begin{description} +\item[Boundary-A~{[\OA]}] この処理は\textsf{欧文境界A~[\NA]}と同様であり, + $x$が次によって決まることのみが異なる: + \begin{itemize} + \item \textit{Nq}がグルーやカーンのときは,$x=\text{\texttt{'glue'}}$. + \item そうでない(\textit{Nq}が\textsf{箱})ときは,$x=\text{\texttt{'jcharbdd'}}$. + \end{itemize} +\end{description} + +\paragraph{和文Aと和文Bの違い} +先に述べたように,\textsf{和文B}はhboxの中身の先頭(or 末尾)として出現している +\textbf{JAchar}である.リスト内に直接ノードとして現れている\textbf{JAchar}(\textsf{和文A})との違いは, +\begin{itemize} +\item \textsf{和文B}に対しては,JFMの文字クラス指定から定まる空白 +(\textsf{JFM由来[M]},\textsf{Boundary-A~[\OA]}など)の挿入は行われない. +%「左空白」の算出も行われない. +例えば, +\begin{itemize} +\item 片方が\textsf{和文A},もう片方が\textsf{和文B}のクラスタの場合, +\textsf{Boundary-A~[\OA]}または\textsf{Boundary-B~[\OB]}の挿入を試み,それがダメなら +\Param{kanjiskip}~\textsf{[K]}の挿入を行う. +\item \textsf{和文B}の2つのクラスタの間には,\Param{kanjiskip}~\textsf{[K]}が自動的に入る. +\end{itemize} +\item \textsf{和文B}と箱・グルー・カーンが隣接したとき(どちらが前かは関係ない),間にJFMグルー・ペナルティの挿入は一切しない. +\item \textsf{和文B}と\textsf{和文B},また\textsf{和文B}と\textsf{欧文}とが隣接した時は,禁則用ペナルティ挿入処理は +\textsf{P-suppress~[PS]}が用いられる. +\item \textsf{和文B}の文字に対する\Param{prebreakpenalty},~\Param{postbreakpenalty}の値は使われず,0として計算される. +\end{itemize} + + +次が具体例である: +\begin{LTXexample} +あ.\inhibitglue A\\ +\hbox{あ.}A\\ +あ.A +\end{LTXexample} +\begin{itemize} +\item 1行目の\cs{inhibitglue}は\textsf{欧文境界B~[\NB]}の処理のみを抑止するので,ピリオドと「A」の間には +\Param{xkanjiskip}(四分アキ)が入ることに注意. +\item 2行目のピリオドと「A」の間においては,前者が\textsf{和文B}となる(hboxの中身の末尾として登場しているから)ので, +そもそも\textsf{欧文境界B~[\NB]}の処理は行われない.よって,\Param{xkanjiskip}が入ることとなる. +\item 3行目では,ピリオドの属するクラスタは\textsf{和文A}である.これによって, +ピリオドと「A」の間には\textsf{欧文境界B~[\NB]}由来の半角アキが入ることになる. +\end{itemize} +%</ja> + +%<*ja> +\section{ベースライン補正の方法} +\subsection{\texttt{yoffset} フィールド} +\Param{yalbaselineshift}等のベースライン補正は,基本的には対象となっている +\textit{glyph\_node}の \texttt{yoffset} フィールドの値を増減することによって +実装されている.なお,\texttt{yoffset} の値は上方向への移動量であるのに対し, +\Param{yalbaselineshift}などは下方向への移動量である. + +さて,\texttt{yoffset} の増減によって見かけのグリフ位置は上下に移動するが, +仮想ボディの高さ$h$,深さ$d$については +\begin{description} +\catcode`\<=12\catcode`\>=12 + \item[$\texttt{yoffset}\geq 0$のとき] +$h = \max(\texttt{height} + \texttt{yoffset}, 0)$, +$d = \max(\texttt{depth} - \texttt{yoffset}, 0)$, + \item[$\texttt{yoffset}<0$のとき] +$h = \max(\texttt{height} + \texttt{yoffset}, 0)$, $d=\texttt{depth}$. +\end{description} +という仕様になっている.つまり,\texttt{yoffset} が負(グリフを下ける)の場合に深さは増加しな +い(\autoref{tab:yoffset_and_im}参照). + +\begin{table}[t] +\caption{\texttt{yoffset} and imaginary body} +\label{tab:yoffset_and_im} +\centering\small +\fboxsep0pt +\def\T#1#2{\fcolorbox{blue}{white}{% + \setbox0=\hbox{\LARGE #1% + \directlua{ + local p = tex.nest[tex.nest.ptr].tail + p.yoffset = #2 * 65536 + }% + }% + \copy0\kern-\wd0\smash{\color{red}\vrule width \wd0 height 0.2pt depth 0.2pt}% +}} +\begin{tabular}{>{\bfseries}lccccc} +\toprule +\texttt{yoffset}&10\,pt&5\,pt&0&$-5$\,pt&$-10$\,pt\\ +\midrule +仮想ボディ&\T{y}{10}, \T{H}{10}&\T{y}{5}, \T{H}{5}&\T{y}{0}, \T{H}{0}% +&\T{y}{-5}, \T{H}{-5}&\T{y}{-10}, \T{H}{-10}\\[10pt] +\bottomrule +\end{tabular} +\end{table} + +\subsection{\textbf{ALchar}の補正} +上記の問題について,\textbf{ALchar}のベースライン補正では +「正しい深さ」を持った罫線(rule)を補うという対応策をとった. +この罫線による補正は,\textit{id}が\textit{id\_glyph}であるクラスタ単位, +大雑把に言えば音節単位で行われる. +文字列``Typeset''を +\begin{itemize} + \item フォントはLatin Modern Roman (\texttt{lmroman10-regular.otf}) 10\,pt + \item \Param{yalbaselineshift}は5\,pt +\end{itemize} +という状況で組んだ場合を例にとって説明しよう. + +\LuaTeX・\Pkg{luaotfload}によるカーニング・ハイフネーションが終わった段階では,…… + + + +%</ja> + +%<en>\section{Patch for the \Pkg{listings} Package} +%<ja>\section{\Pkg{listings} パッケージへの対応} + +%<*en> +It is well-known that the \Pkg{listings} package outputs weird results +for Japanese input. +The \Pkg{listings} package makes most of letters active and assigns +output command for each letter~(\cite{listings}). +But Japanese characters are not included in these activated letters. +For \pTeX{} series, there is no method to make Japanese characters active; +a patch \Pkg{jlisting.sty}~(\cite{jlisting}) resolves the problem forcibly. +%</en> +%<*ja> +\Pkg{listings} パッケージが,そのままでは日本語をまともに出力できないこと +はよく知られている.きちんと整形して出力するために,\Pkg{listings}パッケー +ジは内部で「ほとんどの文字」をアクティブにし,各文字に対してその文字の出 +力命令を割り当てている(\cite{listings}). +しかし,そこでアクティブにする文字の中に,和文文 +字がないためである.\pTeX 系列では,和文文字をアクティブにする手法がなく, +\Pkg{jlisting.sty} というパッチ(\cite{jlisting})を用いることで無理やり解決していた. +%</ja> + +%<*en> +In \LuaTeX-ja, the problem is resolved by using the \verb+process_input_buffer+ callback. +The callback function inserts the output command (active character \cs{ltjlineendcomment}) +before each letter above \texttt{U+0080}. +This method can omits the process to make all Japanese characters active +(most of the activated characters are not used in many cases). +%</en> +%<*ja> +\LuaTeX-jaでは,\verb+process_input_buffer+ コールバックを利用することで, +「各行に出現する\texttt{U+0080}以降の文字に対して,それらの出力命令を前置する」 +という方法をとっている.出力命令としては,アクティブ文字化した\cs{ltjlineendcomment}を用いている. +これにより,(入力には使用されていないかもしれない)和文文字をもすべてアクティブ化する手間もなく, +見通しが良い実装になっている. +%</ja> + + +%<*en> +If the \Pkg{listings} package and \LuaTeX-ja were loaded, +then the patch \Pkg{lltjp-listings} is loaded automatically at \verb+\begin{document}+. +%</en> +%<*ja> +\LuaTeX-ja で利用される \Pkg{listings} パッケージへのパッチ \Pkg{lltjp-listings} は, +\Pkg{listings} と\LuaTeX-jaを読み込んでおけば, +\verb+\begin{document}+ の箇所において自動的に読み込まれるので,通常はあまり +意識する必要はない. +%</ja> + +%<en>\subsection{Notes and additional keys} +%<ja>\subsection{注意} +% %<*en> +% \paragraph{Escaping to \LaTeX} +% We used the \verb+process_input_buffer+ callback to output \textbf{JAchar}s. +% But it has a drawback; any commands whose name contains a \textbf{JAchar} +% cannot be used in any ``escape to \LaTeX''. + +% Consider the following input: +% %</en> +% %<*ja> +% \paragraph{\LaTeX へのエスケープ} +% 日本語対応を行うために \verb+process_input_buffer+ を使用したことで, +% \texttt{texcl},~\texttt{escapeinside}といった\emph{「\LaTeX へのエスケープ」中では, +% \textbf{JAchar}を名称の一部に含む制御綴は使用不可能}である. +% 例えば次のような入力を考えよう: +% %</ja> +% \begin{verbatim*} +% \begin{lstlisting}[escapechar=\#] +% #\ほげ xぴよ# +% \end{lstlisting} +% \end{verbatim*} +% %<en>The line~2 is transformed by the callback to +% %<ja>ここで,2行目は \verb+process_input_buffer+ の作用により, +% \begin{lstlisting}[showspaces, escapechar=\!] +% #\!\IVSA FFFFF!ほ!\IVSA FFFFF!げ x!\IVSA FFFFF!ぴ!\IVSA FFFFF!よ# +% \end{lstlisting} +% %<*en> +% before the line is actually processed. +% In the escape (between the character ``\verb+#+''), +% the category code of \texttt{U+FFFFF} is set to 9~(\emph{ignored}). +% Hence the control symbol ``\cs{}\IVSA FFFFF'' will be executed, +% instead of ``\verb+\ほげ+''. +% %</en> +% %<*ja> +% と変換されてから,実際の処理に回される. +% 「\verb+#+」で挟まれた「\LaTeX へのエスケープ」中では\ +% \texttt{U+FFFFF} のカテゴリーコードは9~(\textit{ignored})となるので, +% 結局「\verb+\ほげ+」の代わりに +% 「\cs{}\IVSA FFFFF」というcontrol symbolが実行されることになる. +% %</ja> + +%<*en> +\paragraph{Variation selectors} +\Pkg{lltjp-listings} add two keys, namely \texttt{vsraw}~and~\texttt{vscmd}, +which specify how variation selectors are treated in +\texttt{lstlisting} or other enviroments. +Note that these additional keys are not usable in the preamble, +since \Pkg{lltjp-listings} is loaded at \verb+\begin{document}+. + +\texttt{vsraw} is a key which takes a boolean value, and its default value is +false. +\begin{itemize} + \item If the \texttt{vsraw} key is true, then +variation selectors are ``combined'' with the previous character. +%</en> +%<*ja> +\paragraph{異体字セレクタの扱い} +\texttt{lstlisting} 環境などの内部にある異体字セレクタを扱うため, +\Pkg{lltjp-listings} では \texttt{vsraw} と \texttt{vscmd} という2つのキーを追加した. +しかし,\Pkg{lltjp-listings} が実際に読み込まれるのは \verb+\begin{document}+\ +のところであるので,プリアンブル内ではこれらの追加キーは使用できない. + +\texttt{vsraw}は,ブール値の値をとるキーであり,標準ではfalseである. +\begin{itemize} + \item trueの場合は,異体字セレクタは「直前の文字に続けて」出力される. +もしもIVSサポート(\ref{ssec:ltjotf}節)が有効になっていた場合は, +以下の例(左側は入力,右側はその出力)のようになる. +%</ja> +\begin{LTXexample} +\begin{lstlisting}[vsraw=true] +葛󠄀城市,葛󠄁飾区,葛西 +\end{lstlisting} +\end{LTXexample} +%<*en> +\item If the \texttt{vsraw} key is false, then +variation selectors are typeset by an appropriate command, which is specified by + the \texttt{vscmd} key. +The default setting of the \texttt{vscmd} key produces the following. +%</en> +%<*ja> +\item falseの場合は,異体字セレクタは適当な命令によって「見える形で」出力される. +どのような形で出力されるかを規定するのが \texttt{vscmd} キーであり, +\Pkg{lltjp-listings} の標準設定では以下の例の右側のように出力される. +%</ja> +\begin{LTXexample} +\begin{lstlisting}[vsraw=false, + vscmd=\ltjlistingsvsstdcmd] +葛󠄀城市,葛󠄁飾区,葛西 +\end{lstlisting} +\end{LTXexample} +%<ja> ちなみに,本ドキュメントでは次のようにしている: +%<en> For example, the following code is the setting of the \texttt{vscmd} key in this document. +\begin{lstlisting}[numbers=left] +\def\IVSA#1#2#3#4#5{% + \textcolor{blue}{\raisebox{3.5pt}{\tt% + \fboxsep=0.5pt\fbox{\tiny \oalign{0#1#2\crcr#3#4#5\crcr}}}}% +} +{\catcode`\%=11 + \gdef\IVSB#1{\expandafter\IVSA\directlua{ + local cat_str = luatexbase.catcodetables['string'] + tex.sprint(cat_str, string.format('%X', 0xE00EF+#1)) +}}} +\lstset{vscmd=\IVSB} +\end{lstlisting} +\end{itemize} +%<*en> +The default output command of variation selectors is stored in \verb+\ltjlistingsvsstdcmd+. +%</en> +%<*ja> +既定の出力命令を復活させたい場合は\ \verb+vscmd=\ltjlistingsvsstdcmd+\ +とすれば良い. +%</ja> + +%<*en> +\paragraph{The \texttt{doubleletterspace} key} +Even the column format is \texttt{[c]fixed}, sometimes characters are not vertically aligned. +The following example is typeset with \texttt{basewidth=2em}, and +you'll see the leftmost ``\texttt{H}'' are not vertically aligned. +\begin{lstlisting}[basewidth=2em, basicstyle=\tt,numbers=left] +:H: +:HHHH: +\end{lstlisting} + +\Pkg{lltjp-listing} adds the \texttt{doubleletterspace} key (not activated by default, for +compatibility) to +improve the situation, namely doubles inter-character space in each output unit. +With this key, the above input now produces better output. +\begin{lstlisting}[basewidth=2em, basicstyle=\tt,numbers=left, doubleletterspace] +:H: +:HHHH: +\end{lstlisting} +%</en> +%<*ja> +\paragraph{\texttt{doubleletterspace}キー} +\Pkg{listings}パッケージで列揃えが \texttt{[c]fixed} となっている場合でも, +場合によっては文字が縦に揃わない場合もある. +例を以下に示そう.これは強調するために \texttt{basewidth=2em} を設定している. +\begin{lstlisting}[basewidth=2em, basicstyle=\tt,numbers=left] +:H: +:HHHH: +\end{lstlisting} +1行目と2行目の「\texttt{H}」の位置が揃っていないが, +これは出力単位ごとに,先頭・末尾・各文字間に同じ量の空白を挿入することによる. + +\Pkg{lltjp-listing}では,このような症状を改善させるために \texttt{doubleletterspace} キー +を追加した(標準では互換性のために無効になっている).このキーを有効にすると, +出力単位中の各文字間の空白を2倍にすることで文字を揃いやすくしている. +上と同じものを \texttt{doubleletterspace} キーを有効にして組んだものが以下であり, +きちんと「\texttt{H}」の位置が揃っていることが分かる. +\begin{lstlisting}[basewidth=2em, basicstyle=\tt,numbers=left, doubleletterspace] +:H: +:HHHH: +\end{lstlisting} +%</ja> + +%<en>\subsection{Class of characters} +%<ja>\subsection{文字種} + +%<en>Roughly speaking, the \Pkg{listings} package processes input as follows: +%<ja>\Pkg{listings} パッケージの内部では,大雑把に言うと +\begin{enumerate} +%<en>\item Collects \textit{letters} and \textit{digits}, which can be used for the name of identifiers. +%<ja>\item 識別子として使える文字 (``letter'',~``digit'') たちを集める. +%<en>\item When reading an \textit{other}, outputs the collected character string (with modification, if needed). +%<ja>\item letterでもdigitでもない文字が現れた時に,収集した文字列を(必要なら修飾して)出力する. +%<en>\item Collects \textit{others}. +%<ja>\item 今度は逆に,letterでない文字たちをletterが現れるまで集める. +%<en>\item When reading a \textit{letter} or a \textit{digit}, outputs the collected character string. +%<ja>\item letterが出現したら集めた文字列を出力する. +%<en>\item Turns back to 1. +%<ja>\item 1.に戻る. +\end{enumerate} +%<*en> +By the above process, line breaks inside of an identifier are blocked. +A flag \verb+\lst@ifletter+ indicates whether the previous character can be used +for the name of identifiers or not. +%</en> +%<*ja> +という処理が行われている.これにより,識別子の途中では行分割が行われないようになっている. +直前の文字が識別子として使えるか否かは \verb+\lst@ifletter+ というフラグに格納されている. +%</ja> + +%<*en> +For Japanese characters, line breaks are permitted on both sides +except for brackets, dashes, etc. +Hence the patch \Pkg{lltjp-listings} introduces +a new flag \verb+\lst@ifkanji+, which indicates +whether the previous character is a Japanese character or not. +For illustration, we introduce following classes of characters: +%</en> +%<*ja> +さて,日本語の処理である.殆どの和文文字の前後では行分割が可能であるが,その一方で +括弧類や音引きなどでは禁則処理が必要なことから,\Pkg{lltjp-listings} では, +直前が和文文字であるかを示すフラグ \verb+\lst@ifkanji+ を新たに導入した. +以降,説明のために以下のように文字を分類する: +%</ja> +%<*ja> +\begin{center} +\small +\begin{tabular}{llllll} +\toprule +&\emph{Letter}&\emph{Other}&\emph{Kanji}&\emph{Open}&\emph{Close}\\\midrule +\verb+\lst@ifletter+&T&F&T&F&T\\ +\verb+\lst@ifkanji+&F&F&T&T&F\\ +\emph{意図}&識別子中の文字&その他欧文文字&殆どの和文文字&開き括弧類&閉じ括弧類\\ +\bottomrule +\end{tabular} +\end{center} +%</ja> +%<*en> +\begin{center} +\small +\begin{tabular}{llll} +\toprule +&\textbf{Letter}&\textbf{Other}&\\\midrule +\verb+\lst@ifletter+&T&F&\\ +\verb+\lst@ifkanji+&F&F&\\ +\textbf{Meaning}&char in an identifier&other alphabet&\\ + \midrule +&\textbf{Kanji}&\textbf{Open}&\textbf{Close}\\\midrule +\verb+\lst@ifletter+&T&F&T\\ +\verb+\lst@ifkanji+&T&T&F\\ +\textbf{Meaning}&most of Japanese char&opening brackets&closing brackets\\ +\bottomrule +\end{tabular} +\end{center} +%</en> +%<*en> +Note that \textit{digits} in the \Pkg{listings} package can be Letter or +Other according to circumstances. +%</en> +%<*ja> +なお,本来の\Pkg{listings} パッケージでの分類``digit''は, +出現状況によって,上の表のLetterとOtherのどちらにもなりうる. +また,KanjiとCloseは \verb+\lst@ifletter+ と \verb+\lst@ifkanji+ の値が一致しているが, +これは間違いではない. +%</ja> + +%<*en> +For example, let us consider the case an Open comes after a Letter. +Since an Open represents Japanese open brackets, +it is preferred to be permitted to insert line break after the Letter. +Therefore, the collected character string is output in this case. +%</en> +%<*ja> +例えば,Letterの直後にOpenが来た場合を考える. +文字種Openは和文開き括弧類を想定しているので,Letterの直後では行分割が可能であることが望ましい. +そのため,この場合では,すでに収集されている文字列を出力することで行分割を許容するようにした. +%</ja> + +%<*en> +The following table summarizes $5\times 5=25$ cases: +%</en> +%<*ja> +同じように,$5\times 5=25$通り全てについて書くと,次のようになる: +%</ja> +\begin{center} +\small +\begin{tabular}{lllllll} +\toprule +%<*en> +&&\multicolumn{4}{c}{\textbf{Next}}\\\cmidrule(lr){3-7} +&&\hbox to 4em{Letter\hss}&\hbox to 4em{Other\hss} +&\hbox to 4em{Kanji\hss}&\hbox to 4em{Open\hss}&Close\\\midrule +&Letter&collects&\multicolumn{3}{c}{\hrulefill \ outputs\ \hrulefill}&collects\\ +&Other&outputs&collects&\multicolumn{2}{c}{\hrulefill \ outputs\ \hrulefill}&collects\\ +\textbf{Prev}&Kanji&\multicolumn{4}{c}{\hrulefill \ outputs\ \hrulefill}&collects\\ +&Open&\multicolumn{5}{c}{\hrulefill \ collects\ \hrulefill}\\ +&Close&\multicolumn{4}{c}{\hrulefill \ outputs\ \hrulefill}&collects\\ +%</en> +%<*ja> +&&\multicolumn{4}{c}{\textbf{後側文字種}}\\\cmidrule(lr){3-7} +&&\hbox to 4em{Letter\hss}&\hbox to 4em{Other\hss} +&\hbox to 4em{Kanji\hss}&\hbox to 4em{Open\hss}&Close\\\midrule +\emph{直}&Letter&収集&\multicolumn{3}{c}{\hrulefill \ 出力\ \hrulefill}&収集\\ +\emph{前}&Other&出力&収集&\multicolumn{2}{c}{\hrulefill \ 出力\ \hrulefill}&収集\\ +\emph{文}&Kanji&\multicolumn{4}{c}{\hrulefill \ 出力\ \hrulefill}&収集\\ +\emph{字}&Open&\multicolumn{5}{c}{\hrulefill \ 収集\ \hrulefill}\\ +\emph{種}&Close&\multicolumn{4}{c}{\hrulefill \ 出力\ \hrulefill}&収集\\ +%</ja> +\bottomrule +\end{tabular} +\end{center} +%<en>In the above table, +%<ja>上の表において, +\begin{itemize} +%<en>\item ``outputs'' means to output the collected character string (i.e., line breaking is permitted there). +%<ja>\item 「出力」は,それまでに集めた文字列を出力(≒ここで行分割可能)を意味する. + +%<en>\item ``collects'' means to append the next character to the collected character string (i.e., line breaking is prohibited there). +%<ja>\item 「収集」は,後側の文字を,現在収集された文字列に追加(行分割不可)を意味する. +\end{itemize} + +%<*en> +Characters above or equal to~\texttt{U+0080} \emph{except Variation Selectors} +are classified into above 5~classes by the following rules: +%</en> +%<*ja> +\texttt{U+0080}以降の\emph{異体字セレクタ以外の}各文字が +Letter, Other, Kanji, Open, Closeのどれに属するかは次によって決まる: +%</ja> +\begin{itemize} +%<en>\item \textbf{ALchar}s above or equal to~\texttt{U+0080} are classified as Letter. +%<ja>\item \<(\texttt{U+0080}以降の)\textbf{ALchar}は,すべてLetter扱いである. + +%<en>\item \textbf{JAchar}s are classified in the order as follows: +%<ja>\item \textbf{JAchar}については,以下の順序に従って文字種を決める: +\begin{enumerate} +%<en>\item Characters whose \Param{prebreakpenalty} is greater than or equal to 0 are classified as Open. +%<ja>\item \Param{prebreakpenalty}が0以上の文字はOpen扱いである. + +%<en>\item Characters whose \Param{postbreakpenalty} is greater than or equal to 0 are classified as Close. +%<ja>\item \Param{postbreakpenalty}が0以上の文字はClose扱いである. + +%<en>\item Characters that don't satisfy the above two conditions are classified as Kanji. +%<ja>\item 上の3条件のどちらにも当てはまらなかった文字は,Kanji扱いである. +\end{enumerate} +\end{itemize} + +%<*en> +The width of halfwidth kana (\texttt{U+FF61}--\texttt{U+FF9F}) +is same as the width of \textbf{ALchar}; +the width of the other \textbf{JAchar}s is double the width of \textbf{ALchar}. +%</en> +%<*ja> +なお,半角カナ(U+FF61--U+FF9F)以外の\textbf{JAchar}は欧文文字2文字分の幅をとるものとみなされる. +半角カナは欧文文字1文字分の幅となる. +%</ja> + +%<*en> +This classification process is executed every time a character appears in +the \texttt{lstlisting} environment or other environments/commands. +%</en> +%<*ja> +これらの文字種決定は,実際に \texttt{lstlisting} 環境などの内部で文字が出てくるたびに行われる. +%</ja> + +%<*ja> +\section{和文の行長補正方法} +\label{sec-adjspec} +\Pkg{luatexja-adjust}で提供される優先順位付きの行長調整の詳細を大まかに述べると,次のようになる. +\begin{itemize} +\item (\texttt{lineend=extended}の場合)\textbf{JAglue}の挿入処理のところで, + …… +\item 通常の\TeX の行分割方法に従って,段落を行分割する.この段階では,行 + 長に半端が出た場合,その半端分は\textbf{JAglue}(\Param{xkanjiskip}, + \Param{kanjiskip},JFMグルー)と + それ以外のグルーの全てで(優先順位なく)負担される. +\item その後,\texttt{post\_linebreak\_filter} callbackを使い,\emph{段 + 落中の各行ごとに},行末文字の位置を調整(\texttt{lineend=true}の場合)したり,優先度付きの行長調整 + を実現するためにグルーの伸縮度を調整する. + その処理においては,グルーの自然長と\textbf{JAglue}以外の + グルーの伸び量・縮み量は変更せず,必要に応じて\textbf{JAglue}の伸び量・縮み量のみを + 変更する設計とした. +\end{itemize} +この章の残りでは各処理について解説する. + +\paragraph{準備:合計伸縮量の計算} +グルーの伸縮度(\texttt{plus} や \texttt{minus} で指定されている値)には, +有限値の他に,\texttt{fi},\texttt{fil},\texttt{fill},\texttt{filll}と +いう4つの無限大レベル(後ろの方ほど大きい)がある.行の調整に +\texttt{fi} などの\emph{無限大レベルの伸縮度が用いられている行では, +「行末文字の位置調整」のみ行い,「グルーの調整」は行わない.} + +まず,段落中の行中のグルーを +\begin{itemize} +\item \textbf{JAglue}ではないグルー +\item JFMグルー(優先度\footnote{% + \ref{ssec:jfm-str}節にあるように, + 各JFMグルーには$-4$から3までの優先度がついている.場合によっては + 伸びと縮みで異なる優先度が付いているかもしれない.}% +別にまとめられる) +\item 和欧文間空白(\Param{xkanjiskip}) +\item 和文間空白(\Param{kanjiskip}) +\end{itemize} +の$1+1+8+1=10$つに類別する. +そして許容されている伸び量(\texttt{stretch}の値)の合計を +無限のレベルごとに +\begin{align*} + T^{+}_{l}&:= \sum_{\text{$\texttt{stretch\_order}(p) = l$}} \texttt{stretch}(p),& + l\in \{\text{(finite)}, \texttt{fi}, \texttt{fil}, \texttt{fill}, \texttt{filll}\} +\end{align*} +と計算する.さらに, +\begin{align*} +T^{+}&:=T^{+}_{L^+},&L^{+} = \max \{l\in + \{\text{(finite)}, \texttt{fi}, \texttt{fil}, \texttt{fill}, \texttt{filll}\}: + T^{+}_l\neq 0\} +\end{align*} +とおく.有限の伸び量については,上記の8種類の類別ごとにも合計を計算する. +さらに縮み量(\texttt{shrink}の値)についても同様の処理を行い,$T^{-}$を計算する. + +また,行長から自然長を引いた値を\textit{total}とおく. + +\subsection{行末文字の位置調整(行分割後の場合)} +行末が\textbf{JAchar}であり,この文字の属する文字クラスでは +\begin{quote} + \texttt{end\_adjust = \{$a_{1}$, $a_{2}$, ..., $a_{n}$\}} +\end{quote} +であったとする. +このとき,以下の条件を満たした場合, +この文字クラスに対する\texttt{end\_adjust}の値のいずれかだけこの文字の位置を移動させる. +\begin{description} + \item[最終行以外] 行長調整に無限大の伸縮度が用いられていない. + すなわち,$\textit{total}>0$ならば$L^{+}=(\text{finite})$であり, + $\textit{total}>0$ならば$L^{-}=(\text{finite})$である. + \item[最終行] 行長調整に無限大に伸び縮みするグルーが用いられたなら,それは\cs{parfillskip}のみであり, + かつ,次の不等式が成立する: + \[ + \min\{0,a_{1}\}\text{\cs{zw}}\leq (\text{\cs{parfillskip}の実際の長さ}) \leq \max\{0,a_{n}\}\text{\cs{zw}} + \] +\end{description} + +各$1\leq i\leq n$に対して, +「行末に$a_{i}$全角だけのカーンを追加した時の,\textit{glue\_set}の値」を +$b_{i}$とおく.式で書くと, +\[ +\catcode`\<=12 +b_{i} = \begin{cases} + |\textit{total}-a_{i}\text{\cs{zw}}|/T^{+} + &(\textit{total}-a_{i}\text{\cs{zw}}\geq 0)\\ + |\textit{total}-a_{i}\text{\cs{zw}}|/T^{-} + &(\textit{total}-a_{i}\text{\cs{zw}}<0) +\end{cases}. +\] +$b_{i}$達の最小値を与えるような$i$を$j$としたとき\footnote{% + そのような$i$が2つ以上あるときは,$|\textit{total}-a_{i}\cdot \text{\cs{zw}}|$, + $|a_{i}|$, $a_i$の順で比較して一番小さくなるものが選ばれる. +}, +行末に大きさ$a_{j}$のカーンを追加する. +\textit{total}から$a_{j}$全角の大きさだけ引いておく. + +\subsection{行末文字の位置調整(行分割での考慮)} +\texttt{lineend=extended}が指定されている場合,\TeX による行分割が行われる前に +各\textbf{JAchar}の直後に,その文字が行末に来たときの位置補正用のノードを挿入していく. + +\ref{sec-jfmglue}章の用語を使って述べる. +前側のクラスタ\textit{Nq}が「和文A」「和文B」であり, +JFMによって\texttt{end\_adjust}の値が +\begin{quote} + \texttt{end\_adjust = \{$a_{1}$, $a_{2}$, ..., $a_{n}$\}} +\end{quote} +であったとする.このとき,次のクラスタ\textit{Np}の直前に以下のノード列を挿入する. +\textbf{JAglue}の挿入過程で禁則処理のために「\textit{Nq}と\textit{Np}の間のペナルティ値を増やす」ことが +行われることがあるが,以下で述べられている$(n+1)$個のペナルティはみなその処理対象になっている. +\begin{align*} + \Node{kern}{$a_{1}\text{\cs{zw}}$} + &\longrightarrow \Node{penalty}{$0$} \longrightarrow\Node{kern}{$(a_{2}-a_{1})\text{\cs{zw}}$} + \longrightarrow \Node{penalty}{$0$} \longrightarrow\Node{kern}{$(a_{3}-a_{2})\text{\cs{zw}}$}\\ + &\longrightarrow + \cdots \longrightarrow\Node{penalty}{$0$} \longrightarrow + \Node{kern}{$(a_{n}-a_{n-1})\text{\cs{zw}}$} + \longrightarrow \Node{penalty}{$0$} \longrightarrow + \Node{kern}{$-a_{n}\text{\cs{zw}}$} \longrightarrow \Node{penalty}{$10000$} +\end{align*} +$n$個あるペナルティの箇所が改行可能箇所である.いずれかで改行された場合は, +その前にあるカーン($n$箇所のうちどこで改行しても,合計の長さは$a_{i}$の形)は行末に残るが, +後ろのペナルティ・カーンは除去される.なお,$a_1=0$のときは最初の幅が$a_{1}\text{\cs{zw}}$のカーンは不要なので挿入されず, +さらにかつ$n=1$であった場合は後ろのペナルティも挿入されない. + +なお,段落の末尾には\cs{penalty10000}と\cs{parfillskip}由来のグルーが自動的に入るが, +これらとの兼ね合いのため\emph{最後のクラスタについては上記のノード挿入処理は行われない}. +段落最終行の行末文字の位置調整は,すでに述べた「行分割後の場合」における最終行の処理をそのまま用いている. + +\subsection{グルーの調整} +$|\textit{total}|$の分だけが,行中のグルーの伸び量,あるいは縮み量に応じて負担されることになる. +以下,$\textit{total}\geq 0$であると仮定して話を進めるが,負のときも同様である. +\Pkg{luatexja-adjust}の初期値では以下の順に伸び量を負担するようになっており, +(優先度$-4$のJFMグルーは例外として)できるだけ\Param{kanjiskip}を自然長のままにすることを +試みている.この順番は\Param{stretch\_priority}(縮み量については\Param{shrink\_priority}) +パラメータで変更可能である. +\begin{enumerate}\def\labelenumi{(\Alph{enumi})} + \item \textbf{JAglue}以外のグルー + \item 優先度3のJFMグルー + \item 優先度2のJFMグルー + \item 優先度1のJFMグルー + \item 優先度0のJFMグルー + \item 優先度$-1$のJFMグルー + \item 優先度$-2$のJFMグルー + \item \Param{xkanjiskip} + \item 優先度$-3$のJFMグルー + \item \Param{kanjiskip} + \item 優先度$-4$のJFMグルー +\end{enumerate} +\begin{enumerate} + \item 行末の\textbf{JAchar}を移動したことで$\textit{total}=0$となれば, +調整の必要はなく,行が格納されているhboxの +\texttt{glue\_set}, \texttt{glue\_sign}, \texttt{glue\_order}を再計算すればよい. +以降,$\textit{total}\neq 0$と仮定する. + \item \textit{total}が「\textbf{JAglue}以外のグルーの伸び量の合計」(以下,(A)の伸び量の + 合計,と称す)よりも小さければ, +それらのグルーに\textit{total}を負担させ,\textbf{JAglue}達自身は自然長で組むことができる. +よって,以下の処理を行う: +\begin{enumerate} +\item 各\textbf{JAglue}の伸び量を0とする. +\item 行が格納されているhboxの +\texttt{glue\_set}, \texttt{glue\_sign}, \texttt{glue\_order}を再計算する. +これによって,\textit{total}は\textbf{JAglue}以外のグルーによって負担される. +\end{enumerate} +\item \textit{total}が「(A)の伸び量の合計」以上ならば,(A)--(K)のどこまで負担すれば +\textit{total}以上になるかを計算する. +例えば, +\[\catcode`\<=12 + \textit{total} = (\text{(A)--(B)の伸び量の合計}) + p\cdot (\text{(C)の伸び量の合計}), + \qquad 0\le p<1 +\] +であった場合,各グルーは次のように組まれる: +\begin{itemize} + \item (A),~(B)に属するグルーは各グルーで許された伸び量まで伸ばす. + \item (C)に属するグルーはそれぞれ$p\times (\text{伸び量})$だけ伸びる. + \item (D)--(K)に属するグルーは自然長のまま. +\end{itemize} +実際には,前に述べた「設計」に従い,次のように処理している: +\begin{enumerate} +\item (C)に属するグルーの伸び量を$p$倍する. +\item (D)--(K)に属するグルーの伸び量を0とする. +\item 行が格納されているhboxの +\texttt{glue\_set}, \texttt{glue\_sign}, \texttt{glue\_order}を再計算する. +これによって,\textit{total}は\textbf{JAglue}以外のグルーによって負担される. +\end{enumerate} +\item \textit{total}が(A)--(K)の伸び量の合計よりも大きい場合,どうしようもないので + \verb+^^;+何もしない. +\end{enumerate} + +%</ja> + +%<*ja> +\section{複数フォントの「合成」(未完)} +\section{\LuaTeX-jaにおけるキャッシュ} +\Pkg{luaotfload}パッケージが,各TrueType・OpenTypeフォントの情報を +キャッシュとして保存しているのと同様の方法で, +\LuaTeX-jaもいくつかのキャッシュファイルを作成するようになった. +\begin{itemize} + \item 通常,キャッシュは\texttt{\$TEXMFVAR/luatexja/}以下に保存され, +そこから読み込みが行われる. + \item 「通常の」テキスト形式のキャッシュ(拡張子は \texttt{.lua})以外にも, +それをバイナリ形式(バイトコード)に変換したものもサポートしている. +\begin{itemize} + \item \LuaTeX とLuaJIT\TeX ではバイトコードの形式が異なるため,バイナリ形式の +キャッシュは共有できない.\LuaTeX 用のバイナリキャッシュは \texttt{.luc}, +LuaJIT\TeX 用のは \texttt{.lub} と拡張子を変えることで対応している. + \item キャッシュを読み込む時,同名のバイナリキャッシュがあれば, +テキスト形式のものよりそちらを優先して読み込む. + \item テキスト形式のキャッシュが更新/作成される際は,そのバイナリ版も +同時に更新される. +また,(バイナリ版が見つからず)テキスト形式のキャッシュ側が読み込まれたときは, +\LuaTeX-jaはバイナリキャッシュを作成する. +\end{itemize} +\end{itemize} +%</ja> +%<*en> +\section{Cache Management of \LuaTeX-ja} +\LuaTeX-ja creates some cache files to reduce the loading time. +in a similar way to the \Pkg{luaotfload} package: +\begin{itemize} + \item Cache files are usually stored in (and loaded from) +\texttt{\$TEXMFVAR/luatexja/}. + \item In addition to caches of the text form (the extension is ``\texttt{.lua}''), +caches of the \emph{binary}, precompiled form are supported. +\begin{itemize} + \item We cannot share same binary cache for \LuaTeX\ and LuaJIT\TeX. +Hence we distinguish them by their extension, ``\texttt{.luc}'' for \LuaTeX\ +and ``\texttt{.lub}'' for LuaJIT\TeX. + \item In loading a cache, the binary cache precedes +the text form. + \item When \LuaTeX-ja updates a cache \texttt{hoge.lua}, +its binary version is also updated. +\end{itemize} +\end{itemize} +%</en> + +%<*ja> +\subsection{キャッシュの使用箇所} + +\LuaTeX-ja では以下の3種類のキャッシュを使用している: +\begin{cslist} +\item[ltj-cid-auto-adobe-japan1.lua] +Ryumin-Lightのような非埋め込みフォントの情報を格納しており, +(それらが\LuaTeX-jaの標準和文フォントなので)\LuaTeX-jaの読み込み時に自動で読まれる. +生成には\texttt{UniJIS2004-UTF32-\{H, V\}}, \texttt{Adobe-Japan1-UCS2}という3つの +CMapが必要である. + +\pageref{para-cid}ページで述べたように,\texttt{cid}キーを使って +非埋め込みの中国語・韓国語フォントを定義する場合,同様のキャッシュが生成される. +キャッシュの名称,必要となるCMapについては\autoref{tab:cid-cache}を参照して欲しい. + +\item[extra\_***.lua] +フォント``\texttt{***}''における異体字セレクタの情報,縦組用字形への変換テーブル,そして +縦組時における幅を格納している.構造は以下の通り: +%</ja> +%<*en> +\subsection{Use of cache} + +\LuaTeX-ja uses the following cache: +\begin{cslist} +\item[ltj-cid-auto-adobe-japan1.lua] +The font table of a CID-keyed non-embedded Japanese font. +This is loaded in every run. +It is created from three CMaps, \texttt{UniJIS2004-UTF32-\{H,V\}} and + \texttt{Adobe-Japan1-UCS2}, +and this is why these two CMaps are needed in the first run of \LuaTeX-ja. + +Similar caches are created as \autoref{tab:cid-cache}, +if you specified \texttt{cid} key in \cs{jfont} +to use other CID-keyed non-embedded fonts for Chinese or Korean, +as in Page~\pageref{para-cid}. + +\item[extra\_***.lua] +This file stores the table which stores the following. +\begin{itemize} + \item unicode variants in a font ``\texttt{***}'' + \item vertical width of glyphs, if it is not equal to the sum of +the height of ascender and the depth of descender + \item vertical variants +\end{itemize} +The following is the structure of the that table. +%</en> + +\begin{table}[!tb] + \centering\small +\caption{\texttt{cid} key and corresponding files} +\label{tab:cid-cache} +\vspace*{\medskipamount} +\begin{tabular}{>{\tt}l>{\tt}l>{\tt}l>{\tt}l} +\toprule +\bf \texttt{cid} key&\bf name of the cache & +\multicolumn{2}{c}{\bf used CMaps}\\ +\midrule +Adobe-Japan1-*<j-cid-auto-adobe-japan1.lua&UniJIS2004-UTF32-*&Adobe-Japan1-UCS2\\ +Adobe-Korea1-*<j-cid-auto-adobe-korea1.lua&UniKS-UTF32-*&Adobe-Korea1-UCS2\\ +Adobe-KR-*<j-cid-auto-adobe-kr.lua&UniAKR-UTF32-*&Adobe-KR-UCS2\\ +Adobe-GB1-*<j-cid-auto-adobe-gb1.lua&UniGB-UTF32-*&Adobe-GB1-UCS2\\ +Adobe-CNS1-*<j-cid-auto-adobe-cns1.lua&UniCNS-UTF32-*&Adobe-CNS1-UCS2\\ +\bottomrule +\end{tabular} +\end{table} + +\begin{lstlisting} +return { + { + [10955]={ -- U+2ACB "Subset Of Above Not Equal To" + [65024]=983879, -- <2ACB FE00> + ["vwidth"]=0.98, -- vertical width + }, + [37001]={ -- U+9089 "邉" + [0]=37001, -- <9089 E0100> + 991049, -- <9089 E0101> + ... + ["vform"]=995025, -- vertical variant + }, + ... + ["unicodes"]={ + ["aj102.pe.vert"]=984163, -- glyph name to unicode + ... + } + }, + ["chksum"]="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", -- checksum of the fontfile + ["version"]=11, -- version of the cache +} +\end{lstlisting} +%<*ja> +\item[ltj-jisx0208.\{luc|lub\}] +\LuaTeX-ja配布中の\texttt{ltj-jisx0208.lua}をバイナリ化したものである. +これはJIS~X~0208とUnicodeとの変換テーブルであり, +\pTeX との互換目的の文字コード変換命令で用いられる. +%</ja> +%<*en> +\item[ltj-jisx0208.\{luc|lub\}] +The binary version of \texttt{ltj-jisx0208.lua}. +This is the conversion table between JIS~X~0208 and Unicode +which is used in Kanji-code conversion commands for compatibility with \pTeX. +%</en> +\end{cslist} + +%<*en> +\subsection{Internal} +Cache management system of \LuaTeX-ja is stored in \texttt{luatexja.base} +(\texttt{ltj-base.lua}). +There are three public functions for cache management in \texttt{luatexja.base}, +where <filename> stands for the file name \emph{without suffix}: +\begin{cslist} +\item[save\_cache(<filename>, <data>)] +Save a non-nil table <data> into a cache <filename>. +Both the text form <filename>\texttt{.lua} and its binary version +are created or updated. + +\item[save\_cache\_luc(<filename>, <data>{[, <serialized\_data>]})] + +Same as \texttt{save\_cache}, except that only the binary cache is updated. +The third argument <serialized\_data> is not usually given. +But if this is given, it is treated as a string representation of <data>. + +\item[load\_cache(<filename>, <outdate>)] +Load the cache <filename>. +<outdate> is a function which takes one argument (the contents of the cache), +and its return value is whether the cache is outdated. + +\texttt{load\_cache} first tries to +read the binary cache <filename>\texttt{.\{luc|lub\}}. +If its contents is up-to-date, \texttt{load\_cache} returns the contents. +If the binary cache is not found or +its contents is outdated, \texttt{load\_cache} tries to +read the text form <filename>\texttt{.lua}. +Hence, the return value of \texttt{load\_cache} is non-nil, +if and only if the updated cache is found. +\end{cslist} +%</en> +%<*ja> +\subsection{内部命令} +\LuaTeX-jaにおけるキャッシュ管理は,\texttt{luatexja.base}~(\texttt{ltj-base.lua})に +実装しており,以下の3関数が公開されている. +ここで,<filename>は保存するキャッシュのファイル名を\emph{拡張子なしで}指定する. +\begin{cslist} +\item[save\_cache(<filename>, <data>)] +nilでない<data>をキャッシュ<filename>に保存する. +テキスト形式の<filename>\texttt{.lua}のみならず, +そのバイナリ版も作成/更新される. + +\item[save\_cache\_luc(<filename>, <data>{[, <serialized\_data>]})] + +\texttt{save\_cache}と同様だが,バイナリキャッシュのみが更新される. +第3引数<serialized\_data>が与えられた場合,それを +<data>の文字列化表現として使用する. +そのため,<serialized\_data>は普通は指定しないことになるだろう. + +\item[load\_cache(<filename>, <outdate>)] +キャッシュ<filename>を読み込む. +<outdate>は1引数(キャッシュの中身)をとる関数であり, +その戻り値は「キャッシュの更新が必要」かどうかを示すブール値でないといけない. + +\texttt{load\_cache}は,まずバイナリキャッシュ<filename>\texttt{.\{luc|lub\}}を +読みこむ.もしその内容が「新しい」,つまり<outdate>の評価結果が \texttt{false} なら +\texttt{load\_cache}はこのバイナリキャッシュの中身を返す. +もしバイナリキャッシュが見つからなかったか,「古すぎる」ならばテキスト版 + <filename>\texttt{.lua}を読み込み,その値を返す. + +以上より,\texttt{load\_cache}自体がnilでない値を返すのは,ちょうど「新しい」キャッシュが +見つかった場合である. +\end{cslist} +%</ja> + + +%<*ja> +\section{縦組の実装} +\label{sec-dir-imp} +\ref{sec-direction}章の最初でも述べたように, +\LuaTeX-jaは横組(\texttt{TLT})で組んだボックスを回転させる方式で +縦組を実装している. + +\LuaTeX-jaにおける縦組の実装は +\pTeX における実装(\cite{ptexdoc,ptextug})をベースにしている. + +\subsection{direction~whatsit} +\textit{direction}~whatsitとは,\textit{direction}という特定の \verb+user_id+ を持つ +whatsitのことであり,以下のタイミングで作られる. +\begin{itemize} + \item 組方向を \cs{tate} 等で変更したとき. + \item \cs{hbox}, \cs{vbox}, \cs{vtop} による明示的なボックスの開始時.\\ +\verb+\hbox{}+, \verb+\vbox{}+ といった, +\begin{itemize} + \item \cs{tate} 等によりボックス内部の組方向を変更していない + \item ボックスの中身のリストが空である +\end{itemize} +場合は,\LuaTeX の \verb+hpack_filter+, \verb+vpack_filter+ といった +callbackに処理が回らない.そこで,\LuaTeX-ja では,\cs{everyhbox}, \cs{everyvbox} を利用す + ることで各ボックスの先頭に確実に追加するようにしている\footnote{% + 問題は \cs{hbox to 25pt\{\}} という状況である.実際のこのボックスの中身は空でない(少な + くともdirection whatsitがある)ため,何も対策をしなければhpack時にUnderfill警告が発 + 生してしまうことになる.\LuaTeX-jaではそうならないように「\cs{hbadness}, + \cs{vbadness} を一時的に10000に変更し,hpack, vpack後に元の値に戻す」処理を行ってい + る. +}. + \item \cs{vsplit}によってvboxを分割した時の「残り」の先頭. + \item \LuaTeX-ja読み込み前に作成したボックスの寸法を \cs{ltjsetwd} 等によって変更した時. + \item \cs{insert} によるinsertionでは,中身の先頭に\textit{direction}~whatsitは作られず, +その代わりに中身の各ボックス・罫線の直前に作られる\footnote{% + これは,ページ分割の過程でinsertionが分割される時,「現在のページで出力される部分」が空と + なることがあることによる.先頭にwhatsitを置くと,最悪でも「現在のページにwhatsitが + 残る」ことになってしまう.}. +\end{itemize} +なお,\verb+\vtop{...}+ の場合は,先頭にdirection whatsitを置くと +ボックスの高さが常に0\,ptになるという問題が発生する.そのため,この場合に限っては +vpack時にdirection whatsitをリストの2番目に移動させている. + +direction whatsitはあくまでも組方向処理のための補助的なノードであるので, +\cs{unhbox}, \cs{unhcopy} によってボックスの中身が展開される時には展開直前に削除される. +これは +\begin{lstlisting} + % yoko direction +\setbox0=\hbox{\tate B} +\noindent % 水平モードに入る.この時点でのリストの中身は空 +\unhbox0 A +\end{lstlisting} +といった場合に,段落が縦組で組まれたり,あるいは +\begin{lstlisting} +\setbox0=\hbox{} +\leavevmode \hbox{A}\unhbox0 +\setbox1=\lastbox % \box1 はどうなる? +\end{lstlisting} +で \cs{box1} が \cs{hbox\{A\}} でなく空になってしまうことを防ぐためである. + + +\subsection{\textit{dir\_box}} +縦中横など異方向のボックスを配置する場合に,周囲の組方向と大きさを整合させるため, +\LuaTeX-jaでは \verb+\ltj@dir+ が128以降の\textit{hlist\_node}, \textit{vlist\_node}を +用いる.これらは\pTeX における\textit{dir\_node}の役割と同じ果たしており, +この文章中では\textit{dir\_box}と呼称する. + +\subsubsection{異方向のボックスの整合} +\textit{dir\_box}の第一の使用目的は,異方向のボックスの大きさを整合させることである. +例えば, +\begin{lstlisting} + % yoko direction +平成\hbox{\tate 26}年 +\end{lstlisting} +は段落中で +\[ + \xymatrix{ + {}\Node{glyph}{`平'}\ar[r]&{}\Node{glyph}{`成'}\ar[r]& + {}\HNode{hbox}{10.00003}{3.02779}{0.0}\ar[r]\ar[d]^{\text{中身}}&{}\Node{glyph}{`年'}\\ + &&{}\Node{whatsit}{\cs{tate}}\ar[r]&{}\Node{glyph}{`2'}\ar[r]&{}\Node{glyph}{`6'} + } +\] +というリストを作る.その後,この段落が終了したときに, +\LuaTeX-jaの\textbf{JAglue}挿入処理が行われ +\[ + \xymatrix{ + {}\Node{glyph}{`平'}\ar[r] + &{}\textcolor{blue}{\Node{glue}{\Param{xkanjiskip}}}\ar[r] + &{}\Node{glyph}{`成'}\ar[r] + &{}\textcolor{blue}{\Node{penalty}{0}} + \ar`r[d] `[l] `[ddll] `[dl] [dl] + \\ + &&{}\textcolor{red}{\HNode{\textit{dir\_box} (\cs{yoko})}{3.02779}{10.00003}{0.0}}\ar[r]\ar[d]^{\text{中身}} + &{}\textcolor{blue}{\Node{penalty}{0}}\ar[r] + &{}\Node{glyph}{`年'}\\ + &&{}\HNode{hbox}{10.00003}{3.02779}{0.0}\ar[d]^{\text{中身}}\\ + &&{}\Node{whatsit}{\cs{tate}}\ar[r]&{}\Node{glyph}{`2'}\ar[r]&{}\Node{glyph}{`6'} + } +\] +のようになる(青字は\textbf{JAglue},赤字が整合処理のための\textit{dir\_box}である). +\TeX の \cs{showbox} 形式で書けば + +\medskip{\narrowbaselines\ttfamily\obeylines\parindent0pt +\catcode`\@=0 @catcode`@\=12 +.\tenmin 平 +@textcolor{blue}{.\glue 0.0 plus 0.4 minus 0.4} +.\tenmin 成 +@textcolor{blue}{.\penalty 0} +@textcolor{red}{.\hbox(10.00003+0.0)x3.02779, direction TLT} +..\hbox(3.02779+0.0)x10.00003, direction TLT +...\whatsit4=[] +...\tenrm 2 +...\tenrm 6 +@textcolor{blue}{.\penalty 0} +.\tenmin 年 +}\medskip + +\noindent である. + +なお,\cs{raise},~\cs{lower}, \cs{moveleft},~\cs{moveright} といったボックス移動命令では. +移動を正しく表現するために段落やボックスの途中でも異方向のボックスは\textit{dir\_box}にカ +プセル化している. +例えば +\begin{lstlisting} + % yoko direction +平成\raise1pt\hbox{\tate 26}年\showlists +\end{lstlisting} +は以下のような結果を得る. + +\medskip{\narrowbaselines\ttfamily\obeylines\parindent0pt +\catcode`\@=0 @catcode`@\=12 +(前略) +\tenrm 平 +\tenrm 成 +@textcolor{red}{\hbox(10.00003+0.0)x3.02779, shifted -1.0, direction TLT} +.\hbox(3.02779+0.0)x10.00003, direction TLT +..\whatsit4=[] +..\tenrm 2 +..\tenrm 6 +\tenrm 年 +}\medskip + +また,メインの垂直リストに異方向のボックスが追加される場合にも同様に即座に +\textit{dir\_box}にカプセル化している.ページ分割のタイミングを正 +しく\TeX が判断するためである. +\cs{lastbox} によるボックスの取得では,\textit{dir\_box}は削除される. + +\subsubsection{異方向のボックス寸法の格納} +第二の使用目的は,現在の組方向がボックス本来の組方向とは異なる状況で, +\cs{ltjsetwd} によってボックス寸法を設定されたことを記録することである. + +例えば +\begin{lstlisting}[numbers=left] +\setbox0=\hbox{\vrule width 10pt height 5pt depth 2pt} +\setbox1=\hbox{\tate\ltjsetwd0=20pt} +\wd0=9pt +\setbox1=\hbox{\dtou\ltjsetwd0=20pt} +\setbox0=\hbox{\dtou a\box0} +\end{lstlisting} +というコードを考える.1行目で \cs{box0} には横組の +幅10\,pt,高さ5\,pt,深さ2\,ptのボックスが代入される. +よって, +\begin{itemize} + \item 縦組下では \cs{box0} は幅7\,pt,高さ・深さ5\,ptのボックスとして扱われる. + \item \cs{dtou} 下では \cs{box0} は幅7\,pt,高さ10\,pt,深さ0\,ptのボックスとして扱われる. +\end{itemize} +このとき,\cs{box0} の\emph{中身}は +\[ + \xymatrix{ + {}\Node{whatsit}{\cs{yoko}}\ar[r]&{}\Node{rule}{} + } +\] +である. + +さて,2行目で縦組時の \cs{box0} の幅が20\,ptに設定される.この情報が +direction~whatsit内部のノードリストに,\textit{dir\_box}として格納される: +\[ + \xymatrix{ + {}\Node{whatsit}{\cs{yoko}}\ar[r]\ar[d]_{\text{中身}}&{}\Node{rule}{}\\ + {}\textcolor{red}{\HNode{\textit{dir\_box} (\cs{tate})}{20.0}{5.0}{5.0}} + } +\] + +次に,3行目では横組時の,つまり \cs{box0} 本来の組方向での深さが9\,ptに変更される. +このとき,\cs{box0} は +\begin{itemize} + \item 縦組下では寸法代入が既に行われているので,2行目で作成された\textit{dir\_box}の通り + に幅20\,pt,高さ・深さ5\,ptのボックスとして扱われる. + \item \cs{dtou} 下ではまだ寸法代入が行われていないので, +\cs{box0} の寸法変更に追従し,幅7\,pt,高さ9\,pt,深さ0\,ptのボックスとして扱われる. +\end{itemize} + +4行目では \cs{dtou} 下での\cs{box0} の幅が20\,ptに設定されるので,2行目と同じように +\[ + \xymatrix{ + {}\Node{whatsit}{\cs{yoko}}\ar[r]\ar[d]_{\text{中身}}&{}\Node{rule}{}\\ + {}\textcolor{red}{\HNode{\textit{dir\_box} (\cs{dtou})}{20.0}{9.0}{0.0}}\ar[r]& + {}\HNode{\textit{dir\_box} (\cs{tate})}{20.0}{5.0}{5.0} + } +\] +と\textit{dir\_box}が作成される. + +このように寸法代入によってつくられた\textit{dir\_box}は,前節の整合過程のときに再利用され +る.上記の例でいえば,5行目を実行した後の \cs{box0} の内容は +\[ + \xymatrix{ + {}\Node{whatsit}{\cs{dtou}}\ar[r]& + {}\Node{glyph}{`a'}\ar[r]& + {}\textcolor{red}{\HNode{\textit{dir\_box} (\cs{dtou})}{20.0}{9.0}{0.0}}\ar[d]_{\text{中身}}\\ + &&{}\HNode{hbox}{9.0}{5.0}{2.0}\ar[d]_{\text{中身}}\\ + &&{}\Node{whatsit}{\cs{yoko}}\ar[r]&{}\Node{rule}{} + } +\] +のようになる. + +\subsection{縦組用字形の取得} +縦組時には,「\hbox to \zw{、}」(\texttt{U+3001})から「\ltjjachar"FE11」(\texttt{U+FE11})%" +のように縦組用字形への置き換えに関係する処理は,以下のようになっている. + \begin{itemize} + \item 各縦組用和文フォントは読み込み時に以下の属性が設定される: + \begin{description} + \item[\textit{vert\_activated}] 真となるのは, + 明示的に \texttt{-vert} も \texttt{-vrt2} のいずれも指定されていないちょうどその時. + \item[\textit{auto\_enable\_vrt2}] 真となるのは, + \texttt{vert}, \texttt{vrt2}のいずれについても有効・無効が指定されていないちょうどその時. + \end{description} + \textit{vert\_activated}については\texttt{luatexja.define\_jfont}コールバックで渡される引数 + \texttt{jfont\_info}から取得可能である. + + \item \textit{auto\_enable\_vrt2}が真の場合は,現在のscript tagとlanguage system identifierの値で + \texttt{vrt2}機能が利用可能か調べる.利用可能ならば\texttt{vrt2}を,そうでなければ + \texttt{vert}を有効化する. + \item また,各和文フォント読み込み時には, + 「OpenType機能による置換以前に行う縦組形への置換」を格納したテーブル\textit{vform}も作成する. + \begin{enumerate} + \item \LuaTeX-jaには,「\hbox to \zw{、}」(\texttt{U+3001})→「\ltjjachar"FE11」(\texttt{U+FE11})といった + いくつかの置換がハードコードされている.そのような各置換$i\longmapsto v$に対して, + \begin{quote} + 置換元$i$が(あるscript, languageにおける)\texttt{vert}では置換対象でなく, + かつ置換先$v$がフォント内に存在する文字コードである + \end{quote} + ならば,$i\longmapsto v$を\textit{vform}に登録する. + \item \ref{ssec:tfont}節にある\texttt{jpotf}が指定された場合, + …… + \item もし\texttt{vert}も\texttt{vrt2}も現在のscript, languageでは有効にできない場合, + どこかのscript, languageにおける\texttt{vert}で定義されている + 置換$i\longmapsto v$をすべて\textit{vform}に登録する. + \end{enumerate} + + あとで説明するように,\textit{vform}は\textit{vert\_activated}が真であるような縦組用和文フォントでしか + 利用されない. + + \item 「現在の水平リスト」内の\textbf{JAchar}を(欧文フォントから)和文フォントへ置き換える処理において, + その時点での組方向が縦組であり,かつ処理対象の各ノードの縦組用フォントで + \textit{vert\_activated}が真である場合,\textit{vform}に従いグリフが置き換えられる. + + \Pkg{luaotfload}が行う,OpenType機能に沿ったグリフ置換はこの後の処理となる.G + \end{itemize} + +%</ja> + +\newpage +\begin{thebibliography}{99} + \addcontentsline{toc}{section}{\refname} +\bibitem{texbytopic} +Victor Eijkhout. \newblock \textit{\TeX\ by Topic, A \TeX nician's Reference}, Addison-Wesley, 1992. +\bibitem{listings} C.\ Heinz, B.\ Moses. \newblock The \textsf{Listings} Package. +\bibitem{uptex} Takuji Tanaka. \newblock +upTeX---Unicode version of pTeX with CJK extensions, +TUG 2013, October 2013. +%<ja>\newblock +%<en>\\\null\hfill +\url{http://tug.org/tug2013/slides/TUG2013_upTeX.pdf} +\bibitem{jlisting} Thor Watanabe. \newblock Listings\ -\ MyTeXpert. +%<en>\newblock +%<ja>\\\null\hfill +\url{http://mytexpert.osdn.jp/index.php?Listings} +\bibitem{jlreq} W3C Japanese Layout Task Force~(ed). \newblock +Requirements for Japanese Text Layout (W3C Working Group Note), 2011, 2012. \newblock +\url{http://www.w3.org/TR/jlreq/}% +%<ja> \\日本語訳の書籍版:W3C日本語組版タスクフォース(編),『W3C技術ノート 日本語組版処理の要件』,東京電機大学出版局,2012. +\bibitem{min10} 乙部厳己.「min10フォントについて」\\\null\hfill +\url{http://argent.shinshu-u.ac.jp/~otobe/tex/files/min10.pdf} +\bibitem{x4051} 日本工業規格(Japanese Industrial Standard). 「JIS~X~4051, +日本語文書の組版方法(Formatting rules for Japanese documents)」, 1993, 1995, 2004. +\bibitem{ptexdoc} 濱野尚人,田村明史,倉沢良一.「\TeX の出版への応用—縦組み機能の組み込み—」. +\\\null\hfill\texttt{.../texmf-dist/doc/ptex/base/ptexdoc.pdf} +\bibitem{ptextug} Hisato Hamano. \newblock +\textit{Vertical Typesetting with \TeX}, TUGBoat~\textbf{11}(3), 346--352, 1990. +\bibitem{pdfstd} International Organization for Standardization. \newblock +ISO 32000-1:2008, \textit{Document management -- Portable document format -- Part 1: PDF + 1.7}, 2008. \newblock +\\\null\hfill +\url{http://www.iso.org/iso/iso\_catalogue/catalogue_tc/catalogue\_detail.htm?csnumber=51502} +\bibitem{tc18ltja} 北川弘典.「\LuaTeX-jaの近況」,\TeX Conf~2018.\\ + \url{https://osdn.net/projects/luatex-ja/wiki/Documentation/attach/tc18ltja.pdf} +\end{thebibliography} + +\end{document} +%</!showexpl> +%<*showexpl> +%% +%% config file for showexpl.sty +%% +%% Copyright The LuaTeX-ja project team, 2012 +%% +\ProvidesFile{showexpl.cfg} + [2012/05/20 v0.01 Definitions for the showexpl package (luatexja)] +\lstset{} +\def\SX@Info{} +\endinput +%</*showexpl> diff --git a/macros/luatex/generic/luatexja/doc/luatexja.ins b/macros/luatex/generic/luatexja/doc/luatexja.ins new file mode 100644 index 0000000000..7d6d3c5d1f --- /dev/null +++ b/macros/luatex/generic/luatexja/doc/luatexja.ins @@ -0,0 +1,10 @@ +%#! lualatex -shell-escape luatex.ins +\input docstrip.tex +\askforoverwritefalse +\generate{\file{luatexja-ja.tex}{\from{luatexja.dtx}{ja}} + \file{luatexja-en.tex}{\from{luatexja.dtx}{en}} + \file{showexpl.cfg}{\from{luatexja.dtx}{showexpl}} +} +\immediate\write18{lualatex luatexja-ja} +\immediate\write18{lualatex luatexja-en} +\endbatchfile |