diff options
Diffstat (limited to 'macros/luatex/generic/luatexja')
105 files changed, 73986 insertions, 0 deletions
diff --git a/macros/luatex/generic/luatexja/COPYING b/macros/luatex/generic/luatexja/COPYING new file mode 100644 index 0000000000..3049f8374b --- /dev/null +++ b/macros/luatex/generic/luatexja/COPYING @@ -0,0 +1,23 @@ +Copyright (c) 2011--2016 The LuaTeX-ja project, All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the LuaTeX-ja project nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE LUATEX-JA PROJECT OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/macros/luatex/generic/luatexja/README b/macros/luatex/generic/luatexja/README new file mode 100644 index 0000000000..ab88e3cb75 --- /dev/null +++ b/macros/luatex/generic/luatexja/README @@ -0,0 +1,90 @@ +The LuaTeX-ja Package 20190826.0 +-------------------------------- +Copyright (c) 2011--2019 The LuaTeX-ja project +License: modified BSD (see COPYING) + +LuaTeX-ja is a macro package for typesetting Japanese documents with LuaTeX. +This package is highly affected by ASCII pTeX engine, but not a porting of it. + +Note that this package is still *alpha-stage*; documentations are not complete +and specifications are subject to change. Documentations are located at + doc/luatexja-en.pdf (en), doc/luatexja-ja.pdf (ja). + +LuaTeX-ja is developed on + <https://osdn.jp/projects/luatex-ja/wiki/FrontPage(en)>. +If you have questions or recognize bugs/have feature requests, +we would like you to create a thread in the forum or a ticket +in the way which OSDN supplies, via links found in the page above. + + +Installation +------------ + +0. Please make sure that your TeX distribution is up-to-date. + This version of LuaTeX-ja requires + - LuaTeX 1.0.0 or later + - luaotfload (v2.98 or later recommended) + - adobemapping (Adobe CMap files) + - everysel package + - etoolbox package + - ltxcmds package + - pdftexcmds package + - atbegshi package + - filehook package + - stfloats package + - IPAex fonts (http://ipafont.ipa.go.jp/) + Hence this version does not work in TeX Live 2016 (or earlier). + +1. If you are using TeX Live 2019 or later, you can install LuaTeX-ja via tlmgr. + +2. If you must/want to install manually: + + a. Download the source archive from CTAN, + or tagged as 20190826.0 in the Git repository by + <http://git.osdn.jp/view?p=luatex-ja/luatexja.git + ;a=snapshot;h=refs/tags/20190826.0;sf=tgz> + + b. Extract the archive and process following three files by LuaLaTeX + to generate classes for Japanese typesetting: + src/ltjclasses.ins + src/ltjltxdoc.ins + src/ltjsclasses.ins + + c. Process src/ltj-kinsoku_make.tex by (plain) LuaTeX to generate ltj-kinsoku.lua, + which stores default "kinsoku" parameters. + + d. Put src/ into your TEXMF tree. + An example location is TEXMF/tex/luatex/luatexja. + + If you are updating from old version, you MUST remove it before + extracting the new version of LuaTeX-ja. + + e. You may need to update the filename database, by mktexlsr (or by another program). + + +Basic Usage +----------- + +LuaTeX-ja supports both the plain format and LaTeX2e. +Simply loading luatexja.sty by \input or \usepackage does the minimal setting. + +- If you want to create Japanese-based documents, you can consider the use of + ltj{article,book,report}.cls or ltjs{article,book,report}.cls. +- If you want to use functionality of the fontspec package with Japanese fonts, + load luatexja-fontspec.sty. It defines control sequences such as \setmainjfont, + \setsansjfont and \jfontspec, which can be used for specifying Japanese fonts. + +Notes +----- +* This archive contains four .{dtx,ins} pairs: + src/ltjclasses.{ins,dtx}, src/ltjltxdoc.{ins,dtx} + src/ltjsclasses.{ins,dtx}, doc/luatexja.{ins,dtx} + Former three pairs generate class files (see above), + while the latter doc/luatexja.{ins,dtx} generates documentations. + (You will need Kozuka fonts to regenerate documentaion PDFs.) + + No .{dtx,ins} pair generates .sty files of LuaTeX-ja package. + +* src/*.{ins.dtx} and src/ltj-kinsoku_make.tex are not needed in regular use. + +Last commit date: Mon Aug 26 09:29:22 2019 +0900 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 diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-adjust.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-adjust.sty new file mode 100644 index 0000000000..c4cc54c2f9 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-adjust.sty @@ -0,0 +1,144 @@ +% +% luatexja-adjust.sty +% + +%% Avoid multiple loading. +\csname\if11luatexjaadjustLoaded\fi\endcsname +\edef\x{% +\catcode32=\the\catcode32% +\catcode33=\the\catcode33% +\catcode35=\the\catcode35% +\catcode40=\the\catcode40% +\catcode41=\the\catcode41% +\catcode42=\the\catcode42% +\catcode43=\the\catcode43% +\catcode44=\the\catcode44% +\catcode45=\the\catcode45% +\catcode46=\the\catcode46% +\catcode58=\the\catcode58% +\catcode59=\the\catcode59% +\catcode60=\the\catcode60% +\catcode61=\the\catcode61% +\catcode62=\the\catcode62% +\catcode64=\the\catcode64% +\catcode91=\the\catcode91% +\catcode93=\the\catcode93% +\catcode94=\the\catcode94% +\catcode95=\the\catcode95% +\catcode126=\the\catcode126% +\endlinechar=\the\endlinechar +\relax} +\catcode32=10 %< > +\catcode33=12 %<"> +\catcode35=6 %<#> +\catcode40=12 %<(> +\catcode41=12 %<)> +\catcode42=12 %<*> +\catcode43=12 %<+> +\catcode44=12 %<,> +\catcode45=12 %<-> +\catcode46=12 %<.> +\catcode58=12 %<:> +\catcode59=12 %<;> +\catcode60=12 %<<> +\catcode61=12 %<=> +\catcode62=12 %<>> +\catcode64=11 %<@> +\catcode91=12 %<[> +\catcode93=12 %<]> +\catcode94=7 %<^> +\catcode95=8 %<_> +\catcode126=13 %<~> +\endlinechar=-1 % + +\edef\ltj@adjust@AtEnd{\x + \noexpand\let\noexpand\ltj@adjust@AtEnd\relax} +\def\luatexjaadjustLoaded{\endinput} + +%% Check if LaTeX is used. +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname RequirePackage\endcsname\relax %<*!LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iffalse\endcsname +\else %<*LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iftrue\endcsname + \NeedsTeXFormat{LaTeX2e} + \ProvidesPackage{luatexja-adjust}[2018/07/24] +\fi %</LaTeX> + +% Load core module if not yet. +% xkeyval.sty is already required in luatexja.sty. +\ifx\luatexjacoreLoaded\@undefined + \ifltj@in@latex %<*LaTeX> + \RequirePackage{luatexja} + \else %<*!LaTeX> + \input luatexja.sty % + \fi %</LaTeX> +\fi + +%% When environment check fails, exit now. +\ifx\LuaTeXjaAvailable\@undefined + \ltj@otf@AtEnd +\expandafter\endinput\fi\relax + +%%------------------ + +%! Main part of luatexja-adjust +\RequireLuaTeXjaSubmodule{adjust} + +\newcount\ltjadj@status@le +\newcount\ltjadj@status@lp +\newcount\ltjadj@status@pr +\newcount\ltjadj@status@ls +\let\ltj@adjust@temp=\relax +\define@choicekey[ltj]{adjust}{lineend}[\@@temp\ltj@adjust@temp]% +{false,true,extended}[true]{% + \ifnum\ltj@adjust@temp=-1 \else\ltjadj@status@le=\ltj@adjust@temp\fi\relax} +\define@boolkey[ltj]{adjust}{priority}[true]{% + \ltjadj@status@pr=\ifltj@adjust@priority1\else0\fi\relax} +\define@boolkey[ltj]{adjust}{profile}[true]{% + \ltjadj@status@lp=\ifltj@adjust@profile1\else0\fi\relax} +\define@boolkey[ltj]{adjust}{linestep}[true]{% + \ltjadj@status@ls=\ifltj@adjust@linestep1\else0\fi\relax} + +\protected\def\@@ltjenableadjust[#1]{% + \setkeys[ltj]{adjust}{#1}% + \directlua{luatexja.adjust.enable_cb( + \the\ltjadj@status@le, \the\ltjadj@status@pr, + \the\ltjadj@status@lp, \the\ltjadj@status@ls)}\ignorespaces +} +\protected\def\ltjdisableadjust{% + \ltjenableadjust[lineend=false,priority=false,profile=false,linestep=false]} +\protected\def\ltjenableadjust{% + \ltx@ifnextchar[{\@@ltjenableadjust}{\@@ltjenableadjust[lineend,priority]}}%] + +\ltjenableadjust + +%%% 優先順位の設定 +\define@key[ltj]{adjpri}{kanjiskip}{% + \directlua{luatexja.adjust.priority_table[\the\count@][1] = token.scan_int()}#1\relax} +\define@key[ltj]{adjpri}{xkanjiskip}{% + \directlua{luatexja.adjust.priority_table[\the\count@][2] = token.scan_int()}#1\relax} +\define@key[ltj]{adjpri}{others}{% + \directlua{luatexja.adjust.priority_table[\the\count@][3] = token.scan_int()}#1\relax} +\define@key[ltj]{japaram}{stretch_priority}{% + \begingroup\count@=1 \setkeys[ltj]{adjpri}{#1}\relax + \directlua{luatexja.adjust.make_priority_table(1)}\endgroup} +\define@key[ltj]{japaram}{shrink_priority}{% + \begingroup\count@=2 \setkeys[ltj]{adjpri}{#1}\relax + \directlua{luatexja.adjust.make_priority_table(2)}\endgroup} +\ltjsetparameter{% + stretch_priority={kanjiskip=-35, xkanjiskip=-25, others=50}, + shrink_priority={kanjiskip=-35, xkanjiskip=-25, others=50}, +} +\define@key[ltj]{japaram}{linestep_factor}{% + \directlua{local d = #1; luatexja.adjust.step_factor=math.abs(d)}\relax} +\define@key[ltj]{japaram}{profile_hgap_factor}{% + \directlua{luatexja.adjust.profile_hgap_factor = math.abs(#1)}\relax} + + +%%------------------ all done +\ltj@adjust@AtEnd +\endinput +%% EOF diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-ajmacros.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-ajmacros.sty new file mode 100644 index 0000000000..ca187cc900 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-ajmacros.sty @@ -0,0 +1,844 @@ +% +% luatexja-ajmacros.sty +% +% Original: +% \ProvidesPackage{ajmacros}[2019/04/01 21:00 iNOUE Koich! <inoue@ma.ns.musashi-tech.ac.jp>] +% + + +%% Avoid multiple loading. +\csname\if11luatexjaajmacrosLoaded\fi\endcsname +\edef\x{% +\catcode32=\the\catcode32% +\catcode33=\the\catcode33% +\catcode35=\the\catcode35% +\catcode40=\the\catcode40% +\catcode41=\the\catcode41% +\catcode42=\the\catcode42% +\catcode43=\the\catcode43% +\catcode44=\the\catcode44% +\catcode45=\the\catcode45% +\catcode46=\the\catcode46% +\catcode58=\the\catcode58% +\catcode59=\the\catcode59% +\catcode60=\the\catcode60% +\catcode61=\the\catcode61% +\catcode62=\the\catcode62% +\catcode64=\the\catcode64% +\catcode91=\the\catcode91% +\catcode93=\the\catcode93% +\catcode94=\the\catcode94% +\catcode95=\the\catcode95% +\catcode126=\the\catcode126% +\endlinechar=\the\endlinechar +\relax} +\catcode32=10 %< > +\catcode33=12 %<"> +\catcode35=6 %<#> +\catcode40=12 %<(> +\catcode41=12 %<)> +\catcode42=12 %<*> +\catcode43=12 %<+> +\catcode44=12 %<,> +\catcode45=12 %<-> +\catcode46=12 %<.> +\catcode58=12 %<:> +\catcode59=12 %<;> +\catcode60=12 %<<> +\catcode61=12 %<=> +\catcode62=12 %<>> +\catcode64=11 %<@> +\catcode91=12 %<[> +\catcode93=12 %<]> +\catcode94=7 %<^> +\catcode95=8 %<_> +\catcode126=13 %<~> +\endlinechar=-1 % + +\edef\ltj@ajmacros@AtEnd{\x + \noexpand\let\noexpand\ltj@ajmacros@AtEnd\relax} +\def\luatexjaajmacrosLoaded{\endinput} + +%% Check if LaTeX is used. +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname RequirePackage\endcsname\relax %<*!LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iffalse\endcsname +\else %<*LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iftrue\endcsname + \NeedsTeXFormat{LaTeX2e} + \ProvidesPackage{luatexja-ajmacros}[2017/05/05] +\fi %</LaTeX> + +%%------------------ +%! Main part of luatexja-ajmacros +\newif\if@kana\@kanafalse +%% for plain TeX +\newcount\@tempcnta +\newcount\@tempcntb +\ifltj@in@latex\else + \def\@tw{\char"2} + \def\@ifstar#1#2#3{\ifx*#3\expandafter#1\else#2{#3}\fi} + \long\def\@gobble#1{} +\fi + +{% +\gdef\shift@CID#1#2{{\@tempcnta#1\advance\@tempcnta#2\CID{\@tempcnta}}} +\gdef\ajTsumesuji{\@ifstar{\@@ajTsumesuji}{\@ajTsumesuji}} +\global\let\ajTumesuji\ajTsumesuji +\gdef\@ajTsumesuji#1#2{{\@tempcnta\unless\ifnum\ltjgetparameter{direction}=3 \ifcase#1\or780\or247\or9758\or9738\fi + \else\ifcase#1\or8736\or8966\or13274\or13254\fi\fi + \aj@expand\aj@Tsumesuji#2\@nil}} +\gdef\@@ajTsumesuji#1{\@ajTsumesuji{\aj@expand\aj@count@toks#14321\@nil}{#1}} +\gdef\aj@expand#1#2{\expandafter\@aj@expand\number#2!#1} +\gdef\@aj@expand#1!#2{#2#1} +\gdef\aj@count@toks#1#2#3#4#5#6\@nil{#5} +\gdef\aj@Tsumesuji#1{\ifx\@nil#1\else\shift@CID{\@tempcnta}{#1}% + \expandafter\aj@Tsumesuji + \fi} +\gdef\ajMaru{\@ifstar{\@aj@Maru}{\aj@Maru}} +\gdef\aj@Maru#1{\ifnum#1=\z@ \CID{8224}% + \else\ifnum#1<21 \shift@CID{#1}{7554}% + \else\ifnum#1=21 \CID{8091}% + \else\ifnum#1<32 \shift@CID{#1}{8080}% + \else\shift@CID{#1}{10212}% + \fi\fi\fi\fi} +\gdef\@aj@Maru#1{\ifnum#1<10 \shift@CID{#1}{10234}% + \else\ifnum#1<21 \shift@CID{#1}{7554}% + \else\ifnum#1=21 \CID{8091}% + \else\ifnum#1<32 \shift@CID{#1}{8080}% + \else\shift@CID{#1}{10212}% + \fi\fi\fi\fi} +\gdef\ajKuroMaru{\@ifstar{\@aj@KuroMaru}{\aj@KuroMaru}} +\gdef\aj@KuroMaru#1{\ifnum#1=\z@ \CID{10503}% + \else\ifnum#1<10 \shift@CID{#1}{8285}% + \else\shift@CID{#1}{10504}% + \fi\fi} +\gdef\@aj@KuroMaru#1{\shift@CID{#1}{10504}} +\gdef\ajKaku{\@ifstar{\@aj@Kaku}{\aj@Kaku}} +\gdef\aj@Kaku#1{\ifnum#1<10{\@tempcnta#1\multiply\@tempcnta\tw@ + \shift@CID{\@tempcnta}{10764}}% + \else\shift@CID{#1}{10774}% + \fi} +\gdef\@aj@Kaku#1{\ifnum#1<10{\@tempcnta#1\multiply\@tempcnta\tw@ + \shift@CID{\@tempcnta}{10765}}% + \else\shift@CID{#1}{10774}% + \fi} +\gdef\ajKuroKaku{\@ifstar{\@aj@KuroKaku}{\aj@KuroKaku}} +\gdef\aj@KuroKaku#1{\ifnum#1<10{\@tempcnta#1\multiply\@tempcnta\tw@ + \shift@CID{\@tempcnta}{11037}}% + \else\shift@CID{#1}{11047}% + \fi} +\gdef\@aj@KuroKaku#1{\ifnum#1<10{\@tempcnta#1\multiply\@tempcnta\tw@ + \shift@CID{\@tempcnta}{11038}}% + \else\shift@CID{#1}{11047}% + \fi} +\gdef\ajMaruKaku{\@ifstar{\@aj@MaruKaku}{\aj@MaruKaku}} +\gdef\aj@MaruKaku#1{\ifnum#1<10{\@tempcnta#1\multiply\@tempcnta\tw@ + \shift@CID{\@tempcnta}{11307}}% + \else\shift@CID{#1}{11317}% + \fi} +\gdef\@aj@MaruKaku#1{\ifnum#1<10{\@tempcnta#1\multiply\@tempcnta\tw@ + \shift@CID{\@tempcnta}{11308}}% + \else\shift@CID{#1}{11317}% + \fi} +\gdef\ajKuroMaruKaku{\@ifstar{\@aj@KuroMaruKaku}{\aj@KuroMaruKaku}} +\gdef\aj@KuroMaruKaku#1{\ifnum#1<10{\@tempcnta#1\multiply\@tempcnta\tw@ + \shift@CID{\@tempcnta}{11576}}% + \else\shift@CID{#1}{11586}% + \fi} +\gdef\@aj@KuroMaruKaku#1{\ifnum#1<10{\@tempcnta#1\multiply\@tempcnta\tw@ + \shift@CID{\@tempcnta}{11577}}% + \else\shift@CID{#1}{11586}% + \fi} +\gdef\ajKakko{\@ifstar{\@aj@Kakko}{\aj@Kakko}} +\gdef\aj@Kakko#1{\ifnum#1=\z@ \CID{8227}% + \else\ifnum#1<21 \shift@CID{#1}{8070}% + \else\shift@CID{#1}{9873}% + \fi\fi} +\gdef\@aj@Kakko#1{\ifnum#1<10 \shift@CID{#1}{9884}% + \else\ifnum#1<21 \shift@CID{#1}{8070}% + \else\shift@CID{#1}{9873}% + \fi\fi} +\gdef\ajRoman{\@ifstar{\@aj@Roman}{\aj@Roman}} +\gdef\aj@Roman#1{\ifnum#1<11 \shift@CID{#1}{7574}% + \else\ifnum#1<13 \shift@CID{#1}{8214}% + \else\shift@CID{#1}{8282}% + \fi\fi} +\gdef\@aj@Roman#1{\ifnum#1=4 \CID{9883}\else\aj@Roman{#1}\fi} +\gdef\ajroman#1{\ifnum#1<11 \shift@CID{#1}{8091}% + \else\shift@CID{#1}{8287}% + \fi} +\gdef\ajPeriod#1{\ifnum#1<10 \shift@CID{#1}{8061}\else\shift@CID{#1}{20577}\fi}%AJ1-6 +\gdef\ajKakkoalph#1{\shift@CID{#1}{8111}} +\gdef\ajKakkoYobi#1{\shift@CID{#1}{8196}} +\gdef\ajKakkoroman#1{\shift@CID{#1}{9973}} +\gdef\ajKakkoRoman#1{\shift@CID{#1}{9988}} +\gdef\ajKakkoAlph#1{\shift@CID{#1}{10003}} +\gdef\ajKakkoHira#1{\shift@CID{#1}{10029}} +\gdef\ajKakkoKata#1{\shift@CID{#1}{10077}} +\gdef\ajKakkoKansuji#1{\shift@CID{#1}{10125}} +\gdef\ajMaruKansuji#1{\shift@CID{#1}{10460}} +\gdef\ajNijuMaru#1{\shift@CID{#1}{16222}} +\gdef\ajRecycle#1{\shift@CID{#1}{16314}} +\gdef\ajHasenKakuAlph#1{\shift@CID{#1}{20496}}%AJ1-6 +\gdef\ajCross#1{\shift@CID{#1}{20523}}%AJ1-6 +\gdef\ajSlanted{\@ifstar{\aj@Slanted}{\@aj@Slanted}}%AJ1-6 +\gdef\aj@Slanted#1{\shift@CID{#1}{20589}}%AJ1-6 +\gdef\@aj@Slanted#1{\ifnum#1<10 \shift@CID{#1}{9460}\else\shift@CID{#1}{20589}\fi}%AJ1-6 +\gdef\ajApostrophe#1{\shift@CID{#1}{20649}}%AJ1-6 +\global\let\ajYear\ajApostrophe%AJ1-6 +\gdef\ajSquareMark{\@ifstar{\aj@SquareMark}{\@ifnextchar+{\@aj@SquareMark}{\@ajSquareMark}}} +\gdef\@ajSquareMark#1{\shift@CID{#1}{12229}} +\gdef\aj@SquareMark#1{\shift@CID{#1}{12241}} +\gdef\@aj@SquareMark+#1{\shift@CID{#1}{\ifodd\@tempcnta24459\else24482\fi + \divide\@tempcnta\tw@}} +\gdef\ajHishi#1{\shift@CID{#1}{12256}} +% +\let\offsetalph\z@ +\chardef\offsetAlph26 +\chardef\offsetHira26 +\chardef\offsetKata48 +\chardef\offsetYobi48 +\let\offsetMaru\z@ +\chardef\offsetKuroMaru144 +\chardef\offsetKaku122 +\chardef\offsetKuroKaku125 +\chardef\offsetMaruKaku122 +\chardef\offsetKuroMaruKaku121 +\@tempcnta10312 +\def\@aj@sujidef#1{\ifx\@nil#1% + \else\advance\@tempcnta\csname offset#1\endcsname + \expandafter\xdef\csname aj\@ajsujifam#1\endcsname##1% + {\noexpand\shift@CID{##1}{\number\@tempcnta}}% + \expandafter\@aj@sujidef\fi} +\def\@ajsujidef#1{\ifx\@nil#1% + \else\advance\@tempcnta\csname offset#1\endcsname + \def\@ajsujifam{#1}% + \@aj@sujidef{alph}{Alph}{Hira}{Kata}{Yobi}\@nil + \expandafter\@ajsujidef\fi} +\@ajsujidef{Maru}{KuroMaru}{Kaku}{KuroKaku}{MaruKaku}{KuroMaruKaku}\@nil +\gdef\ajMaruYobi#1{\ifnum#1<8 \shift@CID{#1}{10470}% + \else\ifnum#1=8 \CID{10492}% + \else\ifnum#1=9 \CID{10487}% + \fi\fi\fi} +% +\gdef\ajTsumekakko#1{\aj@expand\@ajTsumekakko#1\@nil} +\global\let\ajTumekakko\ajTsumekakko +\gdef\@ajTsumekakko#1#2{\ifx\@nil#2\mbox{\unless\ifnum\ltjgetparameter{direction}=3 \rlap{\CID{10233}}\shift@CID{#1}{9872}% + \else\CID{13268}\shift@CID{#1}{10185}\CID{13269}\fi}% + \expandafter\@gobble + \else\shift@CID{#1}{\unless\ifnum\ltjgetparameter{direction}=3 10152\else10174\fi}% + \expandafter\aj@Tsumekakko + \fi#2} +\gdef\aj@Tsumekakko#1#2{\ifx\@nil#2\shift@CID{#1}{\unless\ifnum\ltjgetparameter{direction}=3 10162\else10196\fi}% + \expandafter\@gobble + \else\shift@CID{#1}{\unless\ifnum\ltjgetparameter{direction}=3 247\else10185\fi}% + \expandafter\aj@Tsumekakko + \fi#2} +\gdef\ajNenrei#1{\ifcase#1\relax\expandafter\ajTsumekakko\or\expandafter\aj@NenreiTu + \or\expandafter\aj@NenreiSai\or\expandafter\aj@Nenrei@Tu + \or\expandafter\aj@Nenrei@Sai + \fi} +\gdef\aj@NenreiTu#1{\aj@expand\@aj@NenreiTu#1\@nil} +\gdef\@aj@NenreiTu#1#2{\shift@CID{#1}{\unless\ifnum\ltjgetparameter{direction}=3 10152\else10174\fi}% + \ifx\@nil#2\CID{\unless\ifnum\ltjgetparameter{direction}=3 10172\else10206\fi}\expandafter\@gobble + \else\expandafter\aj@Tsumekakko + \fi#2} +\gdef\aj@NenreiSai#1{\aj@expand\@aj@NenreiSai#1\@nil} +\gdef\@aj@NenreiSai#1{\shift@CID{#1}{\unless\ifnum\ltjgetparameter{direction}=3 10152\else10174\fi}\@aj@NenreiSai@} +\gdef\@aj@NenreiSai@#1{\ifx\@nil#1\CID{\unless\ifnum\ltjgetparameter{direction}=3 10173\else10207\fi}% + \else\shift@CID{#1}{\unless\ifnum\ltjgetparameter{direction}=3 247\else10185\fi}% + \expandafter\@aj@NenreiSai@\fi} +\gdef\aj@Nenrei@Tu#1{\ifnum#1<10 \shift@CID{#1}{10174}\CID{10206}% + \else\expandafter\@aj@Nenrei@Tu\number#1% + \fi} +\gdef\@aj@Nenrei@Tu#1#2{\ifnum#2=\z@ \shift@CID{#1}{10174}\CID{10196}% + \else\ifnum#1<\tw@ \CID{10184}% + \else\shift@CID{#1}{10174}\CID{10195}% + \fi + \shift@CID{#2}{10196}% + \fi} +\gdef\aj@Nenrei@Sai#1{\ifnum#1<10 \shift@CID{#1}{10174}% + \else\expandafter\@aj@Nenrei@Sai\number#1% + \fi\CID{10207}} +\gdef\@aj@Nenrei@Sai#1#2{\ifnum#1<\tw@ \CID{10184}% + \else\shift@CID{#1}{10174}\CID{10195}% + \fi + \ifnum#2>\z@ \shift@CID{#2}{10185}% + \fi} +\gdef\ajnenrei#1#2{\hskip\ltjgetparameter{kanjiskip}\hbox{\tate\ifnum#2<10 + \shift@CID{#2}{10207}\CID{\ifcase#1\or10230\or10232\or10231\or10229\fi}% + \else\ifnum#2=10\CID{\ifodd#1 10208\else10217\fi}% + \CID{\ifcase#1\or10218\or10232\or10218\or10229\fi}% + \else\ifnum#2<20\CID{\ifodd#1 10208\else10217\fi}\shift@CID{#2}{10208}% + \else\expandafter\aj@nenrei\number#2{#1}% + \fi\fi\fi}} +\gdef\aj@nenrei#1#2#3{\shift@CID{#1}{10207}% + \ifcase#2 \CID{\ifodd#3 10218\else10228\fi}% + \else\shift@CID{#2}{10218}% + \fi} +\gdef\ajKosu{\ajnenrei4} +% +\gdef\ajLabel#1#2#{\ifx\\#2\\\aj@Label#1\else\@aj@Label#1#2\fi} +\gdef\aj@Label#1\else#2\fi#3{\fi + \expandafter\protect + \expandafter#1% + \expandafter{\number\csname c@#3\endcsname}} +\gdef\@aj@Label#1#2\fi#3{\fi + \expandafter\protect + \expandafter#1% + \expandafter#2% + \expandafter{\number\csname c@#3\endcsname}} +% +% +\gdef\ajFrac{\@ifstar{\@aj@Frac}{\aj@Frac}} +\gdef\@ajFrac#1#2{\ifcase#2\or + \or\ifcase#1\or9826\fi + \or\ifcase#1+9825\or9827\or9828\fi + \or\ifcase#1\or9829\or9826\or9830\fi + \or\ifcase#1\or9831\or9832\or9833\or9834\fi + \or\ifcase#1\or9835\or9827\or9826\or9828\or9836\fi + \or\ifcase#1\or9837\or9838\or9839\or9840\or9841\or9842\fi + \or\ifcase#1\or9843\or9829\or9844\or9826\or9845\or9830\or9846\fi + \or\ifcase#1\or9847\or9848\or9827\or9849\or9850\or9828\or9851\or9852\fi + \or\ifcase#1\or9853\or9831\or9854\or9832\or9826\or9833\or9855\or9834\or9856\fi + \or\ifcase#1\or9857\or9858\or9859\or9860\or9861\or9862\or9863\or9864\or9865\or9866\fi + \or\ifcase#1\or9867\or9835\or9829\or9827\or9868\or9826\or9869\or9828\or9830\or9836 + \or9870\fi + \else\ifnum#2=100 \ifnum#1=1 9871\fi\fi + \fi} +\gdef\@aj@Frac#1#2{\CID{\@ajFrac{#1}{#2}}} +\gdef\aj@Frac#1#2{{\@tempcnta\@ajFrac{#1}{#2}% + \advance\@tempcnta-9825 + \advance\@tempcnta\ifcase\@tempcnta9780\or8183\or9779\or9779\or8181\else9778\fi\relax + \CID{\@tempcnta}}} +%1/4 161 8880 9604 13120 +%1/2 162 8881 9605 13121 +%3/4 163 8882 9606 13122 +%1/8 9371 12887 9691 13207 +%3/8 9372 12888 9692 13208 +%5/8 9373 12889 9693 13209 +%7/8 9374 12890 9694 13210 +%1/3 9375 12891 9695 13211 +%2/3 9376 12892 9696 13212 +% +% +\def\@aj半角def#1{\ifx\@nil#1\else + \expandafter\xdef\csname aj半角@#1\endcsname{\noexpand\CID + {\noexpand\unless\noexpand\ifnum\noexpand\ltjgetparameter\noexpand{direction\noexpand}=3 \number\@tempcnta\noexpand\else\number\@tempcntb\noexpand\fi}}% + \advance\@tempcnta\@ne\advance\@tempcntb\@ne + \expandafter\@aj半角def\fi} +\@tempcnta326 +\@tempcntb9084 +\@aj半角def 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜`ヰヱヮヵヶヴガギグゲゴザジズゼゾダヂヅデドバパビピブプベペボポ\@nil +\@tempcnta516 +\@aj半角def をぁぃぅぇぉゃゅょっあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわんゐゑゎがぎぐげござじずぜぞだぢづでどばぱびぴぶぷべぺぼぽ\@nil +\gdef\aj半角#1{\aj@半角#1\@nil} +\gdef\aj@半角#1{\ifx\@nil#1\else + \expandafter\ifx\csname aj半角@#1\endcsname\relax + #1\else\csname aj半角@#1\endcsname\fi + \expandafter\aj@半角\fi} +% +% +\def\@ajligdef#1#2{\expandafter\xdef\csname ajLig\@ajmojifam#1\endcsname{\noexpand\CID{#2}}} +\def\@ajligaturedef#1{\ifx\@nil#1\else + \@ajligdef{#1}{\number\@tempcnta}\advance\@tempcnta\@ne + \expandafter\@ajligaturedef\fi} +\def\@aj@ligdef#1#2#3{\expandafter\xdef\csname ajLig\@ajmojifam#1\endcsname + {\unexpanded{\unless\ifnum\ltjgetparameter{direction}=3 }% + \noexpand\CID{#2}\noexpand\else\noexpand\CID{#3}\noexpand\fi}} +\def\@aj@ligaturedef#1{\ifx\@nil#1\else + \@aj@ligdef{#1}{\number\@tempcnta}{\number\@tempcntb}% + \advance\@tempcnta\@ne\advance\@tempcntb\@ne + \expandafter\@aj@ligaturedef\fi} +% +\let\@ajmojifam\@empty +\@tempcnta12111 +\@ajligaturedef{!!}{!?}{!*}{!!*}{!?*}\@nil +\@ajligdef{?!}{16279} +\@ajligdef{??}{16278} +% +\let\@ajmojifam\@empty +\@tempcnta7601 +\@ajligaturedef{mm}{cm}{km}{mg}{kg}{cc}{m2}\@nil +\@tempcnta7610 +\@ajligaturedef{No.}{K.K.}{TEL}\@nil +\@tempcnta8020 +\@ajligaturedef{cm2}{km2}{cm3}{m3}{dl}{l}{kl}{ms}{micros}{ns}{ps}{KB}{MB}{GB}{HP}{Hz}{mb}{ml}\@nil +\@ajligdef{KK.}{8053} +\@ajligdef{Tel}{8055} +\@ajligdef{in}{8182} +\@tempcnta8186 +\@ajligaturedef{mm2}{mm3}{km3}{sec}{min}\@nil +\@tempcnta8192 +\@ajligaturedef{cal}{kcal}{dB}\@nil +\@tempcnta8303 +\@ajligaturedef{m}{g}{F}{TB}{FAX}{JIS}\@nil +\@ajligdef{euro}{9779} +\@aj@ligdef{euro*}{9354}{12870} +\@aj@ligdef{ohm*}{9355}{12871} +\@ajligdef{mho}{16204} +\@aj@ligdef{mho*}{15515}{16526} +\@aj@ligdef{No*}{20321}{20965}%AJ1-6 +\@tempcnta11846 +\@ajligaturedef{AM}{KK}{No}{PH}{PM}{PR}{tel}{tm}{VS}{a/c}{a.m.}{c/c}{c.c.}{c/o}{dl*}{hPa}{kl*}{l*}{microg}{microm}{ml*}{m/m}{n/m}{pH}{p.m.}\@nil +\@ajligdef{JAS}{12088} +\@tempcnta20919 +\@ajligaturedef{ppb}{ppm}{'S}{H2}{O2}{Ox}{Nx}{Q2}{Jr.}{Dr.}\@nil%AJ1-6 +% +\let\@ajmojifam\@empty +\@tempcnta7621 +\@tempcntb12041 +\@aj@ligaturedef{明治}{大正}{昭和}\@nil +\@tempcnta7585 +\@tempcntb7940 +\@aj@ligaturedef{ミリ}{キロ}{センチ*}{メートル}{グラム*}{トン}{アール*}{ヘクタール}{リットル}{ワット*}{カロリー}{ドル}{セント*}{パーセント}{ミリバール}{ページ*}\@nil +\@aj@ligdef{センチ}{8038}{8329} +\@aj@ligdef{キロメートル}{8039}{8330} +\@aj@ligdef{グラム}{8040}{8339} +\@aj@ligdef{キログラム}{8041}{8340} +\@aj@ligdef{アール}{8042}{8338} +\@aj@ligdef{セント}{8043}{8348} +\@aj@ligdef{ワット}{8044}{8344} +\@aj@ligdef{ホーン}{8045}{8347} +\@aj@ligdef{ヘルツ}{8046}{8343} +\@aj@ligdef{ページ}{8047}{8349} +\@aj@ligdef{アパート}{8048}{8350} +\@aj@ligdef{ビル}{8049}{8358} +\@aj@ligdef{マンション}{8050}{8357} +\@aj@ligdef{コーポ}{8051}{8353} +\@aj@ligdef{ハイツ}{8052}{8356} +\@aj@ligdef{株式会社}{8054}{8324} +\@aj@ligdef{インチ}{8183}{8333} +\@aj@ligdef{有限会社}{8321}{8325} +\@aj@ligdef{財団法人}{8322}{8326} +\@aj@ligdef{平成}{8323}{12044} +\@aj@ligdef{フィート}{8327}{8334} +\@aj@ligdef{ヤード}{8328}{8337} +\@aj@ligdef{インチ*}{8331}{8332} +\@aj@ligdef{ヤード*}{8335}{8336} +\@aj@ligdef{ヘルツ*}{8341}{8342} +\@aj@ligdef{ホーン*}{8345}{8346} +\@aj@ligdef{コーポ*}{8351}{8352} +\@aj@ligdef{ハイツ*}{8354}{8355} +\@aj@ligdef{さじ}{11871}{11872} +\@tempcnta11873 +\@tempcntb11957 +\@aj@ligaturedef{アト}{アルファ}{アンペア}{イニング}{ウォン}{ウルシ}{エーカー}{エクサ}{エスクード}{オーム}{オングストローム}{オンス}{オントロ}{カイリ}% +{カップ}{カラット}{ガロン}{ガンマ}{ギガ}{ギニー}{キュリー}{ギルダー}{キロリットル}{キロワット}{グスーム}{グラムトン}{クルサード}{クルゼイロ}{クローネ}% +{ケース}{コルナ}{サイクル}{サンチーム}{シリング}{ダース}{デカ}{デシ}{テラ}{ドラクマ}{ナノ}{ノット}{バーツ}{バーレル}{パスカル}{バレル}{ピアストル}{ピクル}% +{ピコ}{ファラッド}{ファラド}{フェムト}{ブッシェル}{フラン}{ベータ}{ヘクト}{ヘクトパスカル}{ペセタ}{ペソ}{ペタ}{ペニヒ}{ペンス}{ポイント}{ホール}{ボルト}{ホン}% +{ポンド}{マイクロ}{マイル}{マッハ}{マルク}{ミクロン}{メガ}{メガトン}{ヤール}{ユアン}{ユーロ}{ラド}{リラ}{ルーブル}{ルクス}{ルピア}{ルピー}{レム}{レントゲン}\@nil +\@tempcnta12045 +\@tempcntb12054 +\@aj@ligaturedef{医療法人}{学校法人}{共同組合}{協同組合}{合資会社}{合名会社}{社団法人}{宗教法人}{郵便番号}\@nil +\expandafter\gdef\csname ajLigオングストローム*\endcsname + {\mbox{\kern.05zw\ajLig{オントロ}\kern-.1zw\ajLig{グスーム}\kern.05zw}} +\@tempcnta20929 +\@tempcntb20943 +\@aj@ligaturedef{ガル}{グレイ}{クローナ}{シーベルト}{シェケル}{ジュール}{デシベル}{ドット}{バイト}{ビット}{ベクレル}{ボー}{ランド}{リンギット}\@nil%AJ1-6 +\@ajligdef{より}{12181} +\@ajligdef{升}{16194} +\@ajligdef{コト}{16195} +\@aj@ligdef{令和}{23058}{23059}%AJ1-7 +% +\def\@ajmojifam{○} +\@tempcnta7613 +\@ajligaturedef 上中下左右\@nil +\@ajligdef{〒}{8057} +\@tempcnta8152 +\@ajligaturedef 夜企医協名宗労学有株社監資財\@nil +\@ajligdef{印}{8191} +\@ajligdef{秘}{8223} +\@tempcnta8317 +\@ajligaturedef 大小優控\@nil +\@tempcnta10478 +\@ajligaturedef 調注副減標欠基禁項休女男正写祝出適特済増問答例電\@nil% +\@ajligdef{年}{20553}%AJ1-6 +% +\def\@ajmojifam#1{(#1)} +\@ajligdef{株}{7618} +\@ajligdef{有}{7619} +\@ajligdef{代}{7620} +\@tempcnta8138 +\@ajligaturedef 至企協名労社監自資財特学祭呼\@nil +\@ajligdef{祝}{8204} +\@ajligdef{休}{8205} +\@tempcnta10146 +\@ajligaturedef 営合注問答例\@nil +% +\def\@ajmojifam{□} +\@ajligdef{印}{8196} +\@ajligdef{負}{11030} +\@ajligdef{勝}{11031} +\@tempcnta20497 +\@ajligaturedef{:A}{:B}{:C}{:D}{:E}{:F}{:終}\@nil%AJ1-6 +\@tempcnta20505 +\@ajligaturedef{:CL}{:KCL}{:BEL}{:AS}{:AM}{:段}{:ゴ}{:ミ}\@nil%AJ1-6 +% +\def\@ajmojifam{◇} +\@tempcnta20554 +\@ajligaturedef {News}天再新映声前後終立交{ほか}劇司解株気二多文手{PV}{MV}双{SS}{S1}{S2}{S3}デ{HV}\@nil%AJ1-6 +% +\def\@ajmojifam{▽} +\@ajligdef{〒}{12180} +\@ajligdef{▽}{12193} +% +\def\@ajmojifam{△} +\@ajligdef{!}{12192} +% +\def\@ajmojifam{■} +\@ajligdef{◇}{12231} +% +\expandafter\chardef\csname offset●\endcsname\z@ +\expandafter\mathchardef\csname offset□\endcsname269 +\expandafter\mathchardef\csname offset■\endcsname268 +\expandafter\mathchardef\csname offset◇\endcsname267 +\expandafter\mathchardef\csname offset◆\endcsname266 +\@tempcnta10760 +\def\@ajmojidef#1{\ifx\@nil#1% + \else\advance\@tempcnta\csname offset#1\endcsname + \def\@ajmojifam{#1}% + \@ajligaturedef 問答例\@nil + \expandafter\@ajmojidef\fi} +\@ajmojidef ●□■◇◆\@nil +% +\def\@ajkanadef#1#2#3#4#5#6#7{\expandafter\gdef\csname ajLig#1\endcsname + {\if@kana\def\reserved@a{ruby}% + \ifx\k@family\reserved@a + \unless\ifnum\ltjgetparameter{direction}=3 \CID{#6}\else\CID{#7}\fi + \else\unless\ifnum\ltjgetparameter{direction}=3 \CID{#4}\else\CID{#5}\fi + \fi + \else\unless\ifnum\ltjgetparameter{direction}=3 \CID{#2}\else\CID{#3}\fi + \fi}} +\newcount\@tempcntc +\newcount\@tempcntd +\newcount\@tempcnte +\newcount\@tempcntf +\def\@aj@kanadef#1{\ifx\@nil#1% + \else\edef\reserved@b{\noexpand\@ajkanadef{#1}% + {\number\@tempcnta}{\number\@tempcntb}{\number\@tempcntc}% + {\number\@tempcntd}{\number\@tempcnte}{\number\@tempcntf}}\reserved@b + \advance\@tempcnta\@ne\advance\@tempcntb\@ne\advance\@tempcntc\@ne + \advance\@tempcntd\@ne\advance\@tempcnte\@ne\advance\@tempcntf\@ne + \expandafter\@aj@kanadef\fi} +\@ajkanadef{う゛}{7958}{7958}{12361}{12544}{12756}{12756} +\@tempcnta8313 +\@tempcntb8313 +\@tempcntc12452 +\@tempcntd12635 +\@tempcnte16444 +\@tempcntf16444 +\@aj@kanadef{ワ゛}{ヰ゛}{ヱ゛}{ヲ゛}\@nil +\@tempcnta16209 +\@tempcntb16209 +\@tempcntc16352 +\@tempcntd16382 +\@tempcnte16414 +\@tempcntf16414 +\@aj@kanadef{か゜}{き゜}{く゜}{け゜}{こ゜}{カ゜}{キ゜}{ク゜}{ケ゜}{コ゜}{セ゜}{ツ゜}{ト゜}\@nil +\@ajkanadef{小か}{7959}{8264}{12285}{12468}{12682}{12762} +\@ajkanadef{小け}{7960}{8265}{12292}{12475}{12689}{12763} +\@ajkanadef{小こ}{12269}{12270}{12295}{12478}{16448}{16467} +\@ajkanadef{小コ}{12271}{12272}{12385}{12568}{16449}{16468} +\@tempcnta16236 +\@tempcntb16333 +\@tempcntc16365 +\@tempcntd16395 +\@tempcnte16427 +\@tempcntf16450 +\@aj@kanadef{小ク}{小シ}{小ス}{小ト}{小ヌ}{小ハ}{小ヒ}{小フ}{小ヘ}{小ホ}{小プ}{小ム}{小ラ}{小リ}{小ル}{小レ}{小ロ}\@nil +% +\def\@aj@numberdef#1#2{\ifx\@nil#2\expandafter\@gobble + \else\expandafter\xdef\csname ajnumber#2\endcsname{{#1}{\number\@tempcnta}}% + \advance\@tempcnta\@ne + \expandafter\@aj@numberdef\fi{#1}} +\@tempcnta\@ne +\@aj@numberdef{alph}abcdefghijklmnopqrstuvwxyz\@nil +\@tempcnta\@ne +\@aj@numberdef{Alph}ABCDEFGHIJKLMNOPQRSTUVWXYZ\@nil +\@tempcnta\@ne +\@aj@numberdef{Hira}あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん\@nil +\@tempcnta\@ne +\@aj@numberdef{Kata}アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン\@nil +\@tempcnta\@ne +\@aj@numberdef{Yobi}日月火水木金土祝休\@nil +\gdef\@ajnumber#1{\expandafter\expandafter\expandafter\aj@number\csname ajnumber#1\endcsname} +\gdef\aj@number#1{\ifx\relax#1\expandafter\@gobbletwo\else\expandafter\@aj@number\fi{#1}} +\gdef\@aj@number#1#2#3{\csname aj#3#1\endcsname{#2}} +% +\def\@aj@kakomidef#1#2{\expandafter\gdef\csname#1\endcsname##1% + {\expandafter\ifx\csname ajLig#1##1\endcsname\relax\@ajnumber{##1}{#2}% + \else\csname ajLig#1##1\endcsname\fi}} +\@aj@kakomidef{○}{Maru} +\@aj@kakomidef{●}{KuroMaru} +\@aj@kakomidef{□}{Kaku} +\@aj@kakomidef{■}{KuroKaku} +\@aj@kakomidef{◇}{MaruKaku} +\@aj@kakomidef{◆}{KuroMaruKaku} +\gdef\△#1{\csname ajLig△#1\endcsname} +\gdef\▽#1{\csname ajLig▽#1\endcsname} +\gdef\(#1){\expandafter\ifx\csname ajLig(#1)\endcsname\relax\@ajnumber{#1}{Kakko}% + \else\csname ajLig(#1)\endcsname\fi} +\gdef\゛#1{\csname ajLig#1゛\endcsname} +\gdef\゜#1{\csname ajLig#1゜\endcsname} +\gdef\!#1{\csname ajLig小#1\endcsname} +\gdef\ajLig#1{\csname ajLig#1\endcsname} +% +% +\def\@ajPICTdef#1#2{\expandafter\xdef\csname ajPICT#1\endcsname{\noexpand\CID{#2}}} +\def\@aj@PICTdef#1{\ifx\@nil#1\else + \@ajPICTdef{#1}{\number\@tempcnta}\advance\@tempcnta\@ne + \expandafter\@aj@PICTdef\fi} +\@tempcnta8016 +\@aj@PICTdef{Club}{Heart}{Spade}{Diamond}\@nil +\@ajPICTdef{電話}{8056} +\@ajPICTdef{〒}{8058} +\@tempcnta8211 +\@aj@PICTdef{Spade*}{Heart*}{Club*}{Diamond*}\@nil +\@tempcnta8215 +\@aj@PICTdef 晴曇雨雪→←↑↓\@nil +\@ajPICTdef{野球}{12097} +\@ajPICTdef{湯}{12098} +\@ajPICTdef{花}{12228} +\@ajPICTdef{花*}{12229} +\@ajPICTdef{サッカー}{20957}%AJ1-6 +\gdef\ajPICT#1{\csname ajPICT#1\endcsname} +\global\let\※\ajPICT +% +% +\def\@ajArrowdef#1#2{\expandafter\xdef\csname ajArrow#1\endcsname{\noexpand\CID{#2}}} +\def\@aj@Arrowdef#1{\ifx\@nil#1\else + \@ajArrowdef{#1}{\number\@tempcnta}\advance\@tempcnta\@ne + \expandafter\@aj@Arrowdef\fi} +\@tempcnta8009 +\@aj@Arrowdef{LeftTriangle}{RightTriangle}{DOWN}{UP}{LEFT}{RIGHT}\@nil +\@tempcnta8206 +\@aj@Arrowdef{RIGHT*}{LEFT*}{UP*}{DOWN*}\@nil +\@tempcnta8219 +\@aj@Arrowdef{RightHand}{LeftHand}{UpHand}{DownHand}\@nil +\@tempcnta8309 +\@aj@Arrowdef{Left/Right}{Right/Left}{Up/Down}{Down/Up}\@nil +\@tempcnta12175 +\@aj@Arrowdef{LeftScissors}{RightScissors}{UpScissors}{DownScissors}\@nil +\@tempcnta12194 +\@aj@Arrowdef +{LeftTriangle*}{RightTriangle*}{Left}{Right}{Up}{Down}{LeftDouble}{LeftRight*}{RightDown}{LeftDown}{LeftUp}{RightUp}% +{Right/Left*}{Left/Right*}{Right/Left+}{Down/Up+}{Left+}{Right+}{Up+}{Down+}{LeftRight+}{UpDown+}\@nil +\@tempcnta12261 +\@aj@Arrowdef +{LeftAngle}{RightAngle}{UpAngle}{DownAngle}{LeftAngle*}{RightAngle*}{UpAngle*}{DownAngle*}\@nil +\@ajArrowdef{RightDouble}{15482}%752 16493 +\@ajArrowdef{LeftRightDouble}{15483}%753 16494 +%\@ajArrowdef{LeftRight}{15511}%12201 16522 +\@ajArrowdef{RightUp*}{16201} +\@ajArrowdef{RightDown*}{16202} +%\@ajArrowdef{DOWNLEFT*}{16273} +\gdef\ajArrow#1{\csname ajArrow#1\endcsname} +% +% +\def\@aj@kuntendef#1{\ifx\@nil#1% + \else\expandafter\xdef\csname aj訓点#1\endcsname + {\noexpand\CID{\number\@tempcnta}}% + \advance\@tempcnta\@ne + \expandafter\@aj@kuntendef + \fi} +\@tempcnta16283 +\@aj@kuntendef |レ一二三四上中下甲乙丙丁天地人\@nil +\gdef\aj@smallReten{{\@tempdimb\f@size pt\@tempskipa\f@baselineskip + \@tempdimb.94\@tempdimb + \@tempskipa.94\@tempskipa + \fontsize{\@tempdimb}{\@tempskipa}\selectfont\aj訓点レ}} +\gdef\aj訓点一レ{\mbox{\tate\kern-.24zw\aj訓点一\kern-.65zw\raise.15zw\hbox{\aj@smallReten}}} +\gdef\aj訓点上レ{\mbox{\tate\aj訓点上\kern-.3zw\raise.15zw\hbox{\aj@smallReten}}} +\gdef\aj訓点甲レ{\mbox{\tate\aj訓点甲\kern-.25zw\raise.15zw\hbox{\aj@smallReten}}} +\gdef\aj訓点天レ{\mbox{\tate\aj訓点天\kern-.4zw\raise.1zw\hbox{\aj@smallReten}}} +\def\@ajongofudef#1{\ifx\@nil#1% + \else\expandafter\xdef\csname aj訓点#1|\endcsname + {\noexpand\mbox{\yoko\expandafter\noexpand\csname aj訓点#1\endcsname + \hbox to\z@{\hss\expandafter\noexpand\csname aj訓点|\endcsname\kern-.5zw}}}% + \expandafter\@ajongofudef\fi} +\@ajongofudef 二三四中下乙丙丁地人\@nil +\expandafter\gdef\csname aj訓点 |\endcsname{\mbox{\yoko{ }\hbox to\z@{\hss\csname aj訓点|\endcsname\kern-.5zw}}} +\def\@ajkungofudef#1{\ifx\@nil#1% + \else\expandafter\xdef\csname aj訓点|#1\endcsname + {\noexpand\mbox{\yoko\hbox to\z@{\hss\expandafter\noexpand\csname aj訓点|\endcsname\kern-.5zw}% + \expandafter\noexpand\csname aj訓点#1\endcsname}}% + \expandafter\@ajkungofudef\fi} +\@ajkungofudef 二三四中下乙丙丁地人\@nil +\expandafter\gdef\csname aj訓点| \endcsname{\mbox{\yoko\hbox to\z@{\hss\csname aj訓点|\endcsname\kern-.5zw}{ }}} +% +\gdef\ajKunten#1{\csname aj訓点#1\endcsname} +% +\newtoks\@temptokenb +\newtoks\@temptokenc +\gdef\ajRedefine@KundokuMacros{\ifx\kokana\@undefined + \else\let\orig@kokana\kokana + \let\orig@retenform\retenform + \let\orig@reten\reten + \let\orig@retenkana\retenkana + \let\orig@kaeriten\kaeriten + \def\aj@kokana##1##2{\orig@kokana{\aj@kundokusize\if@kana\rubyfamily\fi##1}% + {\aj@kundokusize\ajKunten{##2}}}% + \def\aj@retenform{\aj@kundokusize\aj訓点レ}% + \def\aj@reten{\orig@kaeriten{\aj@kundokusize\aj訓点レ}}% + \def\aj@retenkana##1{\orig@retenkana{\aj@kundokusize\if@kana\rubyfamily\fi##1}}% + \def\aj@kaeriten##1{\orig@kaeriten{\aj@kundokusize\ajKunten{##1}}}% + \let\aj@kundokusize\tiny + \fi + \ifx\@k@nd@ku@\@undefined + \else{\global\let\orig@k@nd@ku@\@k@nd@ku@ + \def\get@hbox##1\hbox##2##3\get@hbox + {\@temptokena{##1}\@temptokenb{##2}\@temptokenc{##3}}% + \expandafter\get@hbox + \@k@nd@ku@[##1]{##2}{##3}{##4}{\ajKunten{##5}}[\ajKunten{##6}]<##7>(##8)\get@hbox + \def\change@reten##1\def\temptopleft##2\def\tempbottomleft##3##4\change@reten + {\@temptokenb{##1\def\temptopleft{####6}\def\tempbottomleft{####5}##4}}% + \expandafter\change@reten\the\@temptokenb\change@reten + \edef\redefine@k@nd@ku@##1{\gdef\noexpand\aj@k@nd@ku@##1% + {\the\@temptokena\hbox{\the\@temptokenb}\the\@temptokenc}}% + \redefine@k@nd@ku@{[##1]##2##3##4##5[##6]<##7>(##8)}}% + \let\aj@kundokusize\kundokusize + \fi} +\ifltj@in@latex + \@onlypreamble\ajRedefine@KundokuMacros + \AtBeginDocument{\ajRedefine@KundokuMacros} +\fi +\gdef\DeclareOriginalKundokuStyle{\@ifnextchar[%] + {\Declare@OriginalKundokuStyle}% + {\Declare@OriginalKundokuStyle[\aj@kundokusize]}} +\gdef\Declare@OriginalKundokuStyle[#1]{\let\aj@kundokusize#1% + \ifx\orig@k@nd@ku@\@undefined + \else\let\@k@nd@ku@\orig@k@nd@ku@ + \let\kundokusize\aj@kundokusize + \fi + \ifx\orig@kokana\@undefined + \else + \let\kokana\orig@kokana + \let\retenform\orig@retenform + \let\reten\orig@reten + \let\retenkana\orig@retenkana + \let\kaeriten\orig@kaeriten + \fi} +\gdef\DeclareAJKundokuStyle{\@ifnextchar[%] + {\Declare@AJKundokuStyle}% + {\Declare@AJKundokuStyle[\aj@kundokusize]}} +\gdef\Declare@AJKundokuStyle[#1]{\let\aj@kundokusize#1% + \ifx\aj@k@nd@ku@\@undefined + \else\let\@k@nd@ku@\aj@k@nd@ku@ + \def\kundokusize{\aj@kundokusize\if@kana\rubyfamily\fi}% + \fi + \ifx\aj@kokana\@undefined + \else + \let\kokana\aj@kokana + \let\retenform\aj@retenform + \let\reten\aj@reten + \let\retenkana\aj@retenkana + \let\kaeriten\aj@kaeriten + \fi} +% +% +\gdef\ajCIDVarDef{\aj@VarDef\CID} +\gdef\ajUTFVarDef{\aj@VarDef\UTF} +\gdef\aj@VarDef#1#2#3{\expandafter\xdef\csname ajVar#2\endcsname{\noexpand#1{#3}}} +\gdef\ajCIDVarList#1{{\@ajCIDVarList#1\relax}} +\gdef\@ajCIDVarList#1{\ifx\relax#1\else\def\reserved@a{#1}\expandafter\aj@CIDVarList\fi} +\gdef\aj@CIDVarList{\afterassignment\@aj@CIDVarList\@tempcnta} +\gdef\@aj@CIDVarList{\aj@VarDef\CID\reserved@a{\number\@tempcnta}\@ajCIDVarList} +\gdef\ajUTFVarList#1{{\@ajUTFVarList#1 \relax}} +\gdef\@ajUTFVarList#1{\ifx\relax#1\else\def\reserved@a{#1}\expandafter\aj@UTFVarList\fi} +\gdef\aj@UTFVarList#1#2{\ifx=#1\expandafter\@aj@UTFVarList\else\expandafter\@aj@UTFVarList\expandafter#1\fi#2} +\gdef\@aj@UTFVarList#1 {\aj@VarDef\UTF\reserved@a{#1}\@ajUTFVarList} +\gdef\ajVar#1{\csname ajVar#1\endcsname} +\ifltj@in@latex + \@onlypreamble\ajCIDVarDef + \@onlypreamble\ajUTFVarDef + \@onlypreamble\ajCIDVarList + \@onlypreamble\ajUTFVarList +\fi +%\ajCIDVarList{吉=13706 教=8471 高=8705 鴎=7646 崎=14290 碕=17009 第=13910 角=13682 浜=8531} +\gdef\ajHashigoTaka{\CID{8705}} +\gdef\ajTsuchiYoshi{\CID{13706}} +\gdef\ajTatsuSaki{\CID{14290}} +\gdef\ajMayuHama{\CID{8531}} +% +% +%\gdef\ajRedefine@ajVar{\@ifpackageloaded{hyperref}{% +% \let\aj@Var\ajVar +% \def\ajVar##1{\ifHy@pdfstring +% \expandafter\expandafter +% \expandafter\check@UTF\csname ajVar##1\endcsname{##1}% +% \else\aj@Var{##1}\fi} +% \def\check@UTF##1##2##3{\ifx\UTF##1\0x##2\else##3\fi}}{}} +\gdef\ajRedefine@ajCommands{\@ifpackageloaded{hyperref}{% + \let\hyperref@ajLabel\ajLabel + \def\ajLabel##1##{\ifHy@pdfstring\Hy@ReturnAfterElseFi\hyperref@ajLabel\@arabic\else\ltx@ReturnAfterFi\hyperref@ajLabel##1\fi}% + \ajRedefine@ajCommand\△{Lig△}\▽{Lig▽}\!{Lig小}\ajLig{Lig}\ajPICT{PICT}\※{PICT}\ajVar{Var}\@nil\@nil + \aj@Redefine@ajCommand○{Maru}●{KuroMaru}□{Kaku}■{KuroKaku}◇{MaruKaku}◆{KuroMaruKaku}\@nil\@nil + \def\(##1){\ifHy@pdfstring(##1)\else\expandafter\ifx\csname ajLig(##1)\endcsname\relax\@ajnumber{##1}{Kakko}% + \else\csname ajLig(##1)\endcsname\fi\fi}% + \def\゛##1{\ifHy@pdfstring##1゛\else\csname ajLig##1゛\endcsname\fi}% + \def\゜##1{\ifHy@pdfstring##1゜\else\csname ajLig##1゜\endcsname\fi}% + }{}} +\gdef\ajRedefine@ajCommand#1#2{\ifx\@nil#1\else\def#1##1{\ifHy@pdfstring##1\else\csname aj#2##1\endcsname\fi}% + \expandafter\ajRedefine@ajCommand\fi} +\gdef\aj@Redefine@ajCommand#1#2{\ifx\@nil#1\else\expandafter\def\csname#1\endcsname##1% + {\ifHy@pdfstring##1\else\expandafter\ifx\csname ajLig#1##1\endcsname\relax\@ajnumber{##1}{#2}\else + \csname ajLig#1##1\endcsname\fi\fi}% + \expandafter\aj@Redefine@ajCommand\fi} +\ifltj@in@latex + \AtBeginDocument{\ajRedefine@ajCommands} +\fi +% +% +\gdef\ajLeader{\@ifnextchar[{\aj@Leader}{\aj@Leader[\z@ plus1fill]}} +\gdef\aj@Leader[#1]#2{{\@tempcnta#2\multiply\@tempcnta\tw@ + \advance\@tempcnta1221\ifhmode\unless\ifnum\ltjgetparameter{direction}=3 4\else5\fi\else\unless\ifnum\ltjgetparameter{direction}=3 5\else4\fi\fi + \leaders\hbox{\CID{\@tempcnta}}\ifhmode\hskip\else\vskip\fi#1}} +% +% +\endlinechar=13 +\toks0{}\toks1{}\toks2{}\toks3{} +\def\ajQuotedef#1 #2 #3 #4 {\ifx*#1\else + \toks0\expandafter{\the\toks0 \or#1}% + \toks1\expandafter{\the\toks1 \or#2}% + \toks2\expandafter{\the\toks2 \or#3}% + \toks3\expandafter{\the\toks3 \or#4}% + \expandafter\ajQuotedef\fi} +\ajQuotedef +670 671 12173 12174 +672 673 7956 7957 +674 675 7899 7900 +676 677 7901 7902 +678 679 7903 7904 +680 681 7905 7906 +682 683 7907 7908 +684 685 7909 7910 +686 687 7911 7912 +688 689 7913 7914 +690 691 7915 7916 +7608 7609 7956 7957 +12125 12126 12135 12136 +12127 12128 12137 12138 +12129 12130 12139 12140 +12131 12132 12141 12142 +12171 12172 12173 12174 +16197 16198 16329 16330 +* * * * +\def\@removetop#1{\toks#1\expandafter\expandafter\expandafter{\expandafter\@gobble\the\toks#1}} +\@removetop0\@removetop1\@removetop2\@removetop3 +\xdef\ajQuote#1#2{\noexpand\CID{\noexpand\unless\noexpand\ifnum\noexpand\ltjgetparameter\noexpand{direction\noexpand}=3 \noexpand\ifcase#1 \the\toks0 + \noexpand\fi\noexpand\else\noexpand\ifcase#1 \the\toks2 + \noexpand\fi\noexpand\fi}#2\inhibitglue\noexpand\CID{\noexpand\unless\noexpand\ifnum\noexpand\ltjgetparameter\noexpand{direction\noexpand}=3 \noexpand\ifcase#1 \the\toks1 + \noexpand\fi\noexpand\else\noexpand\ifcase#1 \the\toks3 + \noexpand\fi\noexpand\fi}} +} +\ifltj@in@latex\else + \ajRedefine@KundokuMacros +\fi +%%------------------ all done +\ltj@ajmacros@AtEnd +\endinput +%% EOF diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-25c.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-25c.sty new file mode 100644 index 0000000000..9c67b70358 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-25c.sty @@ -0,0 +1,357 @@ +% +% luatexja-fontspec-25c.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{luatexja-fontspec-25c}[2019/05/14 fontspec support of LuaTeX-ja] +\RequirePackage{l3keys2e} +\ExplSyntaxOn + +%%%%%%%% Change Japanese font family by \rmfamily or not +\cs_new:Npn \ltj_fontspec_match_cmd { + \renewcommand\jttdefault{\gtdefault} + \@ltj@match@familytrue + \DeclareDocumentCommand \setmonojfont { O{} m O{} } { + \ltj_fontspec_set_family:Nnn \jttdefault {##1,##3}{##2} + \normalfont + } +} +\bool_if:NT \__ltj_fontspec_match_bool \ltj_fontspec_match_cmd + +%%%%%%%% Messages +\msg_new:nnn {luatexja-fontspec} {addjfontfeatures-ignored} +{ + \string\addjfontfeature (s)~ ignored;\\ + it~ cannot~ be~ used~ with~ a~ font~ that~ wasn't~ selected~ by~ luatexja-fontspec. +} + +\msg_new:nnn {luatexja-fontspec} {altfont-ignored-by-norange} +{ + ignored~ sublist~ `#1'~ in~ AltFont~ (no~ range~ is~ specified). +} + +\msg_new:nnn {luatexja-fontspec} {altfont-ignored-by-rangeonly} +{ + ignored~ sublist~ `#1'~ in~ AltFont~ (only~ range~ is~ specified). +} + +\cs_generate_variant:Nn \prg_new_conditional:Nnn {Nnx} + +%%%%%%%% Internal control sequences +%% Each CS is ltj_fontspec version that corresponds to original CS of fontspec. +\cs_new:Nn \ltj_fontspec_define_option:nn { + \__fontspec_keys_define_code:nnn {fontspec} {#1} {#2} +} +\cs_new:Nn \ltj_fontspec_define_preparse_external:nn { + \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {#1} {#2} +} +\cs_new:Nn \ltj_fontspec_define_altfont_option:nn { + \__fontspec_keys_define_code:nnn {fontspec-ltjaltfont} {#1} {#2} +} + +%% Alternate Fonts +%% Spec: AltFont = { +%% ... +%% { Range = <range>, <font features> }, +%% { Range = <range>, Font = <font name>, <font features> }, +%% { Range = <range>, Font = <font name> }, +%% ... +%% } +\tl_new:N \l_ltj_fontspec_altname_tl +\tl_new:N \l_ltj_fontspec_altrange_tl +\clist_new:N \l_ltj_fontspec_altfont_clist +\clist_new:N \l_ltj_fontspec_altfont_leftover_clist +\int_new:N \g_ltj_fontspec_altnumber_int + +\ltj_fontspec_define_altfont_option:nn {Range} { + \tl_set:Nn \l_ltj_fontspec_altrange_tl {#1} +} +\ltj_fontspec_define_altfont_option:nn {Font} { + \fontspec_complete_fontname:Nn \l_ltj_fontspec_altname_tl {#1} +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {AltFont} { + \clist_put_right:Nn \l_ltj_fontspec_altfont_clist { #1 } +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {YokoFeatures} { + \clist_put_right:Nn \l_ltj_fontspec_fontfeat_yoko_clist { #1 } +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {TateFeatures} { + \clist_put_right:Nn \l_ltj_fontspec_fontfeat_tate_clist { #1 } +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {TateFont} { + \tl_if_empty:nF {#1} { + \fontspec_complete_fontname:Nn \l_ltj_fontspec_fontname_tate_tl {#1} + } +} +%% +\clist_new:N \l_ltj_fontspec_fontfeat_yoko_clist +\clist_new:N \l_ltj_fontspec_fontfeat_tate_clist +\tl_new:N \l_ltj_fontspec_fontname_tate_tl + +\cs_new:Npn \ltj_fontspec_DeclareFontFamily #1 #2 #3 { + \DeclareKanjiFamily {JY3} {#2} {#3} + \DeclareKanjiFamily {JT3} {#2} {#3} +} + +\cs_set_eq:NN \__ltj_orig_fontspec_select_font_family:nn \__fontspec_select_font_family:nn +\cs_new_protected:Nn \ltj_fontspec_select_font_family:nn { + \group_begin: + \ltj_fontspec_define_option:nn {NoEmbed} {} + \ltj_fontspec_define_option:nn {AltFont} { + \clist_put_right:Nn \l_ltj_fontspec_altfont_clist { ##1 } + } + \ltj_fontspec_define_option:nn {CID} { + \__fontspec_update_featstr:n {cid=##1} + } + \ltj_fontspec_define_option:nn {Kanjiskip} { + \str_if_eq_x:nnTF {false} { \str_lower_case:n { ##1 } }{ + \__fontspec_update_featstr:n {-ltjksp} + } { + \__fontspec_update_featstr:n {+ltjksp} + } + } + \ltj_fontspec_define_option:nn {JFM} { + \__fontspec_update_featstr:n {jfm=##1} + } + % vary by shape + \ltj_fontspec_define_option:nn {YokoFeatures} { + \clist_put_right:Nn \l_ltj_fontspec_fontfeat_yoko_clist { ##1 } + } + \ltj_fontspec_define_option:nn {TateFeatures} { + \clist_put_right:Nn \l_ltj_fontspec_fontfeat_tate_clist { ##1 } + } + \ltj_fontspec_define_option:nn {TateFont} + { + \tl_if_empty:nF {##1} { + \fontspec_complete_fontname:Nn \l_ltj_fontspec_fontname_tate_tl {##1} + } + } + \ltj_fontspec_define_option:nn {JFM-var} { + \__fontspec_update_featstr:n {jfmvar=##1} + } + \ltj_fontspec_define_preparse_external:nn {NoEmbed} { + \cs_set:Npn \__fontspec_fontname_wrap:n ##1 {psft:##1} + } + + %% Omit the warning message + %% "OpenType feature 'Kerning=Off' (-kern) not available ..." + \keys_define:nn {fontspec-opentype} { + Kerning/Off.code:n=\__fontspec_update_featstr:n {-kern} + } + \clist_set:Nx \g__fontspec_default_fontopts_clist { + YokoFeatures = { JFM=\ltj@stdyokojfm }, TateFeatures = { JFM=\ltj@stdtatejfm }, + Scale=\Cjascale, Kerning=Off, Script=CJK, + \g__ltj_fontspec_default_fontopts_clist + } + \prop_set_eq:NN \g__fontspec_fontopts_prop \g__ltj_fontspec_fontopts_prop + \cs_set_eq:NN \__fontspec_make_font_shapes:Nnnnn \ltj_fontspec_make_font_shapes:Nnnnn + \cs_set_eq:NN \DeclareFontFamily \ltj_fontspec_DeclareFontFamily + \tl_set:Nn \g_fontspec_encoding_tl {JY3} + \__ltj_orig_fontspec_select_font_family:nn{#1}{#2} + \group_end: +} + +%% declare_shape + +\cs_new:Nn \ltj_fontspec_declare_shape_yoko:nnnn { + \ltj_fontspec_declare_shape_aux:nnnnnn {#1} {#2} {#3} {#4} { JY3 } { \l_ltj_fontspec_fontfeat_yoko_clist } +} +\cs_new:Nn \ltj_fontspec_declare_shape_tate:nnnn { + \ltj_fontspec_declare_shape_aux:nnnnnn {#1} {#2} {#3} {#4} { JT3 } { \l_ltj_fontspec_fontfeat_tate_clist } +} +\cs_new:Nn \ltj_fontspec_declare_shape:nnnn { + \ltj_fontspec_declare_shape_yoko:nnnn {#1} {#2} {#3} {#4} + \ltj_fontspec_declare_shape_tate:nnnn {#1} {#2} {#3} {#4} +} +\cs_generate_variant:Nn \ltj_fontspec_declare_shape:nnnn {nnxx} +\cs_generate_variant:Nn \ltj_fontspec_declare_shape_yoko:nnnn {nnxx} +\cs_generate_variant:Nn \ltj_fontspec_declare_shape_tate:nnnn {nnxx} + +\cs_new:Nn \ltj_fontspec_declare_shape_aux:nnnnnn + { + \tl_clear:N \l__fontspec_nfss_tl + \tl_clear:N \l__fontspec_nfss_sc_tl + \tl_set_eq:NN \l__fontspec_saved_fontname_tl \l_fontspec_fontname_tl + + \tl_set:Nn \g_fontspec_encoding_tl {#5} + \tl_set:Nn \l__fontspec_nfss_enc_tl {#5} + \exp_args:Nx \clist_map_inline:nn {#4} + { + \tl_clear:N \l__fontspec_size_tl + \tl_set_eq:NN \l__fontspec_sizedfont_tl \l__fontspec_saved_fontname_tl % in case not spec'ed + + \keys_set_known:nxN {fontspec-sizing} { \exp_after:wN \use:n ##1 } + \l__fontspec_sizing_leftover_clist + \tl_if_empty:NT \l__fontspec_size_tl { \__fontspec_error:n {no-size-info} } + + \str_if_eq:nnTF { #5 } { JY3 } { + % "normal" + \__fontspec_load_fontname:n {\l__fontspec_sizedfont_tl} + } { + \tl_if_empty:NTF \l_ltj_fontspec_fontname_tate_tl + { \__fontspec_load_fontname:n {\l__fontspec_sizedfont_tl} } + { \__fontspec_load_fontname:n {\l_ltj_fontspec_fontname_tate_tl} } + } + \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_tl {#3} {#6} {} + } + \bool_set_true:N \l__fontspec_nosc_bool + \__fontspec_declare_shapes_normal:nn {#1} {#2} + \__fontspec_declare_shape_slanted:nn {#1} {#2} + } + +\cs_new:Nn \ltj_fontspec_set_family:Nnn { + \cs_set_eq:NN \__fontspec_select_font_family:nn \ltj_fontspec_select_font_family:nn + \__ltj_orig_fontspec_set_family:Nnn #1 {#2} {#3} + \cs_set_eq:NN \__fontspec_select_font_family:nn \__ltj_orig_fontspec_select_font_family:nn +} +\cs_set_eq:NN \__ltj_orig_fontspec_set_family:Nnn \fontspec_set_family:Nnn +\cs_set_eq:NN \__ltj_orig_fontspec_make_font_shapes:Nnnnn \__fontspec_make_font_shapes:Nnnnn +\cs_set_eq:NN \__ltj_fontspec_orig_DeclareFontShape \DeclareFontShape + +\cs_new:Nn \ltj_fontspec_make_font_shapes:Nnnnn { + \group_begin: + %% 基底フォント + \cs_set_eq:NN \__fontspec_font_set:Nnn \use_none:nnn + \cs_set_eq:NN \__fontspec_font_if_null:NT \use_none:nn + \cs_set_eq:NN \__fontspec_declare_shape:nnxx \ltj_fontspec_declare_shape:nnxx + \__ltj_orig_fontspec_make_font_shapes:Nnnnn {#1} {#2} {#3} {#4} {#5} + %% + \ltj_fontspec_make_font_shapes_alt:Nnnnnn {#1}{#2}{#3} + {#4, \l_ltj_fontspec_fontfeat_yoko_clist}{#5} {JY3 } + \ltj_fontspec_make_font_shapes_alt:Nnnnnn {#1}{#2}{#3} + {#4, \l_ltj_fontspec_fontfeat_tate_clist}{#5} {JT3} + \group_end: + } + +%%% Altfont 内部処理部 +\cs_new:Nn \ltj_fontspec_make_font_shapes_alt:Nnnnnn { + \group_begin: + \str_if_eq:nnTF { #6 } { JY3 } { + \cs_set_eq:NN \__fontspec_declare_shape:nnxx \ltj_fontspec_declare_shape_yoko:nnxx + }{ + \cs_set_eq:NN \__fontspec_declare_shape:nnxx \ltj_fontspec_declare_shape_tate:nnxx + } + \keys_set_known:nn {fontspec-ltjaltfont-reparse} { #4 } + \clist_if_empty:NF \l_ltj_fontspec_altfont_clist { + \int_gzero:N \g_ltj_fontspec_altnumber_int + \clist_map_inline:Nn \l_ltj_fontspec_altfont_clist { + \tl_clear:N \l_ltj_fontspec_altrange_tl + \tl_set:Nn \l_ltj_fontspec_altname_tl { #1 } + \tl_set:Nn \l_tmpa_tl { #1 } + + \keys_set_known:nxN {fontspec-ltjaltfont} { \exp_after:wN \use:n ##1 } + \l_ltj_fontspec_altfont_leftover_clist + \keys_set_known:nn {fontspec-ltjaltfont-reparse} { \exp_after:wN \use:n ##1 } + + \tl_if_empty:NT \l_ltj_fontspec_altrange_tl { + \msg_warning:nnn {luatexja-fontspec} {altfont-ignored-by-norange} { ##1 } + } { + \bool_if:nTF { + \tl_if_eq_p:NN \l_ltj_fontspec_altname_tl \l_tmpa_tl + && + \tl_if_empty_p:N \l_ltj_fontspec_altfont_leftover_clist + } { + \msg_warning:nnn {luatexja-fontspec} {altfont-ignored-by-rangeonly} { ##1 } + } { + \__ltj_orig_fontspec_make_font_shapes:Nnnnn + { \l_ltj_fontspec_altname_tl } {#2} + {#3 _ alt \int_use:N \g_ltj_fontspec_altnumber_int } + {#4, \l_ltj_fontspec_altfont_leftover_clist } + {#5} + \DeclareAlternateKanjiFont + { #6 }{ \l_fontspec_family_tl }{#2}{#3}% + { #6 }{ \l_fontspec_family_tl }{#2} + { #3 _alt \int_use:N \g_ltj_fontspec_altnumber_int } + { \l_ltj_fontspec_altrange_tl } + \int_gincr:N \g_ltj_fontspec_altnumber_int + } + } + } + } + \group_end: +} + + +%%%%%%%% User commands +\DeclareDocumentCommand \jfontspec { O{} m O{} } { + \ltj_fontspec_set_family:Nnn \k@family {#1,#3}{#2} + \selectfont + \ignorespaces +} + +\DeclareDocumentCommand \setmainjfont { O{} m O{} } { + \ltj_fontspec_set_family:Nnn \mcdefault {#1,#3}{#2} + \unless\ifltj@disablejfam + \DeclareSymbolFont{mincho}{JY3}{\l_fontspec_family_tl}{\mddefault}{n} + \SetSymbolFont{mincho}{bold}{JY3}{\l_fontspec_family_tl}{\bfdefault}{n} + \fi + \normalfont +} + +\DeclareDocumentCommand \setsansjfont { O{} m O{} } { + \ltj_fontspec_set_family:Nnn \gtdefault {#1,#3}{#2} + \unless\ifltj@disablejfam + \DeclareMathAlphabet{\mathgt}{JY3}{\l_fontspec_family_tl}{\mddefault}{n} + \fi + \normalfont +} + +\DeclareDocumentCommand \newjfontfamily { m O{} m O{} } { + \cs_set_eq:NN \fontspec_set_family:Nnn \ltj_fontspec_set_family:Nnn + \newfontfamily #1 [#2,#4] {#3} + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn +} + +\DeclareDocumentCommand \newjfontface { m O{} m O{} } { + \newjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3} +} + +\clist_new:N \g__ltj_fontspec_default_fontopts_clist +\prop_new:N \g__ltj_fontspec_fontopts_prop +\DeclareDocumentCommand \defaultjfontfeatures { t+ o m } + { + \IfNoValueTF {#2} + { \__ltj_fontspec_set_default_features:nn {#1} {#3} } + { \__ltj_fontspec_set_font_default_features:nnn {#1} {#2} {#3} } + \ignorespaces + } +\cs_new:Nn \__ltj_fontspec_set_default_features:nn + { + \clist_set_eq:NN \l__ltj_fontspec_tmp_clist \g__fontspec_default_fontopts_clist + \clist_set_eq:NN \g__fontspec_default_fontopts_clist \g__ltj_fontspec_default_fontopts_clist + \__fontspec_set_default_features:nn {#1} {#2} + \clist_set_eq:NN \g__ltj_fontspec_default_fontopts_clist \g__fontspec_default_fontopts_clist + \clist_set_eq:NN \g__fontspec_default_fontopts_clist \l__ltj_fontspec_tmp_clist + } +\cs_new:Nn \__ltj_fontspec_set_font_default_features:nnn + { + \prop_set_eq:NN \l__ltj_fontspec_tmp_prop \g__fontspec_fontopts_prop + \prop_set_eq:NN \g__fontspec_fontopts_prop \g__ltj_fontspec_fontopts_prop + \__fontspec_set_font_default_features:nnn {#1} {#2} {#3} + \prop_set_eq:NN \g__ltj_fontspec_fontopts_prop \g__fontspec_fontopts_prop + \prop_set_eq:NN \g__fontspec_fontopts_prop \l__ltj_fontspec_tmp_prop + } + +\DeclareDocumentCommand \addjfontfeatures {m} { + \ltj_fontspec_if_fontspec_font:TF + { + \group_begin: + \tl_set_eq:NN \f@family \k@family + \cs_set_eq:NN \__fontspec_select_font_family:nn \ltj_fontspec_select_font_family:nn + \addfontfeatures {#1} + \group_end: + \fontfamily\l_fontspec_family_tl\selectfont + }{ + \msg_warning:nn {luatexja-fontspec} {addjfontfeatures-ignored} + } + \ignorespaces +} + +\cs_set_eq:NN \addjfontfeature \addjfontfeatures + +\prg_new_conditional:Nnn \ltj_fontspec_if_fontspec_font: {TF,T,F} +{ + \cs_if_exist:cTF {g__fontspec_ \k@family _prop} \prg_return_true: \prg_return_false: +} + +\endinput diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-26h.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-26h.sty new file mode 100644 index 0000000000..1472633bb0 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-26h.sty @@ -0,0 +1,412 @@ +% +% luatexja-fontspec-26h.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{luatexja-fontspec-26h}[2019/05/14 fontspec support of LuaTeX-ja] +\RequirePackage{l3keys2e} +\ExplSyntaxOn + +%%%%%%%% Change Japanese font family by \rmfamily or not +\cs_new:Npn \__ltj_fontspec_match_cmd { + \renewcommand\jttdefault{\gtdefault} + \@ltj@match@familytrue + \DeclareDocumentCommand \setmonojfont { O{} m O{} } { + \__ltj_fontspec_set_family:Nnn \jttdefault {##1,##3}{##2} + \normalfont + } +} +\bool_if:NT \__ltj_fontspec_match_bool \__ltj_fontspec_match_cmd + +%%%%%%%% Messages +\msg_new:nnn {luatexja-fontspec} {addjfontfeatures-ignored} +{ + \string\addjfontfeature (s)~ ignored;\\ + it~ cannot~ be~ used~ with~ a~ font~ that~ wasn't~ selected~ by~ luatexja-fontspec. +} + +\msg_new:nnn {luatexja-fontspec} {altfont-ignored-by-norange} +{ + ignored~ sublist~ `#1'~ in~ AltFont~ (no~ range~ is~ specified). +} + +\msg_new:nnn {luatexja-fontspec} {altfont-ignored-by-rangeonly} +{ + ignored~ sublist~ `#1'~ in~ AltFont~ (only~ range~ is~ specified). +} + +\cs_generate_variant:Nn \prg_new_conditional:Nnn {Nnx} + +%%%%%%%% Internal control sequences +%% Each CS is ltj_fontspec version that corresponds to original CS of fontspec. +\cs_new:Nn \__ltj_fontspec_define_option:nn { + \__fontspec_keys_define_code:nnn {fontspec} {#1} {#2} +} +\cs_new:Nn \__ltj_fontspec_define_preparse_external:nn { + \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {#1} {#2} +} +\cs_new:Nn \__ltj_fontspec_define_altfont_option:nn { + \__fontspec_keys_define_code:nnn {fontspec-ltjaltfont} {#1} {#2} +} + +%% Alternate Fonts +%% Spec: AltFont = { +%% ... +%% { Range = <range>, <font features> }, +%% { Range = <range>, Font = <font name>, <font features> }, +%% { Range = <range>, Font = <font name> }, +%% ... +%% } +\tl_new:N \l__ltj_fontspec_altname_tl +\tl_new:N \l__ltj_fontspec_altrange_tl +\clist_new:N \l__ltj_fontspec_altfont_clist +\clist_new:N \l__ltj_fontspec_altfont_leftover_clist +\int_new:N \g__ltj_fontspec_altnumber_int + +\__ltj_fontspec_define_altfont_option:nn {Range} { + \tl_set:Nn \l__ltj_fontspec_altrange_tl {#1} +} +\__ltj_fontspec_define_altfont_option:nn {Font} { + \fontspec_complete_fontname:Nn \l__ltj_fontspec_altname_tl {#1} +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {AltFont} { + \clist_put_right:Nn \l__ltj_fontspec_altfont_clist { #1 } +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {YokoFeatures} { + \clist_put_right:Nn \l__ltj_fontspec_fontfeat_yoko_clist { #1 } +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {TateFeatures} { + \clist_put_right:Nn \l__ltj_fontspec_fontfeat_tate_clist { #1 } +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {TateFont} { + \tl_if_empty:nF {#1} { + \fontspec_complete_fontname:Nn \l__ltj_fontspec_fontname_tate_tl {#1} + } +} +%% +\clist_new:N \l__ltj_fontspec_fontfeat_yoko_clist +\clist_new:N \l__ltj_fontspec_fontfeat_tate_clist +\tl_new:N \l__ltj_fontspec_fontname_tate_tl + +\cs_new:Npn \__ltj_fontspec_DeclareFontFamily #1 #2 #3 { + \DeclareKanjiFamily {JY3} {#2} {#3} + \DeclareKanjiFamily {JT3} {#2} {#3} +} + +%% save and restore global variable +\tl_new:N \g__ltj_fontspec_kanji_nfss_family_tl +\tl_new:N \g__ltj_fontspec_orig_nfss_family_tl +\seq_new:N \g__ltj_fontspec_kanji_bf_series_seq +\seq_new:N \g__ltj_fontspec_orig_bf_series_seq +\clist_new:N \g__ltj_fontspec_kanji_default_fontopts_clist +\clist_new:N \g__ltj_fontspec_orig_default_fontopts_clist + +\cs_new:Nn \__ltj_set_global_variable_for_kanji: { + \tl_gset_eq:NN \g__ltj_fontspec_orig_nfss_family_tl \g__fontspec_nfss_family_tl + \tl_gset_eq:NN \g__fontspec_nfss_family_tl \g__ltj_fontspec_kanji_nfss_family_tl + \seq_gset_eq:NN \g__ltj_fontspec_orig_bf_series_seq \g__fontspec_bf_series_seq + \seq_gset_eq:NN \g__fontspec_bf_series_seq \g__ltj_fontspec_kanji_bf_series_seq + %\seq_gclear:N \g__fontspec_bf_series_seq + \clist_set_eq:NN \g__ltj_fontspec_orig_default_fontopts_clist \g__fontspec_default_fontopts_clist + \clist_set_eq:NN \g__fontspec_default_fontopts_clist \g__ltj_fontspec_kanji_default_fontopts_clist +} + +\cs_new:Nn \__ltj_restore_global_variable: { + \tl_gset_eq:NN \g__ltj_fontspec_kanji_nfss_family_tl \g__fontspec_nfss_family_tl + \tl_gset_eq:NN \g__fontspec_nfss_family_tl \g__ltj_fontspec_orig_nfss_family_tl + \seq_gset_eq:NN \g__ltj_fontspec_kanji_bf_series_seq \g__fontspec_bf_series_seq + \seq_gset_eq:NN \g__fontspec_bf_series_seq \g__ltj_fontspec_orig_bf_series_seq + \clist_set_eq:NN \g__ltj_fontspec_kanji_default_fontopts_clist \g__fontspec_default_fontopts_clist + \clist_set_eq:NN \g__fontspec_default_fontopts_clist \g__ltj_fontspec_orig_default_fontopts_clist +} + +\cs_set_eq:NN \__ltj_orig_fontspec_select_font_family:nn \__fontspec_select_font_family:nn +\cs_new_protected:Nn \__ltj_fontspec_select_font_family:nn { + \group_begin: + \__ltj_fontspec_define_option:nn {NoEmbed} {} + \__ltj_fontspec_define_option:nn {AltFont} { + \clist_put_right:Nn \l__ltj_fontspec_altfont_clist { ##1 } + } + \__ltj_fontspec_define_option:nn {CID} { + \__fontspec_update_featstr:n {cid=##1} + } + \__ltj_fontspec_define_option:nn {Kanjiskip} { + \str_if_eq_x:nnTF {false} { \str_lower_case:n { ##1 } }{ + \__fontspec_update_featstr:n {-ltjksp} + } { + \__fontspec_update_featstr:n {+ltjksp} + } + } + \__ltj_fontspec_define_option:nn {JFM} { + \__fontspec_update_featstr:n {jfm=##1} + } + % vary by shape + \__ltj_fontspec_define_option:nn {YokoFeatures} { + \clist_put_right:Nn \l__ltj_fontspec_fontfeat_yoko_clist { ##1 } + } + \__ltj_fontspec_define_option:nn {TateFeatures} { + \clist_put_right:Nn \l__ltj_fontspec_fontfeat_tate_clist { ##1 } + } + \__ltj_fontspec_define_option:nn {TateFont} + { + \tl_if_empty:nF {##1} { + \fontspec_complete_fontname:Nn \l__ltj_fontspec_fontname_tate_tl {##1} + } + } + \__ltj_fontspec_define_option:nn {JFM-var} { + \__fontspec_update_featstr:n {jfmvar=##1} + } + \__ltj_fontspec_define_preparse_external:nn {NoEmbed} { + \cs_set:Npn \__fontspec_fontname_wrap:n ##1 {psft:##1} + } + + %% Omit the warning message + %% "OpenType feature 'Kerning=Off' (-kern) not available ..." + \keys_define:nn {fontspec-opentype} { + Kerning/Off.code:n=\__fontspec_update_featstr:n {-kern} + } + \clist_set:Nx \g__fontspec_default_fontopts_clist { + YokoFeatures = { JFM=\ltj@stdyokojfm }, TateFeatures = { JFM=\ltj@stdtatejfm }, + Scale=\Cjascale, Kerning=Off, Script=CJK, + \g__ltj_fontspec_kanji_default_fontopts_clist + } + \prop_set_eq:NN \g__fontspec_fontopts_prop \g__ltj_fontspec_fontopts_prop + \cs_set_eq:NN \__fontspec_make_font_shapes:Nnnnn \__ltj_fontspec_make_font_shapes:Nnnnn + \cs_set_eq:NN \DeclareFontFamily \__ltj_fontspec_DeclareFontFamily + \tl_set:Nn \g_fontspec_encoding_tl {JY3} + \__ltj_orig_fontspec_select_font_family:nn{#1}{#2} + + \cs_gset:Npx \__ltj_fontspec_aftergroup { + \exp_not:N \tl_set:Nn \exp_not:N \l_fontspec_family_tl { \l_fontspec_family_tl } + } + \aftergroup \__ltj_fontspec_aftergroup + \group_end: +} + +%% declare_shape + +\cs_new:Nn \__ltj_fontspec_declare_shape_yoko:nnnn { + \__ltj_fontspec_declare_shape_aux:nnnnnn {#1} {#2} {#3} {#4} { JY3 } { \l__ltj_fontspec_fontfeat_yoko_clist } +} +\cs_new:Nn \__ltj_fontspec_declare_shape_tate:nnnn { + \__ltj_fontspec_declare_shape_aux:nnnnnn {#1} {#2} {#3} {#4} { JT3 } { \l__ltj_fontspec_fontfeat_tate_clist } +} +\cs_new:Nn \__ltj_fontspec_declare_shape:nnnn { + \__ltj_fontspec_declare_shape_yoko:nnnn {#1} {#2} {#3} {#4} + \__ltj_fontspec_declare_shape_tate:nnnn {#1} {#2} {#3} {#4} +} +\cs_generate_variant:Nn \__ltj_fontspec_declare_shape:nnnn {nnxx} +\cs_generate_variant:Nn \__ltj_fontspec_declare_shape_yoko:nnnn {nnxx} +\cs_generate_variant:Nn \__ltj_fontspec_declare_shape_tate:nnnn {nnxx} + +\cs_new:Nn \__ltj_fontspec_declare_shape_aux:nnnnnn + { + \tl_clear:N \l__fontspec_nfss_tl + \tl_clear:N \l__fontspec_nfss_sc_tl + \tl_set_eq:NN \l__fontspec_saved_fontname_tl \l_fontspec_fontname_tl + + \tl_set:Nn \g_fontspec_encoding_tl {#5} + \tl_set:Nn \g__fontspec_nfss_enc_tl {#5} + \exp_args:Nx \clist_map_inline:nn {#4} + { + \tl_clear:N \l__fontspec_size_tl + \tl_set_eq:NN \l__fontspec_sizedfont_tl \l__fontspec_saved_fontname_tl % in case not spec'ed + + \keys_set_known:nxN {fontspec-sizing} { \exp_after:wN \use:n ##1 } + \l__fontspec_sizing_leftover_clist + \tl_if_empty:NT \l__fontspec_size_tl { \__fontspec_error:n {no-size-info} } + + \cs_if_exist:NTF \__fontspec_load_fontname:Nn + { %% >= v2.7 + \str_if_eq:nnTF { #5 } { JY3 } { + % "normal" + \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_sizedfont_tl} + } { + \tl_if_empty:NTF \l__ltj_fontspec_fontname_tate_tl + { \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_sizedfont_tl} } + { \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__ltj_fontspec_fontname_tate_tl} } + } + } { %% < v2.7 + \str_if_eq:nnTF { #5 } { JY3 } { + % "normal" + \__fontspec_load_fontname:n {\l__fontspec_sizedfont_tl} + } { + \tl_if_empty:NTF \l__ltj_fontspec_fontname_tate_tl + { \__fontspec_load_fontname:n {\l__fontspec_sizedfont_tl} } + { \__fontspec_load_fontname:n {\l__ltj_fontspec_fontname_tate_tl} } + } + } + \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_tl {#3} {#6} {} + } + \bool_set_true:N \l__fontspec_nosc_bool + \__fontspec_declare_shapes_normal:nn {#1} {#2} + \__fontspec_declare_shape_slanted:nn {#1} {#2} + } + +\cs_new:Nn \__ltj_fontspec_set_family:Nnn { + \__ltj_set_global_variable_for_kanji: + \cs_set_eq:NN \__fontspec_select_font_family:nn \__ltj_fontspec_select_font_family:nn + \__ltj_orig_fontspec_set_family:Nnn #1 {#2} {#3} + \cs_set_eq:NN \__fontspec_select_font_family:nn \__ltj_orig_fontspec_select_font_family:nn + \__ltj_restore_global_variable: +} +\cs_set_eq:NN \__ltj_orig_fontspec_set_family:Nnn \fontspec_set_family:Nnn +\cs_set_eq:NN \__ltj_orig_fontspec_make_font_shapes:Nnnnn \__fontspec_make_font_shapes:Nnnnn +\cs_set_eq:NN \__ltj_fontspec_orig_DeclareFontShape \DeclareFontShape + +\cs_new:Nn \__ltj_fontspec_make_font_shapes:Nnnnn { + \group_begin: + %% 基底フォント + \cs_set_eq:NN \__fontspec_font_set:Nnn \use_none:nnn + \cs_set_eq:NN \__fontspec_font_if_null:NT \use_none:nn + \cs_set_eq:NN \__fontspec_declare_shape:nnxx \__ltj_fontspec_declare_shape:nnxx + \__ltj_orig_fontspec_make_font_shapes:Nnnnn {#1} {#2} {#3} {#4} {#5} + %% + \__ltj_fontspec_make_font_shapes_alt:Nnnnnn {#1}{#2}{#3} + {#4, \l__ltj_fontspec_fontfeat_yoko_clist}{#5} {JY3 } + \__ltj_fontspec_make_font_shapes_alt:Nnnnnn {#1}{#2}{#3} + {#4, \l__ltj_fontspec_fontfeat_tate_clist}{#5} {JT3} + \group_end: + } + +%%% Altfont 内部処理部 +\cs_new:Nn \__ltj_fontspec_make_font_shapes_alt:Nnnnnn { + \group_begin: + \str_if_eq:nnTF { #6 } { JY3 } { + \cs_set_eq:NN \__fontspec_declare_shape:nnxx \__ltj_fontspec_declare_shape_yoko:nnxx + }{ + \cs_set_eq:NN \__fontspec_declare_shape:nnxx \__ltj_fontspec_declare_shape_tate:nnxx + } + \keys_set_known:nn {fontspec-ltjaltfont-reparse} { #4 } + \clist_if_empty:NF \l__ltj_fontspec_altfont_clist { + \int_gzero:N \g__ltj_fontspec_altnumber_int + \clist_map_inline:Nn \l__ltj_fontspec_altfont_clist { + \tl_clear:N \l__ltj_fontspec_altrange_tl + \tl_set:Nn \l__ltj_fontspec_altname_tl { #1 } + \tl_set:Nn \l_tmpa_tl { #1 } + + \keys_set_known:nxN {fontspec-ltjaltfont} { \exp_after:wN \use:n ##1 } + \l__ltj_fontspec_altfont_leftover_clist + \keys_set_known:nn {fontspec-ltjaltfont-reparse} { \exp_after:wN \use:n ##1 } + + \tl_if_empty:NT \l__ltj_fontspec_altrange_tl { + \msg_warning:nnn {luatexja-fontspec} {altfont-ignored-by-norange} { ##1 } + } { + \bool_if:nTF { + \tl_if_eq_p:NN \l__ltj_fontspec_altname_tl \l_tmpa_tl + && + \tl_if_empty_p:N \l__ltj_fontspec_altfont_leftover_clist + } { + \msg_warning:nnn {luatexja-fontspec} {altfont-ignored-by-rangeonly} { ##1 } + } { + \__ltj_orig_fontspec_make_font_shapes:Nnnnn + { \l__ltj_fontspec_altname_tl } {#2} + {#3 _ alt \int_use:N \g__ltj_fontspec_altnumber_int } + {#4, \l__ltj_fontspec_altfont_leftover_clist } + {#5} + \DeclareAlternateKanjiFont + { #6 }{ \g__fontspec_nfss_family_tl }{#2}{#3}% + { #6 }{ \g__fontspec_nfss_family_tl }{#2} + { #3 _alt \int_use:N \g__ltj_fontspec_altnumber_int } + { \l__ltj_fontspec_altrange_tl } + \int_gincr:N \g__ltj_fontspec_altnumber_int + } + } + } + } + \group_end: +} + + +%%%%%%%% User commands +\DeclareDocumentCommand \jfontspec { O{} m O{} } { + \__ltj_fontspec_set_family:Nnn \k@family {#1,#3}{#2} + \selectfont + \ignorespaces +} + +\DeclareDocumentCommand \setmainjfont { O{} m O{} } { + \__ltj_fontspec_set_family:Nnn \mcdefault {#1,#3}{#2} + \unless\ifltj@disablejfam + \DeclareSymbolFont{mincho}{JY3}{\mcdefault}{\mddefault}{n} + \SetSymbolFont{mincho}{bold}{JY3}{\mcdefault}{\bfdefault}{n} + \fi + \normalfont +} + +\DeclareDocumentCommand \setsansjfont { O{} m O{} } { + \__ltj_fontspec_set_family:Nnn \gtdefault {#1,#3}{#2} + \unless\ifltj@disablejfam + \DeclareMathAlphabet{\mathgt}{JY3}{\gtdefault}{\mddefault}{n} + \fi + \normalfont +} + +\DeclareDocumentCommand \newjfontfamily { m O{} m O{} } { + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_fontspec_set_family:Nnn + \newfontfamily #1 [#2,#4] {#3} + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn +} +\DeclareDocumentCommand \renewjfontfamily { m O{} m O{} } { + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_fontspec_set_family:Nnn + \renewfontfamily #1 [#2,#4] {#3} + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn +} +\DeclareDocumentCommand \setjfontfamily { m O{} m O{} } { + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_fontspec_set_family:Nnn + \setfontfamily #1 [#2,#4] {#3} + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn +} + +\DeclareDocumentCommand \newjfontface { m O{} m O{} } { + \newjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3} +} + +\prop_new:N \g__ltj_fontspec_fontopts_prop +\DeclareDocumentCommand \defaultjfontfeatures { t+ o m } + { + \IfNoValueTF {#2} + { \__ltj_fontspec_set_default_features:nn {#1} {#3} } + { \__ltj_fontspec_set_font_default_features:nnn {#1} {#2} {#3} } + \ignorespaces + } +\cs_new:Nn \__ltj_fontspec_set_default_features:nn + { + \__ltj_set_global_variable_for_kanji: + \__fontspec_set_default_features:nn {#1} {#2} + \__ltj_restore_global_variable: + } +\cs_new:Nn \__ltj_fontspec_set_font_default_features:nnn + { + \prop_set_eq:NN \l__ltj_fontspec_tmp_prop \g__fontspec_fontopts_prop + \prop_set_eq:NN \g__fontspec_fontopts_prop \g__ltj_fontspec_fontopts_prop + \__fontspec_set_font_default_features:nnn {#1} {#2} {#3} + \prop_set_eq:NN \g__ltj_fontspec_fontopts_prop \g__fontspec_fontopts_prop + \prop_set_eq:NN \g__fontspec_fontopts_prop \l__ltj_fontspec_tmp_prop + } + +\DeclareDocumentCommand \addjfontfeatures {m} { + \__ltj_fontspec_if_fontspec_font:TF + { + \__ltj_set_global_variable_for_kanji: + \group_begin: + \tl_set_eq:NN \f@family \k@family + \cs_set_eq:NN \__fontspec_select_font_family:nn \__ltj_fontspec_select_font_family:nn + \addfontfeatures {#1} + \group_end: + \kanjifamily\g__fontspec_nfss_family_tl\selectfont + \__ltj_restore_global_variable: + }{ + \msg_warning:nn {luatexja-fontspec} {addjfontfeatures-ignored} + } + \ignorespaces +} + +\cs_set_eq:NN \addjfontfeature \addjfontfeatures + +\prg_new_conditional:Nnn \__ltj_fontspec_if_fontspec_font: {TF,T,F} +{ + \cs_if_exist:cTF {g__fontspec_fontinfo_ \k@family _prop} \prg_return_true: \prg_return_false: +} + +\endinput diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-27c.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-27c.sty new file mode 100644 index 0000000000..88d6b37b58 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-27c.sty @@ -0,0 +1,406 @@ +% +% luatexja-fontspec-27c.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{luatexja-fontspec-27c}[2019/05/14 fontspec support of LuaTeX-ja] +\RequirePackage{l3keys2e} +\ExplSyntaxOn + +%%%%%%%% Change Japanese font family by \rmfamily or not +\cs_new:Npn \__ltj_fontspec_match_cmd { + \renewcommand\jttdefault{\gtdefault} + \@ltj@match@familytrue + \DeclareDocumentCommand \setmonojfont { O{} m O{} } { + \__ltj_fontspec_set_family:Nnn \jttdefault {##1,##3}{##2} + \normalfont + } +} +\bool_if:NT \__ltj_fontspec_match_bool \__ltj_fontspec_match_cmd + +%%%%%%%% Messages +\msg_new:nnn {luatexja-fontspec} {addjfontfeatures-ignored} +{ + \string\addjfontfeature (s)~ ignored;\\ + it~ cannot~ be~ used~ with~ a~ font~ that~ wasn't~ selected~ by~ luatexja-fontspec. +} + +\msg_new:nnn {luatexja-fontspec} {altfont-ignored-by-norange} +{ + ignored~ sublist~ `#1'~ in~ AltFont~ (no~ range~ is~ specified). +} + +\msg_new:nnn {luatexja-fontspec} {altfont-ignored-by-rangeonly} +{ + ignored~ sublist~ `#1'~ in~ AltFont~ (only~ range~ is~ specified). +} + +\cs_generate_variant:Nn \prg_new_conditional:Nnn {Nnx} + +%%%%%%%% Internal control sequences +%% Each CS is ltj_fontspec version that corresponds to original CS of fontspec. +\cs_new:Nn \__ltj_fontspec_define_option:nn { + \__fontspec_keys_define_code:nnn {fontspec} {#1} {#2} +} +\cs_new:Nn \__ltj_fontspec_define_preparse_external:nn { + \__fontspec_keys_define_code:nnn {fontspec-preparse-external} {#1} {#2} +} +\cs_new:Nn \__ltj_fontspec_define_altfont_option:nn { + \__fontspec_keys_define_code:nnn {fontspec-ltjaltfont} {#1} {#2} +} + +%% Alternate Fonts +%% Spec: AltFont = { +%% ... +%% { Range = <range>, <font features> }, +%% { Range = <range>, Font = <font name>, <font features> }, +%% { Range = <range>, Font = <font name> }, +%% ... +%% } +\tl_new:N \l__ltj_fontspec_altname_tl +\tl_new:N \l__ltj_fontspec_altrange_tl +\clist_new:N \l__ltj_fontspec_altfont_clist +\clist_new:N \l__ltj_fontspec_altfont_leftover_clist +\int_new:N \g__ltj_fontspec_altnumber_int + +\__ltj_fontspec_define_altfont_option:nn {Range} { + \tl_set:Nn \l__ltj_fontspec_altrange_tl {#1} +} +\__ltj_fontspec_define_altfont_option:nn {Font} { + \fontspec_complete_fontname:Nn \l__ltj_fontspec_altname_tl {#1} +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {AltFont} { + \clist_put_right:Nn \l__ltj_fontspec_altfont_clist { #1 } +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {YokoFeatures} { + \clist_put_right:Nn \l__ltj_fontspec_fontfeat_yoko_clist { #1 } +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {TateFeatures} { + \clist_put_right:Nn \l__ltj_fontspec_fontfeat_tate_clist { #1 } +} +\__fontspec_keys_define_code:nnn {fontspec-ltjaltfont-reparse} {TateFont} { + \tl_if_empty:nF {#1} { + \fontspec_complete_fontname:Nn \l__ltj_fontspec_fontname_tate_tl {#1} + } +} +%% +\clist_new:N \l__ltj_fontspec_fontfeat_yoko_clist +\clist_new:N \l__ltj_fontspec_fontfeat_tate_clist +\tl_new:N \l__ltj_fontspec_fontname_tate_tl + +\cs_new:Npn \__ltj_fontspec_DeclareFontFamily #1 #2 #3 { + \DeclareKanjiFamily {JY3} {#2} {#3} + \DeclareKanjiFamily {JT3} {#2} {#3} +} + +%% save and restore global variable +\tl_new:N \g__ltj_fontspec_kanji_nfss_family_tl +\tl_new:N \g__ltj_fontspec_orig_nfss_family_tl +\seq_new:N \g__ltj_fontspec_kanji_bf_series_seq +\seq_new:N \g__ltj_fontspec_orig_bf_series_seq +\clist_new:N \g__ltj_fontspec_kanji_default_fontopts_clist +\clist_new:N \g__ltj_fontspec_orig_default_fontopts_clist + +\cs_new:Nn \__ltj_set_global_variable_for_kanji: { + \tl_gset_eq:NN \g__ltj_fontspec_orig_nfss_family_tl \g__fontspec_nfss_family_tl + \tl_gset_eq:NN \g__fontspec_nfss_family_tl \g__ltj_fontspec_kanji_nfss_family_tl + \seq_gset_eq:NN \g__ltj_fontspec_orig_bf_series_seq \g__fontspec_bf_series_seq + \seq_gset_eq:NN \g__fontspec_bf_series_seq \g__ltj_fontspec_kanji_bf_series_seq + %\seq_gclear:N \g__fontspec_bf_series_seq + \clist_set_eq:NN \g__ltj_fontspec_orig_default_fontopts_clist \g__fontspec_default_fontopts_clist + \clist_set_eq:NN \g__fontspec_default_fontopts_clist \g__ltj_fontspec_kanji_default_fontopts_clist +} + +\cs_new:Nn \__ltj_restore_global_variable: { + \tl_gset_eq:NN \g__ltj_fontspec_kanji_nfss_family_tl \g__fontspec_nfss_family_tl + \tl_gset_eq:NN \g__fontspec_nfss_family_tl \g__ltj_fontspec_orig_nfss_family_tl + \seq_gset_eq:NN \g__ltj_fontspec_kanji_bf_series_seq \g__fontspec_bf_series_seq + \seq_gset_eq:NN \g__fontspec_bf_series_seq \g__ltj_fontspec_orig_bf_series_seq + \clist_set_eq:NN \g__ltj_fontspec_kanji_default_fontopts_clist \g__fontspec_default_fontopts_clist + \clist_set_eq:NN \g__fontspec_default_fontopts_clist \g__ltj_fontspec_orig_default_fontopts_clist +} + +\cs_set_eq:NN \__ltj_orig_fontspec_select_font_family:nn \__fontspec_select_font_family:nn +\cs_new_protected:Nn \__ltj_fontspec_select_font_family:nn { + \group_begin: + \__ltj_fontspec_define_option:nn {NoEmbed} {} + \__ltj_fontspec_define_option:nn {AltFont} { + \clist_put_right:Nn \l__ltj_fontspec_altfont_clist { ##1 } + } + \__ltj_fontspec_define_option:nn {CID} { + \__fontspec_update_featstr:n {cid=##1} + } + \__ltj_fontspec_define_option:nn {Kanjiskip} { + \str_if_eq_x:nnTF {false} { \str_lower_case:n { ##1 } }{ + \__fontspec_update_featstr:n {-ltjksp} + } { + \__fontspec_update_featstr:n {+ltjksp} + } + } + \__ltj_fontspec_define_option:nn {JFM} { + \__fontspec_update_featstr:n {jfm=##1} + } + % vary by shape + \__ltj_fontspec_define_option:nn {YokoFeatures} { + \clist_put_right:Nn \l__ltj_fontspec_fontfeat_yoko_clist { ##1 } + } + \__ltj_fontspec_define_option:nn {TateFeatures} { + \clist_put_right:Nn \l__ltj_fontspec_fontfeat_tate_clist { ##1 } + } + \__ltj_fontspec_define_option:nn {TateFont} + { + \tl_if_empty:nF {##1} { + \fontspec_complete_fontname:Nn \l__ltj_fontspec_fontname_tate_tl {##1} + } + } + \__ltj_fontspec_define_option:nn {JFM-var} { + \__fontspec_update_featstr:n {jfmvar=##1} + } + \__ltj_fontspec_define_preparse_external:nn {NoEmbed} { + \cs_set:Npn \__fontspec_fontname_wrap:n ##1 {psft:##1} + } + + %% Omit the warning message + %% "OpenType feature 'Kerning=Off' (-kern) not available ..." + \keys_define:nn {fontspec-opentype} { + Kerning/Off.code:n=\__fontspec_update_featstr:n {-kern} + } + \clist_set:Nx \g__fontspec_default_fontopts_clist { + YokoFeatures = { JFM=\ltj@stdyokojfm }, TateFeatures = { JFM=\ltj@stdtatejfm }, + Scale=\Cjascale, Kerning=Off, Script=CJK, + \g__ltj_fontspec_kanji_default_fontopts_clist + } + \prop_set_eq:NN \g__fontspec_fontopts_prop \g__ltj_fontspec_fontopts_prop + \cs_set_eq:NN \__fontspec_make_font_shapes:Nnnnn \__ltj_fontspec_make_font_shapes:Nnnnn + \cs_set_eq:NN \DeclareFontFamily \__ltj_fontspec_DeclareFontFamily + \tl_set:Nn \g_fontspec_encoding_tl {JY3} + \__ltj_orig_fontspec_select_font_family:nn{#1}{#2} + + \cs_gset:Npx \__ltj_fontspec_aftergroup { + \exp_not:N \tl_set:Nn \exp_not:N \l_fontspec_family_tl { \l_fontspec_family_tl } + } + \aftergroup \__ltj_fontspec_aftergroup + \group_end: +} + +%% declare_shape + +\cs_new:Nn \__ltj_fontspec_declare_shape_yoko:nnnn { + \__ltj_fontspec_declare_shape_aux:nnnnnn {#1} {#2} {#3} {#4} { JY3 } { \l__ltj_fontspec_fontfeat_yoko_clist } +} +\cs_new:Nn \__ltj_fontspec_declare_shape_tate:nnnn { + \__ltj_fontspec_declare_shape_aux:nnnnnn {#1} {#2} {#3} {#4} { JT3 } { \l__ltj_fontspec_fontfeat_tate_clist } +} +\cs_new:Nn \__ltj_fontspec_declare_shape:nnnn { + \__ltj_fontspec_declare_shape_yoko:nnnn {#1} {#2} {#3} {#4} + \__ltj_fontspec_declare_shape_tate:nnnn {#1} {#2} {#3} {#4} +} +\cs_generate_variant:Nn \__ltj_fontspec_declare_shape:nnnn {nnxx} +\cs_generate_variant:Nn \__ltj_fontspec_declare_shape_yoko:nnnn {nnxx} +\cs_generate_variant:Nn \__ltj_fontspec_declare_shape_tate:nnnn {nnxx} + +\cs_new:Nn \__ltj_fontspec_declare_shape_aux:nnnnnn +{ + \tl_build_begin:N \l__fontspec_nfss_tl + \tl_build_begin:N \l__fontspec_nfss_sc_tl + \tl_set_eq:NN \l__fontspec_saved_fontname_tl \l_fontspec_fontname_tl + + \tl_set:Nn \g_fontspec_encoding_tl {#5} + \tl_set:Nn \g__fontspec_nfss_enc_tl {#5} + \exp_args:Nx \clist_map_inline:nn {#4} + { \__ltj_fontspec_setup_single_size:nnn {#3} {#6} {##1} } + \tl_build_end:N \l__fontspec_nfss_tl + \tl_build_end:N \l__fontspec_nfss_sc_tl + + \bool_set_true:N \l__fontspec_nosc_bool + \__fontspec_declare_shapes_normal:nn {#1} {#2} + \__fontspec_declare_shape_slanted:nn {#1} {#2} +} + +\cs_new:Nn \__ltj_fontspec_setup_single_size:nnn +{ + \tl_clear:N \l__fontspec_size_tl + \tl_set_eq:NN \l__fontspec_sizedfont_tl \l__fontspec_saved_fontname_tl % in case not spec'ed + + \keys_set_known:nxN {fontspec-sizing} { \exp_after:wN \use:n #3 } + \l__fontspec_sizing_leftover_clist + \tl_if_empty:NT \l__fontspec_size_tl { \__fontspec_error:n {no-size-info} } + + \str_if_eq:nnTF { \g__fontspec_nfss_enc_tl } { JY3 } { + % "normal" + \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_sizedfont_tl} + } { + \tl_if_empty:NTF \l__ltj_fontspec_fontname_tate_tl + { \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_sizedfont_tl} } + { \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__ltj_fontspec_fontname_tate_tl} } + } + \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_tl {#1} {#2} {} +} + +\cs_new:Nn \__ltj_fontspec_set_family:Nnn { + \__ltj_set_global_variable_for_kanji: + \cs_set_eq:NN \__fontspec_select_font_family:nn \__ltj_fontspec_select_font_family:nn + \__ltj_orig_fontspec_set_family:Nnn #1 {#2} {#3} + \cs_set_eq:NN \__fontspec_select_font_family:nn \__ltj_orig_fontspec_select_font_family:nn + \__ltj_restore_global_variable: +} +\cs_set_eq:NN \__ltj_orig_fontspec_set_family:Nnn \fontspec_set_family:Nnn +\cs_set_eq:NN \__ltj_orig_fontspec_make_font_shapes:Nnnnn \__fontspec_make_font_shapes:Nnnnn +\cs_set_eq:NN \__ltj_fontspec_orig_DeclareFontShape \DeclareFontShape + +\cs_new:Nn \__ltj_fontspec_make_font_shapes:Nnnnn { + \group_begin: + %% 基底フォント + \cs_set_eq:NN \__fontspec_font_set:Nnn \use_none:nnn + \cs_set_eq:NN \__fontspec_font_if_null:NT \use_none:nn + \cs_set_eq:NN \__fontspec_declare_shape:nnxx \__ltj_fontspec_declare_shape:nnxx + \__ltj_orig_fontspec_make_font_shapes:Nnnnn {#1} {#2} {#3} {#4} {#5} + %% + \__ltj_fontspec_make_font_shapes_alt:Nnnnnn {#1}{#2}{#3} + {#4, \l__ltj_fontspec_fontfeat_yoko_clist}{#5} {JY3 } + \__ltj_fontspec_make_font_shapes_alt:Nnnnnn {#1}{#2}{#3} + {#4, \l__ltj_fontspec_fontfeat_tate_clist}{#5} {JT3} + \group_end: + } + +%%% Altfont 内部処理部 +\cs_new:Nn \__ltj_fontspec_make_font_shapes_alt:Nnnnnn { + \group_begin: + \str_if_eq:nnTF { #6 } { JY3 } { + \cs_set_eq:NN \__fontspec_declare_shape:nnxx \__ltj_fontspec_declare_shape_yoko:nnxx + }{ + \cs_set_eq:NN \__fontspec_declare_shape:nnxx \__ltj_fontspec_declare_shape_tate:nnxx + } + \keys_set_known:nn {fontspec-ltjaltfont-reparse} { #4 } + \clist_if_empty:NF \l__ltj_fontspec_altfont_clist { + \int_gzero:N \g__ltj_fontspec_altnumber_int + \clist_map_inline:Nn \l__ltj_fontspec_altfont_clist { + \tl_clear:N \l__ltj_fontspec_altrange_tl + \tl_set:Nn \l__ltj_fontspec_altname_tl { #1 } + \tl_set:Nn \l_tmpa_tl { #1 } + + \keys_set_known:nxN {fontspec-ltjaltfont} { \exp_after:wN \use:n ##1 } + \l__ltj_fontspec_altfont_leftover_clist + \keys_set_known:nn {fontspec-ltjaltfont-reparse} { \exp_after:wN \use:n ##1 } + + \tl_if_empty:NT \l__ltj_fontspec_altrange_tl { + \msg_warning:nnn {luatexja-fontspec} {altfont-ignored-by-norange} { ##1 } + } { + \bool_if:nTF { + \tl_if_eq_p:NN \l__ltj_fontspec_altname_tl \l_tmpa_tl + && + \tl_if_empty_p:N \l__ltj_fontspec_altfont_leftover_clist + } { + \msg_warning:nnn {luatexja-fontspec} {altfont-ignored-by-rangeonly} { ##1 } + } { + \__ltj_orig_fontspec_make_font_shapes:Nnnnn + { \l__ltj_fontspec_altname_tl } {#2} + {#3 _ alt \int_use:N \g__ltj_fontspec_altnumber_int } + {#4, \l__ltj_fontspec_altfont_leftover_clist } + {#5} + \DeclareAlternateKanjiFont + { #6 }{ \g__fontspec_nfss_family_tl }{#2}{#3}% + { #6 }{ \g__fontspec_nfss_family_tl }{#2} + { #3 _alt \int_use:N \g__ltj_fontspec_altnumber_int } + { \l__ltj_fontspec_altrange_tl } + \int_gincr:N \g__ltj_fontspec_altnumber_int + } + } + } + } + \group_end: +} + + +%%%%%%%% User commands +\DeclareDocumentCommand \jfontspec { O{} m O{} } { + \__ltj_fontspec_set_family:Nnn \k@family {#1,#3}{#2} + \selectfont + \ignorespaces +} + +\DeclareDocumentCommand \setmainjfont { O{} m O{} } { + \__ltj_fontspec_set_family:Nnn \mcdefault {#1,#3}{#2} + \unless\ifltj@disablejfam + \DeclareSymbolFont{mincho}{JY3}{\mcdefault}{\mddefault}{n} + \SetSymbolFont{mincho}{bold}{JY3}{\mcdefault}{\bfdefault}{n} + \fi + \normalfont +} + +\DeclareDocumentCommand \setsansjfont { O{} m O{} } { + \__ltj_fontspec_set_family:Nnn \gtdefault {#1,#3}{#2} + \unless\ifltj@disablejfam + \DeclareMathAlphabet{\mathgt}{JY3}{\gtdefault}{\mddefault}{n} + \fi + \normalfont +} + +\DeclareDocumentCommand \newjfontfamily { m O{} m O{} } { + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_fontspec_set_family:Nnn + \newfontfamily #1 [#2,#4] {#3} + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn +} +\DeclareDocumentCommand \renewjfontfamily { m O{} m O{} } { + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_fontspec_set_family:Nnn + \renewfontfamily #1 [#2,#4] {#3} + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn +} +\DeclareDocumentCommand \setjfontfamily { m O{} m O{} } { + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_fontspec_set_family:Nnn + \setfontfamily #1 [#2,#4] {#3} + \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn +} + +\DeclareDocumentCommand \newjfontface { m O{} m O{} } { + \newjfontfamily #1 [ BoldFont={},ItalicFont={},SmallCapsFont={},#2,#4 ] {#3} +} + +\prop_new:N \g__ltj_fontspec_fontopts_prop +\DeclareDocumentCommand \defaultjfontfeatures { t+ o m } + { + \IfNoValueTF {#2} + { \__ltj_fontspec_set_default_features:nn {#1} {#3} } + { \__ltj_fontspec_set_font_default_features:nnn {#1} {#2} {#3} } + \ignorespaces + } +\cs_new:Nn \__ltj_fontspec_set_default_features:nn + { + \__ltj_set_global_variable_for_kanji: + \__fontspec_set_default_features:nn {#1} {#2} + \__ltj_restore_global_variable: + } +\cs_new:Nn \__ltj_fontspec_set_font_default_features:nnn + { + \prop_set_eq:NN \l__ltj_fontspec_tmp_prop \g__fontspec_fontopts_prop + \prop_set_eq:NN \g__fontspec_fontopts_prop \g__ltj_fontspec_fontopts_prop + \__fontspec_set_font_default_features:nnn {#1} {#2} {#3} + \prop_set_eq:NN \g__ltj_fontspec_fontopts_prop \g__fontspec_fontopts_prop + \prop_set_eq:NN \g__fontspec_fontopts_prop \l__ltj_fontspec_tmp_prop + } + +\DeclareDocumentCommand \addjfontfeatures {m} { + \__ltj_fontspec_if_fontspec_font:TF + { + \__ltj_set_global_variable_for_kanji: + \group_begin: + \tl_set_eq:NN \f@family \k@family + \cs_set_eq:NN \__fontspec_select_font_family:nn \__ltj_fontspec_select_font_family:nn + \addfontfeatures {#1} + \group_end: + \kanjifamily\g__fontspec_nfss_family_tl\selectfont + \__ltj_restore_global_variable: + }{ + \msg_warning:nn {luatexja-fontspec} {addjfontfeatures-ignored} + } + \ignorespaces +} + +\cs_set_eq:NN \addjfontfeature \addjfontfeatures + +\prg_new_conditional:Nnn \__ltj_fontspec_if_fontspec_font: {TF,T,F} +{ + \cs_if_exist:cTF {g__fontspec_fontinfo_ \k@family _prop} \prg_return_true: \prg_return_false: +} + +\endinput diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec.sty new file mode 100644 index 0000000000..e98fbc7b95 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-fontspec.sty @@ -0,0 +1,60 @@ +% +% luatexja-fontspec.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{luatexja-fontspec}[2019/03/20 fontspec support of LuaTeX-ja] +\RequirePackage{l3keys2e,luatexja} +\ExplSyntaxOn + +\cs_if_exist:NF \Cjascale { + %% Default scale value for jfont. + \group_begin: + \fontsize{16}{16}\selectfont + \cs_gset:Npx \Cjascale { \fp_to_decimal:n {\zw / 16} } + \group_end: +} + +\bool_new:N \__ltj_fontspec_match_bool +\keys_define:nn { luatexja-fontspec } + { + match .bool_set:N = \__ltj_fontspec_match_bool, + match .default:n = true, + pass .code:n = \PassOptionsToPackage{#1} {fontspec}, + % 互換性のために残したオプション + scale .code:n = \gdef\Cjascale{#1}, + unknown .code:n = \PassOptionsToPackage { \l_keys_key_tl } {fontspec}, + } +\ProcessKeysOptions{ luatexja-fontspec } + +\RequirePackage{fontspec}[2017/01/01]% v2.5c +\@ifpackagelater{fontspec}{2018/07/29}% + {\@ifpackagelater{fontspec}{2019/03/15}% + {\RequirePackage{luatexja-fontspec-27c}} % v2.7c + {\RequirePackage{luatexja-fontspec-26h}}}% v2.6h + {\RequirePackage{luatexja-fontspec-25c}} % v2.5c + +\ExplSyntaxOff +%%%%%%%% Now we completely ignore kanjifont definition file. +\def\@ltj@use@fd{false} + +% We must redefine \try@load@fontshape to ignore kanjifont definitions at all. +\def\try@load@fontshape{% + \expandafter + \ifx\csname \f@encoding+\f@family\endcsname\relax + \directlua{luatexja.jfont.is_kenc('\luatexluaescapestring{\f@encoding}')}% +\ifin@\else % Alphabetic font + \@font@info{Try loading font information for \f@encoding+\f@family}% + \global\expandafter\let + \csname\f@encoding+\f@family\endcsname\@empty + \nfss@catcodes + \let\nfss@catcodes\relax + \edef\reserved@a{% + \lowercase{% + \noexpand\InputIfFileExists{\f@encoding\f@family.fd}}}% + \reserved@a\relax + {\@input@{\f@encoding\f@family.fd}}% +\fi + \fi} + +\endinput diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-otf.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-otf.sty new file mode 100644 index 0000000000..082468b97b --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-otf.sty @@ -0,0 +1,205 @@ +% +% luatexja-otf.sty +% + +%% Avoid multiple loading. +\csname\if11luatexjaotfLoaded\fi\endcsname +\edef\x{% +\catcode32=\the\catcode32% +\catcode33=\the\catcode33% +\catcode35=\the\catcode35% +\catcode40=\the\catcode40% +\catcode41=\the\catcode41% +\catcode42=\the\catcode42% +\catcode43=\the\catcode43% +\catcode44=\the\catcode44% +\catcode45=\the\catcode45% +\catcode46=\the\catcode46% +\catcode58=\the\catcode58% +\catcode59=\the\catcode59% +\catcode60=\the\catcode60% +\catcode61=\the\catcode61% +\catcode62=\the\catcode62% +\catcode64=\the\catcode64% +\catcode91=\the\catcode91% +\catcode93=\the\catcode93% +\catcode94=\the\catcode94% +\catcode95=\the\catcode95% +\catcode126=\the\catcode126% +\endlinechar=\the\endlinechar +\relax} +\catcode32=10 %< > +\catcode33=12 %<"> +\catcode35=6 %<#> +\catcode40=12 %<(> +\catcode41=12 %<)> +\catcode42=12 %<*> +\catcode43=12 %<+> +\catcode44=12 %<,> +\catcode45=12 %<-> +\catcode46=12 %<.> +\catcode58=12 %<:> +\catcode59=12 %<;> +\catcode60=12 %<<> +\catcode61=12 %<=> +\catcode62=12 %<>> +\catcode64=11 %<@> +\catcode91=12 %<[> +\catcode93=12 %<]> +\catcode94=7 %<^> +\catcode95=8 %<_> +\catcode126=13 %<~> +\endlinechar=-1 % + +\edef\ltj@otf@AtEnd{\x + \noexpand\let\noexpand\ltj@otf@AtEnd\relax} +\def\luatexjaotfLoaded{\endinput} + +%% Check if LaTeX is used. +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname RequirePackage\endcsname\relax %<*!LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iffalse\endcsname +\else %<*LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iftrue\endcsname + \NeedsTeXFormat{LaTeX2e} + \ProvidesPackage{luatexja-otf}[2017/05/20] +\fi %</LaTeX> + +% Load core module if not yet. +\ifx\luatexjacoreLoaded\@undefined + \ifltj@in@latex %<*LaTeX> + \RequirePackage{luatexja} + \else %<*!LaTeX> + \input luatexja.sty % + \fi %</LaTeX> +\fi + +%% When environment check fails, exit now. +\ifx\LuaTeXjaAvailable\@undefined + \ltj@otf@AtEnd +\expandafter\endinput\fi\relax + +%%------------------ +%! Main part of luatexja-otf +\RequireLuaTeXjaSubmodule{otf} + +\newcount\ltj@tempcnta + +\protected\def\CID#1{\ifvmode\leavevmode\fi\ltj@tempcnta#1\relax\directlua{luatexja.otf.cid(\the\ltj@tempcnta)}\relax} + +%% \UTF compatible with the OTF package for pLaTeX +\protected\def\UTF#1{\ifvmode\leavevmode\fi\directlua{luatexja.otf.utf(0x#1)}} + +%% Load ajmacros +\ifltj@in@latex %<*LaTeX> + \RequirePackage{luatexja-ajmacros} +\else %<*!LaTeX> + \input luatexja-ajmacros.sty % + % \bou is defined in lltjext, \mbox is defined in LaTeX kernel + \def\boutenchar{\char\euc"A1A2}%" + \def\bou#1{\ifvmode\leavevmode\fi\@bou#1\end} + \def\@bou#1{% + \ifx#1\end \let\ltj@@next=\relax + \else + \ifnum\ltjgetparameter{direction}=3\relax + \hbox to\z@{\vbox to\z@{\boxmaxdepth\maxdimen + \vss\moveleft0.2\zw\hbox{\yoko\boutenchar}\nointerlineskip + \hbox{\char\euc"A1A1}}\hss}\nobreak#1\relax + \else + \hbox to\z@{\vbox to\z@{\boxmaxdepth\maxdimen + \vss\moveleft-0.2\zw\hbox{\boutenchar}\nointerlineskip + \hbox{\char\euc"A1A1}}\hss}\nobreak#1\relax + \fi + \let\ltj@@next=\@bou + \fi\ltj@@next} + \long\def\mbox#1{\leavevmode\hbox{#1}} +\fi %</LaTeX> + +% macros from otf.sty +%for literature +\protected\def\ajKunoji{% + \ifnum\ltjgetparameter{direction}=3 \mbox{\UTF{3033}\UTF{3035}}\else + \@PackageError{luatexja-otf}{A TATE character in YOKO mode!}{Change a direction to TATE.}%2003/03/12 + \fi} +\protected\def\ajKunojiwithBou{% + \ifnum\ltjgetparameter{direction}=3 \mbox{\bou{\mbox{\UTF{3033}}}\bou{\mbox{\UTF{3035}}}}\else + \@PackageError{luatexja-otf}{A TATE character in YOKO mode!}{Change a direction to TATE.}%2003/03/12 + \fi} +\protected\def\ajDKunoji{% + \ifnum\ltjgetparameter{direction}=3 \mbox{\UTF{3034}\UTF{3035}}\else + \@PackageError{luatexja-otf}{A TATE character in YOKO mode!}{Change a direction to TATE.}%2003/03/12 + \fi} +\protected\def\ajDKunojiwithBou{% + \ifnum\ltjgetparameter{direction}=3 \mbox{\bou{\mbox{\UTF{3034}}}\bou{\mbox{\UTF{3035}}}}\else + \@PackageError{luatexja-otf}{A TATE character in YOKO mode!}{Change a direction to TATE.}%2003/03/12 + \fi} +\protected\def\ajNinoji{\CID{12106}} +\protected\def\ajvarNinoji{% + \ifnum\ltjgetparameter{direction}=3 \CID{12107}\else + \@PackageError{luatexja-otf}{A TATE character in YOKO mode!}{Change a direction to TATE.}%2003/03/12 + \fi} +\protected\def\ajYusuriten{% + \ifnum\ltjgetparameter{direction}=3 \CID{16193}\else + \@PackageError{luatexja-otf}{A TATE character in YOKO mode!}{Change a direction to TATE.}%2003/03/12 + \fi} +\protected\def\ajMasu{\UTF{303c}} +\protected\def\ajYori{\UTF{309f}} +\protected\def\ajKoto{\UTF{30ff}} +\protected\def\ajUta{\UTF{303d}} +%dingbats +\protected\def\ajCommandKey{\UTF{2318}} +\protected\def\ajReturnKey{\UTF{23ce}} +\protected\def\ajCheckmark{\UTF{2713}} +\protected\def\ajVisibleSpace{\UTF{2423}} +\protected\def\ajSenteMark{\UTF{2617}} +\protected\def\ajGoteMark{\UTF{2616}} +\protected\def\ajClub{\UTF{2663}} +\protected\def\ajHeart{\UTF{2661}} +\protected\def\ajSpade{\UTF{2660}} +\protected\def\ajDiamond{\UTF{2662}} +\protected\def\ajvarClub{\UTF{2667}} +\protected\def\ajvarHeart{\UTF{2665}} +\protected\def\ajvarSpade{\UTF{2664}} +\protected\def\ajvarDiamond{\UTF{2666}} +\protected\def\ajPhone{\UTF{260e}} +\protected\def\ajPostal{\UTF{3020}} +\protected\def\ajvarPostal{\UTF{3036}} +\protected\def\ajSun{\UTF{2600}} +\protected\def\ajCloud{\UTF{2601}} +\protected\def\ajUmbrella{\UTF{2602}} +\protected\def\ajSnowman{\UTF{2603}} +\protected\def\ajJIS{\UTF{3004}} +\protected\def\ajJAS{\CID{12088}} +\protected\def\ajBall{\CID{12097}} +\protected\def\ajHotSpring{\UTF{2668}} +\protected\def\ajWhiteSesame{\UTF{fe46}} +\protected\def\ajBlackSesame{\UTF{fe45}} +\protected\def\ajWhiteFlorette{\UTF{2740}} +\protected\def\ajBlackFlorette{\UTF{273f}} +\protected\def\ajRightBArrow{\CID{8206}} +\protected\def\ajLeftBArrow{\CID{8207}} +\protected\def\ajUpBArrow{\CID{8208}} +\protected\def\ajDownBArrow{\CID{8209}} +\protected\def\ajRightHand{\CID{8219}} +\protected\def\ajLeftHand{\CID{8220}} +\protected\def\ajUpHand{\CID{8221}} +\protected\def\ajDownHand{\CID{8222}} +\protected\def\ajRightScissors{\CID{12176}} +\protected\def\ajLeftScissors{\CID{12175}} +\protected\def\ajUpScissors{\CID{12177}} +\protected\def\ajDownScissors{\CID{12178}} +\protected\def\ajRightWArrow{\CID{12197}} +\protected\def\ajLeftWArrow{\CID{12196}} +\protected\def\ajUpWArrow{\CID{12198}} +\protected\def\ajDownWArrow{\CID{12199}} +\protected\def\ajRightDownArrow{\CID{12202}} +\protected\def\ajLeftDownArrow{\CID{12203}} +\protected\def\ajLeftUpArrow{\CID{12204}} +\protected\def\ajRightUpArrow{\CID{12205}} + +%%------------------ all done +\ltj@otf@AtEnd +\endinput +%% EOF diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-preset.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-preset.sty new file mode 100644 index 0000000000..2eb38c8384 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-preset.sty @@ -0,0 +1,706 @@ +% luatexja-preset.sty +\ProvidesPackage{luatexja-preset}[2019/03/26 Japanese font presets] + +\RequirePackage{expl3,l3keys2e} +\RequirePackage{luatexja} +\ExplSyntaxOn + +%% messages +\msg_new:nnn { luatexja-preset }{ ltj-fontspec }{ + The~ luatexja-fontspec~ package~ is~ loaded~ already.~ + Hence~ we~ ignore~ `nfssonly'~option. +} +\msg_new:nnn { luatexja-preset }{ no-font }{ + Font~ #1~ (#2)~ is~ not~found.~ Hence~ I~ substitute~ #3~ (#4)~ for~ it. +} +\msg_new:nnn { luatexja-preset }{ scale }{ + Japanese~fonts~will~be~scaled~by~#1. +} + +\msg_new:nnn { luatexja-preset }{ exist-preset-nooverwrite }{ + The~ preset~ `#1'~ is~ already~ defined.~ + To~ redefine~ this~ preset,~ use~ \str_use:N \c_backslash_str ltjnewpreset*~ instead. +} +\msg_new:nnn { luatexja-preset }{ exist-preset-overwrite }{ + The~ preset~ `#1'~ is~ redefined. +} + +\msg_new:nnn { luatexja-preset }{ illegal-preset-name }{ + The~ preset~ `#1'~ cannot~ be~ defined,~ + since~ the~ luatexja-preset~ package~ an~ option~ with~ the~ same~ name. +} + +\seq_new:N \g__ltjpreset_presets_seq + +\keys_define:nn { luatexja-preset }{ + unknown .code:n = + \keys_set_known:noN { ltjpreset-presets } { \tl_use:N \l_keys_tl } \l_tmpa_tl + \tl_if_empty:NT \l_tmpa_tl { + \PassOptionsToPackage { \l_tmpa_tl } { luatexja-fontspec } + }, + scale .code:n = \gdef\Cjascale{#1}, + match .code: n = + \renewcommand\jttdefault{\gtdefault}\@ltj@match@familytrue + \PassOptionsToPackage { match } { luatexja-fontspec }, + match .value_forbidden:n = true, + __custom .bool_set:N = \g__ltjpreset_custom_bool, __custom .groups:n = { preset }, + __office .bool_set:N = \g__ltjpreset_office_bool, __office .groups:n = { preset }, + __noembed .bool_set:N = \g__ltjpreset_noembed_bool, __noembed .groups:n = { preset }, +} +\cs_new:Nn \__ltjpreset_declare_option:nn { + \keys_define:nn { luatexja-preset }{ + #1 .code:n = { #2 }, + #1 .value_forbidden:n = true + } +} +\cs_new:Nn \ltjpreset_declare_preset:nn { + \keys_define:nn { luatexja-preset }{ + #1 .meta:n = { #2 }, + #1 .value_forbidden:n = true, #1 .groups:n = { preset }, + } + \seq_put_right:Nn \g__ltjpreset_presets_seq { #1 } +} +\cs_generate_variant:Nn \ltjpreset_declare_preset:nn {nx} +\cs_new:Nn \__ltjpreset_declare_bool_option:nn { + \bool_new:c { g__ltjpreset_#1_bool } + \bool_set_false:c { g__ltjpreset_#1_bool } + \keys_define:nn { luatexja-preset }{ + #1 .bool_set:c = { g__ltjpreset_#1_bool }, + #2 .bool_set_inverse:c = { g__ltjpreset_#1_bool }, + #1 .default:n = true, #2 .default:n = true, + } +} + +%%%%%%%% bool options +\__ltjpreset_declare_bool_option:nn { nfssonly }{ fontspec } +\__ltjpreset_declare_bool_option:nn { bold }{ nobold } +\__ltjpreset_declare_bool_option:nn { expert }{ noexpert } +\__ltjpreset_declare_bool_option:nn { deluxe }{ nodeluxe } + +% JFM +\tl_new:N \__ltjpreset_use_jfm_yoko_tl % 使用する JFM(横) +\tl_set:Nn \__ltjpreset_use_jfm_yoko_tl {\ltj@stdyokojfm} +\tl_new:N \__ltjpreset_use_jfm_tate_tl % 使用する JFM(縦) +\tl_set:Nn \__ltjpreset_use_jfm_tate_tl {\ltj@stdtatejfm} +\__ltjpreset_declare_option:nn{jis}{\tl_set:Nn \__ltjpreset_use_jfm_yoko_tl {jis}} % jis +\__ltjpreset_declare_option:nn{ujis}{\tl_set:Nn \__ltjpreset_use_jfm_yoko_tl {ujis}} % ujis + +% 漢字字形 +\tl_new:N \l__ltjpreset_kanji_shape_tl +\__ltjpreset_declare_option:nn{90jis}{ \tl_set:Nn \l__ltjpreset_kanji_shape_tl { , CJKShape=JIS1990 }} % 90jis +\__ltjpreset_declare_option:nn{jis90}{ \tl_set:Nn \l__ltjpreset_kanji_shape_tl { , CJKShape=JIS1990 }} % 90jis +\__ltjpreset_declare_option:nn{jis2004}{\tl_set:Nn \l__ltjpreset_kanji_shape_tl { , CJKShape=JIS2004 }} % jis2004 +\__ltjpreset_declare_option:nn{2004jis}{\tl_set:Nn \l__ltjpreset_kanji_shape_tl { , CJKShape=JIS2004 }} % jis2004 + +% font preset +\prop_new:N \g__ltjpreset_font_prop +\keys_define:nn { luatexja-preset } { + mc .code:n = + \prop_put:Nnn \g__ltjpreset_font_prop { mc-l } {#1} + \prop_put:Nnn \g__ltjpreset_font_prop { mc-m } {#1} + \prop_put:Nnn \g__ltjpreset_font_prop { mc-bx } {#1}, + mc .groups:n = { preset }, mc .value_required:n = true, + gt .code:n = + \prop_put:Nnn \g__ltjpreset_font_prop { gt-u } {#1} + \prop_put:Nnn \g__ltjpreset_font_prop { gt-d } {#1} + \prop_put:Nnn \g__ltjpreset_font_prop { gt-bx } {#1} + \prop_put:Nnn \g__ltjpreset_font_prop { gt-eb } {#1}, + gt-m .code:n = % gtfamily , medium series + \prop_put:Nnn \g__ltjpreset_font_prop { gt-u } {#1} + \prop_put:Nnn \g__ltjpreset_font_prop { gt-d } {#1}, + % gt-d, gt-u は隠し + gt .groups:n = { preset }, gt .value_required:n = true, + gt-m .groups:n = { preset }, gt-m .value_required:n = true, +} +\cs_set:Nn \ltjpreset_define_preset_prop:n { + \keys_define:nn { luatexja-preset } { + #1 .code:n = \prop_put:Non \g__ltjpreset_font_prop { #1 } { ##1 }, + #1 .groups:n = { preset }, #1 .value_required:n = true, + } +} +\ltjpreset_define_preset_prop:n { mc-l } +\ltjpreset_define_preset_prop:n { mc-m } +\ltjpreset_define_preset_prop:n { mc-bx } +\ltjpreset_define_preset_prop:n { gt-u } +\ltjpreset_define_preset_prop:n { gt-d } +\ltjpreset_define_preset_prop:n { gt-bx } +\ltjpreset_define_preset_prop:n { gt-eb} +\ltjpreset_define_preset_prop:n { mg-m } + +\cs_new:Nn \__ltjpreset_set_uni:nn { + mc = #1, gt = #2, mc-bx = #2, mg-m = #2, + __custom = false, __office = false, __noembed = false, +} +\cs_new:Npn \__ltjpreset_set_office:nn #1 #2{ + mc = #1, mc-bx = HGMinchoE , + gt-d = HGGothicM , gt-bx = HGGothicE , + gt-u = #2 , gt-eb = HGSoeiKakugothicUB , + mg-m = HGMaruGothicMPRO, + __custom = false, __office = true, __noembed = false, +} + +%%%%%%%% プリセット達 + +% カスタム指定 + \keys_define:nn { luatexja-preset }{ + custom .meta:n = { #1, __custom = true, }, + custom .value_required:n = true, + jfm_yoko .tl_set:N = \__ltjpreset_use_jfm_yoko_tl, + jfm_tate .tl_set:N = \__ltjpreset_use_jfm_tate_tl, +} + +% 小塚 (Adobe) +%% Pro +\ltjpreset_declare_preset:nx{kozuka-pro}{ + mc-m = KozMinPro-Regular, mc-bx = KozMinPro-Bold, + gt-d = KozGoPro-Regular, gt-bx = KozGoPro-Bold, + gt-u = KozGoPro-Medium, gt-eb = KozGoPro-Heavy, + mg-m = KozGoPro-Heavy, mc-l = KozMinPro-Light, + __custom = false, __office = false, __noembed = false, +} +%% Pr6 +\ltjpreset_declare_preset:nx{kozuka-pr6}{ + mc-m = KozMinProVI-Regular, mc-bx = KozMinProVI-Bold, + gt-d = KozGoProVI-Regular, gt-bx = KozGoProVI-Bold, + gt-u = KozGoProVI-Medium, gt-eb = KozGoProVI-Heavy, + mg-m = KozGoProVI-Heavy, mc-l = KozMinProVI-Light, + __custom = false, __office = false, __noembed = false, +} +%% Pr6N +\ltjpreset_declare_preset:nx{kozuka-pr6n}{ + mc-m = KozMinPr6N-Regular, mc-bx = KozMinPr6N-Bold, + gt-d = KozGoPr6N-Regular, gt-bx = KozGoPr6N-Bold, + gt-u = KozGoPr6N-Medium, gt-eb = KozGoPr6N-Heavy, + mg-m = KozGoPr6N-Heavy, mc-l = KozMinPr6N-Light, + __custom = false, __office = false, __noembed = false, +} + +% ヒラギノ (OSX) +\ltjpreset_declare_preset:nx{hiragino-pro}{ + mc-m = HiraMinPro-W3, mc-bx = HiraMinPro-W6, + gt-d = HiraKakuPro-W3, gt-bx = HiraKakuPro-W6, + gt-u = HiraKakuPro-W6, gt-eb = HiraKakuStd-W8, + mg-m = HiraMaruPro-W4, mc-l = HiraMinPro-W2, + __custom = false, __office = false, __noembed = false, +} +\ltjpreset_declare_preset:nx{hiragino-pron}{ + mc-m = HiraMinProN-W3, mc-bx = HiraMinProN-W6, + gt-d = HiraKakuProN-W3, gt-bx = HiraKakuProN-W6, + gt-u = HiraKakuProN-W6, gt-eb = HiraKakuStdN-W8, + mg-m = HiraMaruProN-W4, mc-l = HiraMinProN-W2, + __custom = false, __office = false, __noembed = false, +} + +% モリサワ +\ltjpreset_declare_preset:nx{bizud}{ + mc = BIZ-UDMinchoM.ttc, + gt-d = BIZ-UDGothicR.ttc, gt-bx = BIZ-UDGothicB.ttc, + gt-u = BIZ-UDGothicR.ttc, gt-eb = BIZ-UDGothicB.ttc, + mg-m = BIZ-UDGothicB.ttc, + __custom = false, __office = false, __noembed = false, +} +\ltjpreset_declare_preset:nx{morisawa-pro}{ + mc = A-OTF-RyuminPro-Light.otf, mc-bx = A-OTF-FutoMinA101Pro-Bold.otf, + gt-d = A-OTF-GothicBBBPro-Medium.otf , gt-bx = A-OTF-FutoGoB101Pro-Bold.otf, + gt-u = A-OTF-GothicBBBPro-Medium.otf , gt-eb = A-OTF-MidashiGoPro-MB31.otf, + mg-m = A-OTF-Jun101Pro-Light.otf, + __custom = false, __office = false, __noembed = false, +} +\ltjpreset_declare_preset:nx{morisawa-pr6n}{ + mc = A-OTF-RyuminPr6N-Light.otf, mc-bx = A-OTF-FutoMinA101Pr6N-Bold.otf, + gt-d = A-OTF-GothicBBBPr6N-Medium.otf , gt-bx = A-OTF-FutoGoB101Pr6N-Bold.otf, + gt-u = A-OTF-GothicBBBPr6N-Medium.otf , gt-eb = A-OTF-MidashiGoPr6N-MB31.otf, + mg-m = A-OTF-Jun101Pr6N-Light.otf, + __custom = false, __office = false, __noembed = false, +} + +% 游明朝/游ゴシック (Win8.1) +\ltjpreset_declare_preset:nx{yu-win}{ + mc-m = YuMincho-Regular, mc-bx = YuMincho-Demibold, + gt-d = YuGothic-Regular, gt-bx = YuGothic-Bold, + gt-u = YuGothic-Regular, gt-eb = YuGothic-Bold, + mg-m = YuGothic-Bold, mc-l = YuMincho-Light, + __custom = false, __office = false, __noembed = false, +} +% Win10 +\ltjpreset_declare_preset:nx{yu-win10}{ + mc-m = YuMincho-Regular, mc-bx = YuMincho-Demibold, + gt-d = YuGothic-Regular, gt-bx = YuGothic-Bold, + gt-u = YuGothic-Medium, gt-eb = YuGothic-Bold, + mg-m = YuGothic-Bold, mc-l = YuMincho-Light, + __custom = false, __office = false, __noembed = false, +} + +% Yu fonts in OSX +% according to http://support.apple.com/kb/HT5944 +\ltjpreset_declare_preset:nx{yu-osx}{ + mc = YuMincho~Medium, mc-bx = YuMincho~Demibold, + gt-d = YuGothic~Medium, gt-u = YuGothic~Medium, + gt-bx = YuGothic~Bold, gt-eb = YuGothic~Bold, + mg-m = YuGothic~Bold, + __custom = false, __office = false, __noembed = false, +} + +% moga-mobo +\ltjpreset_declare_preset:nx{moga-mobo}{ + mc = Moga90Mincho, mc-bx = Moga90Mincho~Bold, + gt-d = Moga90Gothic, gt-bx = Moga90Gothic~Bold, + gt-u = Moga90Gothic, gt-eb = Moga90Gothic~Bold, + mg-m = Mobo90Gothic, + __custom = false, __office = false, __noembed = false, +} +\ltjpreset_declare_preset:nx{moga-mobo-ex}{ + mc = MogaEx90Mincho, mc-bx = MogaEx90Mincho~Bold, + gt-d = MogaEx90Gothic, gt-bx = MogaEx90Gothic~Bold, + gt-u = MogaEx90Gothic, gt-eb = MogaEx90Gothic~Bold, + mg-m = MoboEx90Gothic, + __custom = false, __office = false, __noembed = false, +} + +% Ume fones +\ltjpreset_declare_preset:nx{ume}{ + mc = Ume~Mincho, + gt-d = Ume~Gothic, gt-bx = Ume~Gothic~O5, + gt-u = Ume~Gothic~O5, gt-eb = Ume~Gothic~O5, + mg-m = Ume~Gothic~O4, + __custom = false, __office = false, __noembed = false, +} + +% Source Han {Serif,Sans} +\ltjpreset_declare_preset:nx{sourcehan}{ + mc-m = Source~Han~Serif~Regular, + mc-bx = Source~Han~Serif~Bold, + gt-d = Source~Han~Sans~Regular, + gt-bx = Source~Han~Sans~Bold, + gt-u = Source~Han~Sans~Medium, + gt-eb = Source~Han~Sans~Heavy, + mg-m = Source~Han~Sans~Heavy, + mc-l = Source~Han~Serif~Light, + __custom = false, __office = false, __noembed = false, +} +\ltjpreset_declare_preset:nx{sourcehan-jp}{ + mc-m = Source~Han~Serif~JP~Regular, + mc-bx = Source~Han~Serif~JP~Bold, + gt-d = Source~Han~Sans~JP~Regular, + gt-bx = Source~Han~Sans~JP~Bold, + gt-u = Source~Han~Sans~JP~Medium, + gt-eb = Source~Han~Sans~JP~Heavy, + mg-m = Source~Han~Sans~JP~Heavy, + mc-l = Source~Han~Serif~JP~Light, + __custom = false, __office = false, __noembed = false, +} +\ltjpreset_declare_preset:nx{noto-otc}{ + mc-m = Noto~Serif~CJK~Regular, + mc-bx = Noto~Serif~CJK~Bold, + gt-d = Noto~Sans~CJK~Regular, + gt-bx = Noto~Sans~CJK~Bold, + gt-u = Noto~Sans~CJK~Medium, + gt-eb = Noto~Sans~CJK~Black, + mg-m = Noto~Sans~CJK~Black, + mc-l = Noto~Serif~CJK~Light, + __custom = false, __office = false, __noembed = false, +} +\ltjpreset_declare_preset:nx{noto-otf}{ + mc-m = Noto~Serif~CJK~JP~Regular, + mc-bx = Noto~Serif~CJK~JP~Bold, + gt-d = Noto~Sans~CJK~JP~Regular, + gt-bx = Noto~Sans~CJK~JP~Bold, + gt-u = Noto~Sans~CJK~JP~Medium, + gt-eb = Noto~Sans~CJK~JP~Black, + mg-m = Noto~Sans~CJK~JP~Black, + mc-l = Noto~Serif~CJK~JP~Light, + __custom = false, __office = false, __noembed = false, +} + + +% ipa, ipaex, ms +\ltjpreset_declare_preset:nx{ipa}{ + \__ltjpreset_set_uni:nn { IPAMincho } { IPAGothic } +} +\ltjpreset_declare_preset:nx{ipaex}{ + \__ltjpreset_set_uni:nn { IPAExMincho } { IPAExGothic } +} +\ltjpreset_declare_preset:nx{ms}{ + \__ltjpreset_set_uni:nn { MS-Mincho } { MS-Gothic } +} + +% {ipa,ipaex,ms}-dx % Office 付属フォントを利用 +\ltjpreset_declare_preset:nx{ipaex-hg}{ + \__ltjpreset_set_office:nn { IPAExMincho } { IPAExGothic } +} +\ltjpreset_declare_preset:nx{ipa-hg}{ + \__ltjpreset_set_office:nn { IPAMincho } { IPAGothic } +} +\ltjpreset_declare_preset:nx{ms-hg}{ + \__ltjpreset_set_office:nn { MS-Mincho } { MS-Gothic } +} + + +% 非埋込 +\ltjpreset_declare_preset:nx{noembed}{ + \__ltjpreset_set_uni:nn { Ryumin-Light } { GothicBBB-Medium }, + __custom = false, __office = false, __noembed = true, +} + +\keys_set:nn {luatexja-preset} { ipaex } +\ProcessKeysOptions { luatexja-preset } +\@ifpackageloaded{luatexja-fontspec}{ + \bool_if:NT \g__ltjpreset_nfssonly_bool + { \msg_warning:nn { luatexja-preset }{ ltj-fontspec } } + \bool_set_false:N \g__ltjpreset_nfssonly_bool +}{} + +%%%%%%%% main routine + +\cs_new:Nn \__ltjpreset_extract_fonts: { + %% MogaMincho の場合は 90 をつける/はずす + \bool_if:NF \g__ltjpreset_custom_bool { + \tl_set:Nn \l_tmpa_tl {, CJKShape=JIS2004 } + \tl_if_eq:NNT \l__ltjpreset_kanji_shape_tl \l_tmpa_tl { + \tl_set:Nx \l_tmpb_tl { \prop_item:Nn \g__ltjpreset_font_prop { mc-m } } + \tl_if_in:NnT \l_tmpb_tl { Moga90Mincho } { + \prop_clear:N \l_tmpa_prop + \prop_map_inline:Nn \g__ltjpreset_font_prop { + \tl_set:Nn \l_tmpb_tl { ##2 } \tl_remove_all:Nn \l_tmpb_tl {90} + \prop_put:Nnx \l_tmpa_prop { ##1 } { \tl_use:N \l_tmpb_tl } + } + \prop_set_eq:NN \g__ltjpreset_font_prop \l_tmpa_prop + } + \tl_if_in:NnT \l_tmpb_tl { MogaEx90Mincho } { + \prop_clear:N \l_tmpa_prop + \prop_map_inline:Nn \g__ltjpreset_font_prop { + \tl_set:Nn \l_tmpb_tl { ##2 } \tl_remove_all:Nn \l_tmpb_tl {90} + \prop_put:Nnx \l_tmpa_prop { ##1 } { \tl_use:N \l_tmpb_tl } + } + \prop_set_eq:NN \g__ltjpreset_font_prop \l_tmpa_prop + } + } + } + %%%% リストからの展開 + \cs_set:Nx \__ltjpreset_font_mc_l: { \prop_item:Nn \g__ltjpreset_font_prop { mc-l } } + \cs_set:Nx \__ltjpreset_font_mc_m: { \prop_item:Nn \g__ltjpreset_font_prop { mc-m } } + \cs_set:Nx \__ltjpreset_font_mc_bx: { \prop_item:Nn \g__ltjpreset_font_prop { mc-bx } } + \cs_set:Nx \__ltjpreset_font_gt_m: { \prop_item:Nn \g__ltjpreset_font_prop { gt-d } } + \cs_set:Nx \__ltjpreset_font_gt_u: { \prop_item:Nn \g__ltjpreset_font_prop { gt-u } } + \cs_set:Nx \__ltjpreset_font_gt_bx: { \prop_item:Nn \g__ltjpreset_font_prop { gt-bx } } + \cs_set:Nx \__ltjpreset_font_gt_eb: { \prop_item:Nn \g__ltjpreset_font_prop { gt-eb } } + \cs_set:Nx \__ltjpreset_font_mg_m: { \prop_item:Nn \g__ltjpreset_font_prop { mg-m } } + %% HG 系フォント + JIS2004/90JIS のときはフォント名を置換 + \bool_if:nT { !\g__ltjpreset_custom_bool && \g__ltjpreset_office_bool } { + \tl_set:Nn \l_tmpa_tl {, CJKShape=JIS2004 } + \tl_if_eq:NNT \l__ltjpreset_kanji_shape_tl \l_tmpa_tl { + \cs_set:Nx \__ltjpreset_font_mc_bx: { hgrme04.ttc } + \cs_set:Nx \__ltjpreset_font_gt_bx: { hgrge04.ttc } + \cs_set:Nx \__ltjpreset_font_gt_eb: { hgrsgu04.ttc } + \cs_set:Nx \__ltjpreset_font_mg_m: { hgrsmp04.ttf } + \cs_set_eq:NN \__ltjpreset_font_gt_m: \__ltjpreset_font_gt_u: + % HG ゴシックM のときはそうはいかないので 1 ウェイト時のゴシック体を使う + } + \tl_set:Nn \l_tmpa_tl {, CJKShape=JIS1990 } + \tl_if_eq:NNT \l__ltjpreset_kanji_shape_tl \l_tmpa_tl { + \cs_set:Nx \__ltjpreset_font_mc_bx: { hgrme.ttc } + \cs_set:Nx \__ltjpreset_font_gt_bx: { hgrge.ttc } + \cs_set:Nx \__ltjpreset_font_gt_eb: { hgrsgu.ttc } + \cs_set:Nx \__ltjpreset_font_mg_m: { hgrsmp.ttf } + } + } + % mc/l + \tl_set:Nx \l_tmpa_tl { \__ltjpreset_font_mc_l: } + \tl_if_empty:NT \l_tmpa_tl {\tl_set:Nn \l_tmpa_tl {~}} + \cs_set:Nx \__ltjpreset_font_mc_l: { + \tl_if_blank:nTF \l_tmpa_tl { \__ltjpreset_font_mc_m: } {\tl_use:N \l_tmpa_tl } + } + %% bold オプションの処理 + \bool_if:NTF \g__ltjpreset_deluxe_bool { + \bool_if:NT \g__ltjpreset_bold_bool { + \cs_set_eq:NN \__ltjpreset_font_mc_bx: \__ltjpreset_font_gt_bx: + } + }{ + \bool_if:NTF \g__ltjpreset_bold_bool + { \cs_set_eq:NN \__ltjpreset_font_gt_m: \__ltjpreset_font_gt_bx: } + { \cs_set_eq:NN \__ltjpreset_font_gt_m: \__ltjpreset_font_gt_u: } + \cs_set_eq:NN \__ltjpreset_font_gt_bx: \__ltjpreset_font_gt_m: + \cs_set_eq:NN \__ltjpreset_font_mc_bx: \__ltjpreset_font_gt_m: + } +} + +%%%%%%%% フォント名を \l__ltjpreset_font_name: に格納 +\clist_new:N \l__ltjpreset_extensions_clist +\clist_set:Nn \l__ltjpreset_extensions_clist {.otf,.ttf,.OTF,.TTF,.ttc,.TTC} +\prg_new_conditional:Nnn \__ltjpreset_if_detect_external:n {TF} { + \clist_map_inline:Nn \l__ltjpreset_extensions_clist { + \bool_set_false:N \l_tmpa_bool + \tl_if_in:nnT {#1 <= end_of_string} {##1 <= end_of_string} + { \bool_set_true:N \l_tmpa_bool \clist_map_break: } + } + \bool_if:NTF \l_tmpa_bool \prg_return_true: \prg_return_false: +} +\cs_new:Nn \__ltjpreset_wrap_fontname:n { + \__ltjpreset_if_detect_external:nTF { #1 } + { \cs_set:Nn \l__ltjpreset_font_name: { [#1] } } + { \cs_set:Nn \l__ltjpreset_font_name: { "#1" } } +} +\cs_generate_variant:Nn \__ltjpreset_wrap_fontname:n { e } + +%%%%%%%% 存在判定 +\cs_new:Nn \__ltjpreset_substitute:nnnn { + \group_begin: + \suppressfontnotfounderror=1 + \cs_if_exist:cT {ltjpreset_font_#1_#2:} { + \__ltjpreset_wrap_fontname:e { \cs:w ltjpreset_font_#1_#2: \cs_end: } + \font \g__ltjpreset_font_test: = \l__preset_font_name:\relax + \ifx \g__ltjpreset_font_test: \nullfont + \msg_warning:nnxxxx { luatexja-preset }{ no-font } + { \cs:w ltjpreset_font_#1_#2: \cs_end: }{ #1/#2 } + { \cs:w ltjpreset_font_#3_#4: \cs_end: }{ #3/#4 } + \cs_gset_eq:cc { ltjpreset_font_#1_#2: } { ltjpreset_font_#3_#4: } + \fi + } { \cs_gset_eq:cc { ltjpreset_font_#1_#2: } { ltjpreset_font_#3_#4: } } + \group_end: +} + +%%%%%%%% deluxe (\mgfamily はあとで定義) +\bool_if:NTF \g__ltjpreset_deluxe_bool { + \cs_new:Nn \__ltjpreset_check_deluxe_existence: { + \__ltjpreset_substitute:nnnn { gt } { eb } { gt } { bx } + \__ltjpreset_substitute:nnnn { mg } { m } { gt } { bx } + \__ltjpreset_substitute:nnnn { mc } { l } { mc } { m } + } + \def\ltdefault{l} + \DeclareRobustCommand\ltseries { \not@math@alphabet\ltseries\relax\fontseries\ltdefault\selectfont } + \def\ebdefault{eb} + \DeclareRobustCommand\ebseries { \not@math@alphabet\ebseries\relax\fontseries\ebdefault\selectfont } + \DeclareRobustCommand\gtebfamily { \gtfamily\fontseries{\ebdefault}\selectfont } +} { + \cs_set_eq:NN \__ltjpreset_check_deluxe_existence: \prg_do_nothing: +} + +\int_new:N \g__ltjpreset_applycount_int + +\bool_if:NTF \g__ltjpreset_nfssonly_bool { +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%% nfss only + \cs_if_exist:NF \Cjascale { + \group_begin: + \fontsize{16}{16}\selectfont + \cs_gset:Npx \Cjascale { \fp_to_decimal:n {\zw / 16} } + \group_end: + } + + \msg_warning:nnx { luatexja-preset }{ scale }{ \Cjascale } + + % {1: encoding}{2: family}{3: series}{4: shape}{5: fontname}{6: feature}{7: scale} + \cs_new:Nn \__ltjpreset_declare_font_shape:nnnnnnn { + \DeclareFontShape{#1}{#2}{#3}{#4}{ <-> s*[#7] + \bool_if:NT \g__ltjpreset_noembed_bool {psft:} #5 + ;-kern \tl_use:N \l__ltjpreset_kanji_shape_tl; #6 } {} + } + \cs_new:Nn \__ltjpreset_define_family:nnn { + \__ltjpreset_wrap_fontname:e { #3 } + \__ltjpreset_declare_font_shape:nnnnnnn { JY3 } + { ltjp #1 \int_to_arabic:n { \g__ltjpreset_applycount_int }} { #2 } { n } + { \l__ltjpreset_font_name: : jfm=\tl_use:N \__ltjpreset_use_jfm_yoko_tl } + { script=hani \bool_if:NT \g__ltjpreset_expert_bool { ;+hkna } } + { \Cjascale } + \__ltjpreset_declare_font_shape:nnnnnnn { JT3 } + { ltjp #1 \int_to_arabic:n { \g__ltjpreset_applycount_int }} { #2 } { n } + { \l__ltjpreset_font_name: : jfm=\tl_use:N \__ltjpreset_use_jfm_tate_tl } + { script=hani \bool_if:NT \g__ltjpreset_expert_bool { ;+vkna } } + { \Cjascale } + \bool_if:NT \g__ltjpreset_expert_bool { + \__ltjpreset_declare_font_shape:nnnnnnn { JY3 } + { ltjp #1 \int_to_arabic:n { \g__ltjpreset_applycount_int }} { #2 } { rb } + { \l__ltjpreset_font_name: : jfm=\tl_use:N \__ltjpreset_use_jfm_yoko_tl } { script=kana; +ruby } + { \Cjascale } + \__ltjpreset_declare_font_shape:nnnnnnn { JT3 } + { ltjp #1 \int_to_arabic:n { \g__ltjpreset_applycount_int }} { #2 } { rb } + { \l__ltjpreset_font_name: : jfm=\tl_use:N \__ltjpreset_use_jfm_tate_tl } { script=kana; +ruby } + { \Cjascale } + } + \cs_if_exist:NT \ltjpreset_define_family_hook_nfssonly:nnn + { \ltjpreset_define_family_hook_nfssonly:nnn { #1 } { #2 } { #3 } } + } + \bool_if:NT \g__ltjpreset_deluxe_bool { + \let\mgfamily\undefined + \DeclareRobustCommand\mgfamily { + \not@math@alphabet\mgfamily\relax + \kanjifamily{ltjpmg \int_to_arabic:n { \g__ltjpreset_applycount_int }}\selectfont + } + \DeclareTextFontCommand{\textmg}{\mgfamily} + } + \bool_if:NT \g__ltjpreset_expert_bool { + \DeclareRobustCommand\rubyfamily { \kanjishape{rb}\selectfont } + } + % + \cs_new:Nn \__ltjpreset_do_fontset: { \group_begin: + % ====== + \xdef\mcdefault{ltjpmc \int_to_arabic:n { \g__ltjpreset_applycount_int }} + \xdef\gtdefault{ltjpgt \int_to_arabic:n { \g__ltjpreset_applycount_int }} + \DeclareKanjiFamily{JY3}{\mcdefault}{} + \DeclareKanjiFamily{JT3}{\mcdefault}{} + \DeclareKanjiFamily{JY3}{\gtdefault}{} + \DeclareKanjiFamily{JT3}{\gtdefault}{} + \unless\ifltj@disablejfam + \SetSymbolFont{mincho}{normal}{JY3}{\mcdefault}{m}{n} + \SetSymbolFont{mincho}{bold}{JY3}{\mcdefault}{bx}{n} + \DeclareMathAlphabet{\mathgt}{JY3}{\gtdefault}{m}{n} + \fi + \bool_if:NT \g__ltjpreset_deluxe_bool { + \DeclareKanjiFamily{JY3}{ltjpmg \int_to_arabic:n { \g__ltjpreset_applycount_int }}{} + \DeclareKanjiFamily{JT3}{ltjpmg \int_to_arabic:n { \g__ltjpreset_applycount_int }}{} + } + % ====== + \tl_set:Nn \l_tmpa_tl {, CJKShape=JIS1990 } + \tl_if_eq:NNT \l__ltjpreset_kanji_shape_tl \l_tmpa_tl { + \tl_set:Nn \l__ltjpreset_kanji_shape_tl { ;+jp90 } + } + \tl_set:Nn \l_tmpa_tl {, CJKShape=JIS2004 } + \tl_if_eq:NNT \l__ltjpreset_kanji_shape_tl \l_tmpa_tl { + \tl_set:Nx \l__ltjpreset_kanji_shape_tl { ;+jp04 } + } + \__ltjpreset_define_family:nnn {mc} {m} {\__ltjpreset_font_mc_m:} + \__ltjpreset_define_family:nnn {mc} {bx} {\__ltjpreset_font_mc_bx:} + \__ltjpreset_define_family:nnn {mc} {b} {\__ltjpreset_font_mc_bx:} + \__ltjpreset_define_family:nnn {gt} {m} {\__ltjpreset_font_gt_m:} + \__ltjpreset_define_family:nnn {gt} {bx} {\__ltjpreset_font_gt_bx:} + \__ltjpreset_define_family:nnn {gt} {b} {\__ltjpreset_font_gt_bx:} + \normalfont + \bool_if:NT \g__ltjpreset_deluxe_bool { + \__ltjpreset_define_family:nnn {mc} {l} {\__ltjpreset_font_mc_l:} + \__ltjpreset_define_family:nnn {gt} {eb} {\__ltjpreset_font_gt_eb:} + \__ltjpreset_define_family:nnn {mg} {m} {\__ltjpreset_font_mg_m:} + } + \group_end: + } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%% fontspec +} { + \RequirePackage{luatexja-fontspec} + % scale + \msg_warning:nnx { luatexja-preset }{ scale }{ \Cjascale } + \tl_new:N \l__ltjpreset_add_features_tl + + \bool_if:NT \g__ltjpreset_expert_bool { + \cs_set:Npn \rubyfamily { \addjfontfeatures { + Style=Ruby , YokoFeatures={RawFeature=-hkna} , TateFeatures={RawFeature=-vkna} + } } + } + \addjfontfeature{ Kerning=Off } + % 実際の fontspec の呼びだし + \cs_new:Nn \__ltjpreset_do_fontset: { \group_begin: + \tl_gset:Nx \l__ltjpreset_add_features_tl { + \tl_use:N \l__ltjpreset_kanji_shape_tl, + YokoFeatures = { JFM = \tl_use:N \__ltjpreset_use_jfm_yoko_tl }, + TateFeatures = { JFM = \tl_use:N \__ltjpreset_use_jfm_tate_tl }, + Script=CJK, \bool_if:NT \g__ltjpreset_noembed_bool { , NoEmbed } + } + \group_end: + \bool_if:NT \g__ltjpreset_expert_bool { + \tl_put_left:Nn \l__ltjpreset_add_features_tl { + , YokoFeatures = {Style = HorizontalKana}, TateFeatures = {Style = VerticalKana} + } + } + \setmainjfont [ + \bool_if:NT \g__ltjpreset_deluxe_bool { + FontFace={l}{n}{ Font = \__ltjpreset_font_mc_l:, + \cs_if_exist:NT \ltjpreset_define_family_hook_fontspec:nnn { + \ltjpreset_define_family_hook_fontspec:nnn + { mc } { l } { \__ltjpreset_font_mc_l: } + } + }, + } + BoldFont = \__ltjpreset_font_mc_bx: \tl_use:N \l__ltjpreset_add_features_tl, + \cs_if_exist:NT \ltjpreset_define_family_hook_fontspec:nnn { + UprightFeatures = { \ltjpreset_define_family_hook_fontspec:nnn + { mc } { m } { \__ltjpreset_font_mc_m: } }, + BoldFeatures = { \ltjpreset_define_family_hook_fontspec:nnn + { mc } { bx } { \__ltjpreset_font_mc_bx: } }, + } + ] { \__ltjpreset_font_mc_m: } + \setsansjfont [ + \bool_if:NT \g__ltjpreset_deluxe_bool { + FontFace={eb}{n}{ Font = \__ltjpreset_font_gt_eb:, + \cs_if_exist:NT \ltjpreset_define_family_hook_fontspec:nnn { + \ltjpreset_define_family_hook_fontspec:nnn + { gt } { eb } { \__ltjpreset_font_gt_eb: } + } + }, + } + BoldFont = \__ltjpreset_font_gt_bx: \tl_use:N \l__ltjpreset_add_features_tl, + \cs_if_exist:NT \ltjpreset_define_family_hook_fontspec:nnn { + UprightFeatures = { \ltjpreset_define_family_hook_fontspec:nnn + { gt } { m } { \__ltjpreset_font_gt_m: } }, + BoldFeatures = { \ltjpreset_define_family_hook_fontspec:nnn + { gt } { bx } { \__ltjpreset_font_gt_bx: } }, + } + ] { \__ltjpreset_font_gt_m: } + \bool_if:NT \g__ltjpreset_deluxe_bool { + %% mg + \bool_if_exist:NTF \setfontfamily { + \setjfontfamily \mgfamily [ + BoldFont = \__ltjpreset_font_mg_m: \tl_use:N \l__ltjpreset_add_features_tl, + \cs_if_exist:NT \ltjpreset_define_family_hook_fontspec:nnn { + \ltjpreset_define_family_hook_fontspec:nnn + { mg } { m } { \__ltjpreset_font_mg_m: }, + } + ] { \__ltjpreset_font_mg_m: } + } { + \newjfontfamily \mgfamily [ + BoldFont = \__ltjpreset_font_mg_m: \tl_use:N \l__ltjpreset_add_features_tl, + \cs_if_exist:NT \ltjpreset_define_family_hook_fontspec:nnn { + \ltjpreset_define_family_hook_fontspec:nnn + { mg } { m } { \__ltjpreset_font_mg_m: }, + } + ] { \__ltjpreset_font_mg_m: } + } + \DeclareTextFontCommand{\textmg}{\mgfamily} + } + } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +} + +\def\ltjnewpreset{ + \@ifstar{\__ltjpreset_new_preset:nnn{ true }}{\__ltjpreset_new_preset:nnn{ false }}} +\cs_set:Nn \__ltjpreset_new_preset:nnn { + \keys_if_exist:nnTF { luatexja-preset } { #2 } { + \seq_if_in:NnTF \g__ltjpreset_presets_seq { #2 } { + \bool_if:cTF { c_ #1 _bool } { + \msg_warning:nnn { luatexja-preset }{ exist-preset-overwrite } { #2 } + \keys_define:nn { luatexja-preset } { + #2 .meta:n = { #3, __custom = true, __noembed = false, __office = false, }, + #2 .value_forbidden:n = true, #2 .groups:n = { preset }, + } + } { + \msg_error:nnn { luatexja-preset }{ exist-preset-nooverwrite } { #2 } + } + } { + \msg_error:nnn { luatexja-preset }{ illegal-preset-name } { #2 } + } + } { + \keys_define:nn { luatexja-preset } { + #2 .meta:n = { #3, __custom = true, __noembed = false, __office = false, }, + #2 .value_forbidden:n = true, #2 .groups:n = { preset }, + } + \seq_put_right:Nn \g__ltjpreset_presets_seq { #2 } + } +} + + +\cs_set:Npn \ltjapplypreset #1 { + \int_gincr:N \g__ltjpreset_applycount_int + \keys_set_groups:nnn { luatexja-preset } { preset } { #1 } + % \prop_map_inline:Nn \g__ltjpreset_font_prop {\typeout{ [##1] = "##2" } } + \__ltjpreset_extract_fonts: + \__ltjpreset_check_deluxe_existence: + \__ltjpreset_do_fontset: + \normalfont +} + +\ltjapplypreset {} + +\@onlypreamble\ltjnewpreset +\@onlypreamble\ltjapplypreset + +\ExplSyntaxOff + +\endinput diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-ruby.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-ruby.sty new file mode 100644 index 0000000000..813ab31a43 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-ruby.sty @@ -0,0 +1,210 @@ +% +% luatexja-ruby.sty +% + +% LaTeX only! +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{luatexja-ruby}[2017/05/05 v0.23] +\RequirePackage{luatexja} + +%%------------------ +\newattribute\ltj@rubyattr +\ltj@rubyattr=0 +\RequireLuaTeXjaSubmodule{ruby} + +% ltjset/getparameter への追加設定 +% これらは段落単位の設定. + +%% 引数:ルビ全角を単位とした実数 +%% この文字への pre-, post-intrusion の許容量 +\define@key[ltj]{japaram}{rubypreintrusion}{% + \ltj@@set@stack@real{RIPRE}{0}{0x7FFFFFFF}#1 } +\define@key[ltj]{japaram}{rubypostintrusion}{% + \ltj@@set@stack@real{RIPOST}{0}{0x7FFFFFFF}#1 } +\def\ltj@@set@stack@real#1#2#3{% + \directlua{luatexja.stack.set_stack_perchar(luatexja.stack_table_index.#1, + #2, #3, token.scan_word)}} + +% ルビ用のキー設定 +\def\ltj@@rkeydef#1{ + \define@key[ltj]{ruby}{#1}{\expandafter\def\csname ltj@@rubyip@#1\endcsname{##1}} +} +%% attr_ruby_mode +%% bit 0: intrusion を有効にするか(1: 有効) +%% bit 1: 前後の intrusion 許容量を小さい方に揃える (1: yes) +%% bit 2, 3: intrusion をどう使って親文字を配置するか +%% 00: intrusion なしでとりあえず計算し,左右の突出分を進入に割り当てる +%% 01: pre-intrusion でまかなえるだけまかない,無理なら post- も使う +%% 10: post を優先 +%% 11: 2 min (pre,post) までは pre, post に均等配分しようとする +%% >=01 で,intrusion で賄えきれなかった場合はいつものように伸長する. +%% bit 4: 熟語ルビの際の処理方法(0: 常にグループ,1: 可能な限りブロックごとに) +%% ↑bit 4 は今は無効 +\ltj@@rkeydef{mode} +%% intrusion 量強制固定(bit 0, bit 1 より優先,負数で「自動」) +%% attr は sp 単位だが,ユーザーはルビ全角単位で指定する +%% attr_ruby_maxprep, attr_ruby_maxpostp +\ltj@@rkeydef{pre} +\ltj@@rkeydef{post} +%% 親文字伸長の際の比,{0}{1}{1} などと0--7 の数 3 つで指定 +%% attr_ruby_stretch (bol left,middle,right)(eol)(middle) 27-bits +\ltj@@rkeydef{stretchbol} % 行頭形 +\ltj@@rkeydef{stretcheol} % 行末形 +\ltj@@rkeydef{stretch} % 行中形 +%% ルビが伸長するときの比 {1}{2}{1} などと0--7 の数 3 つで指定 +%% attr_ruby_mode 上位部分 +\ltj@@rkeydef{stretchruby} +%% ルビ<親のとき,ルビと親文字の端の最大値 +%% attr_ruby_maxmargin +%% attr は sp 単位だが,ユーザーは親文字全角単位で指定 +\ltj@@rkeydef{maxmargin} +%% ルビと親文字の垂直方向の空き +%% attr_ruby_intergap +%% attr は sp 単位だが,ユーザーは親文字全角単位で指定 +\ltj@@rkeydef{intergap} + +\ltj@@rkeydef{kenten}%% 圏点文字 +\ltj@@rkeydef{fontcmd}%% フォント +\define@boolkey[ltj]{ruby}{rubysmash}[true]{} + + +%%%%%%%% setkeys の別名 +\protected\def\ltjsetruby{\setkeys[ltj]{ruby}} + +% ここからは ruby マクロ内でなんとかされる事項 +%% ルビと親文字の大きさの比 +\ltj@@rkeydef{size} + +% 中つき用簡易設定. +\define@key[ltj]{ruby}{naka}[none]{\setkeys[ltj]{ruby}{mode=1, stretch=121, stretchruby=121}} +% 肩つき用簡易設定. +\define@key[ltj]{ruby}{kata}[none]{\setkeys[ltj]{ruby}{mode=9, stretch=121, stretchruby=001}} + +%%%%%%%% 補助関数 + +% Lua ソースに渡す table 生成 +\def\ltj@@ruby@create@table#1{% #1: ルビ全角 + \string{ + rubyzw = \ltj@safe@dimen{#1}, + maxmargin = \ltj@safe@dimen{\ltj@@rubyip@maxmargin\zw}, + pre = \ltj@safe@dimen{\ltj@@rubyip@pre#1}, + post = \ltj@safe@dimen{\ltj@@rubyip@post#1}, + intergap = \ltj@safe@dimen{\ltj@@rubyip@intergap\zw}, + stretch + = 262144 * \expandafter\ltj@@ruby@cts\ltj@@rubyip@stretchbol + + 512 * \expandafter\ltj@@ruby@cts\ltj@@rubyip@stretcheol + + \expandafter\ltj@@ruby@cts\ltj@@rubyip@stretch, + mode + = 2097152 * \expandafter\ltj@@ruby@cts\ltj@@rubyip@stretchruby + + \ltj@safe@num{\ltj@@rubyip@mode} + + 1048576 * \ifltj@ruby@rubysmash1\else0\fi + \string} +} +%%% +%%% 1098765432109876543210976543210 +%%% |st_ruby|! |--| ← mode +\def\ltj@@ruby@cts#1#2#3{% + ((\ltj@safe@num{#1}) * 64 + (\ltj@safe@num{#2}) * 8 + \ltj@safe@num{#3})% +} + + +%%%%%%%% ZR さんの PXrubrica パッケージ中のコードから引用・改変 +% \pxrr@decompbar: a|bc -> \ltj@@ruby@mark{a}\ltj@@ruby@mark{bc} +\let\pxrr@res\empty +\def\pxrr@ifx#1{% + \ifx#1\expandafter\@firstoftwo + \else\expandafter\@secondoftwo + \fi +} +\def\pxrr@nil{\noexpand\pxrr@nil} +\def\pxrr@end{\noexpand\pxrr@end} +\def\pxrr@appto#1#2{% + \expandafter\def\expandafter#1\expandafter{#1#2}% +} +\def\pxrr@decompbar#1{% + \let\pxrr@res\@empty + \pxrr@decompbar@loopa\pxrr@nil#1|\pxrr@end|% +} +\def\pxrr@decompbar@loopa#1|{% + \expandafter\pxrr@decompbar@loopb\expandafter{\@gobble#1}% +} +\def\pxrr@decompbar@loopb#1{% + \pxrr@decompbar@loopc#1\relax\pxrr@nil{#1}% +} +\def\pxrr@decompbar@loopc#1#2\pxrr@nil#3{% + \pxrr@ifx{#1\pxrr@end}{}{% + \ifx\pxrr@res\@empty + \def\pxrr@res{\ltj@@ruby@mark}% + \else + \pxrr@appto\pxrr@res{\ltj@@ruby@mark}% + \fi + \pxrr@appto\pxrr@res{{#3}}% + \pxrr@decompbar@loopa\pxrr@nil + }% +} +%%%%%%%% ここまで + +%%%%%%%% TeX command +\protected\def\ltjruby{\@ifnextchar[\ltj@@ruby{\ltj@@ruby[]}}%] +\AtBeginDocument{% + \ifdefined\ruby\else\let\ruby=\ltjruby\fi + \directlua{luatexja.ruby.read_old_break_info()}% +} +\def\ltj@@ruby[#1]#2#3{{% #1: option #2: 親文字群,#3: ルビ文字列群,共に| 区切り + \setkeys[ltj]{ruby}{#1}% + \directlua{ruby_tmplist_r = \string{\string}; ruby_tmplist_p = \string{\string}}% + \leavevmode\dimen0=\f@size pt\dimen1=\ltj@@rubyip@size\dimen0% + % 引数展開,テーブルにセット + \pxrr@decompbar{#2}{\let\ltj@@ruby@mark\ltj@@ruby@sp\pxrr@res}% + \pxrr@decompbar{#3}{\let\ltj@@ruby@mark\ltj@@ruby@sr\pxrr@res}% + {\fontsize{\ltj@@rubyip@size\dimen0}\z@\selectfont\ltj@@rubyip@fontcmd\global\dimen1=\zw}% + \directlua{% + luatexja.ruby.texiface(\ltj@@ruby@create@table{\dimen1}, + ruby_tmplist_r, ruby_tmplist_p)}% +}} + +\def\ltj@@ruby@sr#1{% + \setbox0=\hbox{\fontsize{\dimen1}\z@\ltj@@rubyip@fontcmd\selectfont#1}% + \directlua{table.insert(ruby_tmplist_r, luatexja.ruby.cpbox())}% +} +\def\ltj@@ruby@sp#1{% + \setbox0=\hbox{\selectfont#1}% + \directlua{table.insert(ruby_tmplist_p, luatexja.ruby.cpbox())}% +} + +\protected\def\ltjkenten{\@ifnextchar[\ltj@@kenten{\ltj@@kenten[]}}%] +\let\kenten=\ltjkenten +\def\ltj@@kenten[#1]#2{{% + \setkeys[ltj]{ruby}{#1, stretchruby=101}% + \@tfor\ltj@@kenten@temp:=#2\do{\ltj@@ruby[]{\ltj@@kenten@temp}{\ltj@@rubyip@kenten}}% +}} + +% 初期値.要調整 +%% ひらがな +\count@="3040\loop\relax\ifnum \count@<"30A0 + \ltjsetparameter{rubypreintrusion={\the\count@,1}, + rubypostintrusion={\the\count@,1}} + \advance\count@1\repeat +%% 「」 +\ltjsetparameter{rubypreintrusion={`「,1}, + rubypostintrusion={`」,1}} +%% ,、 +\ltjsetparameter{rubypreintrusion={`,,1}, + rubypostintrusion={`,,1}} +\ltjsetparameter{rubypreintrusion={`、,1}, + rubypostintrusion={`、,1}} +%% ・ +\ltjsetparameter{rubypreintrusion={`・,1}, + rubypostintrusion={`・,1}} +%% 段落インデント部分 +\ltjsetparameter{rubypreintrusion={-1,1}} + +\setkeys[ltj]{ruby}{ + 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 +} + +\endinput diff --git a/macros/luatex/generic/luatexja/src/addons/luatexja-zhfonts.sty b/macros/luatex/generic/luatexja/src/addons/luatexja-zhfonts.sty new file mode 100644 index 0000000000..8e215d3f6e --- /dev/null +++ b/macros/luatex/generic/luatexja/src/addons/luatexja-zhfonts.sty @@ -0,0 +1,77 @@ +% luatexja-zhfonts.sty +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{luatexja-zhfonts}[2013/09/10 Setting for Chinese fonts] +\RequirePackage{luatexja-fontspec} + +% SinoType 华文字体 +\DeclareOption{SinoType}{ +\setmainjfont[BoldFont=STZhongsong]{STSong} +\setsansjfont[BoldFont=STXihei]{STXihei} +\newjfontface\kai{STKaiti} +\newjfontface\fang{STFangsong} +} + +% ZhongYi 中易字体 +\DeclareOption{ZhongYi}{ +\setmainjfont[BoldFont=SimHei]{SimSun} +\setsansjfont[BoldFont=SimHei]{SimHei} +\newjfontface\kai{KaiTi} +\newjfontface\fang{FangSong} +} + +% Adobe Adobe字体 +\DeclareOption{Adobe}{ +\setmainjfont[BoldFont=AdobeHeitiStd-Regular]{AdobeSongStd-Light} +\setsansjfont[BoldFont=AdobeHeitiStd-Regular]{AdobeHeitiStd-Regular} +\newjfontface\kai{AdobeKaitiStd-Regular} +\newjfontface\fang{AdobeFangsongStd-Regular} +} + +% Founder 方正字体 +\DeclareOption{Founder}{ +\setmainjfont[BoldFont=FZXiaoBiaoSong-B05]{FZShuSong-Z01} +\setsansjfont[BoldFont=FZHei-B01]{FZHei-B01} +\newjfontface\kai{FZKai-Z03} +\newjfontface\fang{FZFangSong-Z02} +} + +% HanYi-J 汉仪字体-文房字宝-简体 +% HanYi-F 汉仪字体-文房字宝-繁体 +% 书宋一简 HYA9GJM.ttf +% 中宋简 HYA3GJM.ttf +% 中黑简 HYB1GJM.ttf +% 粗黑简 HYB9GJM.ttf +% 楷体简 HYC1GJM.ttf +% 仿宋简 HYD1GJM.ttf +\DeclareOption{HanYi-J}{ +\setmainjfont[BoldFont=HYA9GJM.ttf]{HYA3GJM.ttf} +\setsansjfont[BoldFont=HYB9GJM.ttf]{HYB1GJM.ttf} +\newjfontface\kai{HYC1GJM.ttf} +\newjfontface\fang{HYD1GJM.ttf} +} + +\DeclareOption{HanYi-F}{ +\setmainjfont[BoldFont=HYA9GFM.ttf]{HYA3GFM.ttf} +\setsansjfont[BoldFont=HYB9GFM.ttf]{HYB1GFM.ttf} +\newjfontface\kai{HYC1GFM.ttf} +\newjfontface\fang{HYD1GFM.ttf} +} + +% cwTeX TrueType (in Debian/Ubuntu) +\DeclareOption{cwttf}{ +\setmainjfont[BoldFont=cwTeXHeiBold]{cwTeXMing} +\setsansjfont[BoldFont=cwTeXHeiBold]{cwTeXHeiBold} +\newjfontface\kai{cwTeXKai} +\newjfontface\fang{cwTeXFangSong} +} + +% Fandol fonts http://fandol-doc.googlecode.com/files/fandol-fonts.7z +\DeclareOption{Fandol}{ +\setmainjfont[BoldFont=FandolSong-Bold]{FandolSong-Regular} +\setsansjfont[BoldFont=FandolHei-Bold]{FandolHei-Regular} +\newjfontface\kai{FandolKai-Regular} +\newjfontface\fang{FandolFang-Regular} +} + +\ProcessOptions\relax +\endinput diff --git a/macros/luatex/generic/luatexja/src/jfm-CCT.lua b/macros/luatex/generic/luatexja/src/jfm-CCT.lua new file mode 100644 index 0000000000..c41f6da311 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-CCT.lua @@ -0,0 +1,84 @@ +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = 1.0, + + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.25 , 0.0, 0.0 }, + [3] = { 0.125, 0.0, 0.125 } + } + }, + + [1] = { -- fw. opening punctuations + chars = { + 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016, + 0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [3] = { 0.25, 0.0, 0.25 } + } + }, + + [2] = { -- fw. closing/colon punctuations + chars = { + 0x2019, 0x201D, 0x3001, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015, + 0x3017, 0x3019, 0x301F, 0xFF09, 0xFF0C, 0xFF3D, 0xFF5D, 0xFF60, + 0xFF1A, 0xFF1B + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.25 , 0.0, 0.0 }, + [3] = { 0.125, 0.0, 0.0 }, + [5] = { 0.25 , 0.0, 0.25 } + } + }, + + [3] = { -- fw. middle dot punctuations + chars = {0x30FB, 0x00B7}, + align = 'middle', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.125, 0.0, 0.125 }, + [1] = { 0.125, 0.0, 0.125 }, + [2] = { 0.125, 0.0, 0.125 }, + [3] = { 0.5 , 0.0, 0.5 }, + [4] = { 0.25, 0.0, 0.25 }, + [5] = { 0.25, 0.0, 0.25 }, + } + }, + + [4] = { -- fw. stop punctuations + chars = {0x3002, 0xFF01, 0xFF0E, 0xFF1F}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5, 0.0, 0.0 }, + [1] = { 0.5, 0.0, 0.0 }, + [3] = { 0.5, 0.0, 0.0 }, + [5] = { 0.5, 0.0, 0.0 } + } + }, + + [5] = { -- fw. dash punctuations + chars = { 0x2015, 0x2025, 0x2026, 0x2014, 0x301C, 0xFF5E }, + align = 'middle', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 } + }, + kern = { + [5] = -0.1 + } + }, + + [6] = { -- box end + chars = {'boxbdd'}, + }, + +} diff --git a/macros/luatex/generic/luatexja/src/jfm-banjiao.lua b/macros/luatex/generic/luatexja/src/jfm-banjiao.lua new file mode 100644 index 0000000000..783e836ba2 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-banjiao.lua @@ -0,0 +1,98 @@ +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = 1.0, + + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + --[1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.125, 0.0, 0.125 } + } + }, + + [1] = { -- fw. opening punctuations + chars = { + 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016, + 0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [3] = { 0.25, 0.0, 0.25 } + } + }, + + [2] = { -- fw. closing/colon/dot punctuations, except 4 & 7 + chars = { + 0x2019, 0x201D, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015, + 0x3017, 0x3019, 0x301F, 0xFF09, 0xFF0C, 0xFF3D, 0xFF5D, 0xFF60, + 0xFF0E, 0xFF1A, 0xFF1B, 0xFF01, 0xFF1F + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + --[0] = { 0.5 , 0.0, 0.5 }, + --[1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.125, 0.0, 0.125 }, + [5] = { 0.5 , 0.0, 0.5 } + } + }, + + [3] = { -- fw. middle dot punctuations + chars = {0x30FB, 0x00B7}, + align = 'middle', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.125, 0.0, 0.125 }, + [1] = { 0.125, 0.0, 0.125 }, + [2] = { 0.125, 0.0, 0.125 }, + [3] = { 0.5 , 0.0, 0.5 }, + [4] = { 0.25, 0.0, 0.25 }, + [5] = { 0.25, 0.0, 0.25 }, + [7] = { 0.25, 0.0, 0.25 } + } + }, + + [4] = { -- ideographic full stop + chars = {0x3002}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + --[0] = { 0.5 , 0.0, 0.0 }, + [1] = { 0.5 , 0.0, 0.0 }, + [3] = { 0.75, 0.0, 0.25 }, + [5] = { 0.5 , 0.0, 0.0 } + } + }, + + [5] = { -- fw. dash punctuations + chars = { 0x2015, 0x2025, 0x2026, 0x2014, 0x301C, 0xFF5E }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 } + }, + kern = { + [5] = 0.0 + } + }, + + [6] = { -- box end + chars = {'boxbdd'}, + }, + + [7] = { -- ideographic comma + chars = {0x3001}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5 , 0.0, 0.25 }, + [1] = { 0.5 , 0.0, 0.25 }, + [3] = { 0.25, 0.0, 0.25 }, + [5] = { 0.5 , 0.0, 0.25 } + } + }, + +} diff --git a/macros/luatex/generic/luatexja/src/jfm-jis.lua b/macros/luatex/generic/luatexja/src/jfm-jis.lua new file mode 100644 index 0000000000..642a2475e5 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-jis.lua @@ -0,0 +1,92 @@ +-- -*- coding: utf-8 -*- +-- jfm-jis.lua: JISフォントメトリック互換 +-- Besed on ujis.tfm (a counterpart of jis.tfm for upTeX). +-- * Do not confuse with jfm-ujis.lua. + +local vscale = 0.916443 / 0.962216 +local vht = 0.777588 / 0.962216 +local vdp = 0.138855 / 0.962216 +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = vscale, + + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = vht, depth = vdp, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 } + } + }, + + [1] = { -- 開き括弧類 + chars = { + '‘', '“', '〈', '《', '「', '『', '【', '〔', '〖', + '〘', '〝', '(', '[', '{', '⦅' + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = vht, depth = vdp, italic=0.0, + glue = { + [3] = { 0.25, 0.0, 0.25 } + } + }, + + [2] = { -- 閉じ括弧類 + chars = { + '’', '”', '、', '〉', '》', '」', '』', '】', '〕', + '〗', '〙', '〟', ')', ',', ']', '}', '⦆' + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.5 , 0.0, 0.5 }, + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 }, + [5] = { 0.5 , 0.0, 0.5 }, + } + }, + + [3] = { -- 中点類 + chars = {'・', ':', ';'}, + align = 'middle', left = 0.0, down = 0.0, + width = 0.5, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.25, 0.0, 0.25 }, + [1] = { 0.25, 0.0, 0.25 }, + [2] = { 0.25, 0.0, 0.25 }, + [3] = { 0.5 , 0.0, 0.5 }, + [4] = { 0.25, 0.0, 0.25 }, + [5] = { 0.25, 0.0, 0.25 }, + } + }, + + [4] = { -- 句点類 + chars = {'。', '.'}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.5 , 0.0, 0.0 }, + [1] = { 0.5 , 0.0, 0.0 }, + [3] = { 0.75, 0.0, 0.25 }, + [5] = { 0.5 , 0.0, 0.0 }, + } + }, + + [5] = { -- ダッシュ + chars = { '―', '‥', '…' }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = vht, depth = vdp, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 } + }, + kern = { + [5] = 0.0 + } + }, + + [99] = { -- box末尾 + chars = {'boxbdd', 'parbdd'}, + }, + +}
\ No newline at end of file diff --git a/macros/luatex/generic/luatexja/src/jfm-kaiming.lua b/macros/luatex/generic/luatexja/src/jfm-kaiming.lua new file mode 100644 index 0000000000..cb166ec436 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-kaiming.lua @@ -0,0 +1,98 @@ +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = 1.0, + + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + --[1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.125, 0.0, 0.125 } + } + }, + + [1] = { -- fw. opening punctuations + chars = { + 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016, + 0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [3] = { 0.25, 0.0, 0.25 } + } + }, + + [2] = { -- fw. closing/colon/dot punctuations, except 4 & 7 + chars = { + 0x2019, 0x201D, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015, + 0x3017, 0x3019, 0x301F, 0xFF09, 0xFF0C, 0xFF3D, 0xFF5D, 0xFF60, + 0xFF0E, 0xFF1A, 0xFF1B + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + --[0] = { 0.5 , 0.0, 0.5 }, + --[1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.125, 0.0, 0.125 }, + [5] = { 0.5 , 0.0, 0.5 } + } + }, + + [3] = { -- fw. middle dot punctuations + chars = {0x30FB, 0x00B7}, + align = 'middle', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.125, 0.0, 0.125 }, + [1] = { 0.125, 0.0, 0.125 }, + [2] = { 0.125, 0.0, 0.125 }, + [3] = { 0.5 , 0.0, 0.5 }, + [4] = { 0.25, 0.0, 0.25 }, + [5] = { 0.25, 0.0, 0.25 }, + [7] = { 0.25, 0.0, 0.25 } + } + }, + + [4] = { -- ideographic full stop + chars = {0x3002, 0xFF1F, 0xFF01}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5 , 0.0, 0.0 }, + [1] = { 0.5 , 0.0, 0.0 }, + [3] = { 0.75, 0.0, 0.25 }, + [5] = { 0.5 , 0.0, 0.0 } + } + }, + + [5] = { -- fw. dash punctuations + chars = { 0x2015, 0x2025, 0x2026, 0x2014, 0x301C, 0xFF5E }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 } + }, + kern = { + [5] = 0.0 + } + }, + + [6] = { -- box end + chars = {'boxbdd'}, + }, + + [7] = { -- ideographic comma + chars = {0x3001}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5 , 0.0, 0.25 }, + [1] = { 0.5 , 0.0, 0.25 }, + [3] = { 0.25, 0.0, 0.25 }, + [5] = { 0.5 , 0.0, 0.25 } + } + }, + +} diff --git a/macros/luatex/generic/luatexja/src/jfm-min.lua b/macros/luatex/generic/luatexja/src/jfm-min.lua new file mode 100644 index 0000000000..b59b5329c4 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-min.lua @@ -0,0 +1,261 @@ +-- -*- coding: utf-8 -*- +-- jfm-min.lua: min10 互換 +-- Based on umin10.tfm (a counterpart of min10.tfm for upTeX). + +local vscale = 0.916443 / 0.962216 +local vht = 0.777588 / 0.962216 +local vdp = 0.138855 / 0.962216 + +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = vscale, + kanjiskip = { 0.0, 0.091641/0.962216, 0.0 }, + xkanjiskip = { 0.229101/0.962216, 0.183283/0.962216, 0.114551/0.962216 }, + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = vht, depth = vdp, italic=0.0, + glue = { + [4] = { 0.316224, 0.0, 0.316224 }, + [5] = { 0.238097, 0.0, 0.238097 }, + [3] = { 0.111608, 0.0, 0.111608 }, + [6] = { 0.476196, 0.0, 0.476196 }, + } + }, + + [1] = { + chars = { + '〉', '》', '」', '』', '】', '〕', '〗', '〙', '〟', ')', ']', '}', '⦆ ' + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.523804, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.476196, 0.0, 0.238097 }, + [7] = { 0.476196, 0.0, 0.238097 }, + [12] = { 0.476196, 0.0, 0.238097 }, + [13] = { 0.476196, 0.0, 0.238097 }, + [14] = { 0.476196, 0.0, 0.238097 }, + [10] = { 0.238097, 0.238097, 0.238097 }, + [2] = { 0.238097, 0.238097, 0.238097 }, + [4] = { 0.238097, 0.238097, 0.238097 }, + [5] = { 0.238097, 0.238097, 0.238097 }, + [3] = { 0.476196, 0.0, 0.238097 }, + [6] = { 0.476196, 0.0, 0.238097 }, + [11] = { 0.0, 0.476196, 0.0 }, + [1] = { 0.0, 0.476196, 0.0 }, + } + }, + + [2] = { + chars = { + '゛', '゜' + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.367552, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.632447, 0.0, 0.238097 }, + [7] = { 0.632447, 0.0, 0.238097 }, + [12] = { 0.632447, 0.0, 0.238097 }, + [13] = { 0.632447, 0.0, 0.238097 }, + [14] = { 0.632447, 0.0, 0.238097 }, + [10] = { 0.0, 0.316224, 0.0 }, + [2] = { 0.0, 0.316224, 0.0 }, + [4] = { 0.476196, 0.0, 0.238097 }, + [5] = { 0.476196, 0.0, 0.238097 }, + [3] = { 0.476196, 0.0, 0.238097 }, + [6] = { 0.238097, 0.238097, 0.238097 }, + } + }, + [3] = { + chars = { + '∴', '♀', '♂', '〃', '々', 'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ', 'っ', 'ゃ', 'ゅ ', + 'ょ', 'ゎ', 'ゕ', 'ゖ', 'ゞ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ッ', 'ャ', 'ュ', 'ョ', + 'ヮ', 'ヵ', 'ヶ', 'ㇰ', 'ㇱ', 'ㇲ', 'ㇳ', 'ㇴ', 'ㇵ', 'ㇶ', 'ㇷ', 'ㇸ', 'ㇹ', 'ㇺ', + 'ㇻ', 'ㇼ', 'ㇽ', 'ㇾ', 'ㇿ', '$', '¢', '£' + }, + align = 'middle', left = 0.0, down = 0.0, + width = 0.776784, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.111608, 0.0, 0.111608 }, + [7] = { 0.111608, 0.0, 0.111608 }, + [12] = { 0.111608, 0.0, 0.111608 }, + [13] = { 0.111608, 0.0, 0.111608 }, + [14] = { 0.111608, 0.0, 0.111608 }, + [10] = { 0.0, 0.316224, 0.0}, + [2] = { 0.0, 0.316224, 0.0}, + [4] = { 0.316224, 0.0, 0.316224 }, + [5] = { 0.238097, 0.0, 0.238097 }, + [6] = { 0.476196, 0.0, 0.476196 }, + [11] = { 0.111608, 0.0, 0.111608 }, + [1] = { 0.111608, 0.0, 0.111608 }, + }, + }, + [4] = { + chars = { + '´', '‐', '‖', '‘', '’', '・', '!', ':', ';', '`', '|' + }, + align = 'middle', left = 0.0, down = 0.0, + width = 0.367552, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.316224, 0.0, 0.316224 }, + [7] = { 0.316224, 0.0, 0.316224 }, + [12] = { 0.316224, 0.0, 0.316224 }, + [13] = { 0.316224, 0.0, 0.316224 }, + [14] = { 0.316224, 0.0, 0.316224 }, + [10] = { 0.0, 0.316224, 0.0 }, + [2] = { 0.0, 0.316224, 0.0 }, + [4] = { 0.0, 0.316224, 0.0 }, + [5] = { 0.0, 0.316224, 0.0 }, + [3] = { 0.316224, 0.0, 0.316224 }, + [6] = { 0.238097, 0.238097, 0.238097 }, + [11] = { 0.316224, 0.0, 0.316224 }, + [1] = { 0.316224, 0.0, 0.316224 }, + } + }, + [5] = { + chars = { + '§', '¨', '°', '“', '”', '′', '″', 'ゝ', 'ヽ', '?', '^' + }, + align = 'middle', left = 0.0, down = 0.0, + width = 0.523804, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.238097, 0.0, 0.238097 }, + [7] = { 0.238097, 0.0, 0.238097 }, + [12] = { 0.238097, 0.0, 0.238097 }, + [13] = { 0.238097, 0.0, 0.238097 }, + [14] = { 0.238097, 0.0, 0.238097 }, + [10] = { 0.0, 0.316224, 0.0 }, + [2] = { 0.0, 0.316224, 0.0 }, + [4] = { 0.0, 0.316224, 0.0 }, + [5] = { 0.0, 0.316224, 0.0 }, + [3] = { 0.238097, 0.0, 0.238097 }, + [6] = { 0.238097, 0.238097, 0.238097 }, + [11] = { 0.238097, 0.0, 0.238097 }, + [1] = { 0.238097, 0.0, 0.238097 }, + }, + }, + [6] = { + chars = { + '〈', '《', '「', '『', '【', '〔', '〖', '〘', '〝', '(', '[', '{', '⦅' + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.523804, height = vht, depth = vdp, italic=0.0, + glue = { + [4] = { 0.316224, 0.0, 0.316224 }, + [5] = { 0.238097, 0.0, 0.238097 }, + [3] = { 0.111608, 0.0, 0.111608 }, + [6] = { 0.0, 0.476196, 0.0 }, + }, + }, + [7] = { + chars = { + 'う', 'く', 'ぐ', 'け', 'げ', 'す', 'ず', 'り', 'テ', 'デ', 'ヤ' + }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = vht, depth = vdp, italic=0.0, + glue = { + [4] = { 0.316224, 0.0, 0.316224 }, + [5] = { 0.238097, 0.0, 0.238097 }, + [3] = { 0.111608, 0.0, 0.111608 }, + [6] = { 0.476196, 0.0, 0.238097 }, + }, + kern = { + [10] = -0.05, [11] = -0.05 + }, + }, + + [10] = { + chars = { + ',', '.' + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.367552, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.632447, 0.0, 0.238097 }, + [7] = { 0.632447, 0.0, 0.238097 }, + [12] = { 0.632447, 0.0, 0.238097 }, + [13] = { 0.632447, 0.0, 0.238097 }, + [14] = { 0.632447, 0.0, 0.238097 }, + [10] = { 0.0, 0.316224, 0.0 }, + [2] = { 0.0, 0.316224, 0.0 }, + [4] = { 0.476196, 0.0, 0.238097 }, + [5] = { 0.476196, 0.0, 0.238097 }, + [3] = { 0.476196, 0.0, 0.238097 }, + [6] = { 0.238097, 0.238097, 0.238097 }, + } + }, + [11] = { + chars = { + '、', '。 ' + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.523804, height = vht, depth = vdp, italic=0.0, + glue = { + [0] = { 0.476196, 0.0, 0.238097 }, + [7] = { 0.476196, 0.0, 0.238097 }, + [12] = { 0.476196, 0.0, 0.238097 }, + [13] = { 0.476196, 0.0, 0.238097 }, + [14] = { 0.476196, 0.0, 0.238097 }, + [10] = { 0.238097, 0.238097, 0.238097 }, + [2] = { 0.238097, 0.238097, 0.238097 }, + [4] = { 0.238097, 0.238097, 0.238097 }, + [5] = { 0.238097, 0.238097, 0.238097 }, + [3] = { 0.476196, 0.0, 0.238097 }, + [6] = { 0.476196, 0.0, 0.238097 }, + [11] = { 0.0, 0.476196, 0.0 }, + [1] = { 0.0, 0.476196, 0.0 }, + } + }, + [12] = { + chars = { + 'ア', 'イ', 'ウ', 'オ', 'ケ', 'ゲ', 'サ', 'ザ', 'ソ', 'ゾ', 'チ', 'ヂ', 'ツ', + 'ヅ', 'ト', 'ド', 'ナ', 'フ', 'ブ', 'プ', 'ミ', 'メ', 'ラ', 'リ', 'ワ', 'ヲ' + }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = vht, depth = vdp, italic=0.0, + glue = { + [4] = { 0.316224, 0.0, 0.316224 }, + [5] = { 0.238097, 0.0, 0.238097 }, + [3] = { 0.111608, 0.0, 0.111608 }, + [6] = { 0.476196, 0.0, 0.238097 }, + }, + kern = { + [10] = -0.1, [11] = -0.1 + }, + }, + [13] = { + chars = { + 'ク', 'グ', 'タ', 'ダ' + }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = vht, depth = vdp, italic=0.0, + glue = { + [4] = { 0.316224, 0.0, 0.316224 }, + [5] = { 0.238097, 0.0, 0.238097 }, + [3] = { 0.111608, 0.0, 0.111608 }, + [6] = { 0.476196, 0.0, 0.238097 }, + }, + kern = { + [10] = -0.15, [11] = -0.15 + }, + }, + [14] = { + chars = { + 'ノ' + }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = vht, depth = vdp, italic=0.0, + glue = { + [4] = { 0.316224, 0.0, 0.316224 }, + [5] = { 0.238097, 0.0, 0.238097 }, + [3] = { 0.111608, 0.0, 0.111608 }, + [6] = { 0.476196, 0.0, 0.238097 }, + }, + kern = { + [10] = -0.2, [11] = -0.2 + }, + }, + + [99] = { -- box末尾 + chars = {'boxbdd', 'parbdd'}, + }, +} diff --git a/macros/luatex/generic/luatexja/src/jfm-mono.lua b/macros/luatex/generic/luatexja/src/jfm-mono.lua new file mode 100644 index 0000000000..185e817182 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-mono.lua @@ -0,0 +1,9 @@ +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = 1.0, + + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + } +}
\ No newline at end of file diff --git a/macros/luatex/generic/luatexja/src/jfm-prop.lua b/macros/luatex/generic/luatexja/src/jfm-prop.lua new file mode 100644 index 0000000000..71dc1ae694 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-prop.lua @@ -0,0 +1,9 @@ +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = 1.0, + + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 'prop', height = 0.88, depth = 0.12, italic=0.0, + } +} diff --git a/macros/luatex/generic/luatexja/src/jfm-propv.lua b/macros/luatex/generic/luatexja/src/jfm-propv.lua new file mode 100644 index 0000000000..320ed62648 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-propv.lua @@ -0,0 +1,9 @@ +luatexja.jfont.define_jfm { + dir = 'tate', + zw = 1.0, zh = 1.0, + + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 'prop', height = 0.50, depth = 0.50, italic=0.0, + } +} diff --git a/macros/luatex/generic/luatexja/src/jfm-quanjiao.lua b/macros/luatex/generic/luatexja/src/jfm-quanjiao.lua new file mode 100644 index 0000000000..20590b6a96 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-quanjiao.lua @@ -0,0 +1,98 @@ +luatexja.jfont.define_jfm { + dir = 'yoko', + zw = 1.0, zh = 1.0, + + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 } + } + }, + + [1] = { -- fw. opening punctuations + chars = { + 0x2018, 0x201C, 0x3008, 0x300A, 0x300C, 0x300E, 0x3010, 0x3014, 0x3016, + 0x3018, 0x301D, 0xFF08, 0xFF3B, 0xFF5B, 0xFF5F + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [3] = { 0.25, 0.0, 0.25 } + } + }, + + [2] = { -- fw. closing/colon/dot punctuations, except 4 & 7 + chars = { + 0x2019, 0x201D, 0x3009, 0x300B, 0x300D, 0x300F, 0x3011, 0x3015, + 0x3017, 0x3019, 0x301F, 0xFF09, 0xFF0C, 0xFF3D, 0xFF5D, 0xFF60, + 0xFF0E, 0xFF1A, 0xFF1B, 0xFF01, 0xFF1F + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5 , 0.0, 0.5 }, + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 }, + [5] = { 0.5 , 0.0, 0.5 } + } + }, + + [3] = { -- fw. middle dot punctuations + chars = {0x30FB}, + align = 'middle', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.25, 0.0, 0.25 }, + [1] = { 0.25, 0.0, 0.25 }, + [2] = { 0.25, 0.0, 0.25 }, + [3] = { 0.5 , 0.0, 0.5 }, + [4] = { 0.25, 0.0, 0.25 }, + [5] = { 0.25, 0.0, 0.25 }, + [7] = { 0.25, 0.0, 0.25 } + } + }, + + [4] = { -- ideographic full stop + chars = {0x3002}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5 , 0.0, 0.0 }, + [1] = { 0.5 , 0.0, 0.0 }, + [3] = { 0.75, 0.0, 0.25 }, + [5] = { 0.5 , 0.0, 0.0 } + } + }, + + [5] = { -- fw. dash punctuations + chars = { 0x2015, 0x2025, 0x2026, 0x2014, 0x301C, 0xFF5E }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5 }, + [3] = { 0.25, 0.0, 0.25 } + }, + kern = { + [5] = 0.0 + } + }, + + [6] = { -- box end + chars = {'boxbdd'}, + }, + + [7] = { -- ideographic comma + chars = {0x3001}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [0] = { 0.5 , 0.0, 0.25 }, + [1] = { 0.5 , 0.0, 0.25 }, + [3] = { 0.25, 0.0, 0.25 }, + [5] = { 0.5 , 0.0, 0.25 } + } + }, + +} diff --git a/macros/luatex/generic/luatexja/src/jfm-tmin.lua b/macros/luatex/generic/luatexja/src/jfm-tmin.lua new file mode 100644 index 0000000000..2d9f85b59f --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-tmin.lua @@ -0,0 +1,189 @@ +-- -*- coding: utf-8 -*- +-- jfm-tmin.lua: tmin10 互換 +-- Based on utmin10.tfm (a counterpart of tmin10.tfm for upTeX). + +local vscale = 0.916443 / 0.962216 +local vht = 0.458221 / 0.962216 + +luatexja.jfont.define_jfm { + dir = 'tate', + zw = 1.0, zh = vscale, + kanjiskip = { 0.0, 0.091641/0.962216, 0.0 }, + xkanjiskip = { 0.229101/0.962216, 0.183283/0.962216, 0.114551/0.962216 }, + [0] = { + align = 'middle', left = 0.00, down = 0.00, + width = 1.0, height = vht, depth = vht, italic=0.0, + glue = { + [1] = { 0, 0, 0 }, + [2] = { 0, 0, 0 }, + [3] = { 0.111608, 0.0, 0.111608 }, + [5] = { 0, 0, 0 }, + [6] = { 0.5, 0.190480, 0.5 }, + [7] = { 0.25, 0.190480, 0.25 }, + [10] = { 0, 0, 0 }, + } + }, + + [1] = { + chars = { + ',', '.' + }, + align = 'left', left = 0.00, down = 0.00, + width = 0.5, height = vht, depth = vht, italic=0.0, + glue = { + [0] = { 0.5, 0.190480, 0.5 }, + [1] = { 0, 0, 0 }, + [2] = { 0, 0, 0 }, + [3] = { 0.5, 0.190480, 0.5 }, + [4] = { 0, 0, 0 }, + [5] = { 0.5, 0.190480, 0.5 }, + [6] = { 0.5, 0.190480, 0.5 }, + [7] = { 0.5, 0.190480, 0.5 }, + [10] = { 0, 0, 0 }, + } + }, + + [2] = { + chars = { + '、', '。' + }, + align = 'left', left = 0.00, down = 0.00, + width = 0.5, height = vht, depth = vht, italic=0.0, + glue = { + [0] = { 0.5, 0.190480, 0.5 }, + [1] = { 0, 0, 0 }, + [2] = { 0, 0, 0 }, + [3] = { 0.5, 0.190480, 0.5 }, + [4] = { 0, 0, 0 }, + [5] = { 0.5, 0.190480, 0.5 }, + [6] = { 0.5, 0.190480, 0.5 }, + [7] = { 0.5, 0.190480, 0.5 }, + [10] = { 0, 0, 0 }, + } + }, + + [3] = { + chars = { + '〃', '々', 'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ', 'っ', 'ゃ', 'ゅ', + 'ょ', 'ゎ', 'ゕ', 'ゖ', 'ゝ', 'ゞ', 'ァ', 'ィ', 'ゥ', 'ェ', + 'ォ', 'ッ', 'ャ', 'ュ', 'ョ', 'ヮ', 'ヵ', 'ヶ', 'ヽ', 'ヾ', + 'ㇰ', 'ㇱ', 'ㇲ', 'ㇳ', 'ㇴ', 'ㇵ', 'ㇶ', 'ㇷ', 'ㇸ', 'ㇹ', + 'ㇺ', 'ㇻ', 'ㇼ', 'ㇽ', 'ㇾ', 'ㇿ', + }, + align = 'middle', left = 0.00, down = 0.00, + width = 0.776784, height = vht, depth = vht, italic=0.0, + glue = { + [0] = { 0.111608, 0.0, 0.111608 }, + [1] = { 0, 0, 0 }, + [2] = { 0, 0, 0 }, + [3] = { 0.111608, 0.0, 0.111608 }, + [5] = { 0, 0, 0 }, + [6] = { 0.5, 0.190480, 0.5 }, + [7] = { 0.25, 0.190480, 0.25 }, + [10] = { 0, 0, 0 }, + } + }, + + [4] = { + chars = { + '!', '?' + }, + align = 'middle', left = 0.00, down = 0.00, + width = 1.0, height = vht, depth = vht, italic=0.0, + glue = { + [0] = { 1.0, 0.0, 0.5 }, + [1] = { 0, 0, 0 }, + [2] = { 0, 0, 0 }, + [3] = { 1.0, 0.0, 0.5 }, + [5] = { 0, 0, 0 }, + [6] = { 1.0, 0.0, 0.5 }, + [7] = { 1.0, 0.0, 0.5 }, + [10] = { 0, 0, 0 }, + } + }, + + [5] = { + chars = { + '―', '‥', '…' + }, + align = 'middle', left = 0.00, down = 0.00, + width = 1.0, height = vht, depth = vht, italic=0.0, + glue = { + [0] = { 0, 0, 0 }, + [1] = { 0, 0, 0 }, + [2] = { 0, 0, 0 }, + [3] = { 0, 0, 0 }, + [4] = { 0, 0, 0 }, + [5] = { 0, 0, 0 }, + [6] = { 0.25, 0.190480, 0.25 }, + [7] = { 0.25, 0.190480, 0.25 }, + [10] = { 0, 0, 0 }, + } + }, + + [6] = { -- 開き括弧類 + chars = { + '‘', '“', '〈', '《', '「', '『', '【', '〔', '〖', + '〘', '〝', '(', '[', '{', '⦅' + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = vht, depth = vht, italic=0.0, + glue = { + [0] = {0, 0, 0}, + [1] = {0, 0, 0}, + [2] = {0, 0, 0}, + [3] = {0, 0, 0}, + [4] = {0, 0, 0}, + [5] = {0, 0, 0}, + [6] = {0, 0, 0}, + [7] = { 0.25, 0.0, 0.25 }, + [8] = {0, 0, 0}, + [9] = {0, 0, 0}, + } + }, + + [7] = { + chars = { + '‐', '‖', '・', '|' + }, + align = 'middle', left = 0.00, down = 0.00, + width = 0.5, height = vht, depth = vht, italic=0.0, + glue = { + [0] = { 0.25, 0.190480, 0.25 }, + [1] = { 0.25, 0, 0.25 }, + [2] = { 0.25, 0, 0.25 }, + [3] = { 0.111608, 0.0, 0.111608 }, + [4] = { 0.25, 0.190480, 0.25 }, + [5] = { 0.25, 0.190480, 0.25 }, + [6] = { 0.25, 0.190480, 0.25 }, + [7] = { 0, 0.190480, 0.0 }, + [10] = { 0.25, 0, 0.25 }, + } + }, + + [10] = { -- 閉じ括弧類 + chars = { + '’', '”', '〉', '》', '」', '』', '】', '〕', + '〗', '〙', '〟', ')', ']', '}', '⦆' + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = vht, depth = vht, italic=0.0, + glue = { +-- 3 は四分, 2, 4, 9 は0, あとは0.5 + [0] = { 0.5 , 0.190480, 0.5 }, + [1] = { 0, 0, 0 }, + [2] = { 0, 0, 0 }, + [3] = { 0.5 , 0.190480, 0.5 }, + [4] = { 0, 0, 0 }, + [5] = { 0.25 , 0.190480, 0.25 }, + [6] = { 0.5 , 0.190480, 0.5 }, + [7] = { 0.25 , 0.190480, 0.25 }, + [10] = {0, 0, 0}, + } + }, + + [99] = { -- box末尾 + chars = {'boxbdd', 'parbdd'}, + }, + +} diff --git a/macros/luatex/generic/luatexja/src/jfm-ujis.lua b/macros/luatex/generic/luatexja/src/jfm-ujis.lua new file mode 100644 index 0000000000..10b44d8103 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-ujis.lua @@ -0,0 +1,304 @@ +-- -*- coding: utf-8 -*- +-- jfm-ujis.lua: LuaTeX-ja 標準 JFM +-- based on upnmlminr-h.tfm (a metric in UTF/OTF package used by upTeX). + +-- JIS X 4051:2004 では,行末の句読点や中点はベタなのでそれに従う +-- kanjiskip: 0pt plus .25zw minus 0pt +-- xkanjiskip: .25zw plus .25zw (or .0833zw) minus .125zw + + +local t = { + version = 3, + dir = 'yoko', + zw = 1.0, zh = 1.0, + kanjiskip = { 0.0, 0.25, 0 }, + xkanjiskip = { 0.25, 0.25, .125 }, + [0] = { + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [007] = { 0, 0, 0, kanjiskip_shrink=1 }, + [107] = { 0, 0, 0, kanjiskip_shrink=1 }, + [207] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { [307] = 0 }, + }, + + [1] = { -- 開き括弧類 + chars = { + '‘', '“', '〈', '《', '「', '『', '【', '〔', '〖', + '〘', '〝', '(', '[', '{', '⦅' + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { +-- 3 のみ四分,あとは0 + [0] = { 0, 0, 0, kanjiskip_shrink=1 }, + [1] = { 0, 0, 0, kanjiskip_shrink=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1, kanjiskip_stretch=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [5] = { 0, 0, 0, kanjiskip_shrink=1 }, + [105] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [007] = { 0, 0, 0, kanjiskip_shrink=1 }, + [107] = { 0, 0, 0, kanjiskip_shrink=1 }, + [207] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + } + }, + + [2] = { -- 閉じ括弧類 + chars = { + '’', '”', '〉', '》', '」', '』', '】', '〕', + '〗', '〙', '〟', ')', ']', '}', '⦆', '、', ',*' + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { +-- 3 は四分, 2, 4, 9 は0, あとは0.5 + [0] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [1] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1}, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [5] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [105] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [6] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [007] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [107] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [207] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [8] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + } + }, + + [3] = { -- 中点類 + chars = {'・', ':', ';', '·'}, + align = 'middle', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + --end_stretch = 0.25, + glue = { +-- 3 のみ 0.5,あとは0.25 + [0] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [1] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [2] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [3] = { 0.5 , 0.0, 0.5 , priority=1 }, + [4] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [5] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [105] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [6] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [007] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [107] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [207] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [8] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + } + }, + + [4] = { -- 句点類 + chars = {'。', '.'}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + -- 3 は.75, 2, 4 は0, あとは0.5 + [0] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [1] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [3] = { 0.75, 0.0, 0.25, priority=1, ratio=1./3, kanjiskip_stretch=1 }, + [5] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [105] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [6] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [007] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [107] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [207] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [8] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + } + }, + + [5] = { -- 分離禁止文字 + chars = { '—', '―', '‥', '…', '〳', '〴', '〵', }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { + [5] = 0.0, + [105] = 0.0 + } + }, + + [105] = { -- 二分(二重)ダッシュ + chars = { '゠', '–' }, + align = 'middle', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { + [5] = 0.0, + [105] = 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.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.75, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [007] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [107] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [207] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { + [5] = 0.0, + [105] = 0.0 + } + }, + + [007] = { -- 半角カナ,その他半角CID + chars = { + '。', '「', '」', '、', '・', 'ヲ', 'ァ', 'ィ', 'ゥ', + 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ', + 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', + 'シ', 'ス', 'セ', 'ソ', 'タ', 'チ', 'ツ', 'テ', 'ト', + 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ', + 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', + 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ン', '゙', '゚', + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { [307] = 0 }, + }, + + [107] = { -- 1/3 角 + chars = {}, + align = 'left', left = 0.0, down = 0.0, + width = 1/3, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [107] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + } + }, + + [207] = { -- 1/4 角 + chars = {}, + align = 'left', left = 0.0, down = 0.0, + width = 0.25, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [207] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + } + }, + + [307] = { -- 1/4 角 + chars = { 0x3099, 0x309A }, + align = 'right', left = 0.0, down = 0.0, + width = 0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [207] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + } + }, + + [8] = { -- 罫線類. + chars = { + '─', '━', '│', '┃', '┄', '┅', '┆', '┇', + '┈', '┉', '┊', '┋', '┌', '┍', '┎', '┏', + '┐', '┑', '┒', '┓', '└', '┕', '┖', '┗', + '┘', '┙', '┚', '┛', '├', '┝', '┞', '┟', + '┠', '┡', '┢', '┣', '┤', '┥', '┦', '┧', + '┨', '┩', '┪', '┫', '┬', '┭', '┮', '┯', + '┰', '┱', '┲', '┳', '┴', '┵', '┶', '┷', + '┸', '┹', '┺', '┻', '┼', '┽', '┾', '┿', + '╀', '╁', '╂', '╃', '╄', '╅', '╆', '╇', + '╈', '╉', '╊', '╋', '╌', '╍', '╎', '╏', + '═', '║', '╒', '╓', '╔', '╕', '╖', '╗', + '╘', '╙', '╚', '╛', '╜', '╝', '╞', '╟', + '╠', '╡', '╢', '╣', '╤', '╥', '╦', '╧', + '╨', '╩', '╪', '╫', '╬', '╭', '╮', '╯', + '╰', '╱', '╲', '╳', '╴', '╵', '╶', '╷', + '╸', '╹', '╺', '╻', '╼', '╽', '╾', '╿', + }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.88, depth = 0.12, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { + [8] = 0.0 + } + }, + + + [99] = { -- box末尾 + chars = {'boxbdd', 'parbdd', 'glue'}, + }, + +} + +local ht = t[007].chars +for i=231,632 do ht[#ht+1] = 'AJ1-' .. tostring(i) end +for i=8718,8719 do ht[#ht+1] = 'AJ1-' .. tostring(i) end +for i=12063,12087 do ht[#ht+1] = 'AJ1-' .. tostring(i) end +local ht = t[107].chars +for i=9758,9778 do ht[#ht+1] = 'AJ1-' .. tostring(i) end +local ht = t[207].chars +for i=9738,9757 do ht[#ht+1] = 'AJ1-' .. tostring(i) end + +t[100]=table.fastcopy(t[0]) +t[100].chars={'nox_alchar'} +for i,v in pairs(t) do + if i~=6 and type(i)=='number' and type(v)=='table' then -- 感嘆符以外 + if v.glue and v.glue[0] then v.glue[100] = v.glue[0] end + if v.kern and v.kern[0] then v.kern[100] = v.kern[0] end + end +end + +luatexja.jfont.define_jfm(t) diff --git a/macros/luatex/generic/luatexja/src/jfm-ujisv.lua b/macros/luatex/generic/luatexja/src/jfm-ujisv.lua new file mode 100644 index 0000000000..ccae212f88 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/jfm-ujisv.lua @@ -0,0 +1,307 @@ +-- -*- coding: utf-8 -*- +-- jfm-ujisv.lua: LuaTeX-ja 標準 JFM(縦組み用) +-- based on upnmlminr-h.tfm (a metric in UTF/OTF package used by upTeX). + +-- JIS X 4051:2004 では,行末の句読点や中点はベタなのでそれに従う +-- kanjiskip: 0pt plus .25zw minus 0pt +-- xkanjiskip: .25zw plus .25zw (or .0833zw) minus .125zw + + +local t = { + version = 3, + dir = 'tate', + zw = 1.0, zh = 1.0, + kanjiskip = { 0.0, 0.25, 0 }, + xkanjiskip = { 0.25, 0.25, .125 }, + [0] = { + align = 'middle', left = 0.00, down = 0.00, + width = 1.0, height = 0.50, depth = 0.50, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [7] = { 0, 0, 0, kanjiskip_shrink=1 }, + [107] = { 0, 0, 0, kanjiskip_shrink=1 }, + [207] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { [307] = 0 }, + }, + + [1] = { -- 開き括弧類 + chars = { + '‘', '“', '〈', '《', '「', '『', '【', '〔', '〖', + '〘', '〝', '(', '[', '{', '⦅' + }, + align = 'right', left = 0.0, down = 0.0, + width = 0.5, height = 0.50, depth = 0.50, italic=0.0, + glue = { +-- 3 のみ四分,あとは0 + [0] = { 0, 0, 0, kanjiskip_shrink=1 }, + [1] = { 0, 0, 0, kanjiskip_shrink=1 }, + [2] = { 0, 0, 0, kanjiskip_stretch=1, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [5] = { 0, 0, 0, kanjiskip_shrink=1 }, + [105] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [7] = { 0, 0, 0, kanjiskip_shrink=1 }, + [107] = { 0, 0, 0, kanjiskip_shrink=1 }, + [207] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + } + }, + + [2] = { -- 閉じ括弧類 + chars = { + '’', '”', '〉', '》', '」', '』', '】', '〕', + '〗', '〙', '〟', ')', ']', '}', '⦆', '、', ',' + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.50, depth = 0.50, italic=0.0, + glue = { +-- 3 は四分, 2, 4, 9 は0, あとは0.5 + [0] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [1] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [5] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [105] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [6] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [7] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [107] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [207] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [8] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + } + }, + + [3] = { -- 中点類 + chars = {'・', ':', ';', '·'}, + align = 'middle', left = 0.0, down = 0.0, + width = 0.5, height = 0.50, depth = 0.50, italic=0.0, + --end_stretch = 0.25, + glue = { +-- 3 のみ 0.5,あとは0.25 + [0] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [1] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [2] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [3] = { 0.5 , 0.0, 0.25, priority=1 }, + [4] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [5] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [105] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [6] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [7] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [107] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [207] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [8] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + } + }, + + [4] = { -- 句点類 + chars = {'。', '.'}, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.50, depth = 0.50, italic=0.0, + glue = { +-- 3 は.75, 2, 4 は0, あとは0.5 + [0] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [1] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [3] = { 0.75, 0.0, 0.25, priority=1, ratio=1./3, kanjiskip_stretch=1 }, + [5] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [105] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [6] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [7] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [107] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [207] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + [8] = { 0.5 , 0.0, 0.5, ratio=0, kanjiskip_stretch=1 }, + } + }, + + [5] = { -- 分離禁止文字 + chars = { '—', '―', '‥', '…', '〳', '〴', '〵', }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.50, depth = 0.50, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { + [5] = 0.0, + [105] = 0.0, + } + }, + + [5] = { -- -- 二分(二重)ダッシュ + chars = { '゠', '–' }, + align = 'middle', left = 0.0, down = 0.0, + width = 0.50, height = 0.50, depth = 0.50, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { + [5] = 0.0, + [105] = 0.0 + } + }, + + [6] = { -- 感嘆符・疑問符 + chars = { '?', '!', '‼', '⁇', '⁈', '⁉', }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.50, depth = 0.50, italic=0.0, + glue = { + [0] = { 1.0 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.75, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [7] = { 1.0 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [107] = { 1.0 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [207] = { 1.0 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { + [5] = 0.0, + [105] = 0.0, + } + }, + + [7] = { -- 半角カナ,その他半角CID + chars = { + '。', '「', '」', '、', '・', 'ヲ', 'ァ', 'ィ', 'ゥ', + 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ', + 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', + 'シ', 'ス', 'セ', 'ソ', 'タ', 'チ', 'ツ', 'テ', 'ト', + 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ', + 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', + 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ン', '゙', '゚', + }, + align = 'left', left = 0.0, down = 0.0, + width = 0.5, height = 0.5, depth = 0.5, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [7] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + } + }, + + [107] = { -- 1/3 角 + chars = {}, + align = 'left', left = 0.0, down = 0.0, + width = 1/3, height = 0.5, depth = 0.5, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [107] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + } + }, + [207] = { -- 1/4 角 + chars = {}, + align = 'left', left = 0.0, down = 0.0, + width = 1/4, height = 0.5, depth = 0.5, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [207] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + } + }, + [307] = { -- 合成用濁点・半濁点 + chars = { 0x3099, 0x309A }, + align = 'right', left = 0.0, down = 0.0, + width = 0, height = 0.5, depth = 0.5, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + [8] = { 0, 0, 0, kanjiskip_shrink=1 }, + } + }, + + [8] = { -- 罫線類. + chars = { + '─', '━', '│', '┃', '┄', '┅', '┆', '┇', + '┈', '┉', '┊', '┋', '┌', '┍', '┎', '┏', + '┐', '┑', '┒', '┓', '└', '┕', '┖', '┗', + '┘', '┙', '┚', '┛', '├', '┝', '┞', '┟', + '┠', '┡', '┢', '┣', '┤', '┥', '┦', '┧', + '┨', '┩', '┪', '┫', '┬', '┭', '┮', '┯', + '┰', '┱', '┲', '┳', '┴', '┵', '┶', '┷', + '┸', '┹', '┺', '┻', '┼', '┽', '┾', '┿', + '╀', '╁', '╂', '╃', '╄', '╅', '╆', '╇', + '╈', '╉', '╊', '╋', '╌', '╍', '╎', '╏', + '═', '║', '╒', '╓', '╔', '╕', '╖', '╗', + '╘', '╙', '╚', '╛', '╜', '╝', '╞', '╟', + '╠', '╡', '╢', '╣', '╤', '╥', '╦', '╧', + '╨', '╩', '╪', '╫', '╬', '╭', '╮', '╯', + '╰', '╱', '╲', '╳', '╴', '╵', '╶', '╷', + '╸', '╹', '╺', '╻', '╼', '╽', '╾', '╿', + }, + align = 'left', left = 0.0, down = 0.0, + width = 1.0, height = 0.50, depth = 0.50, italic=0.0, + glue = { + [1] = { 0.5 , 0.0, 0.5, ratio=1, kanjiskip_stretch=1 }, + [2] = { 0, 0, 0, kanjiskip_shrink=1 }, + [3] = { 0.25, 0.0, 0.25, priority=1, ratio=1 }, + [4] = { 0, 0, 0, kanjiskip_shrink=1 }, + [6] = { 0, 0, 0, kanjiskip_shrink=1 }, + }, + kern = { + [8] = 0.0 + } + }, + + [99] = { -- box末尾 + chars = {'boxbdd', 'parbdd', 'glue'}, + }, + +} +local ht = t[007].chars +for i=8950,9353 do ht[#ht+1] = 'AJ1-' .. tostring(i) end +for i=10185,10195 do ht[#ht+1] = 'AJ1-' .. tostring(i) end +local ht = t[107].chars +for i=13274,13294 do ht[#ht+1] = 'AJ1-' .. tostring(i) end +local ht = t[207].chars +for i=13254,13273 do ht[#ht+1] = 'AJ1-' .. tostring(i) end + +t[100]=table.fastcopy(t[0]) +t[100].chars={'nox_alchar'} +for i,v in pairs(t) do + if i~=6 and type(i)=='number' and type(v)=='table' then -- 感嘆符以外 + if v.glue and v.glue[0] then v.glue[100] = v.glue[0] end + if v.kern and v.kern[0] then v.kern[100] = v.kern[0] end + end +end +t[200]=table.fastcopy(t[0]) +t[200].chars={'〱', '〲'} +t[200].width = 2.0 +for i,v in pairs(t) do + if type(v)=='table' then + if v.glue and v.glue[0] then v.glue[200] = v.glue[0] end + if v.kern and v.kern[0] then v.kern[200] = v.kern[0] end + end +end + +luatexja.jfont.define_jfm(t) diff --git a/macros/luatex/generic/luatexja/src/lltjext.sty b/macros/luatex/generic/luatexja/src/lltjext.sty new file mode 100644 index 0000000000..eb1087ad6b --- /dev/null +++ b/macros/luatex/generic/luatexja/src/lltjext.sty @@ -0,0 +1,758 @@ +% +% lltjext.sty: derived from plext.sty in pLaTeX. +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjext}[2018/10/07 v1.2k-ltj-10 Macros for vertical writing] +\RequirePackage{luatexja} +\newcount\ltj@ext@dir +\let\ltj@lltjext@orig@tabular=\tabular +\let\ltj@lltjext@orig@array=\array + +%%% array and tabular +\def\array{\let\@acol\@arrayacol \let\@classz\@arrayclassz + \let\@classiv\@arrayclassiv + \let\\\@arraycr\let\@halignto\@empty + \ltj@ext@dir=\ltjgetparameter{direction}\relax\X@tabarray} +\def\tabular{\let\@halignto\@empty\X@tabular} +\@namedef{tabular*}{\@ifnextchar<%> + {\p@stabular}{\p@stabular<Z>}} +{\catcode`\*=11 +\global\let\ltj@lltjext@orig@tabularS=\tabular* +}% +\def\X@tabarray{\@ifnextchar<%> + {\p@tabarray}{\p@tabarray<Z>}} +\def\X@tabular{\@ifnextchar<%> + {\p@tabular}{\p@tabular<Z>}} +\def\p@stabular<#1>#2{% + \setlength\dimen@{#2}% + \edef\@halignto{to\the\dimen@}\p@tabular<#1>} +\def\p@tabular<#1>{\leavevmode \hbox \bgroup + \ltj@ext@dir=\ltjgetparameter{direction} + $\let\@acol\@tabacol + \let\@classz\@tabclassz + \let\@classiv\@tabclassiv \let\\\@tabularcr\p@tabarray<#1>} +\def\p@tabarray<#1>{\m@th\@ifnextchar[%] + {\p@array<#1>}{\p@array<#1>[c]}} + +\def\p@array<#1>[#2]#3{% + \let\box@dir\relax + \if #1z\relax + \ifnum\ltj@ext@dir=3\relax + \let\box@dir\utod\@tempcnta=\zstrutbox + \fi + \else + \if #1y\relax + \let\box@dir\yoko\@tempcnta=\ystrutbox + \else\if #1t\relax + \let\box@dir\tate\@tempcnta=\tstrutbox + \else\if #1d\relax + \let\box@dir\dtou\@tempcnta=\dstrutbox + \else\if #1u\relax + \let\box@dir\utod\@tempcnta=\zstrutbox + \fi\fi\fi\fi + \fi + \ifx\box@dir\relax + \ifcase\ltj@ext@dir + \or \let\box@dir\dtou\@tempcnta=\dstrutbox% dtou + \or\or\let\box@dir\tate\@tempcnta=\tstrutbox% tate + \or \let\box@dir\yoko\@tempcnta=\ystrutbox% yoko + \else \let\box@dir\utod\@tempcnta=\zstrutbox% utod + \fi + \fi + \fork@array@option<#1>[#2]\@begin@alignbox + \bgroup\box@dir\adjustbaseline + \setbox\@arstrutbox\hbox{% + \box@dir + \vrule\@height\arraystretch\ltjgetht\@tempcnta + \@depth\arraystretch\ltjgetdp\@tempcnta \@width\z@}% + \@mkpream{#3}\edef\@preamble{\ialign \noexpand\@halignto + \bgroup\@arstrut \@preamble \tabskip\z@skip \cr}% + \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox + \let\tabularnewline\\% + \let\par\@empty + \let\@sharp##% + \set@typeset@protect + \lineskip\z@skip\baselineskip\z@skip + \ifhmode \@preamerr\z@ \@@par\fi + \@preamble} +\def\endarray{\crcr\egroup\egroup\@end@alignbox} +\def\endtabular{\endarray$\egroup} +\expandafter \let \csname endtabular*\endcsname = \endtabular +% ↓中身\周囲→ yoko tate utod dtou +% yoko A* B* B B +% tate B* A* D C +% utod B D* A C +% dtou B C C A +% A: 周囲と中身の組方向が一致.そのまま \vtop/\vcenter/\vbox +% B: 周囲と中身が90度ずれ.上端/下端がベースラインに揃うように +% C: 周囲と中身が180度ずれ.\vtop, \vbox 入れ替え +% D: 欧文ベースライン同士を揃えるようにする + +\def\fork@array@option@@A#1{% + \let\@end@alignbox\relax + \if #1t\relax \let\@begin@alignbox\vtop + \else\if #1b\relax\let\@begin@alignbox\vbox + \else \let\@begin@alignbox\vcenter + \fi\fi} +\def\fork@array@option@@B#1{% + \if #1t\relax + \def\@begin@alignbox{\vtop\bgroup\kern\z@\vbox}% + \let\@end@alignbox\egroup + \else\if #1b\relax + \def\@begin@alignbox{\vbox\bgroup\vbox}% + \def\@end@alignbox{\kern\z@\egroup}% + \else + \let\@begin@alignbox\vcenter + \let\@end@alignbox\relax + \fi\fi} +\def\fork@array@option@@C#1{% + \let\@end@alignbox\relax + \if #1t\relax \let\@begin@alignbox\vbox + \else\if #1b\relax\let\@begin@alignbox\vtop + \else \let\@begin@alignbox\vcenter + \fi\fi} +\def\fork@array@option<#1>[#2]{% +\ifnum\ltj@ext@dir=4 % yoko + \ifx\box@dir\yoko \fork@array@option@@A{#2}% + \else \fork@array@option@@B{#2}% + \fi +\else\ifnum\ltj@ext@dir=1 % dtou + \ifx\box@dir\yoko \fork@array@option@@B{#2}% + \else\ifx\box@dir\dtou \fork@array@option@@A{#2}% + \else \fork@array@option@@C{#2}% + \fi\fi +\else\ifnum\ltj@ext@dir=3 % tate + \ifx\box@dir\yoko \fork@array@option@@B{#2}% + \else\ifx\box@dir\tate \fork@array@option@@A{#2}% + \else\ifx\box@dir\dtou \fork@array@option@@C{#2}% + \else + \if #2t\relax + \def\@begin@alignbox{\lower\dimexpr + \ltjgetparameter{talbaselineshift}-\ltjgetparameter{yalbaselineshift}\vtop} + \let\@end@alignbox\relax + \else\if #2b\relax + \def\@begin@alignbox{\lower\dimexpr + \ltjgetparameter{talbaselineshift}-\ltjgetparameter{yalbaselineshift}\vbox} + \let\@end@alignbox\relax + \else + \let\@begin@alignbox\vcenter + \let\@end@alignbox\relax + \fi\fi + \fi\fi\fi +\else % utod + \ifx\box@dir\yoko \fork@array@option@@B{#2}% + \else\ifx\box@dir\utod \fork@array@option@@A{#2}% + \else\ifx\box@dir\dtou \fork@array@option@@C{#2}% + \else + \if #2t\relax + \def\@begin@alignbox{\lower\dimexpr + \ltjgetparameter{yalbaselineshift}-\ltjgetparameter{talbaselineshift}\vtop} + \let\@end@alignbox\relax + \else\if #2b\relax + \def\@begin@alignbox{\lower\dimexpr + \ltjgetparameter{yalbaselineshift}-\ltjgetparameter{talbaselineshift}\vbox} + \let\@end@alignbox\relax + \else + \let\@begin@alignbox\vcenter + \let\@end@alignbox\relax + \fi\fi + \fi\fi\fi +\fi\fi\fi} + +%%% caption +\newbox\@floatbox +\newdimen\floatwidth +\newdimen\floatheight +\newdimen\floatruletick \floatruletick=0.4pt +\newdimen\captionfloatsep \captionfloatsep=10pt +\def\caption@dir{Z} +\let\captiondir\relax +\newdimen\captionwidth \captionwidth\z@ +\def\caption@posa{Z} +\def\caption@posb{Z} +\newbox\@captionbox +\def\captionfontsetup{\normalfont\normalsize} +\def\layoutfloat{\@ifnextchar(%) + {\X@layoutfloat}{\X@layoutfloat(-5\p@,-5\p@)}} +\def\X@layoutfloat(#1,#2){\@ifnextchar[%] + {\@layoutfloat(#1,#2)}{\@layoutfloat(#1,#2)[c]}} +\long\def\@layoutfloat(#1,#2)[#3]#4{% + \setbox\z@\hbox{#4}% + \floatwidth=#1 \floatheight=#2 \edef\float@pos{#3}% + \ifdim\floatwidth<\z@ + \floatwidth\ltjgetwd\z@\floatruletick\z@ + \fi + \ifdim\floatheight<\z@ + \floatheight\ltjgetht\z@\advance\floatheight\ltjgetdp\z@\relax + \floatruletick\z@ + \fi + \setbox\@floatbox\vbox to\floatheight{\offinterlineskip + \hrule width\floatwidth height\floatruletick depth\z@ + \vss\hbox to\floatwidth{% + \vrule width\floatruletick height\floatheight depth\z@ + \hss\vbox to\floatheight{\hsize\floatwidth\vss#4\vss}\hss + \vrule width\floatruletick height\floatheight depth\z@ + }\hrule width\floatwidth height\floatruletick depth\z@}} +\def\DeclareLayoutCaption#1<#2>(#3)[#4#5]{% + \expandafter + \ifx\csname #1@layoutc@ption\endcsname\relax \else + \@latex@info{Redeclaring capiton layout setting of '#1'}% + \fi + \expandafter + \gdef\csname #1@layoutc@ption\endcsname{% + \if Z\caption@dir\def\caption@dir{#2}\fi + \ifdim\captionwidth=\z@ \captionwidth=#3\relax\fi + \if Z\caption@posa\def\caption@posa{#4}\fi + \if Z\caption@posb\def\caption@posb{#5}\fi}} +\@onlypreamble\DeclareLayoutCaption +\DeclareLayoutCaption{figure}<n>(.8\linewidth)[cd] +\DeclareLayoutCaption{table}<n>(.8\linewidth)[cu] +\def\layoutcaption{\def\caption@dir{Z}\captionwidth\z@ + \def\caption@posa{Z}\def\caption@posb{Z}% + \@ifnextchar<\X@layoutcaption{% + \@ifnextchar(\@ilayoutcaption{% + \@ifnextchar[\@iilayoutcaption\relax}}} +\def\X@layoutcaption<#1>{\def\caption@dir{#1}% + \@ifnextchar(\@ilayoutcaption{% + \@ifnextchar[\@iilayoutcaption\relax}} +\def\@ilayoutcaption(#1){\setlength\captionwidth{#1}% + \@ifnextchar[{\@iilayoutcaption}{\relax}} +\def\@iilayoutcaption[#1#2]{% + \def\caption@posa{#1}\def\caption@posb{#2}} +\def\pcaption{% + \ifx\@captype\@undefined + \@latex@error{\noexpand\pcaption outside float}\@ehd + \expandafter\@gobble + \else + \refstepcounter\@captype + \expandafter\@firstofone + \fi + {\@dblarg{\@pcaption\@captype}}% +} +\long\def\@pcaption#1[#2]#3{% + \addcontentsline{\csname ext@#1\endcsname}{#1}{% + \protect\numberline{\csname the#1\endcsname}{\ignorespaces#2}}% + \ifvoid\@floatbox + \@latex@error{Use \noexpand\pcaption with `\protect\layoutfloat'}\@eha + \fi + \make@pcaptionbox{#3}% + \@pboxswfalse + \setbox\@tempboxa\vbox{\hbox to\hsize{\if l\float@pos\else\hss\fi + \if l\caption@posb\box\@captionbox\kern\captionfloatsep\fi + \if t\caption@posa\vtop + \else\if b\caption@posa\vbox + \else\@pboxswtrue $\vcenter \fi\fi + {\if u\caption@posb\box\@captionbox\kern\captionfloatsep\fi + \unvbox\@floatbox + \if d\caption@posb\kern\captionfloatsep\box\@captionbox\fi}% + \if@pboxsw \m@th$\fi + \if r\caption@posb\kern\captionfloatsep\box\@captionbox\fi + \if r\float@pos\else\hss\fi}}% + \par\vskip.25\baselineskip + \box\@tempboxa} +\def\make@pcaptionbox#1{% + \expandafter + \ifx\csname\@captype @layoutc@ption\endcsname\relax + \@latex@warning{Default caption layout of `\@captype' unknown.}% + \def\caption@dir{Z}\captionwidth\z@ + \def\caption@posa{Z}\def\caption@posb{Z}% + \else + \csname \@captype @layoutc@ption\endcsname + \fi + \@tempswafalse + % \@tempswa: 基本組の組方向とキャプションの組方向が直交するか? + \if y\caption@dir \let\captiondir\yoko + \ifodd\ltjgetparameter{direction}\relax\@tempswatrue\fi + \else\if z\caption@dir \let\captiondir\relax + \ifnum\ltjgetparameter{direction}=3\relax\let\captiondir\utod\fi + \else\if d\caption@dir \let\captiondir\dtou + \ifodd\ltjgetparameter{direction}\else\@tempswatrue\fi + \else\if u\caption@dir \let\captiondir\utod + \ifodd\ltjgetparameter{direction}\else\@tempswatrue\fi + \else\if t\caption@dir \let\captiondir\tate + \ifodd\ltjgetparameter{direction}\else\@tempswatrue\fi + \fi\fi\fi\fi\fi + \setbox0\hbox{\hbox{\captiondir + \captionfontsetup\parindent\z@\inhibitglue + \csname fnum@\@captype\endcsname #1}}%" + \if@tempswa\@tempdima\ltjgetht0 \advance\@tempdima\ltjgetdp0 + \else\@tempdima\ltjgetwd0 \fi + \ifdim\@tempdima>\captionwidth \@tempdima\captionwidth \fi + \@pboxswfalse + \setbox0\hbox{% + \if u\caption@posb\vbox + \else\if d\caption@posb\vbox + \else\if t\caption@posa\vtop + \else\if b\caption@posa\vbox + \else\ifmmode\vcenter\else\@pboxswtrue $\vcenter\fi + \fi\fi\fi\fi + {\hsize\@tempdima\kern\z@ + \vbox{\captiondir\hsize\@tempdima + \captionfontsetup\parindent\z@\inhibitglue + \csname fnum@\@captype\endcsname #1}\kern\z@ + }\if@pboxsw \m@th$\fi}% + \let\to@captionboxwidth\relax + \if l\caption@posb \else\if r\caption@posb\else + \def\to@captionboxwidth{to\floatwidth}\fi\fi + \setbox\@captionbox\hbox\to@captionboxwidth{% + \if t\caption@posa\else\hss\fi + \unhbox0\relax + \if b\caption@posa\else\hss\fi}} + +%%% minipage and parbox +\def\minipage{\@ifnextchar<%> + {\X@minipage}{\X@minipage<Z>}} +\def\X@minipage<#1>{\@ifnextchar[%] + {\@iminipage<#1>}{\@iiiminipage<#1>{c}\relax[s]}} +\def\@iminipage<#1>[#2]{\@ifnextchar[%] + {\@iiminipage<#1>{#2}}{\@iiiminipage<#1>{#2}\relax[s]}} +\def\@iiminipage<#1>#2[#3]{\@ifnextchar[%] + {\@iiiminipage<#1>{#2}{#3}}{\@iiiminipage<#1>{#2}{#3}[#2]}} +\def\@iiiminipage<#1>#2#3[#4]#5{% + \leavevmode\bgroup + \setlength\@tempdima{#5}% + \def\@mpargs{<#1>{#2}{#3}[#4]{#5}}% + \let\box@dir\relax + \if #1z\relax + \ifnum\ltjgetparameter{direction}=3\relax + \let\box@dir\utod + \fi + \else + \if #1y\relax \let\box@dir\yoko + \else\if #1t\relax\let\box@dir\tate + \else\if #1d\relax\let\box@dir\dtou + \else\if #1u\relax\let\box@dir\utod + \fi\fi\fi\fi + \fi + \ifx\box@dir\relax + \ifcase\ltjgetparameter{direction}\relax + \or \let\box@dir\dtou + \or\or\let\box@dir\tate + \or \let\box@dir\yoko + \else \let\box@dir\utod + \fi + \fi + \setbox\@tempboxa\vbox\bgroup\box@dir + \adjustbaseline + \color@begingroup + \hsize\@tempdima + \textwidth\hsize \columnwidth\hsize + \@parboxrestore + \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}% + \c@mpfootnote\z@ + \let\@footnotetext\@mpfootnotetext + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \@minipagerestore + \@setminipage} +\def\endminipage{% + \par + \unskip + \ifvoid\@mpfootins\else + \vskip\skip\@mpfootins + \normalcolor + \footnoterule + \unvbox\@mpfootins + \fi + \@minipagefalse %% added 24 May 89 + \color@endgroup + \egroup + \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}\egroup} +\DeclareRobustCommand\parbox{\@ifnextchar<%> + {\X@parbox}{\X@parbox<Z>}} +\def\X@parbox<#1>{\@ifnextchar[%] + {\@iparbox<#1>}{\@iiiparbox<#1>{c}\relax[s]}} +\def\@iparbox<#1>[#2]{\@ifnextchar[%] + {\@iiparbox<#1>{#2}}{\@iiiparbox<#1>{#2}\relax[s]}} +\def\@iiparbox<#1>#2[#3]{\@ifnextchar[%]% + {\@iiiparbox<#1>{#2}{#3}}{\@iiiparbox<#1>{#2}{#3}[#2]}} +\long\def\@iiiparbox<#1>#2#3[#4]#5#6{% + \leavevmode + \setlength\@tempdima{#5}% + \fork@parbox@option<#1>[#2]% + \@begin@tempboxa\vbox{\box@dir + \hsize\@tempdima\@parboxrestore\adjustbaseline#6\@@par}% + \ifx\relax#3\else + \setlength\@tempdimb{#3}% + \edef\@parboxto{to\the\@tempdimb}% + \fi + \@begin@parbox\@parboxto{\box@dir\adjustbaseline + \let\hss\vss\let\unhbox\unvbox + \csname bm@#4\endcsname}\@end@parbox + \@end@tempboxa} + + +% ↓中身\周囲→ yoko tate utod dtou +% yoko A* B* B B +% tate B* A* D C +% utod B D* A C +% dtou B C C A +% A: 周囲と中身の組方向が一致.そのまま \vtop/\vcenter/\vbox +% B: 周囲と中身が90度ずれ.上端が和文の高さ or 下端が和文の深さに揃うように +% C: 周囲と中身が180度ずれ.(コードは B のものを流用) +% D: 上端が和文の高さ or 下端が和文の深さに揃うように(コードは B のものを流用) + +\def\fork@parbox@option@@A#1{% + \let\@end@parbox\relax + \if #1t\relax \let\@begin@parbox\vtop + \else\if #1b\relax\let\@begin@parbox\vbox + \else + \ifmmode + \let\@begin@parbox\vcenter\let\@end@parbox\relax + \else + \def\@begin@parbox{\null$\vcenter}% + \def\@end@parbox{\m@th$\null}% + \fi + \fi\fi} +\def\lltjext@getjablshift{% + \ifnum\ltj@ext@dir=3 \ltjgetparameter{tjabaselineshift}\else + \ltjgetparameter{yjabaselineshift}\fi} +\def\fork@parbox@option@@B#1{% + \if #1t\relax + \def\@begin@parbox{\raise\dimexpr\cht-\lltjext@getjablshift\vtop\bgroup\kern\z@\vbox}% + \let\@end@parbox\egroup + \else\if #1b\relax + \def\@begin@parbox{\lower\dimexpr\cdp+\lltjext@getjablshift\vbox\bgroup\vbox}% + \def\@end@parbox{\kern\z@\egroup}% + \else + \ifmmode + \let\@begin@parbox\vcenter\let\@end@parbox\relax + \else + \def\@begin@parbox{\null$\vcenter}% + \def\@end@parbox{\m@th$\null}% + \fi + \fi\fi} +\let\fork@parbox@option@@C=\fork@parbox@option@@B +\def\fork@parbox@option<#1>[#2]{% + \let\box@dir\relax \ltj@ext@dir=\ltjgetparameter{direction}\relax + \if #1z\relax + \ifnum\ltj@ext@dir=3\relax + \let\box@dir\utod + \fi + \else + \if #1y\relax \let\box@dir\yoko + \else\if #1t\relax\let\box@dir\tate + \else\if #1d\relax\let\box@dir\dtou + \else\if #1u\relax\let\box@dir\utod + \fi\fi\fi\fi + \fi + \ifx\box@dir\relax + \ifcase\ltj@ext@dir + \or \let\box@dir\dtou + \or\or\let\box@dir\tate + \or \let\box@dir\yoko + \else \let\box@dir\utod + \fi + \fi +\ifnum\ltj@ext@dir=4 % yoko + \ifx\box@dir\yoko \fork@parbox@option@@A{#2}% + \else \fork@parbox@option@@B{#2}% + \fi +\else\ifnum\ltj@ext@dir=1 % dtou + \ifx\box@dir\yoko \fork@parbox@option@@B{#2}% + \else\ifx\box@dir\dtou \fork@parbox@option@@A{#2}% + \else \fork@parbox@option@@C{#2}% + \fi\fi +\else\ifnum\ltj@ext@dir=3 % tate + \ifx\box@dir\yoko \fork@parbox@option@@B{#2}% + \else\ifx\box@dir\tate \fork@parbox@option@@A{#2}% + \else\ifx\box@dir\dtou \fork@parbox@option@@C{#2}% + \else \fork@parbox@option@@B{#2}% D + \fi\fi\fi +\else % utod + \ifx\box@dir\yoko \fork@parbox@option@@B{#2}% + \else\ifx\box@dir\utod \fork@parbox@option@@A{#2}% + \else\ifx\box@dir\dtou \fork@parbox@option@@C{#2}% + \else \fork@parbox@option@@B{#2}% D + \fi\fi\fi +\fi\fi\fi} + +%%% pbox +\DeclareRobustCommand\pbox{\leavevmode\@ifnextchar<{\X@makePbox}{\X@makePbox<Z>}} +\def\X@makePbox<#1>{% + \@ifnextchar[{\@imakePbox<#1>}{\@imakePbox<#1>[-5\p@]}} +\def\@imakePbox<#1>[#2]{\@ifnextchar[%] + {\@iimakePbox<#1>{#2}}{\@iimakePbox<#1>{#2}[c]}} +\def\@iimakePbox<#1>#2[#3]#4{% + \bgroup\let\box@dir\relax + \if #1z\relax + \ifnum\ltjgetparameter{direction}=3 \relax + \let\box@dir\utod + \fi + \else + \if #1y\relax \let\box@dir\yoko + \else\if #1t\relax\let\box@dir\tate + \else\if #1d\relax\let\box@dir\dtou + \else\if #1u\relax\let\box@dir\utod + \fi\fi\fi\fi + \fi + \ifx\box@dir\relax + \ifcase\ltjgetparameter{direction} + \or \let\box@dir\dtou + \or\or\let\box@dir\tate + \or \let\box@dir\yoko + \else \let\box@dir\utod + \fi + \fi + \setlength{\@tempdima}{#2}% + \ifdim\@tempdima<\z@ \hbox{\box@dir#4}\else + \hb@xt@\@tempdima{\box@dir + \if #3l\relax\else\hss\fi + #4\relax + \if #3r\relax\else\hss\fi}\fi\egroup} + +%%% picture +\def\picture{\@ifnextchar<%> + {\X@picture}{\X@picture<Z>}} +\def\X@picture<#1>(#2,#3){\@ifnextchar(%) + {\@@picture<#1>(#2,#3)}{\@@picture<#1>(#2,#3)(0,0)}} +\newdimen\@picwd +\def\ltj@@pic@reset@blshift{% + \ltj@yablshift\z@\ltj@ykblshift\z@ + \ltj@tablshift\z@\ltj@tkblshift\z@ +}% +\def\@@picture<#1>(#2,#3)(#4,#5){% + \edef\ltj@@pic@save@blshift{% + \noexpand\ltj@yablshift\the\ltj@yablshift\noexpand\relax + \noexpand\ltj@ykblshift\the\ltj@ykblshift\noexpand\relax + \noexpand\ltj@tablshift\the\ltj@tablshift\noexpand\relax + \noexpand\ltj@tkblshift\the\ltj@tkblshift\noexpand\relax + }% + \bgroup\let\box@dir\relax + \if #1z\relax + \ifnum\ltjgetparameter{direction}=3 \relax + \let\box@dir\utod + \fi + \else + \if #1y\relax \let\box@dir\yoko + \else\if #1t\relax\let\box@dir\tate + \else\if #1d\relax\let\box@dir\dtou + \else\if #1u\relax\let\box@dir\utod + \fi\fi\fi\fi + \fi + \ifx\box@dir\relax + \ifcase\ltjgetparameter{direction} + \or \let\box@dir\dtou + \or\or\let\box@dir\tate + \or \let\box@dir\yoko + \else \let\box@dir\utod + \fi + \fi + \@picwd=#2\unitlength \@picht=#3\unitlength + \setbox\@picbox\hbox to\@picwd\bgroup\box@dir + \hskip-#4\unitlength\lower#5\unitlength\hbox\bgroup + \ltj@@pic@reset@blshift + \ignorespaces} +\def\endpicture{% + \egroup\hss\egroup + \setbox0=\hbox{\box@dir% + \ltjsetht\@picbox\@picht \ltjsetdp\@picbox\z@ + }% + \@tempswafalse + \ifnum\ltjgetparameter{direction}=3 \@tempswatrue\fi + \ifnum\ltjgetparameter{direction}=11 \@tempswatrue\fi + \if@tempswa + \ifx\box@dir\yoko % この場合だけ垂直位置補正が必要 + \ltjsetht\@picbox\dimexpr\ltjgetht\@picbox+\ltjgetdp\@picbox\relax + \ltjsetdp\@picbox\z@ + \fi + \fi + \mbox{\box\@picbox}% + \egroup\ltj@@pic@save@blshift} +\let\org@put\put +\def\put{\ltj@@pic@reset@blshift\org@put} +\let\org@line\line +\def\line{\ltj@@pic@reset@blshift\org@line} +\let\org@vector\vector +\def\vector{\ltj@@pic@reset@blshift\org@vector} +\let\org@dashbox\dashbox +\def\dashbox{\ltj@@pic@reset@blshift\org@dashbox} +\let\org@oval\oval +\def\oval{\ltj@@pic@reset@blshift\org@oval} +\let\org@circle\circle +\def\circle{\ltj@@pic@reset@blshift\org@circle} + +%%% rensuji +\newif\ifnot@advanceline +\newskip\rensujiskip +\rensujiskip=0.25\chs plus.25\zw minus.25\zw +\DeclareRobustCommand\rensuji{% + \@ifstar{\not@advancelinetrue\@rensuji}{\@rensuji}} +\def\@rensuji{\@ifnextchar[{\@@rensuji}{\@@rensuji[c]}} +\def\@@rensuji[#1]#2{% + \ifvmode\leavevmode\fi + \ifnum\ltjgetparameter{direction}=4\relax\hbox{#2}\else + \hskip\rensujiskip + \setbox\tw@\hbox{漢}% 「あ」では仮名書体使用時がまずそう + \@tempdimb\ltjgetht\tw@ \advance\@tempdimb\ltjgetdp\tw@ + \ifnot@advanceline\not@advancelinefalse\else + \setbox\z@\hbox{\yoko#2}% + \@tempdima\ltjgetht\z@ \advance\@tempdima\ltjgetdp\z@ + \ifnum\ltjgetparameter{direction}=1\relax + % 周囲が dtou の場合には,高さ \ltjgetht\tw@, 深さ \ltjgetdp\tw@ のボックスを基準としている. + \if #1c\relax\vrule \@width \z@ \@height\dimexpr.5\@tempdima+.5\ltjgetht\tw@-.5\ltjgetdp\tw@ + \@depth\dimexpr.5\@tempdima-.5\ltjgetht\tw@+.5\ltjgetdp\tw@ + \else\if #1l\relax\vrule\@width \z@\@height\ltjgetht\tw@ \@depth\dimexpr\@tempdima-\ltjgetht\tw@ + \else\vrule\@width \z@ \@height\dimexpr\@tempdima-\ltjgetdp\tw@ \@depth\ltjgetdp\tw@ + \fi\fi + \else + % 周囲が tate, utod の場合も同じ + \if #1c\relax\vrule \@width \z@ \@height\dimexpr.5\@tempdima+.5\ltjgetht\tw@-.5\ltjgetdp\tw@ + \@depth\dimexpr.5\@tempdima-.5\ltjgetht\tw@+.5\ltjgetdp\tw@ + \else\if #1r\relax\vrule\@width \z@\@height\ltjgetht\tw@ \@depth\dimexpr\@tempdima-\ltjgetht\tw@ + \else\vrule\@width \z@ \@height\dimexpr\@tempdima-\ltjgetdp\tw@ \@depth\ltjgetdp\tw@ + \fi\fi + \fi + \fi + \ifnum\ltjgetparameter{direction}=1\relax + \if #1c\relax\hbox to\@tempdimb{\yoko\hss#2\hss\kern-\ltjgetdp\tw@}% + \else\if #1r\relax\vbox{\hbox to\@tempdimb{\yoko\hss#2\kern-\ltjgetdp\tw@}}% + \else\lower\ltjgetdp\tw@\vtop{\hbox to\@tempdimb{\yoko#2\hss}}% + \fi\fi + \else + \if #1c\relax\raise\dimexpr.5\@tempdimb-\ltjgetdp\tw@ + \hbox to\@tempdimb{\yoko \hss#2\hss}% + \else\if #1r\relax\raise\dimexpr.5\@tempdimb-\ltjgetdp\tw@ + \vbox{\hbox to\@tempdimb{\yoko\hss#2}}% + \else\raise\dimexpr.5\@tempdimb-\ltjgetdp\tw@ + \vtop{\hbox to\@tempdimb{\yoko #2\hss}}% + \fi\fi + \fi + \hskip\rensujiskip +\fi} +\let\Rensuji\rensuji +\let\prensuji\rensuji + +%%% kanji +\def\Kanji#1{\expandafter\@Kanji\csname c@#1\endcsname} +\def\@Kanji#1{\kansuji #1} +\def\kanji{\ifnum\ltjgetparameter{direction}=3 \expandafter\kansuji\fi} + +%%% bou +%%% +\def\boutenchar{\char\euc"A1A2}%" +\def\bou#1{\ifvmode\leavevmode\fi\@bou#1\end} +\def\@bou#1{% + \ifx#1\end \let\ltj@@next=\relax + \else + \ifnum\ltjgetparameter{direction}=3\relax + \hbox to\z@{\vbox to\z@{\boxmaxdepth\maxdimen + \vss\moveleft0.2\zw\hbox{\yoko\boutenchar}\nointerlineskip + \hbox{\char\euc"A1A1}}\hss}\nobreak#1\relax + \else + \hbox to\z@{\vbox to\z@{\boxmaxdepth\maxdimen + \vss\moveleft-0.2\zw\hbox{\boutenchar}\nointerlineskip + \hbox{\char\euc"A1A1}}\hss}\nobreak#1\relax + \fi + \let\ltj@@next=\@bou + \fi\ltj@@next} + +%%% kasen +\def\kasen#1{% + \ifnum\ltjgetparameter{direction}=3\relax + \setbox\z@\hbox{#1}\leavevmode\raise.7\zw + \hbox to\z@{\vrule\@width\wd\z@ \@depth\z@ \@height.4\p@\hss}% + \box\z@ + \else\underline{#1}\fi} + +%%% references +\def\@eqnnum{{\reset@font\rmfamily \normalcolor + \ifnum\ltjgetparameter{direction}=11\raise.25\zh\hbox{\yoko(\theequation)}% + \else (\theequation)\fi}} +\def\@thecounter#1{\noexpand\rensuji{\noexpand\arabic{#1}}} +\def\@thmcounter#1{\noexpand\rensuji{\noexpand\arabic{#1}}} + +%% Compatibility with array package + +\def\ltj@lltjext@patch@array{% + \patchcmd{\@tabular}{\hbox\bgroup}{% + \hbox\bgroup\ltj@ext@dir=\ltjgetparameter{direction}}{}{} + \pretocmd{\array}% + {\ltj@ext@dir=\ltjgetparameter{direction}\relax}{}{} + \expandafter\let\csname tabular*\endcsname=\ltj@lltjext@orig@tabularS + \patchcmd{\p@stabular}{\p@tabular}{\@tabular}{}{} + \@ifpackagelater{array}{2018/09/13} + {\expandafter\@firstoftwo} + {\expandafter\@secondoftwo} + {% = for 2018/09/13 v2.4i or newer + \def\@startpbox##1{\bgroup + \color@begingroup + \box@dir\adjustbaseline%%% これを追加 + \setlength\hsize{##1}\@arrayparboxrestore + \everypar{% + \vrule \@height \ltjgetht\@arstrutbox \@width \z@ + \everypar{}}% + }% + }{ % = for 2018/04/30 v2.4h or older + \def\@startpbox##1{\bgroup + \box@dir\adjustbaseline%%% これを追加 + \setlength\hsize{##1}\@arrayparboxrestore + \everypar{% + \vrule \@height \ltjgetht\@arstrutbox \@width \z@ + \everypar{}}% + }% + }% + \def\@tabarray{\@ifnextchar<\p@tabarray{\p@tabarray<z>}} + \def\p@array<##1>[##2]##3{% + \let\box@dir\relax + \if ##1z\relax + \ifnum\ltj@ext@dir=3\relax + \let\box@dir\utod\@tempcnta=\zstrutbox + \fi + \else + \if ##1y\relax + \let\box@dir\yoko\@tempcnta=\ystrutbox + \else\if ##1t\relax + \let\box@dir\tate\@tempcnta=\tstrutbox + \else\if ##1d\relax + \let\box@dir\dtou\@tempcnta=\dstrutbox + \else\if ##1u\relax + \let\box@dir\utod\@tempcnta=\zstrutbox + \fi\fi\fi\fi + \fi + \ifx\box@dir\relax + \ifcase\ltj@ext@dir + \or \let\box@dir\dtou\@tempcnta=\dstrutbox% dtou + \or\or\let\box@dir\tate\@tempcnta=\tstrutbox% tate + \or \let\box@dir\yoko\@tempcnta=\ystrutbox% yoko + \else \let\box@dir\utod\@tempcnta=\zstrutbox% utod + \fi + \fi + \setbox \@arstrutbox \hbox{\box@dir\vrule + \@height \arraystretch + \dimexpr \ltjgetht\@tempcnta+\extrarowheight\relax + \@depth \arraystretch \ltjgetdp \@tempcnta + \@width \z@}% + \fork@array@option<##1>[##2]% + \begingroup + \@mkpream{##3}% + \xdef\@preamble{\ialign \noexpand \@halignto + \bgroup \tabskip \z@skip \@arstrut \@preamble + \tabskip \z@ \cr}% + \endgroup + \@arrayleft + \@begin@alignbox\bgroup\box@dir\adjustbaseline + \let\par\@empty + \let\@sharp####\let\protect\relax + \let\\\@arraycr\let\tabularnewline\\\let\par\@empty + \lineskip\z@skip\baselineskip\z@skip\@preamble} + \def\endarray{\crcr\egroup\egroup\@end@alignbox\@arrayright} +} + +\@ifpackageloaded{array}{% + \let\tabular=\ltj@lltjext@orig@tabular + \let\array=\ltj@lltjext@orig@array + \ltj@lltjext@patch@array +}{% + \let\ltj@lltjext@orig@tabular\relax + \let\ltj@lltjext@orig@array\relax + \RequirePackage{filehook,etoolbox} + \AtEndOfPackageFile{array}{\ltj@lltjext@patch@array} +} + +%%%%%%%%%%%%%%%% LuaTeX-ja original + +%%\define@key[ltj]{japaram}{autouprightnum}{% %COUNT +%% \ltj@@set@stack{AURN}{0}{10000}\z@#1 } + +\endinput diff --git a/macros/luatex/generic/luatexja/src/ltj-adjust.lua b/macros/luatex/generic/luatexja/src/ltj-adjust.lua new file mode 100644 index 0000000000..3d7e31e0c4 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-adjust.lua @@ -0,0 +1,551 @@ +-- +-- ltj-adjust.lua +-- +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('jfont'); local ltjf = luatexja.jfont +luatexja.load_module('jfmglue'); local ltjj = luatexja.jfmglue +luatexja.load_module('stack'); local ltjs = luatexja.stack +luatexja.load_module('direction'); local ltjd = luatexja.direction +luatexja.load_module('lineskip'); local ltjl = luatexja.lineskip +luatexja.adjust = luatexja.adjust or {} + +local to_node = node.direct.tonode +local to_direct = node.direct.todirect + +local setfield = node.direct.setfield +local setglue = luatexja.setglue +local getfield = node.direct.getfield +local getlist = node.direct.getlist +local getid = node.direct.getid +local getfont = node.direct.getfont +local getsubtype = node.direct.getsubtype + +local node_traverse_id = node.direct.traverse_id +local node_new = node.direct.new +local node_next = node.direct.getnext +local node_free = node.direct.free +local node_prev = node.direct.getprev +local node_tail = node.direct.tail +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local insert_after = node.direct.insert_after + +local id_glyph = node.id('glyph') +local id_kern = node.id('kern') +local id_hlist = node.id('hlist') +local id_glue = node.id('glue') +local id_whatsit = node.id('whatsit') +local id_penalty = node.id('penalty') +local attr_icflag = luatexbase.attributes['ltj@icflag'] +local attr_jchar_class = luatexbase.attributes['ltj@charclass'] +local lang_ja = luatexja.lang_ja + +local ltjf_font_metric_table = ltjf.font_metric_table +local ipairs, pairs = ipairs, pairs + +local PACKED = luatexja.icflag_table.PACKED +local LINEEND = luatexja.icflag_table.LINEEND +local FROM_JFM = luatexja.icflag_table.FROM_JFM +local KANJI_SKIP = luatexja.icflag_table.KANJI_SKIP +local KANJI_SKIP_JFM = luatexja.icflag_table.KANJI_SKIP_JFM +local XKANJI_SKIP = luatexja.icflag_table.XKANJI_SKIP +local XKANJI_SKIP_JFM = luatexja.icflag_table.XKANJI_SKIP_JFM + +local get_attr_icflag +do + local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG + get_attr_icflag = function(p) + return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG + end +end + +local priority_num = { 0, 0 } +local at2pr = { {}, {} } +local at2pr_st, at2pr_sh = at2pr[1], at2pr[2] +do + local priority_table = {{},{}} + luatexja.adjust.priority_table = priority_table + local tmp = {} + local function cmp(a,b) return a[1]>b[1] end -- 大きいほうが先! + local function make_priority_table(glue_sign) + for i,_ in pairs(tmp) do tmp[i]=nil end + if glue_sign==2 then -- shrink + for i=0,63 do tmp[#tmp+1] = { (i%8)-4, FROM_JFM+i } end + else -- stretch + for i=0,63 do tmp[#tmp+1] = { math.floor(i/8)-4, FROM_JFM+i } end + end + local pt = priority_table[glue_sign] + tmp[#tmp+1] = { pt[2]/10, XKANJI_SKIP } + tmp[#tmp+1] = { pt[2]/10, XKANJI_SKIP_JFM } + tmp[#tmp+1] = { pt[1]/10, KANJI_SKIP } + tmp[#tmp+1] = { pt[1]/10, KANJI_SKIP_JFM } + tmp[#tmp+1] = { pt[3]/10, -1 } + table.sort(tmp, cmp) + local a, m, n = at2pr[glue_sign], 10000000, 0 + for i=1,#tmp do + if tmp[i][1]<m then n,m = n+1,tmp[i][1] end + a[tmp[i][2]] = n + end + local o = a[-1] + priority_num[glue_sign] = n + setmetatable(a, {__index = function () return o end }) + end + luatexja.adjust.make_priority_table = make_priority_table +end + +-- box 内で伸縮された glue の合計値を計算 + +local total_stsh = {{},{}} +local total_st, total_sh = total_stsh[1], total_stsh[2] +local get_total_stretched +do +local dimensions = node.direct.dimensions +function get_total_stretched(p) +-- return value: <補正値(sp)> + local ph = getlist(p) + if not ph then return 0 end + for i,_ in pairs(total_st) do total_st[i]=nil; total_sh[i]=nil end + for i=1,priority_num[1] do total_st[i]=0 end + for i=1,priority_num[2] do total_sh[i]=0 end + for i=0,4 do total_st[i*65536]=0; total_sh[i*65536]=0 end + for q in node_traverse_id(id_glue, ph) do + local a = getfield(q, 'stretch_order') + if a==0 then + local b = at2pr_st[get_attr_icflag(q)]; + total_st[b] = total_st[b]+getfield(q, 'stretch') + end + total_st[a*65536] = total_st[a]+getfield(q, 'stretch') + local a = getfield(q, 'shrink_order') + if a==0 then + local b = at2pr_sh[get_attr_icflag(q)]; + total_sh[b] = total_sh[b]+getfield(q, 'shrink') + end + total_sh[a*65536] = total_sh[a]+getfield(q, 'shrink') + end + for i=4,1,-1 do if total_st[i*65536]~=0 then total_st.order=i; break end; end + if not total_st.order then + total_st.order, total_st[-65536] = -1,0.1 -- dummy + end + for i=4,1,-1 do if total_sh[i*65536]~=0 then total_sh.order=i; break end; end + if not total_sh.order then + total_sh.order, total_sh[-65536] = -1,0.1 -- dummy + end + return getfield(p,'width') - dimensions(ph) +end +end + +-- step 1: 行末に kern を挿入(句読点,中点用) +local abs = math.abs +local ltjd_glyph_from_packed = ltjd.glyph_from_packed +local function aw_step1(p, total) + local head = getlist(p) + local x = node_tail(head); if not x then return total, false end + -- x: \rightskip + x = node_prev(x); if not x then return total, false end + local xi, xc = getid(x) + -- x may be penalty + while xi==id_penalty do + x = node_prev(x); if not x then return total, false end + xi = getid(x) + end + if (total>0 and total_st.order>0) or (total<0 and total_sh.order>0) then + -- 無限大のグルーで処理が行われているときは処理中止. + return total, false + end + if xi == id_glyph and getfield(x, 'lang')==lang_ja then + -- 和文文字 + xc = x + elseif xi == id_hlist and get_attr_icflag(x) == PACKED then + -- packed JAchar + xc = ltjd_glyph_from_packed(x) + while getid(xc) == id_whatsit do xc = node_next(xc) end -- これはなんのために? + else + return total, false-- それ以外は対象外. + end + local eadt = ltjf_font_metric_table[getfont(xc)] + .char_type[has_attr(xc, attr_jchar_class) or 0].end_adjust + if not eadt then + return total, false + end + local eadt_ratio = {} + for i, v in ipairs(eadt) do + local t = total - v + if t>0 then + eadt_ratio[i] = {i, t/total_st[65536*total_st.order], t, v} + else + eadt_ratio[i] = {i, t/total_sh[65536*total_sh.order], t, v} + end + end + table.sort(eadt_ratio, + function (a,b) + for i=2,4 do + local at, bt = abs(a[i]), abs(b[i]) + if at~=bt then return at<bt end + end + return a[4]<b[4] + end) + if eadt[eadt_ratio[1][1]]~=0 then + local kn = node_new(id_kern, 1) + setfield(kn, 'kern', eadt[eadt_ratio[1][1]]); set_attr(kn, attr_icflag, LINEEND) + insert_after(head, x, kn) + return eadt_ratio[1][3], true + else + return total, false + end +end + +-- step 1 最終行用 +local min, max = math.min, math.max +local function aw_step1_last(p, total) + local head = getlist(p) + local x = node_tail(head); if not x then return total, false end + -- x: \rightskip + pf = node_prev(x); if not x then return total, false end + if getid(pf) ~= id_glue or getsubtype(pf) ~= 15 then return total, false end + x = node_prev(node_prev(pf)); xi = getid(x) + local xi, xc = getid(x) + if xi == id_glyph and getfield(x, 'lang')==lang_ja then + -- 和文文字 + xc = x + elseif xi == id_hlist and get_attr_icflag(x) == PACKED then + -- packed JAchar + xc = ltjd_glyph_from_packed(x) + while getid(xc) == id_whatsit do xc = node_next(xc) end -- これはなんのために? + else + return total, false-- それ以外は対象外. + end + -- 続行条件1:無限の伸縮度を持つグルーは \parfillskipのみ + if total>0 and total_st.order>0 then + if total_st.order ~= getfield(pf, 'stretch_order') then return total, false end + if total_st[total_st.order*65536] ~= getfield(pf, 'stretch') then return total, false end + for i=total_st.order-1, 1, -1 do + if total_st[i*65536] ~= 0 then return total, false end + end + end + if total<0 and total_sh.order>0 then + if total_sh.order ~= getfield(pf, 'shrink_order') then return total, false end + if total_sh[total_sh.order*65536] ~= getfield(pf, 'shrink') then return total, false end + for i=total_sh.order-1, 1, -1 do + if total_sh[i*65536] ~= 0 then return total, false end + end + end + local eadt = ltjf_font_metric_table[getfont(xc)] + .char_type[has_attr(xc, attr_jchar_class) or 0].end_adjust + if not eadt then + return total, false + end + -- 続行条件2: min(eadt[1], 0)<= \parfillskip <= max(eadt[#eadt], 0) + local pfw = getfield(pf, 'width') + + (total>0 and getfield(pf, 'stretch') or -getfield(pf, 'shrink')) *getfield(p, 'glue_set') + if pfw<min(0,eadt[1]) or max(0,eadt[#eadt])<pfw then return total, false end + -- \parfillskip を 0 にする + total = total + getfield(pf, 'width') + total_st.order, total_sh.order = 0, 0 + if getfield(pf, 'stretch_order')==0 then + local i = at2pr_st[-1] + total_st[0] = total_st[0] - getfield(pf, 'stretch') + total_st[i] = total_st[i] - getfield(pf, 'stretch') + total_st.order = (total_st[0]==0) and -1 or 0 + end + if getfield(pf, 'shrink_order')==0 then + local i = at2pr_sh[-1] + total_sh[0] = total_sh[0] - getfield(pf, 'shrink') + total_sh[i] = total_sh[i] - getfield(pf, 'shrink') + total_sh.order = (total_sh[0]==0) and -1 or 0 + end + setfield(pf, 'subtype', 1); setglue(pf) + local eadt_ratio = {} + for i, v in ipairs(eadt) do + local t = total - v + if t>0 then + eadt_ratio[i] = {i, t/total_st[65536*total_st.order], t, v} + else + eadt_ratio[i] = {i, t/total_sh[65536*total_sh.order], t, v} + end + end + table.sort(eadt_ratio, + function (a,b) + for i=2,4 do + local at, bt = abs(a[i]), abs(b[i]) + if at~=bt then return at<bt end + end + return a[4]<b[4] + end) + if eadt[eadt_ratio[1][1]]~=0 then + local kn = node_new(id_kern, 1) + setfield(kn, 'kern', eadt[eadt_ratio[1][1]]); set_attr(kn, attr_icflag, LINEEND) + insert_after(head, x, kn) + return eadt_ratio[1][3], true + else + return total, false + end +end + + +-- step 2: 行中の glue を変える +local aw_step2, aw_step2_dummy +do +local node_hpack = node.direct.hpack +local function repack(p) + local f = node_hpack(getlist(p), getfield(p, 'width'), 'exactly') + setfield(f, 'head', nil) + setfield(p, 'glue_set', getfield(f, 'glue_set')) + setfield(p, 'glue_order', getfield(f, 'glue_order')) + setfield(p, 'glue_sign', getfield(f, 'glue_sign')) + node_free(f) + return +end +function aw_step2_dummy(p, _, added_flag) + if added_flag then return repack(p) end +end + +local function clear_stretch(p, ind, ap, name) + for q in node_traverse_id(id_glue, getlist(p)) do + local f = ap[get_attr_icflag(q)] + if f == ind then + setfield(q, name..'_order', 0) + setfield(q, name, 0) + end + end +end + +local function set_stretch(p, after, before, ind, ap, name) + if before > 0 then + local ratio = after/before + for q in node_traverse_id(id_glue, getlist(p)) do + local f = ap[get_attr_icflag(q)] + if (f==ind) and getfield(q, name..'_order')==0 then + setfield(q, name, getfield(q, name)*ratio) + end + end + end +end + +function aw_step2(p, total, added_flag) + local name = (total>0) and 'stretch' or 'shrink' + local id = (total>0) and 1 or 2 + local res = total_stsh[id] + local pnum = priority_num[id] + if total==0 or res.order > 0 then + -- もともと伸縮の必要なしか,残りの伸縮量は無限大 + if added_flag then return repack(p) end + end + total = abs(total) + for i = 1, pnum do + if total <= res[i] then + local a = at2pr[id] + for j = i+1,pnum do + clear_stretch(p, j, a, name) + end + set_stretch(p, total, res[i], i, a, name); break + end + total = total - res[i] + end + return repack(p) +end +end + +-- step 1': lineend=extended の場合(行分割時に考慮)) +local insert_lineend_kern +do + local insert_before = node.direct.insert_before + local KINSOKU = luatexja.icflag_table.KINSOKU + function insert_lineend_kern(head, nq, np, Bp) + if nq.met then + local eadt = nq.met.char_type[nq.class].end_adjust + if not eadt then return end + if eadt[1]~=0 then + local x = node_new(id_kern, 1) + setfield(x, 'kern', eadt[1]); set_attr(x, attr_icflag, LINEEND) + insert_before(head, np.first, x) + end + local eadt_num = #eadt + for i=2,eadt_num do + local x = node_new(id_penalty) + setfield(x, 'penalty', 0); set_attr(x, attr_icflag, KINSOKU) + insert_before(head, np.first, x); Bp[#Bp+1] = x + local x = node_new(id_kern, 1) + setfield(x, 'kern', eadt[i]-eadt[i-1]); set_attr(x, attr_icflag, LINEEND) + insert_before(head, np.first, x) + end + if eadt_num>1 or eadt[1]~=0 then + local x = node_new(id_penalty) + setfield(x, 'penalty', 0); set_attr(x, attr_icflag, KINSOKU) + insert_before(head, np.first, x); Bp[#Bp+1] = x + local x = node_new(id_kern, 1) + setfield(x, 'kern', -eadt[eadt_num]); set_attr(x, attr_icflag, LINEEND) + insert_before(head, np.first, x) + local x = node_new(id_penalty) + setfield(x, 'penalty', 10000); set_attr(x, attr_icflag, KINSOKU) + insert_before(head, np.first, x); Bp[#Bp+1] = x + end + end + end +end + +local adjust_width +do + local myaw_atep1, myaw_step2, myaw_step1_last + local dummy = function(p,t,n) return t, false end + local ltjs_fast_get_stack_skip = ltjs.fast_get_stack_skip + function adjust_width(head) + if not head then return head end + local last_p + for p in node_traverse_id(id_hlist, to_direct(head)) do + if last_p then + myaw_step2(last_p, myaw_step1(last_p, get_total_stretched(last_p))) + end + last_p = p + end + if last_p then + myaw_step2(last_p, myaw_step1_last(last_p, get_total_stretched(last_p))) + end + return to_node(head) + end + local is_reg = false + function enable_cb(status_le, status_pr, status_lp, status_ls) + if (status_le>0 or status_pr>0) and (not is_reg) then + ltjb.add_to_callback('post_linebreak_filter', + adjust_width, 'Adjust width', + luatexbase.priority_in_callback('post_linebreak_filter', 'ltj.lineskip')-1) + is_reg = true + elseif is_reg and (status_le==0 and status_pr==0) then + luatexbase.remove_from_callback('post_linebreak_filter', 'Adjust width') + is_reg = false + end + if status_le==2 then + if not luatexbase.in_callback('luatexja.adjust_jfmglue', 'luatexja.adjust') then + ltjb.add_to_callback('luatexja.adjust_jfmglue', insert_lineend_kern, 'luatexja.adjust') + end + myaw_step1, myaw_step1_last = dummy, aw_step1_last + else + if status_le==0 then + myaw_step1, myaw_step1_last = dummy, dummy + else + myaw_step1, myaw_step1_last = aw_step1, aw_step1_last + end + if luatexbase.in_callback('luatexja.adjust_jfmglue', 'luatexja.adjust') then + luatexbase.remove_from_callback('luatexja.adjust_jfmglue', 'luatexja.adjust') + end + end + myaw_step2 = (status_pr>0) and aw_step2 or aw_step2_dummy + luatexja.lineskip.setting( + status_lp>0 and 'profile' or 'dummy', + status_ls>0 and 'step' or 'dummy' + ) + end + function disable_cb() -- only for compatibility + enable_cs(0,0,0,0) + end + luatexja.adjust.enable_cb=enable_cb + luatexja.adjust.disable_cb=disable_cb +end + +luatexja.unary_pars.adjust = function(t) + return is_reg and 1 or 0 +end + +-- ---------------------------------- +do + local max, ins, sort = math.max, table.insert, table.sort + local function insert(package, ind, d, b, e) + local bound = package[2] + bound[b], bound[e]=true, true + ins(package[1], {b,e,[ind]=d}) + end + local function flatten(package) + local bd={} for i,_ in pairs(package[2]) do ins(bd,{i}) end + sort(bd, function (a,b) return a[1]<b[1] end) + local bdc=#bd; local t = package[1] + sort(t, function (a,b) return a[1]<b[1] end) + local bdi =1 + for i=1,#t do + while bd[bdi][1]<t[i][1] do bdi=bdi+1 end + local j = bdi + while j<bdc and bd[j+1][1]<=t[i][2] do + for k,w in pairs(t[i]) do + if k>=3 then + bd[j][k]=bd[j][k] and max(bd[j][k],w) or w + end + end + j=j+1 + end + end + package[2]=nil; package[1]=nil; package.flatten, package.insert=nil, nil + bd[#bd]=nil + return bd + end + function init_range() + return {{},{}, insert=insert, flatten=flatten} + end +end + +-- ----------------------------------- +luatexja.adjust.step_factor = 0.5 +luatexja.unary_pars.linestep_factor = function(t) + return luatexja.adjust.step_factor +end +luatexja.adjust.profile_hgap_factor = 1 +luatexja.unary_pars.profile_hgap_factor = function(t) + return luatexja.adjust.profile_hgap_factor +end +do + local insert = table.insert + local rangedimensions, max = node.direct.rangedimensions, math.max + local function profile_inner(box, range, ind, vmirrored, adj) + local w_acc, d_before = getfield(box,'shift'), 0 + local x = getlist(box); local xn = node_next(x) + while x do + local w, h, d + if xn then w, h, d= rangedimensions(box,x,xn) + else w, h, d= rangedimensions(box,x) end + if vmirrored then h=d end + local w_new = w_acc + w + if w>=0 then + range:insert(ind, h, w_acc-adj, w_new) + else + range:insert(ind, h, w_new-adj, w_acc) + end + w_acc = w_new; x = xn; if x then xn = node_next(x) end + end + end + function ltjl.p_profile(before, after, mirrored, bw) + local range, tls + = init_range(), luatexja.adjust.profile_hgap_factor*tex.lineskip.width + profile_inner(before, range, 3, true, tls) + profile_inner(after, range, 4, mirrored, tls) + range = range:flatten() + do + local dmax, d, hmax, h, lmin = 0, 0, 0, 0, 1/0 + for i,v in ipairs(range) do + d, h = (v[3] or 0), (v[4] or 0) + if d>dmax then dmax=d end + if h>hmax then hmax=h end + if bw-h-d<lmin then lmin=bw-h-d end + end + if lmin==1/0 then lmin = bw end + return lmin, + bw - lmin - getfield(before, 'depth') + - getfield(after, mirrored and 'depth' or 'height') + end + end +end + +do + local ltja = luatexja.adjust + local copy_glue = ltjl.copy_glue + local floor, max = math.floor, math.max + function ltjl.l_step(dist, g, adj, normal, bw, loc) + if loc=='alignment' then + return ltjl.l_dummy(dist, g, adj, normal, bw, loc) + end + if dist < tex.lineskiplimit then + local f = max(1, bw*ltja.step_factor) + copy_glue(g, tex.baselineskip, 1, normal - f * floor((dist-tex.lineskip.width)/f)) + else + copy_glue(g, tex.baselineskip, 2, normal) + end + end +end + + diff --git a/macros/luatex/generic/luatexja/src/ltj-base.lua b/macros/luatex/generic/luatexja/src/ltj-base.lua new file mode 100644 index 0000000000..4182a603c3 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-base.lua @@ -0,0 +1,403 @@ +-- +-- luatexja/ltj-base.lua +-- +local ltb = luatexbase +local tostring = tostring +local node, table, tex, token = node, table, tex, token + +local cat_lp = luatexbase.catcodetables['latex-package'] + +-------------------- +local ltjb = {} +luatexja.base = ltjb + +local public_name = 'luatexja' +local public_version = 'alpha' +ltjb.public_name = public_name +ltjb.public_version = public_version + + +-------------------- Fully-expandable error messaging +local _error_set_break, _error_set_message, _error_show +local generic_error, _generic_warn_info +local generic_warning, generic_warning_no_line +local generic_info, generic_info_no_line +local package_error, package_warning, package_warning_no_line +local package_info, package_info_no_line +local ltj_error, ltj_warning_no_line + +do +--! LaTeX 形式のエラーメッセージ(\PackageError 等)を +--! Lua 関数の呼び出しで行う. + + local LF = "\n" + local err_break = "" + local err_main = "" + local err_help = "" + + local function message_cont(str, c) + return str:gsub(err_break, LF .. c) + end + local function into_lines(str) + return str:gsub(err_break, LF):explode(LF) + end + + _error_set_break = function (str) + err_break = str + end + + _error_set_message = function (msgcont, main, help) + err_main = message_cont(main, msgcont) + err_help = into_lines(help) + end + + _error_show = function (escchar) + local escapechar = tex.escapechar + local newlinechar = tex.newlinechar + local errorcontextlines = tex.errorcontextlines + if not escchar then tex.escapechar = -1 end + tex.newlinechar = 10 + tex.errorcontextlines = -1 + tex.error(err_main, err_help) + tex.escapechar = escapechar + tex.newlinechar = newlinechar + tex.errorcontextlines = errorcontextlines + end + + local message_a = "Type H <return> for immediate help" + + generic_error = function (msgcont, main, ref, help) + local mainref = main..".\n\n"..ref.."\n"..message_a + _error_set_message(msgcont, mainref, help) + _error_show(true) + end + + _generic_warn_info = function (msgcont, main, warn, line) + local mainc = message_cont(main, msgcont) + local br = warn and "\n" or "" + local out = warn and "term and log" or "log" + local on_line = line and (" on input line "..tex.inputlineno) or "" + local newlinechar = tex.newlinechar + tex.newlinechar = -1 + texio.write_nl(out, br..main..on_line.."."..br) + tex.newlinechar = newlinechar + end + + generic_warning = function (msgcont, main) + _generic_warn_info(msgcont, main, true, true) + end + generic_warning_no_line = function (msgcont, main) + _generic_warn_info(msgcont, main, true, false) + end + generic_info = function (msgcont, main) + _generic_warn_info(msgcont, main, false, true) + end + generic_info_no_line = function (msgcont, main) + _generic_warn_info(msgcont, main, false, false) + end + + package_error = function (pkgname, main, help) + generic_error("("..pkgname.." ", + "Package "..pkgname.." Error: "..main, + "See the "..pkgname.." package documentation for explanation.", + help) + end + package_warning = function (pkgname, main) + generic_warning("("..pkgname.." ", + "Package "..pkgname.." Warning: "..main) + end + package_warning_no_line = function (pkgname, main) + generic_warning_no_line("("..pkgname.." ", + "Package "..pkgname.." Warning: "..main) + end + package_info = function (pkgname, main) + generic_info("("..pkgname.." ", + "Package "..pkgname.." Info: "..main) + end + package_info_no_line = function (pkgname, main) + generic_info_no_line("("..pkgname.." ", + "Package "..pkgname.." Info: "..main) + end + + ltj_error = function (main, help) + package_error(public_name, main, help) + end + ltj_warning_no_line = function (main) + package_warning_no_line(public_name, main, help) + end + +end +-------------------- TeX stream I/O +--! ixbase.print() と同じ +--- Extension to tex.print(). Each argument string may contain +-- newline characters, in which case the string is output (to +-- TeX input stream) as multiple lines. +-- @param ... (string) string to output +local function mprint(...) + local arg = {...} + local lines = {} + if type(arg[1]) == "number" then + table.insert(lines, arg[1]) + table.remove(arg, 1) + end + for _, cnk in ipairs(arg) do + local ls = cnk:explode("\n") + if ls[#ls] == "" then + table.remove(ls, #ls) + end + for _, l in ipairs(ls) do + table.insert(lines, l) + end + end + return tex.print(unpack(lines)) +end +ltjb.mprint = mprint + +-------------------- Handling of TeX values +do + +--! ixbase.to_dimen() と同じ + local function to_dimen(val) + if val == nil then + return 0 + elseif type(val) == "number" then + return val + else + return tex.sp(tostring(val)) + end + end + + local function parse_dimen(val) + val = tostring(val):lower() + local r, fil = val:match("([-.%d]+)fi(l*)") + if r then + val, fil = r.."pt", fil:len() + 1 + else + fil = 0 + end + return tex.sp(val), fil + end + + ltjb.to_dimen = to_dimen +end + +-------------------- Virtual table for LaTeX counters +-- not used in current LuaTeX-ja +do +--! ixbase.counter と同じ + counter = {} + local mt_counter = {} + setmetatable(counter, mt_counter) + + function mt_counter.__index(tbl, key) + return tex.count['c@'..key] + end + function mt_counter.__newindex(tbl, key, val) + tex.count['c@'..key] = val + end + ltjb.counter = counter + +--! ixbase.length は tex.skip と全く同じなので不要. +end + +-------------------- common error message +do + local function in_unicode(c, admit_math) + local low = admit_math and -1 or 0 + if type(c)~='number' or c<low or c>0x10FFFF then + local s = 'A character number must be between ' .. tostring(low) + .. ' and 0x10ffff.\n' + .. (admit_math and "(-1 is used for denoting `math boundary')\n" or '') + .. 'So I changed this one to zero.' + package_error('luatexja', + 'bad character code (' .. tostring(c) .. ')', s) + c=0 + end + return c + end + ltjb.in_unicode = in_unicode +end + +-------------------- cache management +-- load_cache (filename, outdate) +-- * filename: without suffix '.lua' +-- * outdate(t): return true iff the cache is outdated +-- * return value: non-nil iff the cache is up-to-date +-- save_cache (filename, t): no return value +-- save_cache_luc (filename, t): no return value +-- save_cache always calls save_cache_luc. +-- But sometimes we want to create only the precompiled cache, +-- when its 'text' version is already present in LuaTeX-ja distribution. + +require('lualibs-lpeg') -- string.split +require('lualibs-os') -- os.type + +do + local kpse_var_value = kpse.var_value + local path, pathtmp = kpse_var_value("TEXMFVAR") + pathtmp = kpse_var_value("TEXMFSYSVAR") + if pathtmp then path = (path and path .. ';' or '') .. pathtmp end + pathtmp = kpse_var_value("TEXMFCACHE") + if pathtmp then path = (path and path .. ';' or '') .. pathtmp end + + if os.type~='windows' then path = string.gsub(path, ':', ';') end + path = table.unique(string.split(path, ';')) + + local cache_dir = '/luatexja' + local find_file = kpse.find_file + local join, isreadable = file.join, file.isreadable + local tofile, serialize = table.tofile, table.serialize + local luc_suffix = jit and '.lub' or '.luc' + + -- determine save path + local savepath = '' + for _,v in pairs(path) do + local testpath = join(v, cache_dir) + if not lfs.isdir(testpath) then dir.mkdirs(testpath) end + if lfs.isdir(testpath) then savepath = testpath; break end + end + + local function save_cache_luc(filename, t, serialized) + local fullpath = savepath .. '/' .. filename .. luc_suffix + local s = serialized or serialize(t, 'return', false) + if s then + local sa = load(s) + local f = io.open(fullpath, 'wb') + if f and sa then + f:write(string.dump(sa, true)) + texio.write('(save cache: ' .. fullpath .. ')') + end + f:close() + end + end + + local function save_cache(filename, t) + local fullpath = savepath .. '/' .. filename .. '.lua' + local s = serialize(t, 'return', false) + if s then + local f = io.open(fullpath, 'w') + if f then + f:write(s) + texio.write('(save cache: ' .. fullpath .. ')') + end + f:close() + save_cache_luc(filename, t, s) + end + end + + local function load_cache_a(filename, outdate) + local result + for _,v in pairs(path) do + local fn = join(v, cache_dir, filename) + if isreadable(fn) then + texio.write('(load cache: ' .. fn .. ')') + result = loadfile(fn) + result = result and result(); break + end + end + if (not result) or outdate(result) then + return nil + else + return result + end + end + + local function load_cache(filename, outdate) + local r = load_cache_a(filename .. luc_suffix, outdate) + if r then + return r + else + local r = load_cache_a(filename .. '.lua', outdate) + if r then save_cache_luc(filename, r) end -- update the precompiled cache + return r + end + end + + local function remove_file_if_exist(name) + if os.rename(name,name) then os.remove(name) end + end + local function remove_cache (filename) + local fullpath_wo_ext = savepath .. '/' .. filename .. '.lu' + remove_file_if_exist(fullpath_wo_ext .. 'a') + remove_file_if_exist(fullpath_wo_ext .. 'b') + remove_file_if_exist(fullpath_wo_ext .. 'c') + end + + ltjb.remove_cache = remove_cache + ltjb.load_cache = load_cache + ltjb.save_cache_luc = save_cache_luc + ltjb.save_cache = save_cache +end + +---- +do + local tex_set_attr, tex_get_attr = tex.setattribute, tex.getattribute + function ltjb.ensure_tex_attr(a, v) + if tex_get_attr(a)~=v then + tex_set_attr(a, v) + end + end +end +---- + +ltjb._error_set_break = _error_set_break +ltjb._error_set_message = _error_set_message +ltjb._error_show = _error_show +ltjb._generic_warn_info = _generic_warn_info + +ltjb.package_error = package_error +ltjb.package_warning = package_warning +ltjb.package_warning_no_line = package_warning_no_line +ltjb.package_info = package_info +ltjb.package_info_no_line = package_info_no_line + +ltjb.generic_error = generic_error +ltjb.generic_warning = generic_warning +ltjb.generic_warning_no_line = generic_warning_no_line +ltjb.generic_info = generic_info +ltjb.generic_info_no_line = generic_info_no_line + +ltjb.ltj_warning_no_line = ltj_warning_no_line +ltjb.ltj_error = ltj_error + +---- deterministic version of luatexbase.add_to_callback +function ltjb.add_to_callback(name,fun,description,priority) + local priority= priority + if priority==nil then + priority=#luatexbase.callback_descriptions(name)+1 + end + if(luatexbase.callbacktypes[name] == 3 and + priority == 1 and + #luatexbase.callback_descriptions(name)==1) then + luatexbase.module_warning("luatexbase", + "resetting exclusive callback: " .. name) + luatexbase.reset_callback(name) + end + local saved_callback={},ff,dd + for k,v in ipairs(luatexbase.callback_descriptions(name)) do + if k >= priority then + ff,dd= luatexbase.remove_from_callback(name, v) + saved_callback[#saved_callback+1]={ff,dd} + end + end + luatexbase.base_add_to_callback(name,fun,description) + for _,v in ipairs(saved_callback) do + luatexbase.base_add_to_callback(name,v[1],v[2]) + end + return +end + +-------------------- mock of debug logger +if not ltjb.out_debug then + local function no_op() end + ltjb.start_time_measure = no_op + ltjb.stop_time_measure = no_op + ltjb.out_debug = no_op + ltjb.package_debug = no_op + ltjb.debug_logger = function() return no_op end + ltjb.show_term = no_op + ltjb.show_log = no_op +end + +-------------------- all done +-- EOF diff --git a/macros/luatex/generic/luatexja/src/ltj-base.sty b/macros/luatex/generic/luatexja/src/ltj-base.sty new file mode 100644 index 0000000000..717105e3a5 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-base.sty @@ -0,0 +1,472 @@ +% +% ltj-base.sty +% + +%! これは外から読まれない +%% Avoid multiple loading. +\csname luatexjabaseLoaded\endcsname +\edef\ltj@base@AtEnd{% +\endlinechar=\the\endlinechar +\relax} +\endlinechar=-1 % +\def\luatexjabaseLoaded{\endinput} + +\ifltj@in@latex %<*LaTeX> + \NeedsTeXFormat{LaTeX2e} + \ProvidesPackage{ltj-base}[2017/05/05] +\fi %</LaTeX> + +%%------------------ Tiny helpers + +%% Registers +%\newcount\ltj@tempcnta % defined at luatexja-core.sty +\newcount\ltj@tempcntb +\newcount\ltj@tempcntc +\newdimen\ltj@tempdima +% \newskip\ltj@tempskipa unused +% \newtoks\ltj@temptoks unused + +\countdef\ltj@@count@zero=0 % +\luatexattributedef\ltj@@attr@zero=0 % +\dimendef\ltj@@dimen@zero=0 % +\skipdef\ltj@@skip@zero=0 % + +%% Quarks +%! ただ expl3 の quark とは異なり展開されるとエラーになる. +%% \ltj@q@stop +\protected\def\ltj@q@stop{\ltj@q@stop@} +%% \ltj@q@nil +\protected\def\ltj@q@nil{\ltj@q@nil@} +%% \ltj@q@mark +\protected\def\ltj@q@mark{\ltj@q@mark@} + +%! etoolbox の \letcs, \cslet, \csletcs. +%% \ltj@letcs +\protected\def\ltj@letcs#1#2{ + \expandafter\let\expandafter#1\csname#2\endcsname +} + +%% \ltj@cslet +\protected\def\ltj@cslet#1#2{ + \expandafter\let\csname#1\endcsname#2 +} + +%% \ltj@csletcs +\protected\def\ltj@csletcs#1#2{ + \expandafter\let\csname#1\expandafter\endcsname + \csname#2\endcsname +} + +%% \ltj@ifx{<sutff>}{<yes>}{<no>} +%! LaTeX 形式の \ifx. この形式の利点は自動的に条件ネストからの +%! 脱出が可能であること. +% Does \ifx<stuff> test in LaTeX style. +\long\def\ltj@ifx#1{ + \ifx#1\expandafter\ltx@firstoftwo + \else\expandafter\ltx@secondoftwo\fi +} + +%% \ltj@if@empty{<stuff>}{<yes>}{<no>} +%! <stuff> が空であるか. +% Checks if <stuff> is empty. +\long\def\ltj@if@empty#1{ + \ltj@ifx{\ltj@@q@empty#1\ltj@@q@empty} +} +\protected\def\ltj@@q@empty{\ltj@@q@empty@} + +%% \ltj@if@blank{<stuff>}{<yes>}{<no>} +%! <stuff> が空または空白文字からなるか. +% Checks if <stuff> is either empty or consisting only of spaces. +\def\ltj@if@blank#1{ + \ltj@@if@blankA#1\ltj@@q@empty\ltj@@q@empty + \ltx@secondoftwo\ltx@firstoftwo\ltj@q@nil +} +\long\def\ltj@@if@blankA#1#2\ltj@@q@empty#3#4#5\ltj@q@nil{ + #4 +} + +%%------------------ LaTeX vs plain +\ifltj@in@latex %<*LaTeX> + +%% \ifltj@in@latex +%! LaTeX であるか. +%(Defined in luatexja-core.sty.) + +%% \ifltj@in@plain +%! plain であるか. +\ltj@csletcs{ifltj@in@plain}{iffalse} + +%% \ltj@require@package{<package>}{<date>} +%! サブパッケージを読み込む. LaTeX では \RequirePackage、それ以外では +%! \input を使う. <date> は必須だが空でもよい. +\def\ltj@require@package#1#2{ + \RequirePackage{#1}[#2] +} + +%% \ltj@print{<message>} +%! 端末への出力. +\let\ltj@print\typeout + +\else %<*!LaTeX> + +%% \ifltj@in@plain +\ifnum\pdf@strcmp{\fmtname}{plain}=0 % + \ltj@csletcs{ifltj@in@plain}{iftrue} +\else + \ltj@csletcs{ifltj@in@plain}{iffalse} +\fi + +%% \ltj@require@package{<package>}{<date>} +\def\ltj@require@package#1#2{ + \input #1.sty\relax +} + +%% \ltj@print{<message>} +\def\ltj@print#1{ + \immediate\write16{#1} +} + +\fi %</LaTeX> +%%------------------ Value-token handling + +%% helper stuffs + +%% \ltj@gobble@num <number> +%! 次に続く整数を(2 回展開で)読み捨てる. +\def\ltj@gobble@num{ + \directlua{token.scan_int()} +} + +%% \ltj@gobble@glue <glue> +%! 次に続くグルー値を(2 回展開で)読み捨てる. +\def\ltj@gobble@glue{ + \directlua{token.scan_glue()} +} + +%% \ltj@gobble@dimen <dimen> +%! 次に続く寸法値を(2 回展開で)読み捨てる. +\def\ltj@gobble@dimen{ + \directlua{token.scan_dimen()} +} + +%% \ltj@grab@num <number> +%! 次に続く整数を読み取って, それと等しい整数を表すトークン列 +%! (必ずしも整数表記とは限らない)を { } に入れたものに(2 回で) +%! 展開する. +%! ただし, 整数は以下の形式のいずれかでなければならない. +%! - 整数表記(10 進, 8 進, 16 進, 文字) +%! - chardef トークン +%! - 内部整数パラメタ, countdef トークン +%! (command_name が "assign_int" であるトークン). +%! (注意: まだ文字表記(`A)に対応していません.) +\def\ltj@grab@num{ + \directlua{tex.sprint('{' .. token.scan_int() .. '}')} +} + +%%------------------ Safe passing + +% These macros convert a token sequence denoting a TeX value to its +% suitable notation in Lua, and when the argument is malformed then +% 'nil' is returned. They are all fully-expandable. +%! TeX の値を Lua 上の表記に変換する. 不正形式だと nil にする. + +\def\ltj@@safe@end{\noexpand\ltj@@safe@end} + % behaves same as \relax but is distinct from it + +%% \ltj@safe@invalid +% The value passed to lua instead of malformed value tokens. +\def\ltj@safe@invalid{(nil)} + +%% \ltj@safe@num{<number>} +%! 整数. +% For a number (integer). +\def\ltj@safe@num{ + \ltj@safe@num@or\ltj@safe@invalid +} +\def\ltj@safe@num@or#1#2{ + \expandafter\expandafter\expandafter\ltj@@safe@numA + \ltj@gobble@num#2\ltj@@safe@end{#2}{#1} +} +\def\ltj@@safe@numA#1\ltj@@safe@end#2#3{ + \ltj@if@blank{#1}{ + (\number#2) + }{ + #3 + } +} + +%% \ltj@safe@dimen{<dimen>} +%! 寸法値. +% For a dimension. The result is a scaled-point value. +\def\ltj@safe@dimen{ + \ltj@safe@dimen@or\ltj@safe@invalid +} +\def\ltj@safe@dimen@or#1#2{ + \expandafter\expandafter\expandafter\ltj@@safe@dimenA + \ltj@gobble@dimen#2\ltj@@safe@end{#2}{#1} +} +\def\ltj@@safe@dimenA#1\ltj@@safe@end#2#3{ + \ltj@if@blank{#1}{ + (\number\dimexpr#2\relax) + }{ + #3 + } +} + +%% \ltj@safe@real{<real>} +%! 実数. これは十進表記に限る. +% For a real number given in decimal notation or a macro that +% expands to such notation. +\def\ltj@safe@real#1{ + (tonumber("\luatexluaescapestring{#1}")) +} + +%% \ltj@val@counter{<counter>} +%! LaTeX カウンタの現在値. +% For the current value of a LaTeX counter. +\def\ltj@val@counter#1{ + (\expandafter\number\csname c@#1\endcsname) +} + +%% \ltj@val@skip{<skip>} +% For the current value of a skip (or LaTeX-length) parameter. +%! グルーレジスタ(LaTeX 長さ変数). +%! 整形式のグルー値にも使える. +\def\ltj@val@skip#1{ + (luatexja.base.to_skip("\the\glueexpr#1\relax")) +} +%! 整形式の整数 → 数値 : \number#1 +%! 内部寸法 → 数値 : \number#1 +%! 整形式の寸法 → 数値 : \number\dimexpr#1\relax + +%% \ltj@safe@str{<text>} +%! 文字列. (トークン列を非トークン化) +% Converts a token sequence to Lua string notation. +\def\ltj@safe@str#1{ + "\luatexluaescapestring{\detokenize{#1}}" +} + +%% \ltj@luaescape{<text>} +%! 非トークン化して Lua エスケープ. +\def\ltj@luaescape#1{ + \luatexluaescapestring{\detokenize{#1}} +} +%% \ltj@luaxescape{<text>} +%! 非トークン化せずに(展開ありで) Lua エスケープ. +%! つまり単なる \luatexescape. +\let\ltj@luaxescape\luatexluaescapestring + +%%------------------ Fully-expandable error messaging + +%! ixerrtrick パッケージから移植. +%! 展開限定文脈でも使える \PackageError 等. +%! Lua 関数版(luatexja/base.lua 参照)もある. + +%% \ltj@@error@message@a +\begingroup +\def~{ } +\xdef\ltj@@error@message@a{% + Type~~H <return>~~for immediate help% +}% +\endgroup + +%%<+> \ltj@MessageBreak +% An analogue of \MessageBreak that is used in \ltj@GenericError, etc. +% (\MessageBreak cannot be used there.) +% NB: It is realized as a macro that expands to two instances +% of the character of code 127. This marker is later detected +% by the Lua process. +\begingroup +\lccode42=127 +\lowercase{ + \gdef\ltj@MessageBreak{**} + \directlua{ + luatexja.base._error_set_break("**") + } +} +\endgroup + +%%<+> \ltj@GenericError{<cont>}{<msg-main>}{<msg-ref>}{<msg-help>} +% A variant of \GenericError that can be used in expansion-only +% situation. The meanings of arguments are the same as the original +% \GenericError. +%%<+> \ltj@PlainError{<msg-main>}{<msg-help>} +% A simpler error messenger available in expansion-only situations. +% It behaves similarly to: +% \errhelp{<msg-help}\errmessage{<msg-main>} +\begingroup +% with the same hack as in \GenericError... +\lccode`\@=`\ % +\lccode`\~=`\ % +\lccode`\}=`\ % +\lccode`\{=`\ % +\catcode`\ =11\relax% +\lowercase{% +\endgroup% +\def\ltj@GenericError#1#2#3#4{% not protected +\directlua{% +luatexja.base._error_set_message("\ltj@luaxescape{#1}",% +"\ltj@luaxescape{#2.^^J^^J#3^^J\ltj@@error@message@a}",% +"\ltj@luaxescape{#4}")% +}% +\ % use csname with four spaces as last expander +} +\def\ {% csname with four spaces +\directlua{% +luatexja.base._error_show(false)% and many spaces trail! + % + % +}% +}% +\def\ltj@PlainError#1#2{% +\directlua{% +luatexja.base._error_set_message(" ",% +"\ltj@luaxescape{#1}",% +"\ltj@luaxescape{#2}")% +}% +\error % again a weird name is used +} +\def\error {% csname with two trailing spaces +\directlua{% +luatexja.base._error_show(true)% and many spaces trail! + % + % +}% +}% +} + +%% \ltj@@error@on@line +\def\ltj@@error@on@line{ + on input line \the \inputlineno +} + +%% \ltj@generic@warn@info +\def\ltj@@generic@warn@info#1#2#3#4{ + \begingroup + \directlua{ + luatexja.base._generic_warn_info("\ltj@luaxescape{#3}", + "\ltj@luaxescape{#4}", (#1 > 0), (#2 > 0)) + } + \endgroup +} + +%% \ltj@GenericWarning{<cont>}{<msg-main>} +\def\ltj@GenericWarning{ + \ltj@@generic@warn@info{1}{1} +} +%% \ltj@GenericWarningNoLine{<cont>}{<msg-main>} +\def\ltj@GenericWarningNoLine{ + \ltj@@generic@warn@info{1}{0} +} +%% \ltj@GenericInfo{<cont>}{<msg-main>} +\def\ltj@GenericInfo{ + \ltj@@generic@warn@info{0}{1} +} +%% \ltj@GenericInfoNoLine{<cont>}{<msg-main>} +\def\ltj@GenericInfoNoLine{ + \ltj@@generic@warn@info{0}{0} +} + +%% \ltj@@space@seq@a +\begingroup +\def~{ } +\xdef\ltj@@space@seq@a{~~~~~~~~~~~~~~~~} +\xdef\ltj@@space@seq@b{~~~~~~~~~~~~~} +\endgroup + +%% \ltj@PackageError{<pkg-name>}{<msg-main>}{<msg-help>} +\def\ltj@PackageError#1#2#3{% + \ltj@GenericError{(#1)\ltj@@space@seq@a}% + {Package #1 Error: #2}% + {See the #1 package documentation for explanation.}% + {#3}% +} +%% \ltj@PackageWarning{<pkg-name>}{<msg-main>} +\def\ltj@PackageWarning#1#2{% + \ltj@GenericWarning{(#1)\ltj@@space@seq@a}% + {Package #1 Warning: #2}% +} +%% \ltj@PackageWarningNoLine{<pkg-name>}{<msg-main>} +\def\ltj@PackageWarningNoLine#1#2{% + \ltj@GenericWarningNoLine{(#1)\ltj@@space@seq@a}% + {Package #1 Warning: #2}% +} +%% \ltj@PackageInfo{<pkg-name>}{<msg-main>} +\def\ltj@PackageInfo#1#2{% + \ltj@GenericInfo{(#1)\ltj@@space@seq@b}% + {Package #1 Info: #2}% +} +%% \ltj@PackageInfoNoLine{<pkg-name>}{<msg-main>} +\def\ltj@PackageInfoNoLine#1#2{% + \ltj@GenericInfoNoLine{(#1)\ltj@@space@seq@b}% + {Package #1 Info: #2}% +} + +%%------------------ debug logging +\ifdefined\LuaTeXjaDebugEnabled + +%% Load Lua module +\RequireLuaModule{luatexja.debug} + +%% \ltj@debug{<format>}{<arg>,...} +\def\ltj@debug#1#2{ + \directlua{ + luatexja.base.debug(\ltj@safe@str{#1} + \ltj@if@blank{#2}{}{, } + #2) + } +} + +%% \ltj@package@debug{<package>}{<format>}{<arg>,...} +\def\ltj@package@debug#1#2#3{ + \directlua{ + luatexja.base.package_debug(\ltj@safe@str{#1}, + \ltj@safe@str{#2} + \ltj@if@blank{#3}{}{, } + #3) + } +} + +\else + +\def\ltj@debug#1#2{} +\def\ltj@package@debug#1#2#3{} + +\fi + +%% \ltj@debug@logger\CS{<package>} +\def\ltj@debug@logger#1#2{ + \def#1{\ltj@package@debug{#2}} +} + +%% \ltj@afterbox <token><box> +%% -> \setbox\ltj@afbox<box><token> +%% from Sonja Maus, ``Looking Ahead for a <box>'', +%% TUGBoat, 11, No. 4, 1990. +\newbox\ltj@afbox +\protected\def\ltj@afterbox#1{% + \def\ltj@afb@xarg{#1}% + \afterassignment\ltj@afb@x + \chardef\ltj@@next`.} +\def\ltj@afb@x{\futurelet\ltj@@next\ltj@afb@xtest} +\def\ltj@afb@xtest{% + \ifcase\ifx\ltj@@next\hbox\tw@\fi + \ifx\ltj@@next\vbox\tw@\fi + \ifx\ltj@@next\vtop\tw@\fi + \ifx\ltj@@next\box\@ne\fi + \ifx\ltj@@next\copy\@ne\fi + \ifx\ltj@@next\vsplit\@ne\fi + \ifx\ltj@@next\lastbox\@ne\fi + 0% ``A <box> was ...'' error will be causes by \setbox later anyway. + \or\afterassignment\ltj@afb@xarg + \or\afterassignment\ltj@afb@xagarg + \fi + \setbox\ltj@afbox +} +\def\ltj@afb@xagarg{\aftergroup\ltj@afb@xarg} + + +%%------------------ all done +\ltj@base@AtEnd +\endinput +%% EOF diff --git a/macros/luatex/generic/luatexja/src/ltj-charrange.lua b/macros/luatex/generic/luatexja/src/ltj-charrange.lua new file mode 100644 index 0000000000..96fbd885ab --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-charrange.lua @@ -0,0 +1,112 @@ +-- +-- luatexja/charrange.lua +-- +luatexbase.provides_module({ + name = 'luatexja.charrange', + date = '2019/04/01', + description = 'Handling the range of Japanese characters', +}) +luatexja.charrange = {} +luatexja.load_module('base'); local ltjb = luatexja.base + +local getchar = node.direct.getchar +local has_attr = node.direct.has_attribute +local has_attr_node = node.has_attribute +local tex_getattr = tex.getattribute + +local ATTR_RANGE = 7 +luatexja.charrange.ATTR_RANGE = ATTR_RANGE +local jcr_cjk, jcr_noncjk = 0, 1 +local floor = math.floor +local kcat_attr_table = {} +local pow_table = {} +local fn_table = {} -- used in is_ucs_in_japanese_char_direct +local nfn_table = {} -- used in is_ucs_in_japanese_char_node +for i = 0, 31*ATTR_RANGE-1 do + local ka, pw = luatexbase.attributes['ltj@kcat'..floor(i/31)], 1/(2^(i%31)) + local jcr_noncjk = jcr_noncjk + kcat_attr_table[i], pow_table[i] = ka, 2^(i%31) + fn_table[i] = function(p) return floor(has_attr(p, ka)*pw)%2 ~= jcr_noncjk end + nfn_table[i] = function(p) return floor(has_attr_node(p, ka)*pw)%2 ~= jcr_noncjk end +end +fn_table[-1] = function() return false end -- for char --U+007F +nfn_table[-1] = function() return false end -- for char --U+007F +pow_table[31*ATTR_RANGE] = 2^31 + +-- jcr_table_main[chr_code] = index +-- index : internal 0, 1, 2, ..., 216 0: 'other' +-- external 217, 1 2 216, 217 and (out of range): 'other' + +-- initialize +local jcr_table_main = {} +local ucs_out = 0x110000 + +for i=0x0 ,0x7F do jcr_table_main[i]=-1 end +for i=0x80 ,0xFF do jcr_table_main[i]=1 end +for i=0x100,ucs_out-1 do jcr_table_main[i]=0 end + +-- EXT: add characters to a range +function luatexja.charrange.add_char_range(b,e,ind) -- ind: external range number + if not ind or ind<0 or ind>31*ATTR_RANGE then -- 0 はエラーにしない(隠し) + ltjb.package_error('luatexja', + "invalid character range number (" .. ind .. ")", + "A character range number should be in the range 1.." + .. 31*ATTR_RANGE .. ",\n" .. + "ignored.") + return + elseif b<0x80 or e>=ucs_out then + ltjb.package_warning('luatexja', + 'bad character range ([' .. b .. ',' .. e .. ']). ' .. + 'I take the intersection with [0x80, 0x10ffff].') + elseif b>e then + local j=b; e=b; b=j + end + if ind == 31*ATTR_RANGE then ind=0 end + for i=math.max(0x80,b),math.min(ucs_out-1,e) do + jcr_table_main[i]=ind + end +end + +function luatexja.charrange.char_to_range(c) -- return the external range number + local r = jcr_table_main[ltjb.in_unicode(c, false)] or 217 + return (r~=0) and r or 217 +end + +local function get_range_setting(i) -- i: internal range number + return floor(tex_getattr(kcat_attr_table[i])/pow_table[i])%2 +end + +-- glyph_node p は和文文字か? +function luatexja.charrange.is_ucs_in_japanese_char(p) + return nfn_table[jcr_table_main[c or p.char]](p) +end + +function luatexja.charrange.is_ucs_in_japanese_char_direct(p ,c) + return fn_table[jcr_table_main[c or getchar(p)]](p) +end + +function luatexja.charrange.is_japanese_char_curlist(c) -- assume that c>=0x80 + return get_range_setting(jcr_table_main[c])~= jcr_noncjk +end + +-- EXT +function luatexja.charrange.toggle_char_range(g, i) -- i: external range number + if type(i)~='number' then + ltjb.package_error('luatexja', + "invalid character range number (" .. tostring(i).. ")", + "A character range number must be a number, ignored.") + elseif i==0 then return + else + local kc + if i>0 then kc=0 else kc=1; i=-i end + if i>=7*ATTR_RANGE then i=0 end + local attr = kcat_attr_table[i] + local a = tex_getattr(attr) + tex.setattribute(g, attr, + (floor(a/pow_table[i+1])*2+kc)*pow_table[i]+a%pow_table[i]) + end +end + +luatexja.charrange.get_range_setting=get_range_setting + +-- EOF diff --git a/macros/luatex/generic/luatexja/src/ltj-compat.lua b/macros/luatex/generic/luatexja/src/ltj-compat.lua new file mode 100644 index 0000000000..bd798545f3 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-compat.lua @@ -0,0 +1,140 @@ +-- +-- luatexja/ltj-compat.lua +-- + +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('stack'); local ltjs = luatexja.stack +local stack_table_index = luatexja.stack_table_index + +-- load jisx0208 table +local cache_ver = 2 + +local cache_outdate_fn = function (t) return t.version~=cache_ver end +local jisx0208 = ltjb.load_cache('ltj-jisx0208',cache_outdate_fn) +if not jisx0208 then -- make cache + jisx0208 = require('ltj-jisx0208.lua') + ltjb.save_cache_luc('ltj-jisx0208', jisx0208) +end + + +-- \kuten, \jis, \euc, \sjis, \ucs, \kansuji +local utfchar=utf.char +local function to_kansuji(num) + if not num then num=0; return + elseif num<0 then + num = -num; tex.write('-') + end + local s = "" + while num~=0 do + s = utfchar( + ltjs.get_stack_table(luatexja.stack_table_index.KSJ + num%10, + '', tex.getcount('ltj@@stack'))) .. s + num=math.floor(num/10) + end + tex.write(s) +end + +-- \ucs: 単なる identity +local function from_ucs(i) + if type(i)~='number' then + ltjb.package_error('luatexja', + "invalid character code (".. tostring(i) .. ")", + "I'm going to use 0 instead of that illegal character code.") + i=0 + end + tex.write(i) +end + +-- \kuten: 面区点 (それぞれで16進2桁を使用)=> Unicode 符号位置 +local function from_kuten(i) + if type(i)~='number' then + ltjb.package_error('luatexja', + "invalid character code (".. tostring(i) .. ")", + "I'm going to use 0 instead of that illegal character code.") + i=0 + end + tex.write(tostring(jisx0208.table_jisx0208_uptex[i] or 0)) +end + +-- \euc: EUC-JP による符号位置 => Unicode 符号位置 +local function from_euc(i) + if type(i)~='number' then + ltjb.package_error('luatexja', + "invalid character code (".. tostring(i) .. ")", + "I'm going to use 0 instead of that illegal character code.") + i=0 + elseif i>=0x10000 or i<0xa0a0 then + i=0 + end + from_kuten(i-0xa0a0) +end + +-- \jis: ISO-2022-JP による符号位置 => Unicode 符号位置 +local function from_jis(i) + if (type(i)~='number') or i>=0x10000 or i<0 then + ltjb.package_error('luatexja', + "invalid character code (".. tostring(i) .. ")", + "I'm going to use 0 instead of that illegal character code.") + i=0 + end + from_kuten(i-0x2020) +end + +-- \sjis: Shift_JIS による符号位置 => Unicode 符号位置 +local function from_sjis(i) + if (type(i)~='number') or i>=0x10000 or i<0 then + ltjb.package_error('luatexja', + "invalid character code (".. tostring(i) .. ")", + "I'm going to use 0 instead of that illegal character code.") + tex.write('0'); return + end + local c2 = math.floor(i/256) + local c1 = i%256 + local shift_jisx0213_s1a3_table = { + { [false]= 1, [true]= 8}, + { [false]= 3, [true]= 4}, + { [false]= 5, [true]=12}, + { [false]=13, [true]=14}, + { [false]=15 } } + if c2 >= 0x81 then + if c2 >= 0xF0 then -- this if block won't be true + if (c2 <= 0xF3 or (c2 == 0xF4 and c1 < 0x9F)) then + c2 = 0x100 + shift_jisx0213_s1a3_table[c2 - 0xF0 + 1][(0x9E < c1)]; + else -- 78<=k<=94 + c2 = c2 * 2 - 413 + 0x100; if 0x9E < c1 then c2=c2+1 end + end + else + if c2<=0x9f then i=0x101 else i=0x181 end + c2 = c2 + c2 - i; if 0x9E < c1 then c2=c2+1 end + end + if c1 < 0x9F then + if c1>0x7f then i=0x40 else i=0x3f end + c1 = c1 - i + else + c1 = c1 - 0x9e + end + from_kuten(c2*256+c1) + end +end + +luatexja.binary_pars.kansujichar = function(c, t) + if type(c)~='number' or c<0 or c>9 then + ltjb.package_error('luatexja', + 'Invalid KANSUJI number (' .. tostring(c) .. ')', + 'A KANSUJI number should be in the range 0..9.\n'.. + 'So I changed this one to zero.') + c=0 + end + return ltjs.get_stack_table(stack_table_index.KSJ + c, 0, t) +end + + +local t = { + from_euc = from_euc, + from_kuten = from_kuten, + from_jis = from_jis, + from_sjis = from_sjis, + from_ucs = from_ucs, + to_kansuji = to_kansuji, +} +luatexja.compat = t diff --git a/macros/luatex/generic/luatexja/src/ltj-debug.lua b/macros/luatex/generic/luatexja/src/ltj-debug.lua new file mode 100644 index 0000000000..ac517500e8 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-debug.lua @@ -0,0 +1,187 @@ +-- +-- luatexja/debug.lua +-- +local ltjdbg = {} +luatexja.debug = ltjdbg +local table, string = table, string + +-------------------- pretty-print + +local function get_serialize_param() + return table.serialize_functions, + table.serialize_compact, + table.serialize_inline +end +local function set_serialize_param(s_f, s_c, s_i) + table.serialize_functions = s_f + table.serialize_compact = s_c + table.serialize_inline = s_i +end + +local function normal_serialize(t) + local s_f, s_c, s_i = get_serialize_param() + set_serialize_param(true, true, true) + local ret = table.serialize(t, false, false, true) + set_serialize_param(s_f, s_c, s_i) + return ret +end + +local function table_tosource(t) + if not next(t) then return "{}" end + local res_n = "\127"..normal_serialize({t}).."\127" + local s, e, cap = res_n:find("\127{\n ({ .* }),\n}\127") + if s == 1 and e == res_n:len() then return cap + else return normal_serialize(t) + end +end +ltjdbg.table_tosource = table_tosource + +local function function_tosource(f) + local res = normal_serialize({f}) + return res:sub(4, res:len() - 3) +end +ltjdbg.function_tosource = function_tosource + +--! 値 v をそれを表すソース文字列に変換する. +--! lualibs の table.serialize() の処理を利用している. +local function tosource(v) + local tv = type(v) + if tv == "function" then return function_tosource(v) + elseif tv == "table" then return table_tosource(v) + elseif tv == "string" then return string.format('%q', v) + else return tostring(v) + end +end +ltjdbg.tosource = tosource + +local function coerce(f, v) + if f == "q" then return "s", tosource(v) + elseif f == "s" then return f, tostring(v) + else return f, tonumber(v) or 0 + end +end + +local function do_pformat(fmt, ...) + fmt = fmt:gsub("``", "\127"):gsub("`", "%%"):gsub("\127", "`") + local i, na, a = 0, {}, {...} + local function proc(p, f) + i = i + 1; f, na[i] = coerce(f, a[i]) + return p..f + end + fmt = fmt:gsub("(%%[-+#]?[%d%.]*)([a-zA-Z])", proc) + return fmt:format(unpack(na)) +end + +--! string.format() の拡張版. 以下の点が異なる. +--! - %q は全ての型について tosource() に変換 +--! - <%> の代わりに <`> も使える (TeX での使用のため) +--! - %d, %s 等でキャストを行う +local function pformat(fmt, ...) + if type(fmt) == "string" then + return do_pformat(fmt, ...) + else + return tosource(fmt) + end +end +ltjdbg.pformat = pformat + +-------------------- 所要時間合計 +require("socket") +do + local max = math.max + local gettime = socket.gettime + local time_stat = {} + local function start_time_measure(n) + if not time_stat[n] then + time_stat[n] = {1, -gettime()} + else + local t = time_stat[n] + t[1], t[2] = t[1]+1, t[2]-gettime() + end + end + local function stop_time_measure(n) + local t = time_stat[n] + t[2] = t[2] + gettime() + end + + local function print_measure() + stop_time_measure('RUN') + local temp = {} + for i,v in pairs(time_stat) do + temp[#temp+1] = { i, v[1], v[2], v[2]/v[1] } + end + table.sort(temp, function (a,b) return (a[4]>b[4]) end) + print() + print('desc', 'ave. (us)', 'times', 'total (ms)') + for _,v in ipairs(temp) do + print ((v[1] .. ' '):sub(1,16), 1000000*v[4], v[2], 1000*v[3]) + end + end + if luatexja.base then + luatexja.base.start_time_measure = start_time_measure + luatexja.base.stop_time_measure = stop_time_measure + luatexbase.add_to_callback('stop_run', print_measure, 'luatexja.time_measure', 1) + luatexbase.add_to_callback('pre_linebreak_filter', + function(p) + start_time_measure('tex_linebreak'); return p + end, + 'measure_tex_linebreak', 20000) + end +end + +-------------------- debug logging +do +local debug_show_term = true +local debug_show_log = true +--! デバッグログを端末に出力するか +local function show_term(v) + debug_show_term = v +end +ltjdbg.show_term = show_term +--! デバッグログをログファイルに出力するか +function show_log(v) + debug_show_log = v +end +ltjdbg.show_log = show_log + +local function write_debug_log(s) + local target + if debug_show_term and debug_show_log then + texio.write_nl("term and log", s) + elseif debug_show_term and not debug_show_log then + texio.write_nl("term", s) + elseif not debug_show_term and debug_show_log then + texio.write_nl("log", s) + end +end + +--! デバッグログ出力. 引数は pformat() と同じ. +local function out_debug(...) + if debug_show_term or debug_show_log then + write_debug_log("%DEBUG:"..pformat(...)) + end +end + +--! デバッグログ出力, パッケージ名付き. +local function package_debug(pkg, ...) + if debug_show_term or debug_show_log then + write_debug_log("%DEBUG("..pkg.."):"..pformat(...)) + end +end + +--! パッケージ名付きデバッグログ出力器を得る. +local function debug_logger(pkg) + return function(...) package_debug(pkg, ...) end +end + +if luatexja.base then + luatexja.base.out_debug = out_debug + luatexja.base.package_debug = package_debug + luatexja.base.debug_logger = debug_logger + luatexja.base.show_term = show_term + luatexja.base.show_log = show_log +end +end + +-------------------- all done +-- EOF diff --git a/macros/luatex/generic/luatexja/src/ltj-direction.lua b/macros/luatex/generic/luatexja/src/ltj-direction.lua new file mode 100644 index 0000000000..107d27a897 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-direction.lua @@ -0,0 +1,1147 @@ +-- +-- src/ltj-direction.lua +-- + +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('stack'); local ltjs = luatexja.stack +luatexja.direction = {} + +local attr_dir = luatexbase.attributes['ltj@dir'] +local attr_icflag = luatexbase.attributes['ltj@icflag'] + +local cat_lp = luatexbase.catcodetables['latex-package'] +local to_node = node.direct.tonode +local to_direct = node.direct.todirect +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local insert_before = node.direct.insert_before +local insert_after = node.direct.insert_after +local getid = node.direct.getid +local getsubtype = node.direct.getsubtype +local getlist = node.direct.getlist +local setfield = node.direct.setfield +local getfield = node.direct.getfield +local node_new = node.direct.new +local node_tail = node.direct.tail +local node_free = node.direct.free +local node_remove = node.direct.remove +local node_next = node.direct.getnext +local traverse = node.direct.traverse +local traverse_id = node.direct.traverse_id +local start_time_measure, stop_time_measure + = ltjb.start_time_measure, ltjb.stop_time_measure +local abs = math.abs + +local id_kern = node.id('kern') +local id_hlist = node.id('hlist') +local id_vlist = node.id('vlist') +local id_whatsit = node.id('whatsit') +local sid_save = node.subtype('pdf_save') +local sid_restore = node.subtype('pdf_restore') +local sid_matrix = node.subtype('pdf_setmatrix') +local sid_user = node.subtype('user_defined') + +local tex_nest = tex.nest +local tex_getcount = tex.getcount +local ensure_tex_attr = ltjb.ensure_tex_attr +local PROCESSED = luatexja.icflag_table.PROCESSED +local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG +local PACKED = luatexja.icflag_table.PACKED +local DIR = luatexja.userid_table.DIR +local dir_tate = luatexja.dir_table.dir_tate +local dir_yoko = luatexja.dir_table.dir_yoko +local dir_dtou = luatexja.dir_table.dir_dtou +local dir_utod = luatexja.dir_table.dir_utod +local dir_math_mod = luatexja.dir_table.dir_math_mod +local dir_node_auto = luatexja.dir_table.dir_node_auto +local dir_node_manual = luatexja.dir_table.dir_node_manual +local function get_attr_icflag(p) + return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG +end + +local page_direction +-- +local dir_pool +do + local node_copy = node.direct.copy + dir_pool = {} + for _,i in pairs({dir_tate, dir_yoko, dir_dtou, dir_utod}) do + local w = node_new(id_whatsit, sid_user) + set_attr(w, attr_dir, i) + setfield(w, 'user_id', DIR) + setfield(w, 'type', 110) + setfield(w, 'next', nil) + dir_pool[i] = function () return node_copy(w) end + end +end + +-- +local function adjust_badness(hd) + if not node_next(hd) and getid(hd)==id_whatsit and getsubtype(hd)==sid_user + and getfield(hd, 'user_id')==DIR then + -- avoid double whatsit + luatexja.global_temp=tex.globaldefs; tex.globaldefs=0 + luatexja.hbadness_temp=tex.hbadness; tex.hbadness=10000 + luatexja.vbadness_temp=tex.vbadness; tex.vbadness=10000 + else + luatexja.global_temp = nil + luatexja.hbadness_temp=nil + luatexja.vbadness_temp=nil + end +end + +local get_dir_count, get_adjust_dir_count +do + local function get_dir_count_inner(h) + if h then + if h.id==id_whatsit and h.subtype==sid_user and h.user_id==DIR then + local ic = node.has_attribute(h, attr_icflag) or 0 + return (ic<PROCESSED_BEGIN_FLAG) + and (node.has_attribute(h,attr_dir)%dir_node_auto) or 0 + else + return 0 + end + else + return 0 + end + end + function get_dir_count() + for i=tex_nest.ptr, 1, -1 do + local h = tex_nest[i].head.next + if h then + local t = get_dir_count_inner(h) + if t~=0 then return t end + end + end + return page_direction + end + function get_adjust_dir_count() + for i=tex_nest.ptr, 1, -1 do + local v = tex_nest[i] + local h, m = v.head.next, v.mode + if abs(m)== ltjs.vmode and h then + local t = get_dir_count_inner(h) + if t~=0 then return t end + end + end + return page_direction + end + luatexja.direction.get_dir_count = get_dir_count + luatexja.direction.get_adjust_dir_count = get_adjust_dir_count +end + + +-- \tate, \yoko,\dtou, \utod +do + local node_next = node.next + local node_set_attr = node.set_attribute + local node_traverse = node.traverse + local STCK = luatexja.userid_table.STCK + local IHB = luatexja.userid_table.IHB + local id_local = node.id('local_par') + + local function test_list(h, lv) + if not h then + return 2 -- need to create dir_whatsit + else + local flag = 2 -- need to create dir_whatsit + local w + for p in node_traverse(h) do + if p.id==id_whatsit then + local ps = p.subtype + if ps==sid_user then + local uid= p.user_id + if uid==DIR then + flag = 1; w = w or p -- found + elseif not(uid==IHB or uid==STCK) then + flag = 0; break -- error + end + end + elseif p.id~=id_local then + flag = 0; break + end + end + if flag==1 then -- dir_whatsit already exists + return 1,w + else + return flag + end + end + end + local node_next_node, node_tail_node = node.next, node.tail + local insert_after_node = node.insert_after + function luatexja.direction.set_list_direction_hook(v) + local lv = tex_nest.ptr -- must be >= 1 + if not v then + v = get_dir_count() + if abs(tex_nest[lv-1].mode) == ltjs.mmode and v == dir_tate then + v = dir_utod + end + elseif v=='adj' then + v = get_adjust_dir_count() + end + local h = tex_nest[lv].head + local hn = node.next(h) + hn = (hn and hn.id==id_local) and hn or h + local w = to_node(dir_pool[v]()) + insert_after_node(h, hn, w) + tex_nest[lv].tail = node_tail_node(w) + ensure_tex_attr(attr_icflag, 0) + ensure_tex_attr(attr_dir, 0) + end + + local function set_list_direction(v, name) + local lv = tex_nest.ptr + if not v then + v,name = get_dir_count(), nil + if lv>=1 and abs(tex_nest[lv-1].mode) == ltjs.mmode and v == dir_tate then + v = dir_utod + end + elseif v=='adj' then + v,name = get_adjust_dir_count(), nil + end + local current_nest = tex_nest[lv] + if tex.currentgrouptype==6 then + ltjb.package_error( + 'luatexja', + "You can't use `\\" .. name .. "' in an align", + "To change the direction in an align, \n" + .. "you shold use \\hbox or \\vbox.") + elseif current_nest.mode == ltjs.hmode or abs(current_nest.mode) == ltjs.mmode then + ltjb.package_error( + 'luatexja', + "Improper `\\" .. name .. "'", + 'You cannot change the direction in unrestricted horizontal mode \n' + .. 'nor math modes.') + else + local h = (lv==0) and tex.lists.page_head or current_nest.head.next + local flag,w = test_list(h,lv) + if flag==0 then + if lv==0 and not page_direction then + page_direction = v -- for first call of \yoko (in luatexja-core.sty) + else + ltjb.package_error( + 'luatexja', + "Use `\\" .. tostring(name) .. "' at top of list", + 'Direction change command by LuaTeX-ja is available\n' + .. 'only when the current list is null.') + end + elseif flag==1 then + node_set_attr(w, attr_dir, v) + if lv==0 then page_direction = v end + elseif lv==0 then + page_direction = v + else -- flag == 2: need to create dir whatsit. + local h = current_nest.head + local hn = node.next(h) + hn = (hn and hn.id==id_local) and hn or h + local w = to_node(dir_pool[v]()) + insert_after_node(h,hn,w) + current_nest.tail = node_tail_node(w) + end + ensure_tex_attr(attr_icflag, 0) + end + ensure_tex_attr(attr_dir, 0) + end + luatexja.direction.set_list_direction = set_list_direction +end + +-- ボックスに dir whatsit を追加 +local function create_dir_whatsit(hd, gc, new_dir) + if getid(hd)==id_whatsit and + getsubtype(hd)==sid_user and getfield(hd, 'user_id')==DIR then + set_attr(hd, attr_icflag, + get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG) + local n =node_next(hd) + if n then + set_attr(n, attr_icflag, + get_attr_icflag(n) + PROCESSED_BEGIN_FLAG) + end + ensure_tex_attr(attr_icflag, 0) + return hd + else + local w = dir_pool[new_dir]() + setfield(w, 'next', hd) + set_attr(w, attr_icflag, PROCESSED_BEGIN_FLAG) + set_attr(hd, attr_icflag, + get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG) + ensure_tex_attr(attr_icflag, 0) + ensure_tex_attr(attr_dir, 0) + return w + end +end + +-- hpack_filter, vpack_filter, post_line_break_filter +-- の結果を組方向を明示するため,先頭に dir_node を設置 +local get_box_dir +do + local function create_dir_whatsit_hpack(h, gc) + local hd = to_direct(h) + if gc=='fin_row' then + if hd then + for p in traverse_id(15, hd) do -- unset + if get_box_dir(p, 0)==0 then + setfield(p, 'head', create_dir_whatsit(getlist(p), 'fin_row', ltjs.list_dir)) + end + end + set_attr(hd, attr_icflag, PROCESSED_BEGIN_FLAG) + ensure_tex_attr(attr_icflag, 0) + end + return h + elseif gc == 'preamble' then + else + adjust_badness(hd) + return to_node(create_dir_whatsit(hd, gc, ltjs.list_dir)) + end + end + + ltjb.add_to_callback('hpack_filter', + create_dir_whatsit_hpack, 'ltj.create_dir_whatsit', 10000) +end + +do + local function create_dir_whatsit_parbox(h, gc) + stop_time_measure('tex_linebreak'); + -- start 側は ltj-debug.lua に + local new_dir = ltjs.list_dir + for line in traverse_id(id_hlist, to_direct(h)) do + setfield(line, 'head', create_dir_whatsit(getlist(line), gc, new_dir) ) + end + ensure_tex_attr(attr_dir, 0) + return h + end + ltjb.add_to_callback('post_linebreak_filter', + create_dir_whatsit_parbox, 'ltj.create_dir_whatsit', 10000) +end + +local create_dir_whatsit_vbox +do + local wh = {} + local id_glue, sid_parskip = node.id('glue'), 3 + create_dir_whatsit_vbox = function (hd, gc) + ltjs.list_dir = get_dir_count() + -- remove dir whatsit + for x in traverse_id(id_whatsit, hd) do + if getsubtype(x)==sid_user and getfield(x, 'user_id')==DIR then + wh[#wh+1]=x + end + end + if hd==wh[1] then + ltjs.list_dir =has_attr(hd,attr_dir) + local x = node_next(hd) + if getid(x)==id_glue and getsubtype(x)==sid_parskip then + node_remove(hd,x); node_free(x) + end + end + for i=1,#wh do + hd = node_remove(hd, wh[i]); node_free(wh[i]); wh[i] = nil + end + if gc=='fin_row' then -- gc == 'preamble' case is treated in dir_adjust_vpack + if hd then + set_attr(hd, attr_icflag, PROCESSED_BEGIN_FLAG) + ensure_tex_attr(attr_icflag, 0) + end + return hd + else + local n =node_next(hd) + if gc=='vtop' then + local w = create_dir_whatsit(hd, gc, ltjs.list_dir) + -- move dir whatsit after hd + setfield(hd, 'next', w); setfield(w, 'next', n) + return hd + else + hd = create_dir_whatsit(hd, gc, ltjs.list_dir) + return hd + end + end + end +end + +-- dir_node に包む方法を書いたテーブル +local dir_node_aux +do + local floor = math.floor + local get_h =function (w,h,d) return h end + local get_d =function (w,h,d) return d end + local get_h_d =function (w,h,d) return h+d end + local get_h_d_neg =function (w,h,d) return -h-d end + local get_d_neg =function (w,h,d) return -d end + local get_w_half =function (w,h,d) return floor(0.5*w) end + local get_w_half_rem =function (w,h,d) return w-floor(0.5*w) end + local get_w_neg =function (w,h,d) return -w end + local get_w =function (w,h,d) return w end + local zero = function() return 0 end + dir_node_aux = { + [dir_yoko] = { -- yoko を + [dir_tate] = { -- tate 中で組む + width = get_h_d, + height = get_w_half, + depth = get_w_half_rem, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 1 -1 0' }, + { 'kern', function(w,h,d,nw,nh,nd) return -nd end }, + { 'box' , get_h}, + { 'kern', function(w,h,d,nw,nh,nd) return nd-w end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 1 -1 0' }, + { 'kern' , zero }, + { 'box' , function(w,h,d,nw,nh,nd) return -nh-nd end }, + { 'kern', get_h_d_neg}, + { 'whatsit', sid_restore }, + }, + }, + [dir_dtou] = { -- dtou 中で組む + width = get_h_d, + height = get_w, + depth = zero, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 -1 1 0' }, + { 'kern', function(w,h,d,nw,nh,nd) return -nh end }, + { 'box', get_d_neg }, + { 'kern', function(w,h,d,nw,nh,nd) return nh-w end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 -1 1 0' }, + { 'kern', get_h_d_neg }, + { 'box', zero }, + { 'whatsit', sid_restore }, + }, + }, + }, + [dir_tate] = { -- tate を + [dir_yoko] = { -- yoko 中で組む + width = get_h_d, + height = get_w, + depth = zero, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 -1 1 0' }, + { 'kern', function (w,h,d,nw,nh,nd) return -nh end }, + { 'box' , get_d_neg }, + { 'kern', function (w,h,d,nw,nh,nd) return nh-w end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 -1 1 0' }, + { 'kern', get_h_d_neg }, + { 'box', zero }, + { 'whatsit', sid_restore }, + }, + }, + [dir_dtou] = { -- dtou 中で組む + width = get_w, + height = get_d, + depth = get_h, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '-1 0 0 -1' }, + { 'kern', get_w_neg }, + { 'box', function (w,h,d,nw,nh,nd) return h-nd end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', '-1 0 0 -1' }, + { 'kern', get_h_d_neg }, + { 'box', get_w_neg }, + { 'whatsit', sid_restore }, + }, + }, + }, + [dir_dtou] = { -- dtou を + [dir_yoko] = { -- yoko 中で組む + width = get_h_d, + height = get_w, + depth = zero, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '0 1 -1 0' }, + { 'kern', function (w,h,d,nw,nh,nd) return -nd end }, + { 'box', get_h }, + { 'kern', function (w,h,d,nw,nh,nd) return nd-w end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'kern', zero }, + { 'whatsit', sid_save }, + { 'rotate', '0 1 -1 0' }, + { 'box', function (w,h,d,nw,nh,nd) return -nd-nh end }, + { 'kern', get_h_d_neg }, + { 'whatsit', sid_restore }, + }, + }, + [dir_tate] = { -- tate 中で組む + width = get_w, + height = get_d, + depth = get_h, + [id_hlist] = { + { 'whatsit', sid_save }, + { 'rotate', '-1 0 0 -1' }, + { 'kern', get_w_neg }, + { 'box', function (w,h,d,nw,nh,nd) return h-nd end }, + { 'whatsit', sid_restore }, + }, + [id_vlist] = { + { 'whatsit', sid_save }, + { 'rotate', ' -1 0 0 -1' }, + { 'kern', function (w,h,d,nw,nh,nd) return -nh-nd end }, + { 'box', get_w_neg }, + { 'kern', function (w,h,d,nw,nh,nd) return nh+nd-h-d end }, + { 'whatsit', sid_restore }, + }, + }, + }, + } +end + +-- 1st ret val: b の組方向 +-- 2nd ret val はその DIR whatsit +function get_box_dir(b, default) + start_time_measure('get_box_dir') + local dir = has_attr(b, attr_dir) or 0 + local bh = getfield(b,'head') + -- b は insert node となりうるので getlist() は使えない + local c + if bh~=0 then -- bh != nil + for bh in traverse_id(id_whatsit, bh) do + if getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then + c = bh + dir = (dir==0) and has_attr(bh, attr_dir) or dir + end + end + end + -- for i=1,2 do + -- if bh and getid(bh)==id_whatsit + -- and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then + -- c = bh + -- dir = (dir==0) and has_attr(bh, attr_dir) or dir + -- end + -- bh = node_next(bh) + -- end + stop_time_measure('get_box_dir') + return (dir==0 and default or dir), c +end + +do + local getbox = tex.getbox + local dir_backup + function luatexja.direction.unbox_check_dir(is_copy) + start_time_measure('box_primitive_hook') + local list_dir = get_dir_count()%dir_math_mod + local b = getbox(tex_getcount('ltj@tempcnta')) + if b and getlist(to_direct(b)) then + local box_dir = get_box_dir(to_direct(b), dir_yoko) + if box_dir%dir_math_mod ~= list_dir then + ltjb.package_error( + 'luatexja', + "Incompatible direction list can't be unboxed", + 'I refuse to unbox a box in differrent direction.') + tex.sprint(cat_lp, '\\@gobbletwo') + else + dir_backup = nil + local bd = to_direct(b) + local hd = getlist(bd) + local nh = hd + while hd do + if getid(hd)==id_whatsit and getsubtype(hd)==sid_user + and getfield(hd, 'user_id')==DIR then + local d = hd + nh, hd = node_remove(nh, hd) + if is_copy and (not dir_backup) then + dir_backup = d + setfield(dir_backup, 'next', nil) + else + node_free(d) + end + else + hd = node_next(hd) + end + end + setfield(bd, 'head', nh) + end + end + if luatexja.global_temp and tex.globaldefs~=luatexja.global_temp then + tex.globaldefs = luatexja.global_temp + end + stop_time_measure('box_primitive_hook') + end + function luatexja.direction.uncopy_restore_whatsit() + local b = getbox(tex_getcount('ltj@tempcnta')) + if b then + local bd = to_direct(b) + if dir_backup then + setfield(dir_backup, 'next', getlist(bd)) + setfield(bd, 'head', dir_backup) + dir_backup = nil + end + end + end +end + +-- dir_node に包まれている「本来の中身」を取り出し, +-- dir_node を全部消去 +local function unwrap_dir_node(b, head, box_dir) + -- b: dir_node, head: the head of list, box_dir: + -- return values are (new head), (next of b), (contents), (dir of contents) + local bh = getlist(b) + local nh, nb + if head then + nh = insert_before(head, b, bh) + nh, nb = node_remove(nh, b) + setfield(b, 'next', nil) + node_free(b) + end + local shift_old, b_dir, wh = nil, get_box_dir(bh, 0) + if wh then + node.direct.flush_list(getfield(wh, 'value')) + setfield(wh, 'value', nil) + end + return nh, nb, bh, b_dir +end + +-- is_manual: 寸法変更に伴うものか? +local function create_dir_node(b, b_dir, new_dir, is_manual) + local info = dir_node_aux[b_dir%dir_math_mod][new_dir%dir_math_mod] + local w = getfield(b, 'width') + local h = getfield(b, 'height') + local d = getfield(b, 'depth') + local db = node_new(getid(b)) -- dir_node + set_attr(db, attr_dir, + new_dir + (is_manual and dir_node_manual or dir_node_auto)) + set_attr(db, attr_icflag, PROCESSED) + set_attr(b, attr_icflag, PROCESSED) + ensure_tex_attr(attr_dir, 0) + ensure_tex_attr(attr_icflag, 0) + setfield(db, 'dir', getfield(b, 'dir')) + setfield(db, 'shift', 0) + setfield(db, 'width', info.width(w,h,d)) + setfield(db, 'height', info.height(w,h,d)) + setfield(db, 'depth', info.depth(w,h,d)) + return db +end + +-- 異方向のボックスの処理 +local make_dir_whatsit, process_dir_node +do + make_dir_whatsit = function (head, b, new_dir, origin) + new_dir = new_dir%dir_math_mod + -- head: list head, b: box + -- origin: コール元 (for debug) + -- return value: (new head), (next of b), (new b), (is_b_dir_node) + -- (new b): b か dir_node に被せられた b + local bh = getlist(b) + local box_dir, dn = get_box_dir(b, ltjs.list_dir) + -- 既に b の中身にあるwhatsit + if (box_dir<dir_node_auto) and (not dn) then + bh = create_dir_whatsit(bh, 'make_dir_whatsit', dir_yoko) + dn = bh; setfield(b, 'head', bh) + end + if box_dir%dir_math_mod==new_dir then + if box_dir>=dir_node_auto then + -- dir_node としてカプセル化されている + local _, dnc = get_box_dir(b, 0) + if dnc then -- free all other dir_node + node.direct.flush_list(getfield(dnc, 'value')) + setfield(dnc, 'value', nil) + end + set_attr(b, attr_dir, box_dir%dir_math_mod + dir_node_auto) + return head, node_next(b), b, true + else + -- 組方向が一緒 (up to math dir) のボックスなので,何もしなくて良い + return head, node_next(b), b, false + end + else + -- 組方向を合わせる必要あり + local nh, nb, ret, flag + if box_dir>= dir_node_auto then -- unwrap + local b_dir + head, nb, b, b_dir = unwrap_dir_node(b, head, box_dir) + bh = getlist(b) + if b_dir%dir_math_mod==new_dir then + -- dir_node の中身が周囲の組方向とあっている + return head, nb, b, false + else box_dir = b_dir end + end + box_dir = box_dir%dir_math_mod + local db + local dnh = getfield(dn, 'value') + for x in traverse(dnh) do + if has_attr(x, attr_dir)%dir_math_mod == new_dir then + setfield(dn, 'value', to_node(node_remove(dnh, x))) + db=x; break + end + end + node.direct.flush_list(getfield(dn, 'value')) + setfield(dn, 'value', nil) + db = db or create_dir_node(b, box_dir, new_dir, false) + local w = getfield(b, 'width') + local h = getfield(b, 'height') + local d = getfield(b, 'depth') + local dn_w = getfield(db, 'width') + local dn_h = getfield(db, 'height') + local dn_d = getfield(db, 'depth') + nh, nb = insert_before(head, b, db), nil + nh, nb = node_remove(nh, b) + setfield(b, 'next', nil); setfield(db, 'head', b) + ret, flag = db, true + return nh, nb, ret, flag + end + end + process_dir_node = function (hd, gc) + local x, new_dir = hd, ltjs.list_dir or dir_yoko + while x do + local xid = getid(x) + if (xid==id_hlist and get_attr_icflag(x)~=PACKED) + or xid==id_vlist then + hd, x = make_dir_whatsit(hd, x, new_dir, 'process_dir_node:' .. gc) + else + x = node_next(x) + end + end + return hd + end + + -- lastbox + local node_prev = (node.direct~=node) and node.direct.getprev or node.prev + local id_glue = node.id('glue') + local function lastbox_hook() + start_time_measure('box_primitive_hook') + local bn = tex_nest[tex_nest.ptr].tail + if bn then + local b, head = to_direct(bn), to_direct(tex_nest[tex_nest.ptr].head) + local bid = getid(b) + if bid==id_hlist or bid==id_vlist then + local p = getlist(b) + -- alignment の各行の中身が入ったボックス + if p and getid(p)==id_glue and getsubtype(p)==12 then -- tabskip + local np = node_next(p); local npid = getid(np) + if npid==id_hlist or npid==id_vlist then + setfield(b, 'head', create_dir_whatsit(p, 'align', get_box_dir(np, 0))) + end + end + local box_dir = get_box_dir(b, 0) + if box_dir>= dir_node_auto then -- unwrap dir_node + local p = node_prev(b) + local dummy1, dummy2, nb = unwrap_dir_node(b, nil, box_dir) + setfield(p, 'next', nb); tex_nest[tex_nest.ptr].tail = to_node(nb) + setfield(b, 'next', nil); setfield(b, 'head', nil) + node_free(b); b = nb + end + local _, wh = get_box_dir(b, 0) -- clean dir_node attached to the box + if wh then + node.direct.flush_list(getfield('value', wh)) + setfield(wh, 'value', nil) + end + end + end + stop_time_measure('box_primitive_hook') + end + + luatexja.direction.make_dir_whatsit = make_dir_whatsit + luatexja.direction.lastbox_hook = lastbox_hook +end + +-- \wd, \ht, \dp の代わり +do + local getbox, setdimen = tex.getbox, tex.setdimen + local function get_box_dim_common(key, s, l_dir) + -- s: not dir_node. + local s_dir, wh = get_box_dir(s, dir_yoko) + s_dir = s_dir%dir_math_mod + if s_dir ~= l_dir then + local not_found = true + for x in traverse(getfield(wh, 'value')) do + if l_dir == has_attr(x, attr_dir)%dir_node_auto then + setdimen('ltj@tempdima', getfield(x, key)) + not_found = false; break + end + end + if not_found then + local w = getfield(s, 'width') + local h = getfield(s, 'height') + local d = getfield(s, 'depth') + setdimen('ltj@tempdima', + dir_node_aux[s_dir][l_dir][key](w,h,d)) + end + else + setdimen('ltj@tempdima', getfield(s, key)) + end + end + local function get_box_dim(key, n) + local gt = tex.globaldefs; tex.globaldefs = 0 + local s = getbox(n) + if s then + local l_dir = (get_dir_count())%dir_math_mod + s = to_direct(s) + local b_dir = get_box_dir(s,dir_yoko) + if b_dir<dir_node_auto then + get_box_dim_common(key, s, l_dir) + elseif b_dir%dir_math_mod==l_dir then + setdimen('ltj@tempdima', getfield(s, key)) + else + get_box_dim_common(key, getlist(s), l_dir) + end + else + setdimen('ltj@tempdima', 0) + end + tex.sprint(cat_lp, '\\ltj@tempdima') + tex.globaldefs = gt + end + luatexja.direction.get_box_dim = get_box_dim + + -- return value: (changed dimen of box itself?) + local scan_dimen, scan_int = token.scan_dimen, token.scan_int + local scan_keyword = token.scan_keyword + local function set_box_dim_common(key, s, l_dir) + local s_dir, wh = get_box_dir(s, dir_yoko) + s_dir = s_dir%dir_math_mod + if s_dir ~= l_dir then + if not wh then + wh = create_dir_whatsit(getlist(s), 'set_box_dim', s_dir) + setfield(s, 'head', wh) + end + local db + local dnh = getfield(wh, 'value') + for x in traverse(dnh) do + if has_attr(x, attr_dir)%dir_node_auto==l_dir then + db = x; break + end + end + if not db then + db = create_dir_node(s, s_dir, l_dir, true) + setfield(db, 'next', dnh) + setfield(wh, 'value',to_node(db)) + end + setfield(db, key, scan_dimen()) + return false + else + setfield(s, key, scan_dimen()) + if wh then + -- change dimension of dir_nodes which are created "automatically" + local bw, bh, bd + = getfield(s,'width'), getfield(s, 'height'), getfield(s, 'depth') + for x in traverse(getfield(wh, 'value')) do + local x_dir = has_attr(x, attr_dir) + if x_dir<dir_node_manual then + local info = dir_node_aux[s_dir][x_dir%dir_node_auto] + setfield(x, 'width', info.width(bw,bh,bd)) + setfield(x, 'height', info.height(bw,bh,bd)) + setfield(x, 'depth', info.depth(bw,bh,bd)) + end + end + end + return true + end + end + local function set_box_dim(key) + local s = getbox(scan_int()); scan_keyword('=') + if s then + local l_dir = (get_dir_count())%dir_math_mod + s = to_direct(s) + local b_dir = get_box_dir(s,dir_yoko) + if b_dir<dir_node_auto then + set_box_dim_common(key, s, l_dir) + elseif b_dir%dir_math_mod == l_dir then + -- s is dir_node + setfield(s, key, scan_dimen()) + if b_dir<dir_node_manual then + set_attr(s, attr_dir, b_dir%dir_node_auto + dir_node_manual) + end + else + local sid, b = getid(s), getlist(s) + local info = dir_node_aux[get_box_dir(b,dir_yoko)%dir_math_mod][b_dir%dir_node_auto] + local bw, bh, bd + = getfield(b,'width'), getfield(b, 'height'), getfield(b, 'depth') + local sw, sh, sd + = getfield(s,'width'), getfield(s, 'height'), getfield(s, 'depth') + if set_box_dim_common(key, b, l_dir) and b_dir<dir_node_manual then + -- re-calculate dimension of s, if s is created "automatically" + if b_dir<dir_node_manual then + setfield(s, 'width', info.width(bw,bh,bd)) + setfield(s, 'height', info.height(bw,bh,bd)) + setfield(s, 'depth', info.depth(bw,bh,bd)) + end + end + end + end + end + luatexja.direction.set_box_dim = set_box_dim +end + +do + local getbox = tex.getbox + local function get_register_dir(n) + local s = getbox(n) + if s then + s = to_direct(s) + local b_dir = get_box_dir(s, dir_yoko) + if b_dir<dir_node_auto then + return b_dir + else + local b_dir = get_box_dir( + node_next(node_next(node_next(getlist(s)))), dir_yoko) + return b_dir + end + else + return 0 + end + end + luatexja.direction.get_register_dir = get_register_dir +end + +do + local getbox, setbox, copy_list = tex.getbox, tex.setbox, node.direct.copy_list + -- raise, lower + function luatexja.direction.raise_box() + start_time_measure('box_primitive_hook') + local list_dir = get_dir_count() + local s = getbox('ltj@afbox') + if s then + local sd = to_direct(s) + local box_dir = get_box_dir(sd, dir_yoko) + if box_dir%dir_math_mod ~= list_dir then + setbox( + 'ltj@afbox', + to_node(copy_list(make_dir_whatsit(sd, sd, list_dir, 'box_move'))) + -- copy_list しないとリストの整合性が崩れる……? + ) + end + end + stop_time_measure('box_primitive_hook') + end +end + +-- PACKED の hbox から文字を取り出す +-- luatexja.jfmglue.check_box などで使用 +do + local function glyph_from_packed(h) + local b = getlist(h) + return (getid(b)==id_kern or (getid(b)==id_whatsit and getsubtype(b)==sid_save) ) + and node_next(node_next(node_next(b))) or b + end + luatexja.direction.glyph_from_packed = glyph_from_packed +end + +-- adjust +do + local id_adjust = node.id('adjust') + function luatexja.direction.check_adjust_direction() + start_time_measure('box_primitive_hook') + local list_dir = get_adjust_dir_count() + local a = tex_nest[tex_nest.ptr].tail + local ad = to_direct(a) + if a and getid(ad)==id_adjust then + local adj_dir = get_box_dir(ad) + if list_dir~=adj_dir then + ltjb.package_error( + 'luatexja', + 'Direction Incompatible', + "\\vadjust's argument and outer vlist must have same direction.") + node.direct.last_node() + end + end + stop_time_measure('box_primitive_hook') + end +end + +-- insert +do + local id_ins = node.id('ins') + local id_rule = node.id('rule') + function luatexja.direction.populate_insertion_dir_whatsit() + start_time_measure('box_primitive_hook') + local list_dir = get_dir_count() + local a = tex_nest[tex_nest.ptr].tail + local ad = to_direct(a) + if (not a) or getid(ad)~=id_ins then + a = node.tail(tex.lists.page_head); ad = to_direct(a) + end + if a and getid(ad)==id_ins then + local h = getfield(ad, 'head') + if getid(h)==id_whatsit and + getsubtype(h)==sid_user and getfield(h, 'user_id')==DIR then + local n = h; h = node_remove(h,h) + node_free(n) + end + for box_rule in traverse(h) do + if getid(box_rule)<id_rule then + h = insert_before(h, box_rule, dir_pool[list_dir]()) + end + end + ensure_tex_attr(attr_dir, 0) + setfield(ad, 'head', h) + end + stop_time_measure('box_primitive_hook') + end +end + +-- vsplit +do + local split_dir_whatsit, split_dir_head + local cat_lp = luatexbase.catcodetables['latex-package'] + local sprint, scan_int, tex_getbox = tex.sprint, token.scan_int, tex.getbox + function luatexja.direction.vsplit() + local n = scan_int(); + local p = to_direct(tex_getbox(n)) + split_dir_head = nil + if p then + local bh = getlist(p) + if getid(bh)==id_whatsit and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR + and node_next(bh) then + ltjs.list_dir = has_attr(bh, attr_dir) + local q = node_next(p) + setfield(p, 'head', node_remove(bh,bh,bh)) + split_dir_head = bh + end + end + sprint(cat_lp, '\\ltj@@orig@vsplit' .. tostring(n)) + end + local function dir_adjust_vpack(h, gc) + start_time_measure('direction_vpack') + local hd = to_direct(h) + if gc=='split_keep' then + -- supply dir_whatsit + hd = create_dir_whatsit_vbox(hd, gc) + split_dir_whatsit = hd + elseif gc=='split_off' then + if split_dir_head then + list_dir = has_attr(split_dir_head, attr_dir) + hd = insert_before(hd, hd, split_dir_head) + split_dir_head=nil + end + if split_dir_whatsit then + -- adjust direction of 'split_keep' + set_attr(split_dir_whatsit, attr_dir, ltjs.list_dir) + end + split_dir_whatsit=nil + elseif gc=='preamble' then + split_dir_whatsit=nil + else + adjust_badness(hd) + -- hd = process_dir_node(create_dir_whatsit_vbox(hd, gc), gc) + -- done in append_to_vpack callback + hd = create_dir_whatsit_vbox(hd, gc) + split_dir_whatsit=nil + end + stop_time_measure('direction_vpack') + return to_node(hd) + end + ltjb.add_to_callback('vpack_filter', + dir_adjust_vpack, + 'ltj.direction', 10000) +end + +do + -- supply direction whatsit to the main vertical list "of the next page" + local function dir_adjust_pre_output(h, gc) + return to_node(create_dir_whatsit_vbox(to_direct(h), gc)) + end + ltjb.add_to_callback('pre_output_filter', + dir_adjust_pre_output, + 'ltj.direction', 10000) + + function luatexja.direction.remove_end_whatsit() + local h=tex.lists.page_head + if h and (not h.next) and + h.id==id_whatsit and h.subtype==sid_user and + h.user_id == DIR then + tex.lists.page_head = nil + node.free(h) + end + end +end + +-- append_to_vlist filter: done in ltj-lineskip.lua + +-- finalize (executed just before \shipout) +-- we supply correct pdfsavematrix nodes etc. inside dir_node +do + local finalize_inner + local function finalize_dir_node(db,new_dir) + local b = getlist(db) + if getid(b)==id_whatsit and getsubtype(b)==sid_user + and getfield(b, 'user_id')==DIR then + local ob = b; b = node_remove(b,b); setfield(db, 'head', b); + node_free(ob) + end + finalize_inner(b) + local w = getfield(b, 'width') + local h = getfield(b, 'height') + local d = getfield(b, 'depth') + local dn_w = getfield(db, 'width') + local dn_h = getfield(db, 'height') + local dn_d = getfield(db, 'depth') + local db_head, db_tail + local t = dir_node_aux[get_box_dir(b, dir_yoko)%dir_math_mod][new_dir] + t = t and t[getid(b)]; if not t then return end + for _,v in ipairs(t) do + local cmd, arg, nn = v[1], v[2] + if cmd=='kern' then + nn = node_new(id_kern, 1) + setfield(nn, 'kern', arg(w, h, d, dn_w, dn_h, dn_d)) + elseif cmd=='whatsit' then + nn = node_new(id_whatsit, arg) + elseif cmd=='rotate' then + nn = node_new(id_whatsit, sid_matrix) + setfield(nn, 'data', arg) + elseif cmd=='box' then + nn = b; setfield(b, 'next', nil) + setfield(nn, 'shift', arg(w, h, d, dn_w, dn_h, dn_d)) + end + if db_head then + insert_after(db_head, db_tail, nn) + db_tail = nn + else + setfield(db, 'head', nn) + db_head, db_tail = nn, nn + end + end + end + + tex.setattribute(attr_dir, dir_yoko) + local shipout_temp = node_new(id_hlist) + tex.setattribute(attr_dir, 0) + + finalize_inner = function (box) + for n in traverse(getlist(box)) do + local nid = getid(n) + if (nid==id_hlist or nid==id_vlist) then + local ndir = get_box_dir(n, dir_yoko) + if ndir>=dir_node_auto then -- n is dir_node + finalize_dir_node(n, ndir%dir_math_mod) + else + finalize_inner(n) + end + end + end + end + local getbox = tex.getbox + local setbox, copy = node.direct.setbox, node.direct.copy + local lua_mem_kb = 0 + function luatexja.direction.finalize() + local a = to_direct(tex.getbox("AtBeginShipoutBox")) + local a_dir = get_box_dir(a, dir_yoko) + if a_dir~=dir_yoko then + local b = create_dir_node(a, a_dir, dir_yoko, false) + setfield(b, 'head', a); a = b + end + setfield(shipout_temp, 'head', a) + finalize_inner(shipout_temp) + setbox('global', "AtBeginShipoutBox", copy(getlist(shipout_temp))) + setfield(shipout_temp, 'head',nil) + -- garbage collect + --local m = collectgarbage('count') + --if m>lua_mem_kb+20480 then + -- collectgarbage(); lua_mem_kb = collectgarbage('count') + --end + --print('Lua Memory Usage', lua_mem_kb) + end +end diff --git a/macros/luatex/generic/luatexja/src/ltj-inputbuf.lua b/macros/luatex/generic/luatexja/src/ltj-inputbuf.lua new file mode 100644 index 0000000000..e901d43891 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-inputbuf.lua @@ -0,0 +1,53 @@ +-- +-- luatexja/ltj-inputbuf.lua +-- + +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('charrange'); local ltjc = luatexja.charrange + +require("unicode") +local utflen = utf.len +local utfbyte = utf.byte +local utfchar = utf.char +local node_new = node.new +local node_free = node.free +local id_glyph = node.id('glyph') +local getcatcode, getcount = tex.getcatcode, tex.getcount +local ltjc_is_japanese_char_curlist = ltjc.is_japanese_char_curlist + +--- the following function is modified from jafontspec.lua (by K. Maeda). +--- Instead of "%", we use U+FFFFF for suppressing spaces. +--DEBUG require"socket" +local time_line = 0 +local start_time_measure, stop_time_measure + = ltjb.start_time_measure, ltjb.stop_time_measure +local function add_comment(buffer) + start_time_measure('inputbuf') + local i = utflen(buffer) + while (i>0) and (getcatcode(utfbyte(buffer, i))==1 + or getcatcode(utfbyte(buffer, i))==2) do + i=i-1 + end + if i>0 then + local c = utfbyte(buffer, i) + if c>=0x80 then + local ct = getcatcode(c) + local te = tex.endlinechar + local ctl = (te ~= -1) and (getcatcode(te)==5) and (getcatcode(getcount('ltjlineendcomment'))==14) + -- Is the catcode of endline character is 5 (end-of-line)? + -- Is the catcode of \ltjlineendcomment (new comment char) is 14 (comment)? + if ((ct==11) or (ct==12)) and ctl then + if ltjc_is_japanese_char_curlist(c) then + buffer = buffer .. utfchar(getcount('ltjlineendcomment')) + end + end + end + end + stop_time_measure('inputbuf') + return buffer +end + +luatexbase.add_to_callback('process_input_buffer', + add_comment,'ltj.process_input_buffer') + +--EOF diff --git a/macros/luatex/generic/luatexja/src/ltj-ivd_aj1.lua b/macros/luatex/generic/luatexja/src/ltj-ivd_aj1.lua new file mode 100644 index 0000000000..424b1ef472 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-ivd_aj1.lua @@ -0,0 +1,23096 @@ +return { +version = 2, +table_ivd_aj1 = { +-- # IVD_Sequences +-- # +-- # History: +-- # +-- # 2017-12-12 Registration of additional sequences in the Adobe-Japan1 +-- # collection. Combined registration of the KRName collection +-- # and of sequences in that collection. Registration of +-- # additional sequences in the Moji_Joho collection. +-- # +-- # 2016-08-15 Combined registration of the MSARG collection and of +-- # sequences in that collection. +-- # +-- # 2014-05-16 Combined registration of the Moji_Joho collection and of +-- # sequences in that collection. +-- # +-- # 2012-07-02 File restored due to corruption on the server. +-- # +-- # 2012-03-02 Registration of additional sequences in the Adobe-Japan1 +-- # collection. Registration of additional sequences in the +-- # Hanyo-Denshi collection. +-- # +-- # 2010-11-14 Combined registration of the Hanyo-Denshi collection and +-- # of sequences in that collection. +-- # +-- # 2007-12-14 Combined registration of the Adobe-Japan1 collection and +-- # of sequences in that collection. +-- # +-- # This file is part of the Unicode Ideographic Variation Database (IVD). +-- # For more details on the IVD, see UTS #37: +-- # http://www.unicode.org/reports/tr37/ +-- # +-- # Copyright 2006-2017 Unicode, Inc. +-- # For terms of use, see: http://www.unicode.org/terms_of_use.html +-- # +-- # EOF + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 2117341, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 2117276, + 2118934, + 2120195, + 2135615, + 2118848, + 2122011, + 2122536, + 2120182, + 2134050, + 2131061, + 2130716, + 2128464, + 2121898, + 2122721, + 2125349, + 2123245, + 2131046, + 2130598, + 2137077, + 2123923, + 2119463, + 2123169, + 2122353, + 2120603, + 2120144, + 2131579, + 2136308, + 2129250, + 2129342, + 2136974, + 2122262, + 2129055, + 2132151, + 2120585, + 2121397, + 2122505, + 2123415, + 2123848, + 2135495, + 2135949, + 2123599, + 2117349, + 2117386, + 2117453, + 2117533, + 2117705, + 2119410, + 2119991, + 2120148, + 2120193, + 2120713, + 2121951, + 2121999, + 2122096, + 2123283, + 2124037, + 2126010, + 2127183, + 2127216, + 2128379, + 2129325, + 2129391, + 2130115, + 2130958, + 2132067, + 2132738, + 2134101, + 2134138, + 2118459, + 2117269, + 2117285, + 2119647, + 2130098, + 2134209, + 2128111, + 2117120, + 2119921, + 2125474, + 2134072, + 2128434, + 2130728, + 2130571, + 2137135, + 2117953, + 2118512, + 2118845, + 2118881, + 2119392, + 2120187, + 2121493, + 2136306, + 2125291, + 2130148, + 2131245, + 2135650, + 2135664, + 2135712, + 2136059, + 2118667, + 2118643, + 2120583, + 2126031, + 4227005, + 2133954, + 2135784, + 2118511, + 2137436, + 2128570, + 2117137, + 2128019, + 2130428, + 2125350, + 2119192, + 2118916, + 2124573, + 2131226, + 2137147, + 2120165, + 2118569, + 2125158, + 2127068, + 2135439, + 2119234, + 2117265, + 2134091, + 2135794, + 2130767, + 2136332, + 2118625, + 2119094, + 2120496, + 2121585, + 2123296, + 2123507, + 2123780, + 2124856, + 2125043, + 2125097, + 2126939, + 2127560, + 2128462, + 2136116, + 2130673, + 2132059, + 2132576, + 2134765, + 2125234, + 2127275, + 2127562, + 2136517, + 2121894, + 4229889, + 2133386, + 2135474, + 2124174, + 2118573, + 2118022, + 2119442, + 2119728, + 2120004, + 2120628, + 2121462, + 2121768, + 2122665, + 2122740, + 4222143, + 2125588, + 2125966, + 2126100, + 2126169, + 2126293, + 2126655, + 2129409, + 2130550, + 2130641, + 2131351, + 2134112, + 2134619, + 2137371, + 2119785, + 2123196, + 2124890, + 2127141, + 2118137, + 2119982, + 2120037, + 2121600, + 2121692, + 2122428, + 2123258, + 2124330, + 2124583, + 2124724, + 2126731, + 2129857, + 2132310, + 2137388, + 2137358, + 2137796, + 2120865, + 2124950, + 2130811, + 2117892, + 2120779, + 2122166, + 2130374, + 2123894, + 2126433, + 2117209, + 2117626, + 2118520, + 2121833, + 2125353, + 2128463, + 2136051, + 2117131, + 2118422, + 2117358, + 2117461, + 2117437, + 2117537, + 2117491, + 2118304, + 2118639, + 2119177, + 2119951, + 2120385, + 2120630, + 2120673, + 2128337, + 2123399, + 2123676, + 2123702, + 2124620, + 2124979, + 2125931, + 2126786, + 4225421, + 2128318, + 2128444, + 2128775, + 2130609, + 2130651, + 2130692, + 2130807, + 2130927, + 2130899, + 2131814, + 2132658, + 2119209, + 2133160, + 2133990, + 2134094, + 2135838, + 2131594, + 2117572, + 2120936, + 2122257, + 2126425, + 2127163, + 2130405, + 4227773, + 2131710, + 2133184, + 2135749, + 2136339, + 2136533, + 2117323, + 2117402, + 2132451, + 2119390, + 2119754, + 2119882, + 2121467, + 2121707, + 2121770, + 4219028, + 2121826, + 2122192, + 2122258, + 2122448, + 2123065, + 2136897, + 2123366, + 2123952, + 4222327, + 2125936, + 2127180, + 2127494, + 2129269, + 2130597, + 2131961, + 2135435, + 2135694, + 2133149, + 2118129, + 2118334, + 2119958, + 2118835, + 2120627, + 2120982, + 2122088, + 2124162, + 2125231, + 2128013, + 2131147, + 2132055, + 2132594, + 2134951, + 2136760, + 2125164, + 2136488, + 2131673, + 2119587, + 2123775, + 2131662, + 2134542, + 2118275, + 2119303, + 2118660, + 2121427, + 2122465, + 2122937, + 2123836, + 2123832, + 2124731, + 2126706, + 2128058, + 2128491, + 2132378, + 4229586, + 2133355, + 2133763, + 2134253, + 2135459, + 2135700, + 2135913, + 2120550, + 2120883, + 2124157, + 2136141, + 2136142, + 2122651, + 2128672, + 2124331, + 2124415, + 2123958, + 2137101, + 2125663, + 4215410, + 2119069, + 2121840, + 2122476, + 2125115, + 2125319, + 2125521, + 2131035, + 2132240, + 2133828, + 2117140, + 2137145, + 2118646, + 2124059, + 2124346, + 2135940, + 2123818, + 2117980, + 2128579, + 2131122, + 2134492, + 2134924, + 2119259, + 2137384, + 2123810, + 2130693, + 2130993, + 2129061, + 2118152, + 2130629, + 2127078, + 2117246, + 2117507, + 2118048, + 2120658, + 2118154, + 2118360, + 2118375, + 2121211, + 2119066, + 2119722, + 2120166, + 2120588, + 2120600, + 2120667, + 2121330, + 2121337, + 2121891, + 2122015, + 2122083, + 2122174, + 2122715, + 2123106, + 2123729, + 2123859, + 2124026, + 2124606, + 2124627, + 2124887, + 2125602, + 2125719, + 2125637, + 2127024, + 2127128, + 2127587, + 2127627, + 2128639, + 2128801, + 2128929, + 2129385, + 2129718, + 2129904, + 2130077, + 2130534, + 2130846, + 2132403, + 2132684, + 2133163, + 2134148, + 2135121, + 2135443, + 2135441, + 2135458, + 2135653, + 2136019, + 2136360, + 2130456, + 2117176, + 2118699, + 2120888, + 2121164, + 2126761, + 2127436, + 2127676, + 2120873, + 2129899, + 2133259, + 2135745, + 2136081, + 2136148, + 2136152, + 2117377, + 2117390, + 2118513, + 2119068, + 2119272, + 2119674, + 2120007, + 2120457, + 2120644, + 2120848, + 2121228, + 2121342, + 2121676, + 2122734, + 2123578, + 2123223, + 4220386, + 2123551, + 2123979, + 2123972, + 2124383, + 2121264, + 2124741, + 2124823, + 2124925, + 2127231, + 4225352, + 2120547, + 2128384, + 2129152, + 2121661, + 2132367, + 2132504, + 2133172, + 2133367, + 2133708, + 2133789, + 2136290, + 2136590, + 2136892, + 2117248, + 2117757, + 2117888, + 2120083, + 2120604, + 2122287, + 2122368, + 2122988, + 2124602, + 2126496, + 2127249, + 2128199, + 2129833, + 2131963, + 2132668, + 2132848, + 2122668, + 2130890, + 2135968, + 2118665, + 2118659, + 2119083, + 2123860, + 2124376, + 2132592, + 2127911, + 2123637, + 2137805, + 2118516, + 2120610, + 2130202, + 2131536, + 2134022, + 2117144, + 2117189, + 2117319, + 2117393, + 2118602, + 2118712, + 2120622, + 2121491, + 2121765, + 2123089, + 2123581, + 2124866, + 2124914, + 2125027, + 2125944, + 2126851, + 2128502, + 2128558, + 2128648, + 2129178, + 2129150, + 2129254, + 2123239, + 2126427, + 2118587, + 2120773, + 2121192, + 2122450, + 2122464, + 2122521, + 2125344, + 2131546, + 2132529, + 2133469, + 2134776, + 2125569, + 2128294, + 2136922, + 2117288, + 2117291, + 2117292, + 2117531, + 2117536, + 2117841, + 2117959, + 2128630, + 2118001, + 2118134, + 2118484, + 2118433, + 4215679, + 2118635, + 2119084, + 2119811, + 2120929, + 2121527, + 2121546, + 2121775, + 2121808, + 2121837, + 2122527, + 2123097, + 2124363, + 2124993, + 2126530, + 2126573, + 2127855, + 2130168, + 2130181, + 2130440, + 2131278, + 2134263, + 2135009, + 2136063, + 2136407, + 2136666, + 2117360, + 2118109, + 2120749, + 2123393, + 2124141, + 2120768, + 2123506, + 2124149, + 2126729, + 2123856, + 2129025, + 2117829, + 2118372, + 2119495, + 2121214, + 2134822, + 2123172, + 2124579, + 2124605, + 2126900, + 2128257, + 2128317, + 2128715, + 2129354, + 2130617, + 2130892, + 2132095, + 2132319, + 4229945, + 2133969, + 2134481, + 2118687, + 2134656, + 2117213, + 2117686, + 2118629, + 2118458, + 2126551, + 2126742, + 2127849, + 2130662, + 2133679, + 2136518, + 2136520, + 2136530, + 2118007, + 2122010, + 2131550, + 2119088, + 2128506, + 2117750, + 2120659, + 2134087, + 2135685, + 2117170, + 4221659, + 2134503, + 2120785, + 2120776, + 2122648, + 2128543, + 2124947, + 2135924, + 2133857, + 2128554, + 2126218, + 2135688, + 2129026, + 2123799, + 2129520, + 2123857, + 2134892, + 2118386, + 2118683, + 2131371, + 2132499, + 2129828, + 2133709, + 2134241, + 2118502, + 2132104, + 2128193, + 2117570, + 2117822, + 2118161, + 2117956, + 2118995, + 2119469, + 2126826, + 2119563, + 2120017, + 2121570, + 2121604, + 2121845, + 2122102, + 2122087, + 2122153, + 2122674, + 2122810, + 2123116, + 2123375, + 2123842, + 2125331, + 2127206, + 2128445, + 2129147, + 2129228, + 2129305, + 2129483, + 2129771, + 2130702, + 2130762, + 2131661, + 2132488, + 2132579, + 2132838, + 2133757, + 2136090, + 2137487, + 2130616, + 2133966, + 2137064, + 2118279, + 2122271, + 2122883, + 2125760, + 2135705, + 2123841, + 2117777, + 2124576, + 2124922, + 2125652, + 2128500, + 2129232, + 2132032, + 2132515, + 2123528, + 2117366, + 2117689, + 2117670, + 2117733, + 2118012, + 2118200, + 2118243, + 2119079, + 2119439, + 2119685, + 2120396, + 2121466, + 2122162, + 2122232, + 2122483, + 2122610, + 2124060, + 2124329, + 2126461, + 2126508, + 2126638, + 2127892, + 2127983, + 2129273, + 2127628, + 2130089, + 2132363, + 2132761, + 2133218, + 2133714, + 2134115, + 2134901, + 2135674, + 2136149, + 2136595, + 2137720, + 2117955, + 2118559, + 2118579, + 2121339, + 2121510, + 2125339, + 2125456, + 2126724, + 2126846, + 2129219, + 2130487, + 2132480, + 2132730, + 2135632, + 2117198, + 2117643, + 2118628, + 2118780, + 2119418, + 2120145, + 2120548, + 2121201, + 2121387, + 2121511, + 2122296, + 2123077, + 2123695, + 2125398, + 2126544, + 2129098, + 2132148, + 2130081, + 2130145, + 2130928, + 2131534, + 2132615, + 2133480, + 2134583, + 2135751, + 2136167, + 2137875, + 2117268, + 2117266, + 2117389, + 2118472, + 2118729, + 2118718, + 2120239, + 2121612, + 2121633, + 2121887, + 2123943, + 2124430, + 2126938, + 2128001, + 2132638, + 2132644, + 2132855, + 2134416, + 2117214, + 2137033, + 2117284, + 2117500, + 2117551, + 2117657, + 2117654, + 2117961, + 2117996, + 2118303, + 2118329, + 2118398, + 2118554, + 2118627, + 2118673, + 2118670, + 2119049, + 2119505, + 2119586, + 2120061, + 2120532, + 2120541, + 2120591, + 2121189, + 2121191, + 2121207, + 2121336, + 2121347, + 2121370, + 2121399, + 2121496, + 2121810, + 2122060, + 2122391, + 2122456, + 2122663, + 2123067, + 2123266, + 2123331, + 2123508, + 2123629, + 2123809, + 2123927, + 2124235, + 2124895, + 2125098, + 2125161, + 2125359, + 2125469, + 2127154, + 2127495, + 2127980, + 2128447, + 2129120, + 2129157, + 2129176, + 2129246, + 2129329, + 2129941, + 2129923, + 2130095, + 2130097, + 2130260, + 2130319, + 2130474, + 2130770, + 2132044, + 2132065, + 2132763, + 2133154, + 2133244, + 2134218, + 2134389, + 2134641, + 2127935, + 2134780, + 2135460, + 2135629, + 2136069, + 2136473, + 2136792, + 2137403, + 2118235, + 2118315, + 2118647, + 2118664, + 2119893, + 2122487, + 2125792, + 2133098, + 2133855, + 2137785, + 2117963, + 2118203, + 2118730, + 2119421, + 4225600, + 2134391, + 2137440, + 2137810, + 2126660, + 2125577, + 2130288, + 2127121, + 2121725, + 2121946, + 2136744, + 2126555, + 2133948, + 2124644, + 2136067, + 2117322, + 2119408, + 2119524, + 2119870, + 2120282, + 2121832, + 2122183, + 2123279, + 2123270, + 2123833, + 2123953, + 2125303, + 2127317, + 2129210, + 2130542, + 2136898, + 2117275, + 2117456, + 2118601, + 2118918, + 2121071, + 2121190, + 2121198, + 2123771, + 2124953, + 2126963, + 2127874, + 2132560, + 2134934, + 2132191, + 2119504, + 2121383, + 2122539, + 2117813, + 2117804, + 4215181, + 2123520, + 2118857, + 2119774, + 2120123, + 2120624, + 2121577, + 2122317, + 2122657, + 2123837, + 2124659, + 2125320, + 2125949, + 2134471, + 2126464, + 2127893, + 2127910, + 2128237, + 2123150, + 2129200, + 2130908, + 2132161, + 2133769, + 2135707, + 2118244, + 2119464, + 2123600, + 2129770, + 2133153, + 2118068, + 2119490, + 2135594, + 2119738, + 2124170, + 2130100, + 2118834, + 2120974, + 2119676, + 2128021, + 2137594, + 2117468, + 2118218, + 2118795, + 2122814, + 2123304, + 2123540, + 2123765, + 2128516, + 2128726, + 2129186, + 2134831, + 2123868, + 2137005, + 2128697, + 2118425, + 2118026, + 2118199, + 2120671, + 2122486, + 2122926, + 2122982, + 2123565, + 4221882, + 2131369, + 2135761, + 2127504, + 2137046, + 2122572, + 2134790, + 2137003, + 2127551, + 2123346, + 2117129, + 2117784, + 2118594, + 2120817, + 2121960, + 2122898, + 2123107, + 2123871, + 2126310, + 2126794, + 2127139, + 2128791, + 2129538, + 2131605, + 2132867, + 2133211, + 2134392, + 2136336, + 2123180, + 2123435, + 2124683, + 2117333, + 2117332, + 2117434, + 2117503, + 2118202, + 2118648, + 2118642, + 2119139, + 2119387, + 2119915, + 2120139, + 2120137, + 2120191, + 2120528, + 2120781, + 2121218, + 2121259, + 2121687, + 2121757, + 2122503, + 2123055, + 2120540, + 2123183, + 2123197, + 2123240, + 2123677, + 2124642, + 2124667, + 2124815, + 2126661, + 2128201, + 2128321, + 2129144, + 2129177, + 2129195, + 2130082, + 2130178, + 2130419, + 2132374, + 2132574, + 2132585, + 2132582, + 2132620, + 2132718, + 2133191, + 2133212, + 2135756, + 2136316, + 2124655, + 2117259, + 2117436, + 2117517, + 2117968, + 2120535, + 2120698, + 2122056, + 2122497, + 2123330, + 2124577, + 2125515, + 2124987, + 2126398, + 2127037, + 2127316, + 2128065, + 4225338, + 2129932, + 2129971, + 2130410, + 2131092, + 2133918, + 2124880, + 2137727, + 2121487, + 2132824, + 2137387, + 2128634, + 2133752, + 2120589, + 2135787, + 2117123, + 2118641, + 2119671, + 2119985, + 2120393, + 2120612, + 2121865, + 2125439, + 2125574, + 2127294, + 2133226, + 2120607, + 2131200, + 2128864, + 2117746, + 2123764, + 2130589, + 2120801, + 2131274, + 2129438, + 2130446, + 2118041, + 2120708, + 2122600, + 2133350, + 2123164, + 4223342, + 2128190, + 2129175, + 2129925, + 2132765, + 2133706, + 2134126, + 2131655, + 2134186, + 2117663, + 4215546, + 2120762, + 2123603, + 2125948, + 4223541, + 2134348, + 2134472, + 2134827, + 2130661, + 2120642, + 2121521, + 2121977, + 2117179, + 2118614, + 2120584, + 2122315, + 2123569, + 2124682, + 2126569, + 2126816, + 2128430, + 2130283, + 2133411, + 2134354, + 2136470, + 2117906, + 2118615, + 2118762, + 2120703, + 2122632, + 2124345, + 2129324, + 2135808, + 2119386, + 2118606, + 4215912, + 2120599, + 2120753, + 2121182, + 2117614, + 2121985, + 2122494, + 2125106, + 2128320, + 2128331, + 2129218, + 2129485, + 2129874, + 2130413, + 2130463, + 2131088, + 2132038, + 2132338, + 2132880, + 2133620, + 2133807, + 2134065, + 2134347, + 2134380, + 2135750, + 2134428, + 2117312, + 2117455, + 2117957, + 2118465, + 2121619, + 2122254, + 2123732, + 2124865, + 2125323, + 2126691, + 2129446, + 2134477, + 2134659, + 2118612, + 2119961, + 2120639, + 2125265, + 4225373, + 2129454, + 2129051, + 2119806, + 2126239, + 2118138, + 2132051, + 2134000, + 2117578, + 2120955, + 2123301, + 2127788, + 2128611, + 2130460, + 2136575, + 2118086, + 2121642, + 2123244, + 2124143, + 2124681, + 2125299, + 2125462, + 2125668, + 2127614, + 2129172, + 2121185, + 2134133, + 2134407, + 2136070, + 2118118, + 2118173, + 2122304, + 2123409, + 2123481, + 4222490, + 2121398, + 2129362, + 4226930, + 2123512, + 2131375, + 2131447, + 4229880, + 2118313, + 2118617, + 2120051, + 2121359, + 2121616, + 2121813, + 2134756, + 2135652, + 2117815, + 2117919, + 2118365, + 2118432, + 2118471, + 2118636, + 2118888, + 2118982, + 2118961, + 2119191, + 2120040, + 2120126, + 2120252, + 2120629, + 4217862, + 2120719, + 2120721, + 2120730, + 2121348, + 2121354, + 2121440, + 2121584, + 2122367, + 2122372, + 2122459, + 2122636, + 2122615, + 2123271, + 2123276, + 2123309, + 2123382, + 2123646, + 2123938, + 2124319, + 2124341, + 2124988, + 2125192, + 2125321, + 2125400, + 2126140, + 2126118, + 2126183, + 2127303, + 2127617, + 2127965, + 2128129, + 4225381, + 2128368, + 2128608, + 2128657, + 2129063, + 2129209, + 2130070, + 2130902, + 2131083, + 2131273, + 2132061, + 2132211, + 2132511, + 2132540, + 2132564, + 2132595, + 2133089, + 2133214, + 2134436, + 2134630, + 2134910, + 2135064, + 2135708, + 2135960, + 2117130, + 2117128, + 2117150, + 2117207, + 2118039, + 2118256, + 4216782, + 2119732, + 2119884, + 2120482, + 2121272, + 2121925, + 2123006, + 2123617, + 2123606, + 2125124, + 2126518, + 2127219, + 2128483, + 2131128, + 2132850, + 2134456, + 2134816, + 2119217, + 2119668, + 2136318, + 2122477, + 2124045, + 2124694, + 2126317, + 2129492, + 2130039, + 2130546, + 2132454, + 2136287, + 2131797, + 2133937, + 2120763, + 2117432, + 2117601, + 2117557, + 2118919, + 2120224, + 2120669, + 2120681, + 2121667, + 2122062, + 2122543, + 2123184, + 2123339, + 2124014, + 2124187, + 2125176, + 2125297, + 2127155, + 2127289, + 2127647, + 4225374, + 2128358, + 2129203, + 2130403, + 2130607, + 2131370, + 2132394, + 2132538, + 2133675, + 2133915, + 2134066, + 2134493, + 2135815, + 2117306, + 2117313, + 2118147, + 2119797, + 2119916, + 2120715, + 2127130, + 2120765, + 2130254, + 2132490, + 2133957, + 2135651, + 2135917, + 2128677, + 2132687, + 2136072, + 2134370, + 2119411, + 2118568, + 2134039, + 2118713, + 2119554, + 2121253, + 2122664, + 2124852, + 2125962, + 2127713, + 2129035, + 2129888, + 2132080, + 2134082, + 2134356, + 2134800, + 2134808, + 2135695, + 2126942, + 2136772, + 2120967, + 2121065, + 2123120, + 2123682, + 2133416, + 2135771, + 2122606, + 2123593, + 2124057, + 2130885, + 2136087, + 2135744, + 2132222, + 2125700, + 2122874, + 2120696, + 2117142, + 2125868, + 2127197, + 2123311, + 2118084, + 2118198, + 2118370, + 2120147, + 2121601, + 2121767, + 2122256, + 2123071, + 2123124, + 2123295, + 4220532, + 2124018, + 2123798, + 2124643, + 2125317, + 2126450, + 2127135, + 2127579, + 4226238, + 2130006, + 2119920, + 2132221, + 2132351, + 2132640, + 2132627, + 2132683, + 2134045, + 2134418, + 2135890, + 2135897, + 2123145, + 2128398, + 2130182, + 2135739, + 2121261, + 2121948, + 2122266, + 2123173, + 2123284, + 2123664, + 2127859, + 2128461, + 2128973, + 2129470, + 2130186, + 2133164, + 2133348, + 2133473, + 2133599, + 2128041, + 2118151, + 2122457, + 2122661, + 2122818, + 2122392, + 2132525, + 2128515, + 2128832, + 2132652, + 2135786, + 2129270, + 2130444, + 2131785, + 2117337, + 2117960, + 2118467, + 2118496, + 2120611, + 2120706, + 2120726, + 2121181, + 2122278, + 2122311, + 2122928, + 2123795, + 2123828, + 2125001, + 2125125, + 2125079, + 2123731, + 2125660, + 2126158, + 2126205, + 2123211, + 2128511, + 2128813, + 2129370, + 2129482, + 2129832, + 2130298, + 2130459, + 2130489, + 2131366, + 2132590, + 2133198, + 2133493, + 2134136, + 2134135, + 2134701, + 2134673, + 2135427, + 2137006, + 2118221, + 2119044, + 2125624, + 2126134, + 2117992, + 2128261, + 2129493, + 2130355, + 2129102, + 2119244, + 2119761, + 2120872, + 2122666, + 2123518, + 2123517, + 2124122, + 2126553, + 2127247, + 2127246, + 2128142, + 2128214, + 2128351, + 2129047, + 2129184, + 2129220, + 2131463, + 2132532, + 2135611, + 2134113, + 2137888, + 2117863, + 2118261, + 2118604, + 2118626, + 2117641, + 2119082, + 2119918, + 2120015, + 2126397, + 2120587, + 2120804, + 2118429, + 2121955, + 2121971, + 2122588, + 2122627, + 2122559, + 2122683, + 2122957, + 2123241, + 2123513, + 2121187, + 2124237, + 2124285, + 2125589, + 2126309, + 2117257, + 2127337, + 2127608, + 2128531, + 2129119, + 2129359, + 2129308, + 2130017, + 2130761, + 2130776, + 2131052, + 2131132, + 2131451, + 2132165, + 2133360, + 2134017, + 2134125, + 2134935, + 2135836, + 2136594, + 2117839, + 2119831, + 4219278, + 2130387, + 2131253, + 2133256, + 2134048, + 2117571, + 2117748, + 2118215, + 2118515, + 2121839, + 2122569, + 2123615, + 2125356, + 2133427, + 2134047, + 2117591, + 2120798, + 2133194, + 2123215, + 2129306, + 2118482, + 2132118, + 2118006, + 2122691, + 2120536, + 2120555, + 2120714, + 2122765, + 2123601, + 2134108, + 2117334, + 2119962, + 2119978, + 2124912, + 2132561, + 2118974, + 2119701, + 2120101, + 2121968, + 2122323, + 2123713, + 2130485, + 2124117, + 2135616, + 2136516, + 2136616, + 2117459, + 2119686, + 2120702, + 2129936, + 2120881, + 2121263, + 2121605, + 2121760, + 2122059, + 2122292, + 2123519, + 2125040, + 2125534, + 2130126, + 2130303, + 2130644, + 2132107, + 2133176, + 2134016, + 2134062, + 2135690, + 2137819, + 2137051, + 2117347, + 2118640, + 2119975, + 2128684, + 2134413, + 2136140, + 2137593, + 2125533, + 2125863, + 2118483, + 2118980, + 2120581, + 2122328, + 2122398, + 2122451, + 2124962, + 2125807, + 4224034, + 2132503, + 2135096, + 2125761, + 2132734, + 2130744, + 2118119, + 2131704, + 2118634, + 2118633, + 2117446, + 2134100, + 2133936, + 2120042, + 2130225, + 4218365, + 2128618, + 2133951, + 2123994, + 2133047, + 2126584, + 2137160, + 2124349, + 2132656, + 2117177, + 2118488, + 4216326, + 2119526, + 2122437, + 2122658, + 2123238, + 2124622, + 2125281, + 2125403, + 2125997, + 2127853, + 2128623, + 2128810, + 2129339, + 2129981, + 2130118, + 2131659, + 2132629, + 2134875, + 2119395, + 2119879, + 2121534, + 2123181, + 2123414, + 2124416, + 2124725, + 2127159, + 2132679, + 2117668, + 2127845, + 2119472, + 2121499, + 2121829, + 2123386, + 2124896, + 2127348, + 2128410, + 2129774, + 2130420, + 2131736, + 2134085, + 2136499, + 2128841, + 2127196, + 2128633, + 2128721, + 2131140, + 2134032, + 2128361, + 2128530, + 2130742, + 2120417, + 2127680, + 2117165, + 2117362, + 2120601, + 2121696, + 2122429, + 2123324, + 2123761, + 2125032, + 2131563, + 2132087, + 2132539, + 2134350, + 2134771, + 2136528, + 2124311, + 2125862, + 4223786, + 2130663, + 2131031, + 2133167, + 2117121, + 2117958, + 2118091, + 2119051, + 2120693, + 2121238, + 2121267, + 2121345, + 2121492, + 2121525, + 2121579, + 2121652, + 2122226, + 2122513, + 2123426, + 2123549, + 4222830, + 2126418, + 2127162, + 2127674, + 2130036, + 2130233, + 2130296, + 2131830, + 2132671, + 2132700, + 2133381, + 2133491, + 2134682, + 2135415, + 2136066, + 2137317, + 2118341, + 2122583, + 2127604, + 2123541, + 2124936, + 2126797, + 2133187, + 2134958, + 2135667, + 2125093, + 2119836, + 2124046, + 2124236, + 2134013, + 2134938, + 2127323, + 2134042, + 2119770, + 2123778, + 2122676, + 2124283, + 2117443, + 2125612, + 2123736, + 2133947, + 2131238, + 2129332, + 2134868, + 2124095, + 2125680, + 2119530, + 2119927, + 2120492, + 2129196, + 2126378, + 2118666, + 2134499, + 4234676, + 2117293, + 2117454, + 2117724, + 2117749, + 2118211, + 2133150, + 2118728, + 2119716, + 2120602, + 2121245, + 2121365, + 2121389, + 2121463, + 2121503, + 2121868, + 2122421, + 2122554, + 2122704, + 2123951, + 2124864, + 2128007, + 2128270, + 2128395, + 2129376, + 2130503, + 2132482, + 2132710, + 2133572, + 2134035, + 2134200, + 2134317, + 2134488, + 2137870, + 2125029, + 2122840, + 2122978, + 2123125, + 2125556, + 2127492, + 2128667, + 2134121, + 2134993, + 2125498, + 2118898, + 2121657, + 2122916, + 2133837, + 2133997, + 2134596, + 2118008, + 2119787, + 2119977, + 2120789, + 2121367, + 2125307, + 2129551, + 2127132, + 2133180, + 2133730, + 2136155, + 2126009, + 2117405, + 2124735, + 2125745, + 2127152, + 2135803, + 2117966, + 2118672, + 2119733, + 2119767, + 2120108, + 2120800, + 2121618, + 2123159, + 2123612, + 2125345, + 2127483, + 2130911, + 2133229, + 2134036, + 4231421, + 2134861, + 2127909, + 2127930, + 2118314, + 2121382, + 2119455, + 2120052, + 2121746, + 2117650, + 2117978, + 4215212, + 2118093, + 2118144, + 2118928, + 2119764, + 2119768, + 2120023, + 2120597, + 2120950, + 2121099, + 2121916, + 2122389, + 2122797, + 2123633, + 2123843, + 2123964, + 2123999, + 2127575, + 2125272, + 2125423, + 2125211, + 2125935, + 2126280, + 2121555, + 2127320, + 2128247, + 2128713, + 2128724, + 2128722, + 4226262, + 2129265, + 2118192, + 2131043, + 2131305, + 2131428, + 2132494, + 2132740, + 2133062, + 2133519, + 2134019, + 2134031, + 2135065, + 2135670, + 2136109, + 2136624, + 2135512, + 2117837, + 2118357, + 2118668, + 2119682, + 2120718, + 2122151, + 2122910, + 2125086, + 2127795, + 2128613, + 2130164, + 2130948, + 2134099, + 2134661, + 2120928, + 2137351, + 2118463, + 2121623, + 2121651, + 2125212, + 2126457, + 2127715, + 2128319, + 2128868, + 2124754, + 2126572, + 2132653, + 2123779, + 2124385, + 2118136, + 2128513, + 2124084, + 2120778, + 2137334, + 2130667, + 2120645, + 2134345, + 2125854, + 2119288, + 2120815, + 2121927, + 2123110, + 2124940, + 2133082, + 2134081, + 2136083, + 2118737, + 2123463, + 2134541, + 2120008, + 2134179, + 2118021, + 2117197, + 2118122, + 2131353, + 2132750, + 2125912, + 2122618, + 2134859, + 2124130, + 2136500, + 2129412, + 2127223, + 2118487, + 2124128, + 2133727, + 4232931, + 2124893, + 2117260, + 2120764, + 2121488, + 2133993, + 2118402, + 2133201, + 2130057, + 2131577, + 2121471, + 2123237, + 2117235, + 2117989, + 2120066, + 2120767, + 2136046, + 2117371, + 2120074, + 2121677, + 2132621, + 2125793, + 2128304, + 2128226, + 4217831, + 2131057, + 2126635, + 2126257, + 2121332, + 2121717, + 2122619, + 2122906, + 2126275, + 2129048, + 2117187, + 2121468, + 2117195, + 2119644, + 2119330, + 2121897, + 2125763, + 2129165, + 2130173, + 2130227, + 2130367, + 2133938, + 2132375, + 2131620, + 2121204, + 2122378, + 2122925, + 2132359, + 2123639, + 2125026, + 2125118, + 2126902, + 2127924, + 2120262, + 2129781, + 2130605, + 2136492, + 2117619, + 2121411, + 2122461, + 2122642, + 2123095, + 2123631, + 2127555, + 2126412, + 2130124, + 2130106, + 2133801, + 2134349, + 2117645, + 2119673, + 2120338, + 4221061, + 2124147, + 2126180, + 2126589, + 2133175, + 2119922, + 2133216, + 2135658, + 2134041, + 2131839, + 2128356, + 2127847, + 2130985, + 2117423, + 2118245, + 2118490, + 2122445, + 2123727, + 2125002, + 2127485, + 2128788, + 2129045, + 2130486, + 2131332, + 2133995, + 2123485, + 2125600, + 2126342, + 2129435, + 2130859, + 2136513, + 2137766, + 2118141, + 2128817, + 2127986, + 2128824, + 2130055, + 2128712, + 2124520, + 2121313, + 2130060, + 2127185, + 2127200, + 2117995, + 2134626, + 2125452, + 2127482, + 2134423, + 2136810, + 2117392, + 2129776, + 2122396, + 2128719, + 2135461, + 2137321, + 2119290, + 2119769, + 2131684, + 2135740, + 2117428, + 2118180, + 2118474, + 2118605, + 2118619, + 2121222, + 2122796, + 2123153, + 2123647, + 2124862, + 2124878, + 2126408, + 2126511, + 2126829, + 2127188, + 2129473, + 2130476, + 2131433, + 2133161, + 2128836, + 2134470, + 2126185, + 2136082, + 4233455, + 2122557, + 2123369, + 2127210, + 2127588, + 2128080, + 2131267, + 2131694, + 2118442, + 4215633, + 2118694, + 2120067, + 2121351, + 2121596, + 2121906, + 2122313, + 2122361, + 2122411, + 2123152, + 2124756, + 2125004, + 2127282, + 2127534, + 4225169, + 2128344, + 2129355, + 2129783, + 2130085, + 2132139, + 2132665, + 2133179, + 2134143, + 2135902, + 2136283, + 2124299, + 2128952, + 2117785, + 2120766, + 2121646, + 2123655, + 2124760, + 2126901, + 2127625, + 2129806, + 2137915, + 2123722, + 2128407, + 2118457, + 2127243, + 2136813, + 2121574, + 2130333, + 2130929, + 2130072, + 2121532, + 2121669, + 2127202, + 2128710, + 2134076, + 2123879, + 2120171, + 2120347, + 2129168, + 2127486, + 2132780, + 2117621, + 2121578, + 2124313, + 2124855, + 2125570, + 2127074, + 2128232, + 2132072, + 2132565, + 2133113, + 2121439, + 2122703, + 2127301, + 2128338, + 2130647, + 2134824, + 2134770, + 2131100, + 2131693, + 2137133, + 2118849, + 2121580, + 2123148, + 2125148, + 2125845, + 2133159, + 4230355, + 4233275, + 4220239, + 2127094, + 2117133, + 2117336, + 2119648, + 2119979, + 2120294, + 2120652, + 2118056, + 2121219, + 2121372, + 2121750, + 2122358, + 2123127, + 2123175, + 2123374, + 2125166, + 2126390, + 2128678, + 2130256, + 2130330, + 2130585, + 2132828, + 2133152, + 2133222, + 2133364, + 2135580, + 2135620, + 2117550, + 2122923, + 2124646, + 2130462, + 2131041, + 2131306, + 2134248, + 2120705, + 2124115, + 2136232, + 2131066, + 2131287, + 2117391, + 2118255, + 2121641, + 2121285, + 2123533, + 2128271, + 2130297, + 2132231, + 2132358, + 2125301, + 2121495, + 2122325, + 2124984, + 2117327, + 2126441, + 2136978, + 2118150, + 2118715, + 2119284, + 2119859, + 2122148, + 2122350, + 2126106, + 2120046, + 2129033, + 2129118, + 2129179, + 2135792, + 2123143, + 2130014, + 2117145, + 2117493, + 2118005, + 2119744, + 2121315, + 2121331, + 2121482, + 2123716, + 2117158, + 2131261, + 2135433, + 2135643, + 2129011, + 2136065, + 2117883, + 2119873, + 2127446, + 2128039, + 2118181, + 2127781, + 2131217, + 2128774, + 2117711, + 2119945, + 2126407, + 2128839, + 2129384, + 2133946, + 2133972, + 2134093, + 2117567, + 4215497, + 2120233, + 2121473, + 2135981, + 2117597, + 2130455, + 2134762, + 2119427, + 2122581, + 2124649, + 2127147, + 2132188, + 2133780, + 2128450, + 2118367, + 2119827, + 2122069, + 2122250, + 2123438, + 2124749, + 2128959, + 2130921, + 2117667, + 2117624, + 2118405, + 2118726, + 2119729, + 2120009, + 2120605, + 2120944, + 2120943, + 2121001, + 2121366, + 2122417, + 2122599, + 2123070, + 2123193, + 2123531, + 2125013, + 2125025, + 2126073, + 2127922, + 2129451, + 2130142, + 2130611, + 2130956, + 2131180, + 2131714, + 2132242, + 2132522, + 2133066, + 2134182, + 2134738, + 2136317, + 2137331, + 2137452, + 2117199, + 2117281, + 2117773, + 2118230, + 2119498, + 2120104, + 2121277, + 2121688, + 2121689, + 2122303, + 2123444, + 2123547, + 2123728, + 2123986, + 2118034, + 2129185, + 2130090, + 2130344, + 2132736, + 2133132, + 2133183, + 2134654, + 2135602, + 2118688, + 2136108, + 2118423, + 2117845, + 2118492, + 4217000, + 2122930, + 2123572, + 2126439, + 2127718, + 2128454, + 2134502, + 2118339, + 2124961, + 2124678, + 2119680, + 2121292, + 2120020, + 2123564, + 2129915, + 2118113, + 2127558, + 2122857, + 2128104, + 2136916, + 2137787, + 2119627, + 2120121, + 2123303, + 2123674, + 2124750, + 2118889, + 2124249, + 2121301, + 2130332, + 2123669, + 2137002, + 2123774, + 2137170, + 2123869, + 2117286, + 2117603, + 2118600, + 2122425, + 2123563, + 2124971, + 2133956, + 2117549, + 2129517, + 2137791, + 2117127, + 2122082, + 2125440, + 2125611, + 2131219, + 2118771, + 2123562, + 2136901, + 2121203, + 2128789, + 2120876, + 2120646, + 2131740, + 2125386, + 2131153, + 2128404, + 2130184, + 2120089, + 2129037, + 2124817, + 2127648, + 2118361, + 2119970, + 2126113, + 2126431, + 2127835, + 2135847, + 2137441, + 2124043, + 2120319, + 2120216, + 2118053, + 2118669, + 2118781, + 2123278, + 2127583, + 2134007, + 2134680, + 2137332, + 2120170, + 2126429, + 2125509, + 2117965, + 2123977, + 2129343, + 2129388, + 2135906, + 2137786, + 2122872, + 2124321, + 2130690, + 2120068, + 2120543, + 2124763, + 2126619, + 2127602, + 2129330, + 2129943, + 2131097, + 2117938, + 2123560, + 2137817, + 2127598, + 2123618, + 2118399, + 2136325, + 2120740, + 2122299, + 2129022, + 2133168, + 2118991, + 2121910, + 2129163, + 2135424, + 2118401, + 2117215, + 2118070, + 2119964, + 2126394, + 2129974, + 2134478, + 2121509, + 2127842, + 2118532, + 2121593, + 2129156, + 2131372, + 2132531, + 2133645, + 2135894, + 2123763, + 2131374, + 2135123, + 2121993, + 2121992, + 2124985, + 2127442, + 4229869, + 2133816, + 2118959, + 2117457, + 2117930, + 2118343, + 2118603, + 2120613, + 2121341, + 2121888, + 2122114, + 2122710, + 2123529, + 2123738, + 2125415, + 2125196, + 2126646, + 2126647, + 2127153, + 4225360, + 2132181, + 2132632, + 2134090, + 2134161, + 2134261, + 2135748, + 2131853, + 2119957, + 2117256, + 2117465, + 2117134, + 2132617, + 2133823, + 2136080, + 2117805, + 2121340, + 2120086, + 2120633, + 2121400, + 2122714, + 2122746, + 2122945, + 2123484, + 2124106, + 2124248, + 2125067, + 2125494, + 2126228, + 2127144, + 2128559, + 4226954, + 2129920, + 2131017, + 2131145, + 2132353, + 2132769, + 2133514, + 2134117, + 2135677, + 2136330, + 2122110, + 2122385, + 2124594, + 2124931, + 2125172, + 2129868, + 2129916, + 2125248, + 2129797, + 2131898, + 2132216, + 2123621, + 2130865, + 2136124, + 2135799, + 2125083, + 2129249, + 2131005, + 2134378, + 2117233, + 2118517, + 2121040, + 4221700, + 2125803, + 2131405, + 2131501, + 2132391, + 2118185, + 2118671, + 2120805, + 2123598, + 2123944, + 2126854, + 2126979, + 2127330, + 2132175, + 2132193, + 2134476, + 2135778, + 2135672, + 2121611, + 2126727, + 2128587, + 2131022, + 2122656, + 2127205, + 2118281, + 2125121, + 2125468, + 2126857, + 2127193, + 2127979, + 2129042, + 2135686, + 2128604, + 2137997, + 2117558, + 2122094, + 2123205, + 4228700, + 2117254, + 2117294, + 2117850, + 2117153, + 2118092, + 2120686, + 2123161, + 2123905, + 2125244, + 2126623, + 2127426, + 2127789, + 2128412, + 2129127, + 2130543, + 2132690, + 2134140, + 2134479, + 2135669, + 2136088, + 2118299, + 2129361, + 2117675, + 2118552, + 2123671, + 2125259, + 2126288, + 2126899, + 2130408, + 2133802, + 2135715, + 2137175, + 2137759, + 2126944, + 2119745, + 2125209, + 2129199, + 4233310, + 2117348, + 2117430, + 2117515, + 2118071, + 2118321, + 2121146, + 2121756, + 2126770, + 2128188, + 2130643, + 2134580, + 2135735, + 2135798, + 2135818, + 2137751, + 2137954, + 2123430, + 2124660, + 2118167, + 2118307, + 2126024, + 2132162, + 4218569, + 2121803, + 2122128, + 4222755, + 4223305, + 2128958, + 4226548, + 2130031, + 4228334, + 4231203, + 2134828, + 2118722, + 2136943, + 2124499, + 2125961, + 2133186, + 2133487, + 2135858, + 2118324, + 2120257, + 2121418, + 2121476, + 4220695, + 2124156, + 2124180, + 2125162, + 2125583, + 2126434, + 2126588, + 2128877, + 2129921, + 2130046, + 2131787, + 2134222, + 2117997, + 2137747, + 2128260, + 2130059, + 2134834, + 2132694, + 2117677, + 2118796, + 2132593, + 2124650, + 2133188, + 2130183, + 2121937, + 2123680, + 2137586, + 2117273, + 2117272, + 2137104, + 2132587, + 2131393, + 2131304, + 2124032, + 2125438, + 2128023, + 2130261, + 2121484, + 2117136, + 2117141, + 2117162, + 2117169, + 2117174, + 2117180, + 2117183, + 2117186, + 2117206, + 2117208, + 2117250, + 2117253, + 2133099, + 2117258, + 2130450, + 2121485, + 2117262, + 2117278, + 2117279, + 2117280, + 2117282, + 2117296, + 2117299, + 2117302, + 2117326, + 2117325, + 2117316, + 2117318, + 2117314, + 2117335, + 2117342, + 2117357, + 2117343, + 2117367, + 2117385, + 2117466, + 2117424, + 2117467, + 2117469, + 2117463, + 2117447, + 2117494, + 2117512, + 2117519, + 2117528, + 2117499, + 2117481, + 2117488, + 2117521, + 2117487, + 2117510, + 2117526, + 2117912, + 2117588, + 2117599, + 2117582, + 2117592, + 2117595, + 2117585, + 2117594, + 2117584, + 2117604, + 2117605, + 2117658, + 2117672, + 2117652, + 2117674, + 2117669, + 2117637, + 2117404, + 2117622, + 2117665, + 2117673, + 2117676, + 2117630, + 2117615, + 2117649, + 2117638, + 2117699, + 2117703, + 2123523, + 2117717, + 2117712, + 2117704, + 2117722, + 2117718, + 2117740, + 2117752, + 2117760, + 2117786, + 2117765, + 2117812, + 2117810, + 2117833, + 2117834, + 2117811, + 2117826, + 2117846, + 2117854, + 2117861, + 2117869, + 2117859, + 2117870, + 2117881, + 2117877, + 2117897, + 2117889, + 2117890, + 2117910, + 2117909, + 2117908, + 2117914, + 2117921, + 2117946, + 2117943, + 2117948, + 2117947, + 2117951, + 2117952, + 2117970, + 2117964, + 4215124, + 2117986, + 2128632, + 2117993, + 2117994, + 2117998, + 2118016, + 2118018, + 2119384, + 2118028, + 2118025, + 2118031, + 2118033, + 2118035, + 4215189, + 2118038, + 2118052, + 2118054, + 2118050, + 2118057, + 2118058, + 2118059, + 2118067, + 2118065, + 2118066, + 2118064, + 2118069, + 2118077, + 2118085, + 2118089, + 2118107, + 2118112, + 2131541, + 2118121, + 2118125, + 2118128, + 2118133, + 2118142, + 2118148, + 2118155, + 2118164, + 2118158, + 2118183, + 2118186, + 2118190, + 2118195, + 2118201, + 2118223, + 2118212, + 2118219, + 2118220, + 2118238, + 2118228, + 2118250, + 2118260, + 2118249, + 2118259, + 2118271, + 2118269, + 2118285, + 2118292, + 2118290, + 2118257, + 2118280, + 2118289, + 2133928, + 2133927, + 2118316, + 2118317, + 2118332, + 2118325, + 2118337, + 2118349, + 2118359, + 2118366, + 2118371, + 2118374, + 2136301, + 2118368, + 2118387, + 2118389, + 2118392, + 2118393, + 2118406, + 2118408, + 2127160, + 2118413, + 2118416, + 2118415, + 2118421, + 2118426, + 2118435, + 2118447, + 2118449, + 2118451, + 2118456, + 2118464, + 2118470, + 2118469, + 2117143, + 2118473, + 2118477, + 2118102, + 2118494, + 2118505, + 2118510, + 2119960, + 2118523, + 2118519, + 2118530, + 2118550, + 2118560, + 2118566, + 2118565, + 2118574, + 2118576, + 2118582, + 2118595, + 2128914, + 2135769, + 2118623, + 2123516, + 2126318, + 2118638, + 2118632, + 2118637, + 2118650, + 2118657, + 2118717, + 2118720, + 2118700, + 2118701, + 2118716, + 2118702, + 2118710, + 2118697, + 2118685, + 2118734, + 2118799, + 2118773, + 2118798, + 2118751, + 2118769, + 2118775, + 2118768, + 2118802, + 2118779, + 2118784, + 2118774, + 2118788, + 2118800, + 2118790, + 2118855, + 2118818, + 2118840, + 2118821, + 2118828, + 2118852, + 2118856, + 2118824, + 2118827, + 2118850, + 2118820, + 2118846, + 2118844, + 2118872, + 2118885, + 2118886, + 2118927, + 2118932, + 2118909, + 2118894, + 2118893, + 2118906, + 2118882, + 2118969, + 2118976, + 2119011, + 2118988, + 2118958, + 2119004, + 2118981, + 2118998, + 2118999, + 2118968, + 2118963, + 2119005, + 2119065, + 2119040, + 2118831, + 2119050, + 2119071, + 2119035, + 2119038, + 2119064, + 2119070, + 2119086, + 2119036, + 2119043, + 2119081, + 2119047, + 2119080, + 2119130, + 2119109, + 2119135, + 2119108, + 2119132, + 2119140, + 2119124, + 2119188, + 2119159, + 2119190, + 2119166, + 2119165, + 2119195, + 2119161, + 2119246, + 2119248, + 2126303, + 2119220, + 2119222, + 2119218, + 2119224, + 2119275, + 2119268, + 2119215, + 2119276, + 2119274, + 2119302, + 2119296, + 2119306, + 2119328, + 2119316, + 2119311, + 2119333, + 2119342, + 2119350, + 2119348, + 2119362, + 2119356, + 2119361, + 2119363, + 2119360, + 2119368, + 2119374, + 2119377, + 2119379, + 2119383, + 2119406, + 2119417, + 2119424, + 2119423, + 2119428, + 2119433, + 2119432, + 2119435, + 2119437, + 2119443, + 2119448, + 2119446, + 2119111, + 2119452, + 2119462, + 2119479, + 2119480, + 2119502, + 2119483, + 2119488, + 2119503, + 2119529, + 2119616, + 2119560, + 2119521, + 2119551, + 2119561, + 2119571, + 2119584, + 2119603, + 2119588, + 2119594, + 2119600, + 2119619, + 2119622, + 2119636, + 2119634, + 2119635, + 2119690, + 2119638, + 2119651, + 2119691, + 2119705, + 2119709, + 2119794, + 2119713, + 2119778, + 2119755, + 2119792, + 2124736, + 2119762, + 2119741, + 2119801, + 2119813, + 2119865, + 2119839, + 2119851, + 2119866, + 2119902, + 2119867, + 2119864, + 2119854, + 2119877, + 2119891, + 2119889, + 2119895, + 2119897, + 2119896, + 2119909, + 2119900, + 2119908, + 2119903, + 2119919, + 2119930, + 2119929, + 2119931, + 2119932, + 2119933, + 2119938, + 2119946, + 2119952, + 2119963, + 2123942, + 2119973, + 2119980, + 2119981, + 2119986, + 2119992, + 2119998, + 2128594, + 2120021, + 2120016, + 2120014, + 2120026, + 2120024, + 2120034, + 2120032, + 2120039, + 2120044, + 2120041, + 2120056, + 2120065, + 2120093, + 2117470, + 2117547, + 2120099, + 2120114, + 2120134, + 2120168, + 2120156, + 2120077, + 2120153, + 2120154, + 2120229, + 2120223, + 2120209, + 2120220, + 2120201, + 2120218, + 2120256, + 2120300, + 2120265, + 2120245, + 2120246, + 2120290, + 2120298, + 2120346, + 2120380, + 2120382, + 2120395, + 2120386, + 2120381, + 2120419, + 2120407, + 2120422, + 2120425, + 2120406, + 2120442, + 2120443, + 2120460, + 2120459, + 2120470, + 2120498, + 2120400, + 2120490, + 2120502, + 2120510, + 2120515, + 2120517, + 2120512, + 2120529, + 2120533, + 2120538, + 2120539, + 2120549, + 2120553, + 2120560, + 2120563, + 2120565, + 2120568, + 2123144, + 2120570, + 2120576, + 2120579, + 2120614, + 2120632, + 2120643, + 2120647, + 2120649, + 2120660, + 2120656, + 2120676, + 2120678, + 2120674, + 2120670, + 2120677, + 2120683, + 2120688, + 2120694, + 2120691, + 2120709, + 2120711, + 2120712, + 2120717, + 2120723, + 2120736, + 2120738, + 2120744, + 2120760, + 2120761, + 2120769, + 2120774, + 2120782, + 2120787, + 2120784, + 2120783, + 2120561, + 2120812, + 4217966, + 2117218, + 2120822, + 2120825, + 2120844, + 2120849, + 2120852, + 2120091, + 2120875, + 2120891, + 2120886, + 2120892, + 2120887, + 2120901, + 2120894, + 2120903, + 2120921, + 2120937, + 2120957, + 2120954, + 2120941, + 2121100, + 2120938, + 2120971, + 2120981, + 2120983, + 2121052, + 2120991, + 2120987, + 2120977, + 2120980, + 2120994, + 2120986, + 2120985, + 2120984, + 2121036, + 2121042, + 2121038, + 2121035, + 2121068, + 2121075, + 2121078, + 2121095, + 2121092, + 2121090, + 2121122, + 2121117, + 2121132, + 2121134, + 2121149, + 2121104, + 2121143, + 2121148, + 2121161, + 2121165, + 2121171, + 2121170, + 2121174, + 2121179, + 2121195, + 2121202, + 2121205, + 2121227, + 2121242, + 2121241, + 2121233, + 2121243, + 2121270, + 2121271, + 2121284, + 2121283, + 2121280, + 2121294, + 2121303, + 2121300, + 2121311, + 2121314, + 2121316, + 2121287, + 2121333, + 2121334, + 2121338, + 2137788, + 2121343, + 2121376, + 2121409, + 2121410, + 2121416, + 2121424, + 2121423, + 2121430, + 2121443, + 2121437, + 2121434, + 2121435, + 2121442, + 2121441, + 2121448, + 2121449, + 2121452, + 2121457, + 2121459, + 2121456, + 2121460, + 2121464, + 2121470, + 2121475, + 2121481, + 2121565, + 2121564, + 2121483, + 2121489, + 2121494, + 2121513, + 2121517, + 2121528, + 2121537, + 2121544, + 2121548, + 2121550, + 2121519, + 2121553, + 2121558, + 2121559, + 2121561, + 2121569, + 2121581, + 2121587, + 2121591, + 2121603, + 2121602, + 2121599, + 2121610, + 2121608, + 2121617, + 2121607, + 2121630, + 2121625, + 2121624, + 2121632, + 2121640, + 2121645, + 2121660, + 2121686, + 2121723, + 2121700, + 2121720, + 2121713, + 2121693, + 2121907, + 2121727, + 2121761, + 2121824, + 2121753, + 2121744, + 2121769, + 2121742, + 2121777, + 2121755, + 2121749, + 2121771, + 2121766, + 2121743, + 2121786, + 2121818, + 2121793, + 2121834, + 2121847, + 2121823, + 2121802, + 2121798, + 2121805, + 2121827, + 2121795, + 2121828, + 2121794, + 2121836, + 2121835, + 2121817, + 2121857, + 2121869, + 2121959, + 2121859, + 2121882, + 2121860, + 2121883, + 2121878, + 2121879, + 2121874, + 2121895, + 2121867, + 2121953, + 2121912, + 2121952, + 2121939, + 2121908, + 2121712, + 2121917, + 2121926, + 2121909, + 2121944, + 2122061, + 2122005, + 2121990, + 2121974, + 2121975, + 2121984, + 2121972, + 2121978, + 2121987, + 2122017, + 2121979, + 2121969, + 2121997, + 2121998, + 2122055, + 2122046, + 2122024, + 2122023, + 2122058, + 2122047, + 2122044, + 2122028, + 2122036, + 2122045, + 2122050, + 2122052, + 2122099, + 2122103, + 2122072, + 2122073, + 2122074, + 2122091, + 2122100, + 2122095, + 2122085, + 2122097, + 2122079, + 2122077, + 2122067, + 2122101, + 2122137, + 2122134, + 2122119, + 2122156, + 2122132, + 2122138, + 2122122, + 2122129, + 2122155, + 2122158, + 2122188, + 2122186, + 2122185, + 2122231, + 2122184, + 2122179, + 2122182, + 2122170, + 2122187, + 2129785, + 2122189, + 2122214, + 2122211, + 2122230, + 2122234, + 2122228, + 2122239, + 2122237, + 2122236, + 2122238, + 2122240, + 2122248, + 2122249, + 2122253, + 2122252, + 2122260, + 2122267, + 2122270, + 2122273, + 2122282, + 2122286, + 2122288, + 2122290, + 2122291, + 2122305, + 2122318, + 2122334, + 2122339, + 2122331, + 2122336, + 2122344, + 2122364, + 2122370, + 2122377, + 2122366, + 2122386, + 2122387, + 2122390, + 4219604, + 2122371, + 2122388, + 2122455, + 2122449, + 2122427, + 2122447, + 2122495, + 2122438, + 2122964, + 2122440, + 2122460, + 2122444, + 2122442, + 2122434, + 2122439, + 2122395, + 2122441, + 2122508, + 2122478, + 2122481, + 2122535, + 2122498, + 2122504, + 2122479, + 2122485, + 2122576, + 2122558, + 2122573, + 2122780, + 2122575, + 2122646, + 2122638, + 2122624, + 2122667, + 2122614, + 2122659, + 2122639, + 2122633, + 2122655, + 2122677, + 2122603, + 2122601, + 2122686, + 2122729, + 2122688, + 2122694, + 2122723, + 2122697, + 2122706, + 2122742, + 2122692, + 2122774, + 2122804, + 2122758, + 2122771, + 2122790, + 2122806, + 2123037, + 2122775, + 2122792, + 2122767, + 2122855, + 2122863, + 2122870, + 2122830, + 2123050, + 2122901, + 2122899, + 2122917, + 2122921, + 2122888, + 2122940, + 2122970, + 2122962, + 2122949, + 2122951, + 2122939, + 2122968, + 2122946, + 2122993, + 2122983, + 2130441, + 2122976, + 2122977, + 2122412, + 2122979, + 2122991, + 2123052, + 2122998, + 2122996, + 2122994, + 2123002, + 2123008, + 2123005, + 2123032, + 2123036, + 2123013, + 2123044, + 2123043, + 2123051, + 2123060, + 2123061, + 2123063, + 2123062, + 2123064, + 2127179, + 2123080, + 2123094, + 2123093, + 2123085, + 2123096, + 2123102, + 2123101, + 2123122, + 2123128, + 2123138, + 2123139, + 2132874, + 2123163, + 2123167, + 2123179, + 2123191, + 2123203, + 2123206, + 2123201, + 2123204, + 2123212, + 2123218, + 2123227, + 2123225, + 2123232, + 2123233, + 2123249, + 2123634, + 2123274, + 2123267, + 2123259, + 2123635, + 2123317, + 2123318, + 2123316, + 2123292, + 2123343, + 2123332, + 2123337, + 2123329, + 2123358, + 2123357, + 2123364, + 2123367, + 2123368, + 2123359, + 2123362, + 2123376, + 2123395, + 2123400, + 2123406, + 2123401, + 2123396, + 2123416, + 2123421, + 2123457, + 2123449, + 2123465, + 2123454, + 2123452, + 2123460, + 2123448, + 2123478, + 2123482, + 2123488, + 2123327, + 2123494, + 2123497, + 2123504, + 2123509, + 2123511, + 2123535, + 2123542, + 2123550, + 2123558, + 2123559, + 2135864, + 2123566, + 2123583, + 2123574, + 2123585, + 2123576, + 2123575, + 2123590, + 2123614, + 2123616, + 2123609, + 2123619, + 2123620, + 2123657, + 2123632, + 2123689, + 2123644, + 2123626, + 2123660, + 2123659, + 2123686, + 2123681, + 2123653, + 2123703, + 2123759, + 2123700, + 2123756, + 2123699, + 2123753, + 2123704, + 2123748, + 2123742, + 2123741, + 2123746, + 2123758, + 2123705, + 2123726, + 2123718, + 2123751, + 2124444, + 2123806, + 2123846, + 2123817, + 2123840, + 2123853, + 2123826, + 2123854, + 2123955, + 2123819, + 2123865, + 2123875, + 2123895, + 2123903, + 2123935, + 2123919, + 2123949, + 2123924, + 2123933, + 2123931, + 2123907, + 2124462, + 2123961, + 2123892, + 2123957, + 2123936, + 2123962, + 2124047, + 2123917, + 2123902, + 2124033, + 2123978, + 2124040, + 2123992, + 2124066, + 2124070, + 2124001, + 2124044, + 2123981, + 2123988, + 2124007, + 2123989, + 2124086, + 2124050, + 2124036, + 2123991, + 2124003, + 2124069, + 2124025, + 2124000, + 2124015, + 2124072, + 2124074, + 2124058, + 2124067, + 2124065, + 2123974, + 2124153, + 2124151, + 2124124, + 2124152, + 2124139, + 2124116, + 2124158, + 2124142, + 2124089, + 2124148, + 2124093, + 2124121, + 2124080, + 2124129, + 2124126, + 2124125, + 2124161, + 2124138, + 2124210, + 2124206, + 2124240, + 2124223, + 2124225, + 2124243, + 2124222, + 2124238, + 2120680, + 2124234, + 2124253, + 2124219, + 2124227, + 2124199, + 2124334, + 2124177, + 2124192, + 2124188, + 2124181, + 2124212, + 2124254, + 2124264, + 2124290, + 2124315, + 2124287, + 2124554, + 2124281, + 2124274, + 2124263, + 2124293, + 2124209, + 2124318, + 2124269, + 2124308, + 2124267, + 2124298, + 2124306, + 2124481, + 2124323, + 2124307, + 2124356, + 2124300, + 2124402, + 2124342, + 2124408, + 2124359, + 2124386, + 2124377, + 2124390, + 2124360, + 2124344, + 2124322, + 2124432, + 2124429, + 2124448, + 2124420, + 2124450, + 2124451, + 2124439, + 2131479, + 2124475, + 2124483, + 2124482, + 2124472, + 2124467, + 2124460, + 2124510, + 2124497, + 2124511, + 2124458, + 2124506, + 2124522, + 2124539, + 2124549, + 2131478, + 2124538, + 2124562, + 2124566, + 2136881, + 2124575, + 2124600, + 2124599, + 2127580, + 2124601, + 2136302, + 2124615, + 2124611, + 2124617, + 2124624, + 2124633, + 2124628, + 2124635, + 2124639, + 2124641, + 2124664, + 2124665, + 2124671, + 2124672, + 2124676, + 2124675, + 2124685, + 2124696, + 2124693, + 2124702, + 2124708, + 2124714, + 2124715, + 2124719, + 2124722, + 2124721, + 2124723, + 2124727, + 2124732, + 2124742, + 2124747, + 2124755, + 2124767, + 2124780, + 2124779, + 2124787, + 2124783, + 2137790, + 2124808, + 2124819, + 2124820, + 2124827, + 2124836, + 2124835, + 2124894, + 2124885, + 2124898, + 2124906, + 2124930, + 2124941, + 2124954, + 2124929, + 2124955, + 2124926, + 2124904, + 2124915, + 2124946, + 2124944, + 2124996, + 2125041, + 2125011, + 2124989, + 2125015, + 2124997, + 2125021, + 2124974, + 2124977, + 2124990, + 2124986, + 2125019, + 2125039, + 2125017, + 2125034, + 2125087, + 2132045, + 2125110, + 2125099, + 2125117, + 2125112, + 2125081, + 2125109, + 2125107, + 2125074, + 2125068, + 2125155, + 2125203, + 2125156, + 2125146, + 2125177, + 2125145, + 2125198, + 2125205, + 2125796, + 2125189, + 2125305, + 2125333, + 2125322, + 2125237, + 2125255, + 2125286, + 2125240, + 2125254, + 2125292, + 2125278, + 2125260, + 2125288, + 2125266, + 2125253, + 2125306, + 2125273, + 2125284, + 2125269, + 2125290, + 2125294, + 2125357, + 2125422, + 2125358, + 2125337, + 2125426, + 2125407, + 2125374, + 2125347, + 2125419, + 2125355, + 2125430, + 2125389, + 2125343, + 2125379, + 2125370, + 2125390, + 2125348, + 2125567, + 2125341, + 2125368, + 2125442, + 2125482, + 2125464, + 2125513, + 2125495, + 2125523, + 2125501, + 2125487, + 2125508, + 2125490, + 2125524, + 2125525, + 2125455, + 2125477, + 2125506, + 2125471, + 2125633, + 2125585, + 2125900, + 2125548, + 2125560, + 2125566, + 2125631, + 2125554, + 2125617, + 2125551, + 2125618, + 2125516, + 2125630, + 2125587, + 2125559, + 2125702, + 2125690, + 2125688, + 2125697, + 2125696, + 2125679, + 2125659, + 2125811, + 2125677, + 2125698, + 2125692, + 2125656, + 2125710, + 2125713, + 2125762, + 2125670, + 2125747, + 2125731, + 2125729, + 2125732, + 2125753, + 2125766, + 2125738, + 2125791, + 2125781, + 2125804, + 2125780, + 2125784, + 2125809, + 2125806, + 2125787, + 2125833, + 2125835, + 2125818, + 2125841, + 2125825, + 2125839, + 2125822, + 2125851, + 2125850, + 2125684, + 2125853, + 2125848, + 2125855, + 2125872, + 2125886, + 2125874, + 2125905, + 2125923, + 2125977, + 2125970, + 2125999, + 2126065, + 2125996, + 2126008, + 2126003, + 2125998, + 2126047, + 2126027, + 2126045, + 2126041, + 2126089, + 2126077, + 2126108, + 2126105, + 2126181, + 2126165, + 2126216, + 2126182, + 2126178, + 2126156, + 2126166, + 2126188, + 2126223, + 2126331, + 2126212, + 2126229, + 2126248, + 2126252, + 2126295, + 2126265, + 2126270, + 2126290, + 2126281, + 2126292, + 2126286, + 2126304, + 2126316, + 2126311, + 2126325, + 2126332, + 2126329, + 2126335, + 2126349, + 2126352, + 2126363, + 4223528, + 2126381, + 2126380, + 2126384, + 2126386, + 2126395, + 2126396, + 2126399, + 2126400, + 2126406, + 2126411, + 2126424, + 2126452, + 2126462, + 2126466, + 2126465, + 2126471, + 2126482, + 2126486, + 2126498, + 2126503, + 2126521, + 2126514, + 2126531, + 2126534, + 2126532, + 2126542, + 2126546, + 2126562, + 2126560, + 2126561, + 2126585, + 2126583, + 2117647, + 2126615, + 2126602, + 2126620, + 2126614, + 2126621, + 2126644, + 2126639, + 2126633, + 2126629, + 2126654, + 2126670, + 2126671, + 2137816, + 2126679, + 2126698, + 2126696, + 2126704, + 2126712, + 2126709, + 2126715, + 2126714, + 2126792, + 2126771, + 2126798, + 2126779, + 2126784, + 2126821, + 2126830, + 2126814, + 2127010, + 2126853, + 2126959, + 2126885, + 2126840, + 2126898, + 2126906, + 2126933, + 2126911, + 2126943, + 2126937, + 2126913, + 2126940, + 2126953, + 2126960, + 2126947, + 2126954, + 2126966, + 2126974, + 2126987, + 2127006, + 2127015, + 2127050, + 2127055, + 2127060, + 2126833, + 2127072, + 2127075, + 2127079, + 2127081, + 2127086, + 2127090, + 2127088, + 2127089, + 2127096, + 2127095, + 2127108, + 2127107, + 2127109, + 2127116, + 2127118, + 2127117, + 2127125, + 2127123, + 2127134, + 2127142, + 2127148, + 2127164, + 2127172, + 2127181, + 2127178, + 2127177, + 2127195, + 2127174, + 2127194, + 2127209, + 2127204, + 2127207, + 2127211, + 2127213, + 2127224, + 2127222, + 2127238, + 2127239, + 2127220, + 2127242, + 2127241, + 2127234, + 2127252, + 2127258, + 2127261, + 2127269, + 2127267, + 2127298, + 2127283, + 2127299, + 2127285, + 2127293, + 2127288, + 2127292, + 2127281, + 2127309, + 2127306, + 2127314, + 2127321, + 2127331, + 2127326, + 2127358, + 2127359, + 2127356, + 2127361, + 2127344, + 2127354, + 2127346, + 2127347, + 2127371, + 2127373, + 2127369, + 2127391, + 2127399, + 2127392, + 2127393, + 2127394, + 2127396, + 2127412, + 2127408, + 2127419, + 2127431, + 2127432, + 2127430, + 2127452, + 2127448, + 2127457, + 2127458, + 2127464, + 2127465, + 2127466, + 2127463, + 2127468, + 2127472, + 2127474, + 2127478, + 2127480, + 2127484, + 2127488, + 2127491, + 2127496, + 2127499, + 2127502, + 2127510, + 2127507, + 2127513, + 2127514, + 2127536, + 2127540, + 2127544, + 2127545, + 2127546, + 2127554, + 2127565, + 2127574, + 2127570, + 2127582, + 2127585, + 2127589, + 2127591, + 2127594, + 2131503, + 2127611, + 2127624, + 2127623, + 2127620, + 2127657, + 2127652, + 4224798, + 2127653, + 2127654, + 2127643, + 2127671, + 2127672, + 2127687, + 2127706, + 2127720, + 2127723, + 2127707, + 2127717, + 2127743, + 2127742, + 2127737, + 2127758, + 2127755, + 2127761, + 2127776, + 2127774, + 2127792, + 2127798, + 2127801, + 2127807, + 2127804, + 2127805, + 2127803, + 2127815, + 2127821, + 2127831, + 2127834, + 2127836, + 2127843, + 2127854, + 2127868, + 2127884, + 2127890, + 2128166, + 2127904, + 2128170, + 2127941, + 2128014, + 2127988, + 2128006, + 2127996, + 2128026, + 2128012, + 2128035, + 2128053, + 2128042, + 2128047, + 2128081, + 2128070, + 2128075, + 2128084, + 2128062, + 2128060, + 2128069, + 2128074, + 2128108, + 2128103, + 2128090, + 2128125, + 2128116, + 2128135, + 2128146, + 2128145, + 2128153, + 2128172, + 2128171, + 2128192, + 2128224, + 2128215, + 2128223, + 2128218, + 2128213, + 2128211, + 2128250, + 2128255, + 2128266, + 2128285, + 2128295, + 2137931, + 2128298, + 2128302, + 2128307, + 2128313, + 2128314, + 2128329, + 2128341, + 2128359, + 2128364, + 2128353, + 2128355, + 2128392, + 2128397, + 2128408, + 2128409, + 2128416, + 2128415, + 2128256, + 2128433, + 2128443, + 2128446, + 2128439, + 2128451, + 2128471, + 2128457, + 2128481, + 2128482, + 2128489, + 2138013, + 2128496, + 2128505, + 2128509, + 2128520, + 2128535, + 2128533, + 2128536, + 2128534, + 2128553, + 2128584, + 2128560, + 2128566, + 2128581, + 2128580, + 2128575, + 2134147, + 2128583, + 2128586, + 2128589, + 2128591, + 2128597, + 2128595, + 2128601, + 2128602, + 2128605, + 2128609, + 2128610, + 2128614, + 2128621, + 2128624, + 2128642, + 2128655, + 2128650, + 2128646, + 2128691, + 2128664, + 2128665, + 2128670, + 2128693, + 2128680, + 2128694, + 2128720, + 2128762, + 2128644, + 2128717, + 2128651, + 2128716, + 2128709, + 2128757, + 2128741, + 2128756, + 2128743, + 2128752, + 2128753, + 2128748, + 2128750, + 2128797, + 2128792, + 2128799, + 2128781, + 2128796, + 2128794, + 2128779, + 2128786, + 2128783, + 2128733, + 2128793, + 2128843, + 2128833, + 2128844, + 2128847, + 2128820, + 2128838, + 2128861, + 2128873, + 2128913, + 2128916, + 2128870, + 2128869, + 2128992, + 2128896, + 2128903, + 2128915, + 2128883, + 2128887, + 2128919, + 2128909, + 2128886, + 2128931, + 2128935, + 2128938, + 2128927, + 2128951, + 2128939, + 2128957, + 2128972, + 2128963, + 2128980, + 2128975, + 2128960, + 2128976, + 2128984, + 2128991, + 2128996, + 2128982, + 2128997, + 2129004, + 2129013, + 2129027, + 2129040, + 2129060, + 2129069, + 2129058, + 2129067, + 2129057, + 2129064, + 2129075, + 2129074, + 2129073, + 2129070, + 2129081, + 2129085, + 2129088, + 2129093, + 2129090, + 2129112, + 2129106, + 2129116, + 2129122, + 2136891, + 2129135, + 2129138, + 2129140, + 2129142, + 2129146, + 2129158, + 2129154, + 2129180, + 2129173, + 2129162, + 2129221, + 2129227, + 2129198, + 2129202, + 2129215, + 2129205, + 2129222, + 2129267, + 2129238, + 2129230, + 2129266, + 2129256, + 2129262, + 2129231, + 2129251, + 2129299, + 2129289, + 2129243, + 2129295, + 2129277, + 2129307, + 2129338, + 2129326, + 2129315, + 2129333, + 2129351, + 2129341, + 2129323, + 2129469, + 2129314, + 2129327, + 2129372, + 2129336, + 2129311, + 2129328, + 2129368, + 2129373, + 2129380, + 2129374, + 2129403, + 2129394, + 2129377, + 2129413, + 2129418, + 2129443, + 2129441, + 2129426, + 2129457, + 2129439, + 2129417, + 2129419, + 2129442, + 2129478, + 2129510, + 2129467, + 2129461, + 2129465, + 2129475, + 2129463, + 2129458, + 2129466, + 2129511, + 2129501, + 2129494, + 2129502, + 2129497, + 2129498, + 2129529, + 2129514, + 2129513, + 2129532, + 2129531, + 2129539, + 2129365, + 2129533, + 2133934, + 2129535, + 2129544, + 2129545, + 2129548, + 2129554, + 2129552, + 2129555, + 2129556, + 2129558, + 2129550, + 2129563, + 2129564, + 2129720, + 2129722, + 2129733, + 2129740, + 2129741, + 2129742, + 2129744, + 2129745, + 2129749, + 2129748, + 2129752, + 2129759, + 2129760, + 2129768, + 2129769, + 2129767, + 2129784, + 2129794, + 2129798, + 2129795, + 2129800, + 2129799, + 2129804, + 2129812, + 2129822, + 2129821, + 2129818, + 2129827, + 2129839, + 2129842, + 2129849, + 2129838, + 2129846, + 2129848, + 2132849, + 2129861, + 2129862, + 2129866, + 2129877, + 2129876, + 2129889, + 2129894, + 2129897, + 2129907, + 2129913, + 2136284, + 2129926, + 2129924, + 2129931, + 2129938, + 2129944, + 2129945, + 2129948, + 2129953, + 2129960, + 2129983, + 2129979, + 2129994, + 2129990, + 2130002, + 2130008, + 2130010, + 2130015, + 2130018, + 2130024, + 2130035, + 2130034, + 2130032, + 2130038, + 2130041, + 2130045, + 2130047, + 2130052, + 2130054, + 2130053, + 2130075, + 2130067, + 2130074, + 2130093, + 2118032, + 2130092, + 2130139, + 2130149, + 2130137, + 2130141, + 2130116, + 2130138, + 2130134, + 2130185, + 2130159, + 2130161, + 2130203, + 2130217, + 2130211, + 2130223, + 2130251, + 2135691, + 2130246, + 2130238, + 2130259, + 2130257, + 2130172, + 2130289, + 2130286, + 2130277, + 2130278, + 2130292, + 2130307, + 2130312, + 2130314, + 2130304, + 2130306, + 2130336, + 2130325, + 2130340, + 2130339, + 2130271, + 2130323, + 2130345, + 2130352, + 2130357, + 2130366, + 2130360, + 2130365, + 2130368, + 2130370, + 2130362, + 2130377, + 2130381, + 2130385, + 2130393, + 2130392, + 2130376, + 2130394, + 2130399, + 2130400, + 2130407, + 2130426, + 2130427, + 2130430, + 2130433, + 2130434, + 2130437, + 2130439, + 2130442, + 2130445, + 2130448, + 2130454, + 2130473, + 2130475, + 2130488, + 2130483, + 2130496, + 2130521, + 2130520, + 2130525, + 2130522, + 2130527, + 2130532, + 2130530, + 2130536, + 2130538, + 2130539, + 2130478, + 2130545, + 2130551, + 2130552, + 2130558, + 2130573, + 2130578, + 2130603, + 2130591, + 2130619, + 2130604, + 2130657, + 2130659, + 2130655, + 2130642, + 2130676, + 2130675, + 2130682, + 2130835, + 2130691, + 2130683, + 2130681, + 2130654, + 2130694, + 2130652, + 2130697, + 2130649, + 2130741, + 2130740, + 2130710, + 2130738, + 2130737, + 2130752, + 2130745, + 2130768, + 2130757, + 2130735, + 2130731, + 2130711, + 2130712, + 2130821, + 2130842, + 2130858, + 2130847, + 2130850, + 2130838, + 2130723, + 2130830, + 2130823, + 2130826, + 2130812, + 2130869, + 2130803, + 2130805, + 2130848, + 2130825, + 2130856, + 2130932, + 2130963, + 2130923, + 2130894, + 2130941, + 2130947, + 2130904, + 2130955, + 2130881, + 2130935, + 2130951, + 2130912, + 2130930, + 2130957, + 2130978, + 2130976, + 2130877, + 2131000, + 2131206, + 2130939, + 2131053, + 2130986, + 2131004, + 2131290, + 2131076, + 2131063, + 2131051, + 2131117, + 2131054, + 2131074, + 2131049, + 2131014, + 2130988, + 2131055, + 2131065, + 2130997, + 2131146, + 2131042, + 2131129, + 2131135, + 2131103, + 2131161, + 2131149, + 2131131, + 2131162, + 2131152, + 2131137, + 2131142, + 2131158, + 2131105, + 2131233, + 2131199, + 2131188, + 2131223, + 2131224, + 2131244, + 2131231, + 2131221, + 2131220, + 2131196, + 2131264, + 2131299, + 2131288, + 2131272, + 2131265, + 2131458, + 2131275, + 2131285, + 2131328, + 2131364, + 2131336, + 2131345, + 2131338, + 2131368, + 2131309, + 2131348, + 2131355, + 2131434, + 2131335, + 2131356, + 2131319, + 2131326, + 2131344, + 2131401, + 2131386, + 2131407, + 2131385, + 2131408, + 2131413, + 2131421, + 2131429, + 2131420, + 2131449, + 2131466, + 2131475, + 2131467, + 2131454, + 2131450, + 2131462, + 2131490, + 2131482, + 2131504, + 2131519, + 2131533, + 2117205, + 2131540, + 2131551, + 2131559, + 2131569, + 2131603, + 2131619, + 2131625, + 2131626, + 2131595, + 2131596, + 2131638, + 2131631, + 2131652, + 2131654, + 2131632, + 2131657, + 2132003, + 2131627, + 2131668, + 2131678, + 2131689, + 2131692, + 2131679, + 2131675, + 2131695, + 2131730, + 2131718, + 2131720, + 2131712, + 2131715, + 2131707, + 2131729, + 2131721, + 2131725, + 2131705, + 2131722, + 2131764, + 2131775, + 2131767, + 2131771, + 2131749, + 2131753, + 2131738, + 2131808, + 2131807, + 2131832, + 2131788, + 2131790, + 2131828, + 2131799, + 2131816, + 2131822, + 2131801, + 2131795, + 2131811, + 2131818, + 2131973, + 2131874, + 2131871, + 2131842, + 2131887, + 2131915, + 2131901, + 2131904, + 2131920, + 2135766, + 2131883, + 2131908, + 2131891, + 2131911, + 2131910, + 2131899, + 2131951, + 2131954, + 2131936, + 2131983, + 2131981, + 2131966, + 2131958, + 2131959, + 2131982, + 2131922, + 2131985, + 2131990, + 2131989, + 2132002, + 2132001, + 2132017, + 2132022, + 2132025, + 2132007, + 2132027, + 2132036, + 2132034, + 2132050, + 2132057, + 2132062, + 2132066, + 2132075, + 2132097, + 2132094, + 2132126, + 2132085, + 2132093, + 2132149, + 2132082, + 2132098, + 2132119, + 2132114, + 2132142, + 2132121, + 2132130, + 2132109, + 2132132, + 2132144, + 2132159, + 2132145, + 2132163, + 2132164, + 2132180, + 2132184, + 2132185, + 2132189, + 2132217, + 2132226, + 2132220, + 2132212, + 2132200, + 2132210, + 2132228, + 2132236, + 2132234, + 2132243, + 2132291, + 2132254, + 2132261, + 2132266, + 2132267, + 2132289, + 2132292, + 2132283, + 2132278, + 2132280, + 2132300, + 2132253, + 2132320, + 2132318, + 2132326, + 2132324, + 2132333, + 2132330, + 2132335, + 2132340, + 2132343, + 2132350, + 2132355, + 2132360, + 2132362, + 2132371, + 2132376, + 2132385, + 2132393, + 2132390, + 2132396, + 2132399, + 2132402, + 2132410, + 2132413, + 2132415, + 2132416, + 2132442, + 2132444, + 2132445, + 2132455, + 2132468, + 2132472, + 2132483, + 2132502, + 2132496, + 2132492, + 2132507, + 2132509, + 2132517, + 2132534, + 2132545, + 2132571, + 2132562, + 2132550, + 2132552, + 2132604, + 2132589, + 2132588, + 2132578, + 2132613, + 2132610, + 2132612, + 2132648, + 2132641, + 2132625, + 2132645, + 2132646, + 2132634, + 2132643, + 2132676, + 2132685, + 2132674, + 2132698, + 2132715, + 2132723, + 2132711, + 2132708, + 2132721, + 2132756, + 2132704, + 2132706, + 2132727, + 2132702, + 2132699, + 2132748, + 2132743, + 2132762, + 2132705, + 2132758, + 2132752, + 2132759, + 2132768, + 2132787, + 2135979, + 2132774, + 2132779, + 2132798, + 2132776, + 2132801, + 2132812, + 2132815, + 2132814, + 2132809, + 2132822, + 2132827, + 2132826, + 2132843, + 2132831, + 2132844, + 2132847, + 2132852, + 2132861, + 2132864, + 2132876, + 2132878, + 2132882, + 2132883, + 2132886, + 2132889, + 2132890, + 2133050, + 2133057, + 2133055, + 2133064, + 2133068, + 2133070, + 2133072, + 2133077, + 2133090, + 2133100, + 2133112, + 2133114, + 2133122, + 2133129, + 2133125, + 2133130, + 2133133, + 2133134, + 2133140, + 2133116, + 2133144, + 2122269, + 2133165, + 2133162, + 2133181, + 2133170, + 2133171, + 2133166, + 2133174, + 2133192, + 2133185, + 2133220, + 2133219, + 2133210, + 2133245, + 2133242, + 2133243, + 2133252, + 2133253, + 2133258, + 2133255, + 2133263, + 2133261, + 2133264, + 2137934, + 2133267, + 2133197, + 2133268, + 2133270, + 2133351, + 2133357, + 2133361, + 2133363, + 2133377, + 2133401, + 2133442, + 2133438, + 2133434, + 2133455, + 2133466, + 2133462, + 2133452, + 2133467, + 2133451, + 2133482, + 2133483, + 2133471, + 2133475, + 2133500, + 2133512, + 2133513, + 2133503, + 2133533, + 2133534, + 2133520, + 2133535, + 2133570, + 2133557, + 2133552, + 2133556, + 2133578, + 2133575, + 2133577, + 2133580, + 2133584, + 2133576, + 2133593, + 2133604, + 2133600, + 2133546, + 2133603, + 2133589, + 2133622, + 2133618, + 2133628, + 2133633, + 2133639, + 2133637, + 2133636, + 2133643, + 2133642, + 2133651, + 2133649, + 2133652, + 2133657, + 2133674, + 2133665, + 2133676, + 2133680, + 2133702, + 2133681, + 2133694, + 2133701, + 2133704, + 2133707, + 2133723, + 2133731, + 2133756, + 2133755, + 2133739, + 2133758, + 2133770, + 2133765, + 2133781, + 2133778, + 2133785, + 2133779, + 2133788, + 2133791, + 2133787, + 2133772, + 2133798, + 2133811, + 2133819, + 2133817, + 2133829, + 2133826, + 2133822, + 2133836, + 2133833, + 2133830, + 2133838, + 2133847, + 2133852, + 2133858, + 2133859, + 2133860, + 2133916, + 2133919, + 2133923, + 2133933, + 2133935, + 2133943, + 2133978, + 2133989, + 2133986, + 2133994, + 2133999, + 2134151, + 2134004, + 2134021, + 2134009, + 2134010, + 2134033, + 2134037, + 2134049, + 2134029, + 2134046, + 2134038, + 2134027, + 2134055, + 2134070, + 2134069, + 2134073, + 2134008, + 2134095, + 2134096, + 2134097, + 2134098, + 2134030, + 2134089, + 2134078, + 2134102, + 2134104, + 2134110, + 2134120, + 2134127, + 2134134, + 2135720, + 2134130, + 2134146, + 2134141, + 2134145, + 2134144, + 2134154, + 2134153, + 2134159, + 2134184, + 2134191, + 2134193, + 2134197, + 2134242, + 2134244, + 2122312, + 2134235, + 2134274, + 2134290, + 2134297, + 2134322, + 2134320, + 2134346, + 2134358, + 2134360, + 2134371, + 2134373, + 2134377, + 2134387, + 2134386, + 2134411, + 2134409, + 2134402, + 2134434, + 2134443, + 2134447, + 2134442, + 2134453, + 2134452, + 2134458, + 2134464, + 2134465, + 2134473, + 2134475, + 2134480, + 2134486, + 2134495, + 2134497, + 2134491, + 2134524, + 2134517, + 2134518, + 2134558, + 2134527, + 2134548, + 2134572, + 2134549, + 2134545, + 2134622, + 2134615, + 2134597, + 2134601, + 2134628, + 2134600, + 2134677, + 2134591, + 2134603, + 2134608, + 2134684, + 2134678, + 2134675, + 2134683, + 2134618, + 2134735, + 2134713, + 2134711, + 2134761, + 2134799, + 2134778, + 2134852, + 2134830, + 2134809, + 2134818, + 2134810, + 2134819, + 2134842, + 2134837, + 2134843, + 2134876, + 2134880, + 2134908, + 2134894, + 2134870, + 2134960, + 2134956, + 2134957, + 2134932, + 2134969, + 2134998, + 2134999, + 2135016, + 2135013, + 2135000, + 2134979, + 2135005, + 2134992, + 2134984, + 2135012, + 2135066, + 2135060, + 2135059, + 2135043, + 2135047, + 2135056, + 2135094, + 2135083, + 2135093, + 2135073, + 2135098, + 2135105, + 2135122, + 2135108, + 2135131, + 2135136, + 2135138, + 2135134, + 2135146, + 2134569, + 2135152, + 2135157, + 2135159, + 2135165, + 2135130, + 2135164, + 2135166, + 2135169, + 2135167, + 2135426, + 2135431, + 2135434, + 2135444, + 2135446, + 2135448, + 2135449, + 2135456, + 2135464, + 2135463, + 2135469, + 2135484, + 2135483, + 2135481, + 2135486, + 2135498, + 2125814, + 2135491, + 2135501, + 2135500, + 2135509, + 2135508, + 2135510, + 2135516, + 2135521, + 2135525, + 2135522, + 2135585, + 2135592, + 2135598, + 2135599, + 2135618, + 2135628, + 2135631, + 2135627, + 2135671, + 2135644, + 2135646, + 2135645, + 2135647, + 2135654, + 2135666, + 2135660, + 2135693, + 2135704, + 2135701, + 2135703, + 2135722, + 2135719, + 2135729, + 2135730, + 2135728, + 2135732, + 2135734, + 2135736, + 2135737, + 2135758, + 2135755, + 2135753, + 2135757, + 2132301, + 2135772, + 2135821, + 2135765, + 2135801, + 2135812, + 2135814, + 2135816, + 2135827, + 2135822, + 2135825, + 2135823, + 2135830, + 2135833, + 2135844, + 2135850, + 2135856, + 2135865, + 2135869, + 2135870, + 2135876, + 2135878, + 2135880, + 2135874, + 2135881, + 2135900, + 2135904, + 2135908, + 2135910, + 2135912, + 2118354, + 2135915, + 2135921, + 2135929, + 2135941, + 2135932, + 2135937, + 2135930, + 2135942, + 2135947, + 2135951, + 2135952, + 2135964, + 2135976, + 2135974, + 2135971, + 2135987, + 2135988, + 2136003, + 2136006, + 2136008, + 2136011, + 2136028, + 2136045, + 2137935, + 2136050, + 2128607, + 2136054, + 2136053, + 2136079, + 2136076, + 2136120, + 2136100, + 2136097, + 2136119, + 2136125, + 2136134, + 2136143, + 2136139, + 2136171, + 2136175, + 2136176, + 2136177, + 2136180, + 2136179, + 2136234, + 2136239, + 2136241, + 2136246, + 2136260, + 2136259, + 2136262, + 2136297, + 2136299, + 2136323, + 2136329, + 2136338, + 2136340, + 2136344, + 2136353, + 2136349, + 2136350, + 2136356, + 2136352, + 2136364, + 2136366, + 2136381, + 2136382, + 2136386, + 2136393, + 2136389, + 2136400, + 2136395, + 2136401, + 2136402, + 2136396, + 2136405, + 2136471, + 2136472, + 2136485, + 2136493, + 2136494, + 2136508, + 2136543, + 2136539, + 2136541, + 2136536, + 2136529, + 2136557, + 2136558, + 2136561, + 2136562, + 2136571, + 2136568, + 2136577, + 2136591, + 2136581, + 2136546, + 2136601, + 2136619, + 2136631, + 2136645, + 2136642, + 2136640, + 2136643, + 2136638, + 2136661, + 2136653, + 2136667, + 2136663, + 2136671, + 2136674, + 2136677, + 2136676, + 2136681, + 2136683, + 2136682, + 2136749, + 2136752, + 2136764, + 2136768, + 2136783, + 2136785, + 2136787, + 2136788, + 2136798, + 2136799, + 2136802, + 2136803, + 2136806, + 2136815, + 2136811, + 2136814, + 2136820, + 2136817, + 2136823, + 2136827, + 2136838, + 2136856, + 2136858, + 2136863, + 2136866, + 2136867, + 2136869, + 2136871, + 2136872, + 2136873, + 2136874, + 2136878, + 2136879, + 2136882, + 2136900, + 2136899, + 2136911, + 2136909, + 2136910, + 2136913, + 2136920, + 2136948, + 2136979, + 2136963, + 2136977, + 2136982, + 2136983, + 2136991, + 2136992, + 2137000, + 2137012, + 2137024, + 2137034, + 2137017, + 2137030, + 2137039, + 2137041, + 2137042, + 2137059, + 2137058, + 2137060, + 2137044, + 2137057, + 2137146, + 2137074, + 2137073, + 2137072, + 2137109, + 2137108, + 2137097, + 2137107, + 2137100, + 2137094, + 2137096, + 2137106, + 2137098, + 2137092, + 2137134, + 2137115, + 2137125, + 2137124, + 2137121, + 2137136, + 2137159, + 2137138, + 2137158, + 2137150, + 2137178, + 2137184, + 2137191, + 2137206, + 2137208, + 2137319, + 2137324, + 2137328, + 2137353, + 2137352, + 2137323, + 2137347, + 2137350, + 2137386, + 2137382, + 2137519, + 2137379, + 2137375, + 2137412, + 2137365, + 2137362, + 2137409, + 2137407, + 2137406, + 2137414, + 2137416, + 2137437, + 2137438, + 2137444, + 2137425, + 2137424, + 2137433, + 2137458, + 2137481, + 2137479, + 2137515, + 2137455, + 2137466, + 2137498, + 2137508, + 2137513, + 2137522, + 2137540, + 2137537, + 2137531, + 2137528, + 2137530, + 2137542, + 2137551, + 2137538, + 2137561, + 2137555, + 2137592, + 2137574, + 2137581, + 2137583, + 2137597, + 2137626, + 2137627, + 2137630, + 2137717, + 2137721, + 2137725, + 2137729, + 2137736, + 2137739, + 2137740, + 2137746, + 2137749, + 2137745, + 2137757, + 2137765, + 2137769, + 2137784, + 2137770, + 2137773, + 2135905, + 2137804, + 2137806, + 2137807, + 2137808, + 2137812, + 2137820, + 2137822, + 2137821, + 2137824, + 2137829, + 2137832, + 2137839, + 2137844, + 2137846, + 2137847, + 2137849, + 2137851, + 2137852, + 2137853, + 2137863, + 2137864, + 2127543, + 2137877, + 2137889, + 2137900, + 2137918, + 2137930, + 2137938, + 2137940, + 2137955, + 2137951, + 2137952, + 2137953, + 2137958, + 2137959, + 2137964, + 2137962, + 2137975, + 2137970, + 2137974, + 2138005, + 2138012, + 2138016, + 2119727, + 2124231, + 2134105, + 2126948, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 2119006, + 4233460, + 4222626, + 4234287, + 4222443, + 4231106, + 4221725, + 4215721, + 2264285, + 4216386, + 4233484, + 2126128, + 4229462, + 2137559, + 4231142, + 4218978, + 4219600, + 4220518, + 4216221, + 4228187, + 4233092, + 2119321, + 2112846, + 4227056, + 4227051, + 4218813, + 4225351, + 2117600, + 6312831, + 4214981, + 2133696, + 4216240, + 2124507, + 4217937, + 4233076, + 4225345, + 4219239, + 2250868, + 2129515, + 2130758, + 2264822, + 4214822, + 4217548, + 4219762, + 2137724, + 4229882, + 4218359, + 2123323, + 4222621, + 2137780, + 4234592, + 4224273, + 4231623, + 4221322, + 2123781, + 4228521, + 4234198, + 4231942, + 4223946, + 4215793, + 2120802, + 4231278, + 4220755, + 4223100, + 2129505, + 4231499, + 4220633, + 2125338, + 4228527, + 4228599, + 4216040, + 4218592, + 4221090, + 2131235, + 2134444, + 4233112, + 4228949, + 4233073, + 4231191, + 4227040, + 4220026, + 4231197, + 2131948, + 4220080, + 4220947, + 4223310, + 4223357, + 4229742, + 4216396, + 4231265, + 4215413, + 2122772, + 4224550, + 4231260, + 2136658, + 4227455, + 4234971, + 4216132, + 4222959, + 2126882, + 4228856, + 2121213, + 4231103, + 4221146, + 4234312, + 4221501, + 2128926, + 4229691, + 4223014, + 4215243, + 4219735, + 4221388, + 4232090, + 4216922, + 2122833, + 4231469, + 4220130, + 4222650, + 2119777, + 2136154, + 4216885, + 4217952, + 4228063, + 4230381, + 4216920, + 2128305, + 4234503, + 2125830, + 4223006, + 4216440, + 4231233, + 4233235, + 4231331, + 4229902, + 4223064, + 4221282, + 4225456, + 2119370, + 4223564, + 4231193, + 4225508, + 2118237, + 4225976, + 2125649, + 2134449, + 4219709, + 4219465, + 4221451, + 4220874, + 4225559, + 4231228, + 4217499, + 4229932, + 4218591, + 4222997, + 2136123, + 4228413, + 4224933, + 4217385, + 4218518, + 4222177, + 4228332, + 2136112, + 4234322, + 2137781, + 4215090, + 4233477, + 4226174, + 4232275, + 4219144, + 4224594, + 4223799, + 4223380, + 4227072, + 2130954, + 4231292, + 2125603, + 2126153, + 2131182, + 4221332, + 2131999, + 2117972, + 4215177, + 2118037, + 4215204, + 4216121, + 4216115, + 4216292, + 4216370, + 4216485, + 4216843, + 4217534, + 2234906, + 2120795, + 4218468, + 4219031, + 4219753, + 4219910, + 2123042, + 4220291, + 4220838, + 2123770, + 4221083, + 2123918, + 4222574, + 2245584, + 2126376, + 4223950, + 4224260, + 4224269, + 4224277, + 4224659, + 4225148, + 4225585, + 4235165, + 4225945, + 4226192, + 4226222, + 4226459, + 4226478, + 4226463, + 4227028, + 4227630, + 4227725, + 4227794, + 4227875, + 4227957, + 4228375, + 2131262, + 4228994, + 4229074, + 4229386, + 4229551, + 4229854, + 4229953, + 4230618, + 4230665, + 4230931, + 4231146, + 4231145, + 4231256, + 4219464, + 4231617, + 4232635, + 2127714, + 4232996, + 4233056, + 4233069, + 4233252, + 4234030, + 4234135, + 4234226, + 4234922, + 4235164, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 4227750, + 4227880, + 2119251, + 6312873, + 4223577, + 4222066, + 4225800, + 4233559, + 4219635, + 4233488, + 6330221, + 6320509, + 4225663, + 4225965, + 4219843, + 6325215, + 4225378, + 4215771, + 4225991, + 4231108, + 4226110, + 4214986, + 4215573, + 4216233, + 4216494, + 4216857, + 4217115, + 4217896, + 4218576, + 4218575, + 4219457, + 4220609, + 4221960, + 4222499, + 4222700, + 4225687, + 4226013, + 4227049, + 4228130, + 4228953, + 4229134, + 6326226, + 4233753, + 4234925, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 4231202, + 4231099, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 2118108, + 2126233, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 2129546, + 2132252, + 2134856, + 2134664, + 2131164, + 2117577, + 2126011, + 2123313, + 2123976, + 2134777, + 2123515, + 2121541, + 2117160, + 2117345, + 2117372, + 2117376, + 2117379, + 2117433, + 2117462, + 2117522, + 2117514, + 2117530, + 2117524, + 2117581, + 2117696, + 2117666, + 2117631, + 2117662, + 2117702, + 2117744, + 2117698, + 2117780, + 2117876, + 2117848, + 2117962, + 2117988, + 2118045, + 2118078, + 2118124, + 2118165, + 2118300, + 2118310, + 2118336, + 2118363, + 2118400, + 4215559, + 2118436, + 2118514, + 2118547, + 2118578, + 2118621, + 2161166, + 2118812, + 2118794, + 2118825, + 2118911, + 2119046, + 2119513, + 2119525, + 2119596, + 2119624, + 2119623, + 2161167, + 6314074, + 2119838, + 2119858, + 2119947, + 2120019, + 2120027, + 2120029, + 2120035, + 2120100, + 2120122, + 2120534, + 2120640, + 2127151, + 2120664, + 4217819, + 2120734, + 2120870, + 2120890, + 2120949, + 2120999, + 2121043, + 4258321, + 2121026, + 2121069, + 2121144, + 2121145, + 2121168, + 2121505, + 2121524, + 2121575, + 2121655, + 2121694, + 2121821, + 2121861, + 2121866, + 2121950, + 2121941, + 2122016, + 2121970, + 2122001, + 2122039, + 2122032, + 2122136, + 2122259, + 2122406, + 2122741, + 2122848, + 2122909, + 2122958, + 2123086, + 2123264, + 2123285, + 2123273, + 2123310, + 4220446, + 2123300, + 2123365, + 2123351, + 2123353, + 2123380, + 2123379, + 2123417, + 2123424, + 2123442, + 2123455, + 2123514, + 2123534, + 6317847, + 2123622, + 2123707, + 4221010, + 2123712, + 4220929, + 2123844, + 2123983, + 2161171, + 2124136, + 2161172, + 2124184, + 2124258, + 2124336, + 2124395, + 2124358, + 2124403, + 2124414, + 2124514, + 2124516, + 2124758, + 2124863, + 2124892, + 2124934, + 2124911, + 2125018, + 2125060, + 2125191, + 2125167, + 2125206, + 2125228, + 2125263, + 2125304, + 2125298, + 2125308, + 2125369, + 2125404, + 2125351, + 2125372, + 2125503, + 2125704, + 2125749, + 2125813, + 2125829, + 2125831, + 2125864, + 2125957, + 2125995, + 2126095, + 2126084, + 2126172, + 2126150, + 2126151, + 10506718, + 2126273, + 2126334, + 2126513, + 2126526, + 2126628, + 2126634, + 2126711, + 2126781, + 2126793, + 2126806, + 2126819, + 2126802, + 2126855, + 2126837, + 2126886, + 2126890, + 2126889, + 2126894, + 4224098, + 2126985, + 2127007, + 2127105, + 2127215, + 2127490, + 2127516, + 2127518, + 2127515, + 2127526, + 4224714, + 2127686, + 2118319, + 2127905, + 2127950, + 2127972, + 2127994, + 2128176, + 4225340, + 2128222, + 2128229, + 2128276, + 4225423, + 2128283, + 2128593, + 2128615, + 4233046, + 2128619, + 2128798, + 2129086, + 2129224, + 4226396, + 2129335, + 2129312, + 2129366, + 2129490, + 2129735, + 2129825, + 2129853, + 2130689, + 2130786, + 2130815, + 2130887, + 2130934, + 2131016, + 2131124, + 2131283, + 2131289, + 2131307, + 2161183, + 2131376, + 4228626, + 2161185, + 2131975, + 2132213, + 2132498, + 2132535, + 2132601, + 2132647, + 2132670, + 2132703, + 2132728, + 2132726, + 2132819, + 2132863, + 2133232, + 2133236, + 2133266, + 2133366, + 2161187, + 2133711, + 4258340, + 6328376, + 2134119, + 2134238, + 2134269, + 2134293, + 2134311, + 2134490, + 2134487, + 2134494, + 2134509, + 2134510, + 2134500, + 2134501, + 2134534, + 2134544, + 2134538, + 2134586, + 2134592, + 2134588, + 2134606, + 2134617, + 2134609, + 2134585, + 2134631, + 2134695, + 2134647, + 2134648, + 2134759, + 2134743, + 2134745, + 2134736, + 2161191, + 2134741, + 2134752, + 2134739, + 2134821, + 2134817, + 2134779, + 2161192, + 2134814, + 2134783, + 2134813, + 2134786, + 2134896, + 2134871, + 2134948, + 2134982, + 2135006, + 2135032, + 2135089, + 2135109, + 2135112, + 2135442, + 6329990, + 2161193, + 2135709, + 2135727, + 2135859, + 2135867, + 2135875, + 2135885, + 2135887, + 2135889, + 4233045, + 2136151, + 2136165, + 2136303, + 4233468, + 2136359, + 4233512, + 2136478, + 2136654, + 2136793, + 2136796, + 2136949, + 2136946, + 2136975, + 2137009, + 2137019, + 2137088, + 2137456, + 2137451, + 2137524, + 2137625, + 2137809, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 6319336, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 4231224, + 2132737, + 2129379, + 2137795, + 2125483, + 2128269, + 2121876, + 2125175, + 4219240, + 2124266, + 2125364, + 4229392, + 4222754, + 4216424, + 2123234, + 2128200, + 2131547, + 4233215, + 4215524, + 2132793, + 2122733, + 2122954, + 2127951, + 2128448, + 2124730, + 4225353, + 4229526, + 2126190, + 4225342, + 4227077, + 4227565, + 2128221, + 4220561, + 2129778, + 2125193, + 2126528, + 4219214, + 2127646, + 4225984, + 4225366, + 4215015, + 4217956, + 2121186, + 2122126, + 4230408, + 2118525, + 2119174, + 4228183, + 2121653, + 4219378, + 4232110, + 4225422, + 4234029, + 4225665, + 2135779, + 2123909, + 4226625, + 2123354, + 2118481, + 2128017, + 2133203, + 2123087, + 4214702, + 4214645, + 4216896, + 2118345, + 2124645, + 2119848, + 2124751, + 4215117, + 2122302, + 2128208, + 2124548, + 4232838, + 2131548, + 2125274, + 2136158, + 2123462, + 2124663, + 2129396, + 2134858, + 6315722, + 2134788, + 4221314, + 4215220, + 4219724, + 4228827, + 4231305, + 6328354, + 4214857, + 4226543, + 4231253, + 8410025, + 6330636, + 4229211, + 4218614, + 6319295, + 4231771, + 4227009, + 6324925, + 4232901, + 4217779, + 6316392, + 6318466, + 4221883, + 4220258, + 4230315, + 4218316, + 4233233, + 4218416, + 4230860, + 4225710, + 4216647, + 4214929, + 4225652, + 4214885, + 4218618, + 4231735, + 4221582, + 4214436, + 4215148, + 4220660, + 4220961, + 4225132, + 4226398, + 4227075, + 4230396, + 4232781, + 4219639, + 4226922, + 4214655, + 4215794, + 4217289, + 4229917, + 4231338, + 4215758, + 4230959, + 4220884, + 4224940, + 4227612, + 4221295, + 4220798, + 4229663, + 4214280, + 4216820, + 4221197, + 4227191, + 4229546, + 4231234, + 4219758, + 4219970, + 4227641, + 4226511, + 4227169, + 4214991, + 4229781, + 4218981, + 4215110, + 4224826, + 4227188, + 4230643, + 4218541, + 4218615, + 4227655, + 4220995, + 4231171, + 4222270, + 4219794, + 4230953, + 4223981, + 4233234, + 4219058, + 6316617, + 4220304, + 4226507, + 4229817, + 4230311, + 4223542, + 4228218, + 4215302, + 4216436, + 4219300, + 4226185, + 4226331, + 4232944, + 6325565, + 4214719, + 4219751, + 4224710, + 4221021, + 4227336, + 4227126, + 4227068, + 4215823, + 4232867, + 4234911, + 4234903, + 4227183, + 4227198, + 4222590, + 4214917, + 4215187, + 4215259, + 2230542, + 4215616, + 4232921, + 6313385, + 4216513, + 4216589, + 4217003, + 4217306, + 4217398, + 6314686, + 4218190, + 4218247, + 4218313, + 4218323, + 4218669, + 4218776, + 4219096, + 4219197, + 4219390, + 4219496, + 4219599, + 4220189, + 4219919, + 4220146, + 4220253, + 4220511, + 4220841, + 4220903, + 4221291, + 4221232, + 4221351, + 4221508, + 4221584, + 6319112, + 4221971, + 6319651, + 4222737, + 4222718, + 4222782, + 4223487, + 4223973, + 4224050, + 4224095, + 4224224, + 4224268, + 4224626, + 4225322, + 4225236, + 4225466, + 4225561, + 4225685, + 4226290, + 4226419, + 4226525, + 4226613, + 4226990, + 4227041, + 4227162, + 4227167, + 4227187, + 4227184, + 4227190, + 4227411, + 4227466, + 4227509, + 4227533, + 4228082, + 4228437, + 4228565, + 4228890, + 4229174, + 4229278, + 4229336, + 4229364, + 4229419, + 4229435, + 4229482, + 4229487, + 4229661, + 4230405, + 4230415, + 4235086, + 4230801, + 4230817, + 4231250, + 4231182, + 4231472, + 4231510, + 4231512, + 4231525, + 4231539, + 4231538, + 4231586, + 4231599, + 4231594, + 4231604, + 4231610, + 4232311, + 4232856, + 4233021, + 6330208, + 6330225, + 4233228, + 4233331, + 4233411, + 4233797, + 4234061, + 4234072, + 4234182, + 4234209, + 4234225, + 4234568, + 4234703, + 4235016, + 4219505, + 4220567, + 4219151, + 4229219, + 6328405, + 4231290, + 4225263, + 2133151, + 4232936, + 2255185, + 10507177, + 4224220, + 4231243, + 8427788, + 2275288, + 2134707, + 2135473, + 6315766, + 4219892, + 2124991, + 4223321, + 4231264, + 6328923, + 4220348, + 4218752, + 6324161, + 4215672, + 4233203, + 4215574, + 4227761, + 4228051, + 4230312, + 4231246, + 2130621, + 6330053, + 4233491, + 4218619, + 4223088, + 6314931, + 8413544, + 10510696, + 12607848, + 4221418, + 8415618, + 2123630, + 2132434, + 4232852, + 2118258, + 4230980, + 4232076, + 4227781, + 4217810, + 4224176, + 4226537, + 2253346, + 4231300, + 4232594, + 4233171, + 4227608, + 4215665, + 4207618, + 2110466, + 6304770, + 4218494, + 2123235, + 4220703, + 4221535, + 4230519, + 4233442, + 2231223, + 4216235, + 4228688, + 4231174, + 4215754, + 4215864, + 4218917, + 4226330, + 4218344, + 4219602, + 4230621, + 2268491, + 4365643, + 2118527, + 2121530, + 4218960, + 4221377, + 4339258, + 2275214, + 4231415, + 6330367, + 6330711, + 4220545, + 4223883, + 4231121, + 2117617, + 4225001, + 4215159, + 4228702, + 4225658, + 4231239, + 6318811, + 4216147, + 4217169, + 4218997, + 6316391, + 4231118, + 6312081, + 4222804, + 6322804, + 4220680, + 4227615, + 4215164, + 4215352, + 4219314, + 2123587, + 4227241, + 4229913, + 4231267, + 2230884, + 2132481, + 2122294, + 4232903, + 4233319, + 2118707, + 2120219, + 4229796, + 4218341, + 4219212, + 2122373, + 4219815, + 4221387, + 4222313, + 4222511, + 4227093, + 4227412, + 4227922, + 4229915, + 6327548, + 2118719, + 4231543, + 4227440, + 6321425, + 4231100, + 2275142, + 4232086, + 2275191, + 4218729, + 4219809, + 2124658, + 4228060, + 6312372, + 4215986, + 4215370, + 2127138, + 2116408, + 4217343, + 6314495, + 2121215, + 4229870, + 6327022, + 4230343, + 6327495, + 4221729, + 6318881, + 4222667, + 2126778, + 2231199, + 4219752, + 4220316, + 6328490, + 2118394, + 6320693, + 2126389, + 4231500, + 4218673, + 4214331, + 4215767, + 4219784, + 2118760, + 4226370, + 4227026, + 4229190, + 4231217, + 4214607, + 4229203, + 4231152, + 4218337, + 4231285, + 6328437, + 4219456, + 4220664, + 4217203, + 4215517, + 4216134, + 4217781, + 2120710, + 4217871, + 2282820, + 2120729, + 4222344, + 4225117, + 4227222, + 2228235, + 2120578, + 2119630, + 4219077, + 6313972, + 4233470, + 6318349, + 4221846, + 4233439, + 2136288, + 2266751, + 2111373, + 4214709, + 2111738, + 4222328, + 4224799, + 4231218, + 2117307, + 2228642, + 4215299, + 4217867, + 4229642, + 6326794, + 4231109, + 2286953, + 6328386, + 2110751, + 2275153, + 4219408, + 4224731, + 4227158, + 2132352, + 4229792, + 4229835, + 4233052, + 6330204, + 2128389, + 4227334, + 4232891, + 4226125, + 6323136, + 2132650, + 4232938, + 2129237, + 4219463, + 2125720, + 4226977, + 6324793, + 4231288, + 4231287, + 4215373, + 4215144, + 4219779, + 2122743, + 2127398, + 4230512, + 4231169, + 4231277, + 4231200, + 2260919, + 4231199, + 4230346, + 4217866, + 6315018, + 4217253, + 2243838, + 4231168, + 4231214, + 4232842, + 4234203, + 4217127, + 2110503, + 4223015, + 4231252, + 2130219, + 4214329, + 4221774, + 4223149, + 6326933, + 4220566, + 4214820, + 4226926, + 4225993, + 2251479, + 4225873, + 4231184, + 4220913, + 4222184, + 4233680, + 4218731, + 4218805, + 6316530, + 4220701, + 2125678, + 4229823, + 4224756, + 4220693, + 6317845, + 4216988, + 4231165, + 4231194, + 4216682, + 4231651, + 4215880, + 4218397, + 4225547, + 4224644, + 4231273, + 4231149, + 4222459, + 4215118, + 4231188, + 4225082, + 2119457, + 2232893, + 2118060, + 4216080, + 2129110, + 4228580, + 4229892, + 6328323, + 4231183, + 4233776, + 4217870, + 4231251, + 2118686, + 2112392, + 2117991, + 4227209, + 4214387, + 4218829, + 4229773, + 2120679, + 4226317, + 4229511, + 6319422, + 4227258, + 4215642, + 4228484, + 4231147, + 4226587, + 4227207, + 2117175, + 4222801, + 4231601, + 4214580, + 4215332, + 4215626, + 4218374, + 4224340, + 4220521, + 4228419, + 4231295, + 4218798, + 4235067, + 4215609, + 2247956, + 2121573, + 2120172, + 4217324, + 4229717, + 2121369, + 4224453, + 4217446, + 4220279, + 4222318, + 4230304, + 6327456, + 4220685, + 4229510, + 4214297, + 4218467, + 4218483, + 4218634, + 4228369, + 4214863, + 4226536, + 4231124, + 4231245, + 4226111, + 4215557, + 4218153, + 4219569, + 4220683, + 4225074, + 4226603, + 4227294, + 4228108, + 4231334, + 6328486, + 4233469, + 4234604, + 4214433, + 4218429, + 4218840, + 4218841, + 4219455, + 4220699, + 6317851, + 4215186, + 4220009, + 4227067, + 4215265, + 4225256, + 4234068, + 4234939, + 4221401, + 6318173, + 2110568, + 2138036, + 4226669, + 4234943, + 6324488, + 4220430, + 4224735, + 4231159, + 4217220, + 2118352, + 4224754, + 4227095, + 4219451, + 4226315, + 2135528, + 4226308, + 4230797, + 2275209, + 6318202, + 2123777, + 4219145, + 2132717, + 4230968, + 4215495, + 4220681, + 4223798, + 6320950, + 6320951, + 2250367, + 4231242, + 4220636, + 2129802, + 4229505, + 4233482, + 4227020, + 6324220, + 2133686, + 4228653, + 4223879, + 4235149, + 6332301, + 4220357, + 2138052, + 4223440, + 6330019, + 4234327, + 6332063, + 2129019, + 2121417, + 4219280, + 2134051, + 8414999, + 2129922, + 2254512, + 6312138, + 4215066, + 6312276, + 6312341, + 2229800, + 4215437, + 4215511, + 2228362, + 2230660, + 2110782, + 4215775, + 4220668, + 6313267, + 6313444, + 2118741, + 4216512, + 2119993, + 4217372, + 4217538, + 2120566, + 4217795, + 2120724, + 2111458, + 2120934, + 4218452, + 2117192, + 4218595, + 6316183, + 2122452, + 4219596, + 4219932, + 4219846, + 4219944, + 2255257, + 2122523, + 6317663, + 8414815, + 2123363, + 4220661, + 2241484, + 4221085, + 4221069, + 2124278, + 2124166, + 2271718, + 4217832, + 4221371, + 2124748, + 6319889, + 2125335, + 4222872, + 4222122, + 2124970, + 4223003, + 4223330, + 4223547, + 2117164, + 4223772, + 4224202, + 2127087, + 2127221, + 2127340, + 2127438, + 2113457, + 2127722, + 2127785, + 4225344, + 2138054, + 6322515, + 4235083, + 4225454, + 4231299, + 2128723, + 2275261, + 4226068, + 2114148, + 4226128, + 4226136, + 4226374, + 4226403, + 4226594, + 6323746, + 2129480, + 6323765, + 4226627, + 4226700, + 2286200, + 2229567, + 2253418, + 4350576, + 4227013, + 4227014, + 6324201, + 2130241, + 2114643, + 4227672, + 2130553, + 6324857, + 4227705, + 4227811, + 2118009, + 2130778, + 4228128, + 4228029, + 4228340, + 2114853, + 4228487, + 2131444, + 2228400, + 4228919, + 4228923, + 4229125, + 4229053, + 2131581, + 6326326, + 2110510, + 2132166, + 4229565, + 4229851, + 4229950, + 4229978, + 4230515, + 4230553, + 2115558, + 4230708, + 2287338, + 4231151, + 4231303, + 4231162, + 4231198, + 4231221, + 4231248, + 2133960, + 4231297, + 4231306, + 6328458, + 8425610, + 10522762, + 12619914, + 14717066, + 6328457, + 8425609, + 10522761, + 12619913, + 14717065, + 16814217, + 18911369, + 21008521, + 23105673, + 25202825, + 27299977, + 29397129, + 2263431, + 4232157, + 4232636, + 2264599, + 4232882, + 4233049, + 2136121, + 4233451, + 4233475, + 4233481, + 4233541, + 6330693, + 4233547, + 2136584, + 4233823, + 4233829, + 4233967, + 4234008, + 2137055, + 4234505, + 4234504, + 4234917, + 4234956, + 6332168, + 4235082, + 2275354, + 4235111, + 4367898, + 4342510, + 2245358, + 4229404, + 4221128, + 4220667, + 4218693, + 4215552, + 2118537, + 4217171, + 2161169, + 2123858, + 4221555, + 2243774, + 2229777, + 4229650, + 2117124, + 2117125, + 2117151, + 2117163, + 2117167, + 2117168, + 2117184, + 2117185, + 2117188, + 2117210, + 2117247, + 2117261, + 2117270, + 2117305, + 2117328, + 2117344, + 2117373, + 2117375, + 2117387, + 2117397, + 2117472, + 2117435, + 2117449, + 2117460, + 2117498, + 2117501, + 2117502, + 2117527, + 2117566, + 2117583, + 2117629, + 2117632, + 2117633, + 2117648, + 2117659, + 2117671, + 2117678, + 2117719, + 2117734, + 2117738, + 2117691, + 2117775, + 2117782, + 2117788, + 2117836, + 2117862, + 2117865, + 2117871, + 2117896, + 2117899, + 2117904, + 2117915, + 2117918, + 2117983, + 2118049, + 2118076, + 6312414, + 2118126, + 2118132, + 2118145, + 2118146, + 2118163, + 2118217, + 2118241, + 2118246, + 2118291, + 2118344, + 2118384, + 2118410, + 2118411, + 2118462, + 2118476, + 2118475, + 2118497, + 2118508, + 2118571, + 2118618, + 2118630, + 2118645, + 2118695, + 2118733, + 2118758, + 2118763, + 2118772, + 2118797, + 2118806, + 2118817, + 2118829, + 2118841, + 2118847, + 2118854, + 2118861, + 2118926, + 2118955, + 2118965, + 2118986, + 2119008, + 4216161, + 2119048, + 2119054, + 2119176, + 2119182, + 2119183, + 2119223, + 2119231, + 2119241, + 2119243, + 2119247, + 2119270, + 2119273, + 2119279, + 2119281, + 2119282, + 2119317, + 2119322, + 2119340, + 2119341, + 2119345, + 2119369, + 2119389, + 2119396, + 2119434, + 2119445, + 2119459, + 2119471, + 2119475, + 2119476, + 2119500, + 2119536, + 2119564, + 2119580, + 2119608, + 2119654, + 2119661, + 2119669, + 2119670, + 2119679, + 2119689, + 2119712, + 2119730, + 2119804, + 2119808, + 2119849, + 2119886, + 2119888, + 2119892, + 2119898, + 2119913, + 2119948, + 2119972, + 2119983, + 2120033, + 2120045, + 2120138, + 2120146, + 2120157, + 2120163, + 2120164, + 2120196, + 2120204, + 2120227, + 2120263, + 2120277, + 2120291, + 2120301, + 2120318, + 2120350, + 2120359, + 2120364, + 2120371, + 2120416, + 2120448, + 2120473, + 2120485, + 2120493, + 2120513, + 2120572, + 2120574, + 2120575, + 2120586, + 2120739, + 2120747, + 2120752, + 2120803, + 2120809, + 2120828, + 2120907, + 2120914, + 2120948, + 2120996, + 2120998, + 2121027, + 2121030, + 2121034, + 2121106, + 2121108, + 2121113, + 2121120, + 2121176, + 2121184, + 2121208, + 2121216, + 2121234, + 2121236, + 2121237, + 2121240, + 2121262, + 2121304, + 2121323, + 2121324, + 2121384, + 2121386, + 2121406, + 2121407, + 4218571, + 2121426, + 2121479, + 2121486, + 2121500, + 2121501, + 2121506, + 2121512, + 2121526, + 2121531, + 2121536, + 2121552, + 2121560, + 2121572, + 2121609, + 2121628, + 2121639, + 2121636, + 2121647, + 2121656, + 2121668, + 2121673, + 2121697, + 2121705, + 2121709, + 2121724, + 2121751, + 2121754, + 2121779, + 2121825, + 2121855, + 2121886, + 2121892, + 2121904, + 2121931, + 2121947, + 2121976, + 2122002, + 2122003, + 2122004, + 2122012, + 2122108, + 2122125, + 2122143, + 2122152, + 2122178, + 2122207, + 2122261, + 2122281, + 2122307, + 2122310, + 2122316, + 2122321, + 2122326, + 2122436, + 2122492, + 2122506, + 2122509, + 2122520, + 2122553, + 2122562, + 2122563, + 2122597, + 2122612, + 2122621, + 2122628, + 2122631, + 2122640, + 2122654, + 2122705, + 2122716, + 2122761, + 2122768, + 2122786, + 2122836, + 2122843, + 2122861, + 2122875, + 2122942, + 2122943, + 2122981, + 2122999, + 2123003, + 2123012, + 2123030, + 2123033, + 2123079, + 2123111, + 2123137, + 2123141, + 2123202, + 2123248, + 2123250, + 2123308, + 2123340, + 2123355, + 2123356, + 2123361, + 2123371, + 4220535, + 2123428, + 2123464, + 2123500, + 2123525, + 2123539, + 2123571, + 2123592, + 2123596, + 2123638, + 2123643, + 2123696, + 2123698, + 2123769, + 2123735, + 2123737, + 2123760, + 2123820, + 2123824, + 2123825, + 2123867, + 2123890, + 2123893, + 2123898, + 2123908, + 2123941, + 2123954, + 2123984, + 2123990, + 2124008, + 2124013, + 2124016, + 2124017, + 2124028, + 2124049, + 2124051, + 2124085, + 2124091, + 2124119, + 2124131, + 2124146, + 2124159, + 2124160, + 2124198, + 2124205, + 2124215, + 2124246, + 2124247, + 2124289, + 2124303, + 2124309, + 2124328, + 2124340, + 2124350, + 2124357, + 2124368, + 2124369, + 2124374, + 2124379, + 2124419, + 2124425, + 2124433, + 2124445, + 2124446, + 2124447, + 2124508, + 2124519, + 2124524, + 2124574, + 2124580, + 2124597, + 2124614, + 2124630, + 2124640, + 2124674, + 2124734, + 2124769, + 2124785, + 2124816, + 2124851, + 2124853, + 4222010, + 2124889, + 2124918, + 2124923, + 2124933, + 2124949, + 2124956, + 2125008, + 2125012, + 2125014, + 2125024, + 2125035, + 2125036, + 2125038, + 2125066, + 2125070, + 2125073, + 2125102, + 2125143, + 2125150, + 2125157, + 2125186, + 2125247, + 2125252, + 2125258, + 2125270, + 2125289, + 2125346, + 2125393, + 2125511, + 2125514, + 2125518, + 2125565, + 2125594, + 2125610, + 2125615, + 2125619, + 2125658, + 2125662, + 2125666, + 2125693, + 2125707, + 2125709, + 2125714, + 2125716, + 2125722, + 2125735, + 2125736, + 2125750, + 2125786, + 2125790, + 4222969, + 2125881, + 2125884, + 4223050, + 2125908, + 2125917, + 2125918, + 2125924, + 2125932, + 2125950, + 2125953, + 2125973, + 2126007, + 2126035, + 2126036, + 2126040, + 2126044, + 2126087, + 2126112, + 2126129, + 2126154, + 2126162, + 2126176, + 2126201, + 2126226, + 4223411, + 2126283, + 2126291, + 2126294, + 2126336, + 2126365, + 2126379, + 2126392, + 2126401, + 2126419, + 2126421, + 2126422, + 2126428, + 2126477, + 2126509, + 2126516, + 2126535, + 2126587, + 2126596, + 2126597, + 2126632, + 2126641, + 2126659, + 2126700, + 2126716, + 2126723, + 2126725, + 2126726, + 2126741, + 2126750, + 2126751, + 2126752, + 2126758, + 2126763, + 2126773, + 2126775, + 2126780, + 2126799, + 2126809, + 2126825, + 2126836, + 2126845, + 2126852, + 2126858, + 2126874, + 2126875, + 2126884, + 2126888, + 2126892, + 2126895, + 2126896, + 2126897, + 2126905, + 2126916, + 2126919, + 2126923, + 2126925, + 2126929, + 2126935, + 2126950, + 2126955, + 2126961, + 2126976, + 2126981, + 2126982, + 2126983, + 2126992, + 2127000, + 2127004, + 2127008, + 2127011, + 2127016, + 2127019, + 2127029, + 2127039, + 2127048, + 2127066, + 2127070, + 2127182, + 2127225, + 2127233, + 2127248, + 2127250, + 2127251, + 2127284, + 2127332, + 2127353, + 2127360, + 2127370, + 2127381, + 2127382, + 2127385, + 2127390, + 2127405, + 2127413, + 2127427, + 2127435, + 2127461, + 2127469, + 2127471, + 2127473, + 2127476, + 2127524, + 2127525, + 2127557, + 2127564, + 2127596, + 2127612, + 2127668, + 2127670, + 2127708, + 2127711, + 2127712, + 2127730, + 2127741, + 2127765, + 2127786, + 2127846, + 2127856, + 2127860, + 2127878, + 2127906, + 2127917, + 2127918, + 2127920, + 2127925, + 2127976, + 2128030, + 2128072, + 2128076, + 2128078, + 2128100, + 2128096, + 2128097, + 2128114, + 2128119, + 2128123, + 2128177, + 4225332, + 2128187, + 2128189, + 2128197, + 2128219, + 2128220, + 2128267, + 2128278, + 2128280, + 2128312, + 2128315, + 2128330, + 2128346, + 2128387, + 2128393, + 2128401, + 2128414, + 2128429, + 2128441, + 2128453, + 2128460, + 2128477, + 4225632, + 2128493, + 2128504, + 2128544, + 2128547, + 2128563, + 2128571, + 2128572, + 2128582, + 2128647, + 2128660, + 2128679, + 2128689, + 2128711, + 2128718, + 2128736, + 2128745, + 2128749, + 2128754, + 2128785, + 2128815, + 2128855, + 2128857, + 2128907, + 2128911, + 2128928, + 2128934, + 2128945, + 2128950, + 2128977, + 2128985, + 2128999, + 2129006, + 2129008, + 2129084, + 2129087, + 2129096, + 2129097, + 2129111, + 2129113, + 2129117, + 2129131, + 2129159, + 2129160, + 2129161, + 2129171, + 2129181, + 2129187, + 2129217, + 2129235, + 2129241, + 2129245, + 2129274, + 2129286, + 2129291, + 2129292, + 2129356, + 2129387, + 2129393, + 2129401, + 2129416, + 2129425, + 2129429, + 2129440, + 2129479, + 2129506, + 2129518, + 2129523, + 2129549, + 2129553, + 2129560, + 2129732, + 2129743, + 2129746, + 2129747, + 2129761, + 2129809, + 2129855, + 2129870, + 2129887, + 2129893, + 2129900, + 2129902, + 2129903, + 2129914, + 2129934, + 2129937, + 2129940, + 2129956, + 2129958, + 2129978, + 2129980, + 2130016, + 2130033, + 2130037, + 2130078, + 2130086, + 2130091, + 2130135, + 2130136, + 2130198, + 2130200, + 2130234, + 2130250, + 2130252, + 2130305, + 2130308, + 2130356, + 2130383, + 2130425, + 2130435, + 2130465, + 2130482, + 2130484, + 2130502, + 2130507, + 2130511, + 2130574, + 2130606, + 2130615, + 2130622, + 2130630, + 2130686, + 2130755, + 2130769, + 2130773, + 2130822, + 2130829, + 2130834, + 2130840, + 2130857, + 2130879, + 2130880, + 2130922, + 2130959, + 2130961, + 2131018, + 2131062, + 2131112, + 2131119, + 2131136, + 2131138, + 2131184, + 2131197, + 2131212, + 2131252, + 2131294, + 2131343, + 2131383, + 2131406, + 2131373, + 2131474, + 2131497, + 2131538, + 2131555, + 2131564, + 2131567, + 2131578, + 2131597, + 2131601, + 2131608, + 2131623, + 2131624, + 2131706, + 2131709, + 2131723, + 2131731, + 2131737, + 2131742, + 2131752, + 2131774, + 2131825, + 2131848, + 2131865, + 2131884, + 2131885, + 2131893, + 2131926, + 2131947, + 2131949, + 2131969, + 4229123, + 2131974, + 2131979, + 2131988, + 2131996, + 2132054, + 2132063, + 2132068, + 2132120, + 2132138, + 2132157, + 2132158, + 2132170, + 2132178, + 2132187, + 2132208, + 2132209, + 2132230, + 2132248, + 2132249, + 2132250, + 2132263, + 2132272, + 2132286, + 2132347, + 2132436, + 2132438, + 2132453, + 2132465, + 2132487, + 2132495, + 2132501, + 2132514, + 2132558, + 2132607, + 2132724, + 2132767, + 2132791, + 2132803, + 2132804, + 2132820, + 2132892, + 2132894, + 2133063, + 2133076, + 2133107, + 2133156, + 2133209, + 2133217, + 2133240, + 2133246, + 2133275, + 2133353, + 2133356, + 2133380, + 2133389, + 2133397, + 2133414, + 2133446, + 2133454, + 2133476, + 2133484, + 2133536, + 2133579, + 2133612, + 2133616, + 2133626, + 2133650, + 2133678, + 2133683, + 2133713, + 4230868, + 2133753, + 2133783, + 2133814, + 2133926, + 2133941, + 2133942, + 4231110, + 2133984, + 2133988, + 2134006, + 2134018, + 2134060, + 2134084, + 2134152, + 2134165, + 2134169, + 2134171, + 2134178, + 2134196, + 2134231, + 2134237, + 2134260, + 2134295, + 2134300, + 2134321, + 2134330, + 2134333, + 2134344, + 2134363, + 2134369, + 2134372, + 2134414, + 2134430, + 2134440, + 2134445, + 2134446, + 2134450, + 2134460, + 2134512, + 2134519, + 2134523, + 2134535, + 2134568, + 2134579, + 2134584, + 2134595, + 2134599, + 2134607, + 2134624, + 2134722, + 2134731, + 2134732, + 2134751, + 2134797, + 2134805, + 2134815, + 2134823, + 2134855, + 2134866, + 4232037, + 2134890, + 2134893, + 2134939, + 2134970, + 2134953, + 2134977, + 2134986, + 2135010, + 2135034, + 2135037, + 2135055, + 2135092, + 2135103, + 2135125, + 2135147, + 2135154, + 2135416, + 2135462, + 2135465, + 4232619, + 2135476, + 2135485, + 2135514, + 2135581, + 2135617, + 2135640, + 2135684, + 2135716, + 2135721, + 2135762, + 2121138, + 2135774, + 2135785, + 2135793, + 2135810, + 2135817, + 2135898, + 2135907, + 2135918, + 2135923, + 2135962, + 2135970, + 2135989, + 2135990, + 2136025, + 2136030, + 2136052, + 2136074, + 2136078, + 2136094, + 2136099, + 2136107, + 2136126, + 2136146, + 2136147, + 2136153, + 2136172, + 2136248, + 2136250, + 2136255, + 2136264, + 2136293, + 2136370, + 2136371, + 2136384, + 2136397, + 2136412, + 2136415, + 2136497, + 2136505, + 2136506, + 2136521, + 2136578, + 2136598, + 2136612, + 2136615, + 2136621, + 2136622, + 2136630, + 2136632, + 2136650, + 2136662, + 2136757, + 2136758, + 2136825, + 2136835, + 2136864, + 2136883, + 2136884, + 2136947, + 2136953, + 2136999, + 2137025, + 2137031, + 2137047, + 2137063, + 2137067, + 2137079, + 2137082, + 2137085, + 2137099, + 2137127, + 2137130, + 2137142, + 2137153, + 2137171, + 2137187, + 2137200, + 2137207, + 2137346, + 2137410, + 2137415, + 2137443, + 2137449, + 2137468, + 2137470, + 2137485, + 2137521, + 2137539, + 2137543, + 2137558, + 2137567, + 2137579, + 2137588, + 2137621, + 2137629, + 2137764, + 2137768, + 2137772, + 2137831, + 2137838, + 2137872, + 2137874, + 2137879, + 2137881, + 2137903, + 2137911, + 2137913, + 2137921, + 2137925, + 2137943, + 2137960, + 2137969, + 2137973, + 2138000, + 2138004, + 2138018, + 4214320, + 2110469, + 4214624, + 2119200, + 2121419, + 4218704, + 4219044, + 2242106, + 4221732, + 2125817, + 2125542, + 2126259, + 4223531, + 4225734, + 4226913, + 4227185, + 4227230, + 4231094, + 4231676, + 4218290, + 4233182, + 2117587, + 2117849, + 2117872, + 2118083, + 2119286, + 2124372, + 2125057, + 2125264, + 2125378, + 2125529, + 2126820, + 2126881, + 2127212, + 2127953, + 2131957, + 2241534, + 2126760, + 2112243, + 2110683, + 2114572, + 2113162, + 4339140, + 2138045, + 2116584, + 2138044, + 2113242, + 2112290, + 2138046, + 2114938, + 2113683, + 4365885, + 2115173, + 2113795, + 2114195, + 2115246, + 2110600, + 2237961, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 2117448, + 2117471, + 2117482, + 2117484, + 2117646, + 2117656, + 2117697, + 2117874, + 2117840, + 2117894, + 2117891, + 2117941, + 2117973, + 2117975, + 2110645, + 2118090, + 2118114, + 2118231, + 2118348, + 2118358, + 2118395, + 2118428, + 2118499, + 2118557, + 2118674, + 2118783, + 2118792, + 2118992, + 2119041, + 2119085, + 2119118, + 2119227, + 2119326, + 2119337, + 2119347, + 2119543, + 2119548, + 2233115, + 2119631, + 2119652, + 2119780, + 2119817, + 2233454, + 2119890, + 2119904, + 2131521, + 2120075, + 2120082, + 2120131, + 2120211, + 2120295, + 2120311, + 2120324, + 2120388, + 2234557, + 2120573, + 2120595, + 2120722, + 2120814, + 2234036, + 2120826, + 2120847, + 2120863, + 2120867, + 2120874, + 2120912, + 2235956, + 2120973, + 2121031, + 2121089, + 2121124, + 2121127, + 2121163, + 2121310, + 2121465, + 2121472, + 2121474, + 2121507, + 2121533, + 2121556, + 2121597, + 2121741, + 2121748, + 2121752, + 2121781, + 2121799, + 2121885, + 2121940, + 2121949, + 2122027, + 2122172, + 2122169, + 2122274, + 2122330, + 2122351, + 2122454, + 2122620, + 2122725, + 2122873, + 2122948, + 2122960, + 2123049, + 2123165, + 2123322, + 2123298, + 2123307, + 2123312, + 2123315, + 2123336, + 2240964, + 2123383, + 2123384, + 2123405, + 2123451, + 2123483, + 2123496, + 2123591, + 2123649, + 2123667, + 2123672, + 2123675, + 2123772, + 2123805, + 2123939, + 2124042, + 2124105, + 2241988, + 2124098, + 2124132, + 2124197, + 2124239, + 2112438, + 2112451, + 2124265, + 2124277, + 2242367, + 2124347, + 2242403, + 2124436, + 2124453, + 2112527, + 2124571, + 2124588, + 2124647, + 2124713, + 2124717, + 2124759, + 2124799, + 2124805, + 2124916, + 2124952, + 2125051, + 2124998, + 2125105, + 2125113, + 2125119, + 2125144, + 2125204, + 2125226, + 2125275, + 2125277, + 2125380, + 2125406, + 2125489, + 2125505, + 2125584, + 2125657, + 2125665, + 2125694, + 2125708, + 2125728, + 2125756, + 2125767, + 2125770, + 2125808, + 2125902, + 2125941, + 2125988, + 2126052, + 2126123, + 2126110, + 2126126, + 2126161, + 2126184, + 2126213, + 2126215, + 2126266, + 2126276, + 2126357, + 2113087, + 2126491, + 2246641, + 2126631, + 2126672, + 2126694, + 2126754, + 2126891, + 2126918, + 2126946, + 2126957, + 2127014, + 2127017, + 2127049, + 2127103, + 2127127, + 2113394, + 2127310, + 2127362, + 2127368, + 2127460, + 2127489, + 2127517, + 2127530, + 2127542, + 2127566, + 2127572, + 2127590, + 2127601, + 2127626, + 2127641, + 2127693, + 2127694, + 2127738, + 2127744, + 2127764, + 2127840, + 2249870, + 2127939, + 2127982, + 2128048, + 2249998, + 2128045, + 2128128, + 2128156, + 2128174, + 2128180, + 2128198, + 2128249, + 2128328, + 2250609, + 2128340, + 2128350, + 2128363, + 2128365, + 2128517, + 2251204, + 2128590, + 2128637, + 2128658, + 2128685, + 2128699, + 2128751, + 2128897, + 2128947, + 2252193, + 2129005, + 2129017, + 2129039, + 2129044, + 2129056, + 2129109, + 2129201, + 2129244, + 2129283, + 2129318, + 2129346, + 2129448, + 2129815, + 2129883, + 2129973, + 2129975, + 2130122, + 2130144, + 2130163, + 2130272, + 2130279, + 2130280, + 2130285, + 2130363, + 2130378, + 2130391, + 2114651, + 2130528, + 2130548, + 2255615, + 2130593, + 2130595, + 2130596, + 2130601, + 2130623, + 2130645, + 2130685, + 2130688, + 2130722, + 2130733, + 2130746, + 2130759, + 2130813, + 2130855, + 2130895, + 2130897, + 2130913, + 2130945, + 2130950, + 2131039, + 2131056, + 2131059, + 2131077, + 2131102, + 2131130, + 2256448, + 2131250, + 2131230, + 2131247, + 2131300, + 2131322, + 2131340, + 2131362, + 2131403, + 2131437, + 2131455, + 2131460, + 2131461, + 2131472, + 2257140, + 2131480, + 2131512, + 2131543, + 2131554, + 2114973, + 2131573, + 2131640, + 2131708, + 2131847, + 2115050, + 2131978, + 2131984, + 2132174, + 2258564, + 2132274, + 2132281, + 2132288, + 2132372, + 2132470, + 2132551, + 2132573, + 2132577, + 2132597, + 2132688, + 2132806, + 2132825, + 2132841, + 2132893, + 2133065, + 2133096, + 2133423, + 2133457, + 2133463, + 2133539, + 2133565, + 2133627, + 2261623, + 2115652, + 2133754, + 2133790, + 2133805, + 2133844, + 2261965, + 2133992, + 2133998, + 2134024, + 2134061, + 2134167, + 2134195, + 2134206, + 2134212, + 2134213, + 2134215, + 2134255, + 2134292, + 2134294, + 2134306, + 2134307, + 2134319, + 2134324, + 2134403, + 2134513, + 2134857, + 2134884, + 2134885, + 2134947, + 2135007, + 2135044, + 2135091, + 2135114, + 2135139, + 2135153, + 2135438, + 2135455, + 2135468, + 2135478, + 2135499, + 2135504, + 2135507, + 2116016, + 2135518, + 2135717, + 2135791, + 2135886, + 2135957, + 2135982, + 2135994, + 2136001, + 2136009, + 2136027, + 2136150, + 2136295, + 2136408, + 2136579, + 2136769, + 2136771, + 2136782, + 2136790, + 2136834, + 2136840, + 2116631, + 2136877, + 2136926, + 2136934, + 2136964, + 2136970, + 2136990, + 2137038, + 2137061, + 2137080, + 2137123, + 2137167, + 2137168, + 2137189, + 2137373, + 2137374, + 2137411, + 2137426, + 2137482, + 2137494, + 2137536, + 2137516, + 2137532, + 2269584, + 2137575, + 2137607, + 2137758, + 2137775, + 2138007, + 2228361, + 2117122, + 2117135, + 2117138, + 2117161, + 2117166, + 2117191, + 2228386, + 2117201, + 2110470, + 2228388, + 2117225, + 2117277, + 2110508, + 2117308, + 2117315, + 2117320, + 2117355, + 2117338, + 2117361, + 2117365, + 2117398, + 2117476, + 2117431, + 2117438, + 2117464, + 2228755, + 2117495, + 2117496, + 2117506, + 2117509, + 2117606, + 2117554, + 2117573, + 2117579, + 2117586, + 2110570, + 2117618, + 2117651, + 2117660, + 2117710, + 2117715, + 2117731, + 2117795, + 2117768, + 2117778, + 2117779, + 2117781, + 2117802, + 2229035, + 2117809, + 2117818, + 2117819, + 2117828, + 2117831, + 2117875, + 2229121, + 2117838, + 2229105, + 2117844, + 2117857, + 2110610, + 2229241, + 2117911, + 2229322, + 2117984, + 2229513, + 2118003, + 2118019, + 2118027, + 2110652, + 2118040, + 2118051, + 2118061, + 2110663, + 2229718, + 2118131, + 2118162, + 2118166, + 2230095, + 2118229, + 2118236, + 2118252, + 2118263, + 2118276, + 2118274, + 2230279, + 2118296, + 2230330, + 2118308, + 2118330, + 2118331, + 2118346, + 2118353, + 2230457, + 2118391, + 2118453, + 2118466, + 2230652, + 2230685, + 2118503, + 2118522, + 2118564, + 2118580, + 2230995, + 2118583, + 2118592, + 2231069, + 2110813, + 2110814, + 2118613, + 2110819, + 2118644, + 2118692, + 2118696, + 2110830, + 2118723, + 2118754, + 2118764, + 2118805, + 2118816, + 2118822, + 2118830, + 2118839, + 2118842, + 2118851, + 2231621, + 2118892, + 2118895, + 2118897, + 2118899, + 2118912, + 2118913, + 2118921, + 2118972, + 2118977, + 2110886, + 2118983, + 2110888, + 2119012, + 2231777, + 2119037, + 2119042, + 2119057, + 2110917, + 2119122, + 2231957, + 2231917, + 2119103, + 2119113, + 2119116, + 2119121, + 2119133, + 2110938, + 2119138, + 2231908, + 2119145, + 2119208, + 2232159, + 2119175, + 2119184, + 2119216, + 2110964, + 2119229, + 2119232, + 2119239, + 2119262, + 2119264, + 2119277, + 2110981, + 2119304, + 2119308, + 2119325, + 2119336, + 2119346, + 2119365, + 2119373, + 2119391, + 2119400, + 2119414, + 2119415, + 2232833, + 2232917, + 2119465, + 2232955, + 2119493, + 2119494, + 2119501, + 2232948, + 2119528, + 2119535, + 2119539, + 2119540, + 2119541, + 2119547, + 2233060, + 2233047, + 2119578, + 2119581, + 2119582, + 2119592, + 2119639, + 2233085, + 2119628, + 2233142, + 2233156, + 2119646, + 2119664, + 2111050, + 2119672, + 2119675, + 2119677, + 2119684, + 2119710, + 2119719, + 2119737, + 2233284, + 2119753, + 2119756, + 2119783, + 2119818, + 2119819, + 2119821, + 2119823, + 2119824, + 2119828, + 2119837, + 2119850, + 2119857, + 2233453, + 2119875, + 2119885, + 2119906, + 2119923, + 2119924, + 2119941, + 2119942, + 2119949, + 2119956, + 2233815, + 2111121, + 2119997, + 2111129, + 2120006, + 2111126, + 2255913, + 2120031, + 2233927, + 2120053, + 2120054, + 2120060, + 2120095, + 2120110, + 2120124, + 2120136, + 2120141, + 2120158, + 2120167, + 2120174, + 2234118, + 2234178, + 2111183, + 2120205, + 2120215, + 2120231, + 2120237, + 2120293, + 2120314, + 2120331, + 2120348, + 2120351, + 2120352, + 2120354, + 2120369, + 2120373, + 2120378, + 2120383, + 2120410, + 2120412, + 2120421, + 2120432, + 2120430, + 2120437, + 2120456, + 2120471, + 2120500, + 2120524, + 2120530, + 2120552, + 2120559, + 2120577, + 2120580, + 2234819, + 2120598, + 2120620, + 2111329, + 2111330, + 2120654, + 2120662, + 2111340, + 2111339, + 2120689, + 2120701, + 2111349, + 2120707, + 2120745, + 2235478, + 2120799, + 2120807, + 2120808, + 2120816, + 2235693, + 2235717, + 2235768, + 2235746, + 2120840, + 2120842, + 2111425, + 2235809, + 2235804, + 2120864, + 2120866, + 2120871, + 2235794, + 2120877, + 2120885, + 2235831, + 2120905, + 2235872, + 2235955, + 2120966, + 2120976, + 2121003, + 2120989, + 2120992, + 2121009, + 2121017, + 2111464, + 2121057, + 2121066, + 2111476, + 2121072, + 2236190, + 2111485, + 2121096, + 2111488, + 2121111, + 2121136, + 2121140, + 2236278, + 2121169, + 2121175, + 2236410, + 2121188, + 2121193, + 2111535, + 2111542, + 2111552, + 2121247, + 2121278, + 2121289, + 2111580, + 2121302, + 2111585, + 2121325, + 2121326, + 2236795, + 2121381, + 2121388, + 2121401, + 2121414, + 2121433, + 2237214, + 2121469, + 2121480, + 2237357, + 2121502, + 2121543, + 2121571, + 2121586, + 2121598, + 2121615, + 2121634, + 2121671, + 2121675, + 2121682, + 2121683, + 2121684, + 2121698, + 2121710, + 2121711, + 2121715, + 2111767, + 2121762, + 2121764, + 2111770, + 2121804, + 2121877, + 2121896, + 2238195, + 2121905, + 2121918, + 2121928, + 2121945, + 2121966, + 2121973, + 2122000, + 2122009, + 2122014, + 2122042, + 2111855, + 2122049, + 2122054, + 2122080, + 2238555, + 2122130, + 2122131, + 2122135, + 2122149, + 2122157, + 2238635, + 2122197, + 2122205, + 2122229, + 2238863, + 2122275, + 2122322, + 2122337, + 2122340, + 2122363, + 2122349, + 2122355, + 2122393, + 2122453, + 2239160, + 2122493, + 2122499, + 2122512, + 2239311, + 2239312, + 2122546, + 2122549, + 2122555, + 2122556, + 2122561, + 2122564, + 2122574, + 2239302, + 2122585, + 2239517, + 2239398, + 2122604, + 2122649, + 2239524, + 2122644, + 2122685, + 2122708, + 2122709, + 2122720, + 2122731, + 2122732, + 2122738, + 2122782, + 2122789, + 2122793, + 2122799, + 2122842, + 2122845, + 2122867, + 2122877, + 2122887, + 2122897, + 2122911, + 2122955, + 2122956, + 2122965, + 2122967, + 2239969, + 2122980, + 2123007, + 2112110, + 2123023, + 2123028, + 2112115, + 2123038, + 2123058, + 2123076, + 2123092, + 2123115, + 2123130, + 2123140, + 2123146, + 2123186, + 2123189, + 2123192, + 2123199, + 2123209, + 2123220, + 2112214, + 2123257, + 2123260, + 2123268, + 2123272, + 2123297, + 2123306, + 2123333, + 2123345, + 2123342, + 2112234, + 2240963, + 2241013, + 2240950, + 2123370, + 2123372, + 2123373, + 2123387, + 2123392, + 2123408, + 2123410, + 2112270, + 2123437, + 2123441, + 2123445, + 2112282, + 2112284, + 2112215, + 2123521, + 2123538, + 2241394, + 2123545, + 2241491, + 2241490, + 2123597, + 2123604, + 2123613, + 2241488, + 2241508, + 2241493, + 2123636, + 2241498, + 2123666, + 2241503, + 2130787, + 2123792, + 2123715, + 2123720, + 2123730, + 2123739, + 2123767, + 2241610, + 2241617, + 2241611, + 2123800, + 2123807, + 2123821, + 2241637, + 2123827, + 2123835, + 2123838, + 2123845, + 2123849, + 2123852, + 2123861, + 2123863, + 2112375, + 2123883, + 2123886, + 2123900, + 2123906, + 2123920, + 2123926, + 2112365, + 2123928, + 2123929, + 2123930, + 2123932, + 2123946, + 2123947, + 2123956, + 2123963, + 2124027, + 2241764, + 2241882, + 2123971, + 2123973, + 2123980, + 2123993, + 2124004, + 2124005, + 2124012, + 2124023, + 2124035, + 2124039, + 2112391, + 2241940, + 2112397, + 2124102, + 2124137, + 2124140, + 2124154, + 2124178, + 2112420, + 2124182, + 2124208, + 2124218, + 2124220, + 2124224, + 2124241, + 2242105, + 2242119, + 2242104, + 2124259, + 2124270, + 2124271, + 2124275, + 2112461, + 2124276, + 2124286, + 2124305, + 2124314, + 2124317, + 2242332, + 2124338, + 2124339, + 2124351, + 2124361, + 2124410, + 2124366, + 2124370, + 2124388, + 2242316, + 2124427, + 2112496, + 2124449, + 2242404, + 2124459, + 2124477, + 2124486, + 2124500, + 2124496, + 2124509, + 2242559, + 2242535, + 2124529, + 2124530, + 2124531, + 2124541, + 2242596, + 2124555, + 2124559, + 2124560, + 2124561, + 2242621, + 2124567, + 2112550, + 2124591, + 2124618, + 2124632, + 2124652, + 2124661, + 2124666, + 2124673, + 2124699, + 2124718, + 2243224, + 2124733, + 2124743, + 2124744, + 2124745, + 2124762, + 2124774, + 2124775, + 2124782, + 2124802, + 2124810, + 2124814, + 2124854, + 2243711, + 2124877, + 2124891, + 2124909, + 2124932, + 2124937, + 2112707, + 2124948, + 2124951, + 2124973, + 2124994, + 2112722, + 2125020, + 2125033, + 2125037, + 2243840, + 2125056, + 2125092, + 2125094, + 2125095, + 2124903, + 2125103, + 2125116, + 2125147, + 2125152, + 2125168, + 2125184, + 2125185, + 2125194, + 2125197, + 2125201, + 2125208, + 2243904, + 2244090, + 2244089, + 2244051, + 2125227, + 2125230, + 2125236, + 2125250, + 2125108, + 2125256, + 2125262, + 2125279, + 2125302, + 2125366, + 2125342, + 2112785, + 2125362, + 2125384, + 2125385, + 2125387, + 2125388, + 2125391, + 2125395, + 2125396, + 2125399, + 2125411, + 2112798, + 2125459, + 2125479, + 2125492, + 2125507, + 2125621, + 2125547, + 2125561, + 2125563, + 2125578, + 2125580, + 2125592, + 2125605, + 2125622, + 2125628, + 2244478, + 2125650, + 2125655, + 2125664, + 2125672, + 2125712, + 2125718, + 2125758, + 2125727, + 2125733, + 2125743, + 2112868, + 2125768, + 2125769, + 2125801, + 2244758, + 2125820, + 2125824, + 2125834, + 2125859, + 2244867, + 2125882, + 2125891, + 2125895, + 2125899, + 2112922, + 2125925, + 2125929, + 2125934, + 2125942, + 2125958, + 2125975, + 2245062, + 2125983, + 2126001, + 2245118, + 2126060, + 2126026, + 2126033, + 2126083, + 2126086, + 2126088, + 2126092, + 2112960, + 2126127, + 2126160, + 2126163, + 2126174, + 2112980, + 2126230, + 2126208, + 2126235, + 2126240, + 2126242, + 2126254, + 2126255, + 2245564, + 2126297, + 2126300, + 2126343, + 2113029, + 2126388, + 2126393, + 2126402, + 2126423, + 2126435, + 2246185, + 2126446, + 2126447, + 2126456, + 2126463, + 2126478, + 2246309, + 2126510, + 2126512, + 2126529, + 2113120, + 2126540, + 2113126, + 2113128, + 2126579, + 2126586, + 2126599, + 2126610, + 2126616, + 2126617, + 2113155, + 2126649, + 2126636, + 2126643, + 2126653, + 2126674, + 2113172, + 2126699, + 2246806, + 2126702, + 2126703, + 2126705, + 2126721, + 2126730, + 2126740, + 2126744, + 2126748, + 2126757, + 2126777, + 2126783, + 2126789, + 2126795, + 2126817, + 2126823, + 2126841, + 2126867, + 2126842, + 2126849, + 2126931, + 2126912, + 2126915, + 2126930, + 2126941, + 2126977, + 2126984, + 2247245, + 2126994, + 2126999, + 2127001, + 2127009, + 2127013, + 2127018, + 2127033, + 2127035, + 2127034, + 2127062, + 2127064, + 2127083, + 2247510, + 2127098, + 2247535, + 2127136, + 2127140, + 2127146, + 2113367, + 2247702, + 2127165, + 2127166, + 2127168, + 2127176, + 2127184, + 2127186, + 2127218, + 2127217, + 2127226, + 2127229, + 2127230, + 2127244, + 2113397, + 2127266, + 2113399, + 2127280, + 2127287, + 2127295, + 2127296, + 2127302, + 2127311, + 2127315, + 2127325, + 2127327, + 2127328, + 2127335, + 2127342, + 2127345, + 2127363, + 2127384, + 2127367, + 2127375, + 2113454, + 2248206, + 2127379, + 2127387, + 2127388, + 2248247, + 2127397, + 2127400, + 2127420, + 2127411, + 2248298, + 2113481, + 2127425, + 2248331, + 2127433, + 2127445, + 2113495, + 2127470, + 2127509, + 2127521, + 2127520, + 2127527, + 2127528, + 2127535, + 2248778, + 2127561, + 2248789, + 2127592, + 2248994, + 2127639, + 2127642, + 2127661, + 2127669, + 2249129, + 2113593, + 2249189, + 2249165, + 2127704, + 2249246, + 2127740, + 2249292, + 2113624, + 2127770, + 2127775, + 2127778, + 2127780, + 2127838, + 2127839, + 2127844, + 2127850, + 2127852, + 2127867, + 2249774, + 2127877, + 2127881, + 2127885, + 2127897, + 2127916, + 2127943, + 2127978, + 2249945, + 2128010, + 2128020, + 2128036, + 2128029, + 2128031, + 2128059, + 2128085, + 2128102, + 2128121, + 2128122, + 2128126, + 2250151, + 2128144, + 2128155, + 2128165, + 2128202, + 2128216, + 2113797, + 2128231, + 2128242, + 2128277, + 2128289, + 2128297, + 2128308, + 2128322, + 2128327, + 2128332, + 2128333, + 2128342, + 2113864, + 2250665, + 2250676, + 2113871, + 2128394, + 2128405, + 2128411, + 2113891, + 2128440, + 2128455, + 2128470, + 2128473, + 2128476, + 2128479, + 2128487, + 2128490, + 2128501, + 2128514, + 2128522, + 2128528, + 2128556, + 2251220, + 2113972, + 2128569, + 2128574, + 2113983, + 2128588, + 2128616, + 2128628, + 2251492, + 2251491, + 2251505, + 2128701, + 2128682, + 2128686, + 2128687, + 2114022, + 2114035, + 2128767, + 2128705, + 2114030, + 2128725, + 2128761, + 2128740, + 2128742, + 2128755, + 2251698, + 2114055, + 2128784, + 2128795, + 2114062, + 2128821, + 2128828, + 2128837, + 2128842, + 2251851, + 2251876, + 2128852, + 2128854, + 2128858, + 2128874, + 2128880, + 2128899, + 2128910, + 2128965, + 2128970, + 2128983, + 2128990, + 2128993, + 2129001, + 2129007, + 2252334, + 2252374, + 2252389, + 2129062, + 2252386, + 2129078, + 2129079, + 2252504, + 2129092, + 2252482, + 2129101, + 2252520, + 2252579, + 2129126, + 2252636, + 2129141, + 2129155, + 2114246, + 2129170, + 2129182, + 2252768, + 2252756, + 2129213, + 2129214, + 2129216, + 2129223, + 2252812, + 2252795, + 2114262, + 2129242, + 2129258, + 2129264, + 2114269, + 2129279, + 2252823, + 2129288, + 2129303, + 2252896, + 2129309, + 2129319, + 2129322, + 2129334, + 2129344, + 2129367, + 2129369, + 2129382, + 2114306, + 2253037, + 4226569, + 2129424, + 2129431, + 2129437, + 2129447, + 2129452, + 2129477, + 2129525, + 2129534, + 2129542, + 2129543, + 2114347, + 2129562, + 2114371, + 2129724, + 2129723, + 2129726, + 2129731, + 2110657, + 2253424, + 2253446, + 2129763, + 2129764, + 2129773, + 2129789, + 2129790, + 2129808, + 2118011, + 2243854, + 2129814, + 2129820, + 2129837, + 2253826, + 2129859, + 2129871, + 2129891, + 2129906, + 2129930, + 2129928, + 2129942, + 2129964, + 2129968, + 2129987, + 2130022, + 2130043, + 2130073, + 2130076, + 2130084, + 2130087, + 2130104, + 2254462, + 2130117, + 2130133, + 2130150, + 2130189, + 2130165, + 2130171, + 2114542, + 2130229, + 2130206, + 2114544, + 2130212, + 2130215, + 2130220, + 2254621, + 2130237, + 2114568, + 2130281, + 2114583, + 2114588, + 2130309, + 2114594, + 2130328, + 2130354, + 2130369, + 2130371, + 2130390, + 2130395, + 2255069, + 2130404, + 2255082, + 2130412, + 2130429, + 2130431, + 2255215, + 2130436, + 2255325, + 2130457, + 2130466, + 2255390, + 2130492, + 2130505, + 2130501, + 2255448, + 2114678, + 2114682, + 2130519, + 2255500, + 2130524, + 2130531, + 2255543, + 2114705, + 2130557, + 2130559, + 2130563, + 2130570, + 2130579, + 2130599, + 2130600, + 2130610, + 2130612, + 2130618, + 2130620, + 2130658, + 2130664, + 2130679, + 2130695, + 2130696, + 2130700, + 2130772, + 2130715, + 2130717, + 2130736, + 2130748, + 2130756, + 2130775, + 2114750, + 2114772, + 2114739, + 2130836, + 2130837, + 2130843, + 2130845, + 2130889, + 2130896, + 2130900, + 2130909, + 2130917, + 2130937, + 2130965, + 2255987, + 2130967, + 2131001, + 2131023, + 2131025, + 2131026, + 2131033, + 2131034, + 2131036, + 2256093, + 2131045, + 2131064, + 2131068, + 2131073, + 2114829, + 2131095, + 2131110, + 2131134, + 2114824, + 2131150, + 2131151, + 2131155, + 2256485, + 2131175, + 2131178, + 2131183, + 2131185, + 2131194, + 2131227, + 2131236, + 2131237, + 2131243, + 2131279, + 2131311, + 2114883, + 2131281, + 2131297, + 2131298, + 2256788, + 2131323, + 2131325, + 2131327, + 2131329, + 2131334, + 2131347, + 2131357, + 2131359, + 2256888, + 2256886, + 2256887, + 2131388, + 2131399, + 2131402, + 2131416, + 2131417, + 2131423, + 2131425, + 2131430, + 2131446, + 2131456, + 2131473, + 2131486, + 2131489, + 2131492, + 2131495, + 2257165, + 2131513, + 2131516, + 2257209, + 2131520, + 2131539, + 2131542, + 2131575, + 2131591, + 2131593, + 2131612, + 2131613, + 2131633, + 2131635, + 2131649, + 2131651, + 2131665, + 2131669, + 2131671, + 2131683, + 2131686, + 2115000, + 2131717, + 2131719, + 2131726, + 2131728, + 2131743, + 2131745, + 2131747, + 2131761, + 2131770, + 2131776, + 2131779, + 2131793, + 2131800, + 2131812, + 2131813, + 2131826, + 2131836, + 2257883, + 2257882, + 2131879, + 2131849, + 2131851, + 2131859, + 2131872, + 2257918, + 2115045, + 2131902, + 2257936, + 2131905, + 2131918, + 2131935, + 2257993, + 2131939, + 2131941, + 2131942, + 2131946, + 2131987, + 2132008, + 2132014, + 2132018, + 2132028, + 2115087, + 2132042, + 2132056, + 2258453, + 2258452, + 2132073, + 2258481, + 2132079, + 2132128, + 2132156, + 2132160, + 2258579, + 2132177, + 2132179, + 2115137, + 2132225, + 2258702, + 2132279, + 2258723, + 2132290, + 2132293, + 2132297, + 2258770, + 2132322, + 2132361, + 2132368, + 2132383, + 2132400, + 2132407, + 2132440, + 2132459, + 2115233, + 2132467, + 2132477, + 2132479, + 2115247, + 2132497, + 2132500, + 2259333, + 2132513, + 2132533, + 2132542, + 2132549, + 2132557, + 2132568, + 2132654, + 2132624, + 2132663, + 2132695, + 2132732, + 2259588, + 2132746, + 2132741, + 2132749, + 2132764, + 2132781, + 2115340, + 2132817, + 2132830, + 2132854, + 2132865, + 2132875, + 2132884, + 2132885, + 2133049, + 2259891, + 2133053, + 2259902, + 2259911, + 2133061, + 2133071, + 2133079, + 2133097, + 2133101, + 2260152, + 2133139, + 2133138, + 2133145, + 2115428, + 2133147, + 2133206, + 2133205, + 2260384, + 2133233, + 2260496, + 2133257, + 2133262, + 2133448, + 2133465, + 2133516, + 2115581, + 2133501, + 2133510, + 2261130, + 2133524, + 2133526, + 2133537, + 2133538, + 2133543, + 2261179, + 2115606, + 2133558, + 2133561, + 2133588, + 2133602, + 2133613, + 2133615, + 2133656, + 2133662, + 2133685, + 2133691, + 2261634, + 2115662, + 2261747, + 2133760, + 2133768, + 2133803, + 2133824, + 2133834, + 2133848, + 2262028, + 2133924, + 2133940, + 2262101, + 2133953, + 2133958, + 2161188, + 2133962, + 2133965, + 2133971, + 2133973, + 2134001, + 2134005, + 2134011, + 2134028, + 2134071, + 2262379, + 2134083, + 2134109, + 2262472, + 2262473, + 2134149, + 2134156, + 2134160, + 2134177, + 2115765, + 2134192, + 2134198, + 2134211, + 2134216, + 2262743, + 2134236, + 2134239, + 2262778, + 2134262, + 2134258, + 2134272, + 2134251, + 2134270, + 2134271, + 2134276, + 2134278, + 2134296, + 2134302, + 2134327, + 2134329, + 2134342, + 2134343, + 2134359, + 2134361, + 2134388, + 2134393, + 2134405, + 2134451, + 2134454, + 2134467, + 2134468, + 2263369, + 2263366, + 2134508, + 2134529, + 2134550, + 2134551, + 2263403, + 2134594, + 2134602, + 2134614, + 2134625, + 2134629, + 2134632, + 2263432, + 2134652, + 2134653, + 2134655, + 2134665, + 2134669, + 2134679, + 2134681, + 2134687, + 2134699, + 2263482, + 2263483, + 2134706, + 2134719, + 2134720, + 2134726, + 2134734, + 2134757, + 2134801, + 2263582, + 2263593, + 2134775, + 2134825, + 2263665, + 2263619, + 2134865, + 2134874, + 2134891, + 2134897, + 2134899, + 2134945, + 2263705, + 2263757, + 2134920, + 2134923, + 2134927, + 2134942, + 2135029, + 2263780, + 2263773, + 2135025, + 2134983, + 2135004, + 2135015, + 2135049, + 2135062, + 2135063, + 2135035, + 2135090, + 2135099, + 2264001, + 2264047, + 2135149, + 2135151, + 2135417, + 2135430, + 2135436, + 2135437, + 2264336, + 2264433, + 2135496, + 2264571, + 2264607, + 2135596, + 2135603, + 2135604, + 2264630, + 2135612, + 2135649, + 2264713, + 2135682, + 2264811, + 2135706, + 2264882, + 2116071, + 2135731, + 2135738, + 2135741, + 2116090, + 2265080, + 2135768, + 2135770, + 2135773, + 2116100, + 2135828, + 2135843, + 2116137, + 2135862, + 2135873, + 2135879, + 2135895, + 2135899, + 2135914, + 2265760, + 2265777, + 2135958, + 2135966, + 2135985, + 2135986, + 2135998, + 2136012, + 2136017, + 2136020, + 2136024, + 2136033, + 2136049, + 2136068, + 2136077, + 2136084, + 2136086, + 2116284, + 2266256, + 2136114, + 2136115, + 2136101, + 2136135, + 2136166, + 2136235, + 2136237, + 2136240, + 2266575, + 2136247, + 2136251, + 2136252, + 2136258, + 2136263, + 2136267, + 2136289, + 2136291, + 2136298, + 2136304, + 2136305, + 2136307, + 2136328, + 2116411, + 2266864, + 2136342, + 2136343, + 2266905, + 2136346, + 2136347, + 2136348, + 2266960, + 2136369, + 2136378, + 2136379, + 2136380, + 2136385, + 2136390, + 2136398, + 2136416, + 2136483, + 2136486, + 2136509, + 2136511, + 2136515, + 2136532, + 2136537, + 2136542, + 2267334, + 2136560, + 2136569, + 2136572, + 2136586, + 2136593, + 2136602, + 2136608, + 2136625, + 2136644, + 2136652, + 2136664, + 2116546, + 2136751, + 2116554, + 2136759, + 2116562, + 2136761, + 2267762, + 2136774, + 2136784, + 2136786, + 2136789, + 2136800, + 2136805, + 2136809, + 2136844, + 2136848, + 2136850, + 2136854, + 2136860, + 2136875, + 2136893, + 2116640, + 2136907, + 2136931, + 2136933, + 2136939, + 2136940, + 2136950, + 2136951, + 2136998, + 2137004, + 2268635, + 2137010, + 2137016, + 2137022, + 2137075, + 2137048, + 2137053, + 2137066, + 2137071, + 2137070, + 2268693, + 2268810, + 2268745, + 2137110, + 2137112, + 2137113, + 2137114, + 2137117, + 2137122, + 2137129, + 2268868, + 2137137, + 2137143, + 2137157, + 2137180, + 2268905, + 2137161, + 2137162, + 2268891, + 2137172, + 2137176, + 2137179, + 2137181, + 2137183, + 2137193, + 2137194, + 2137195, + 2137197, + 2137198, + 2137202, + 2137205, + 2137210, + 2137318, + 2137330, + 2137355, + 2269143, + 2137361, + 2137367, + 2137368, + 2269231, + 2116804, + 2269210, + 2137394, + 2116817, + 2137418, + 2137439, + 2137442, + 2269433, + 2269314, + 2137459, + 2137462, + 2137463, + 2137476, + 2137497, + 2137505, + 2137535, + 2137525, + 2137529, + 2137533, + 2137545, + 2137562, + 2137568, + 2137571, + 2116871, + 2137610, + 2137602, + 2137613, + 2137628, + 2137723, + 2236952, + 2137728, + 2137733, + 2137755, + 2270092, + 2137789, + 2270263, + 2137823, + 2137855, + 2137858, + 2116983, + 2137859, + 2137914, + 2137917, + 2137926, + 2137939, + 2137941, + 2137944, + 2270705, + 2137949, + 2270722, + 2137961, + 2137965, + 2137968, + 2270898, + 2128186, + 2110996, + 2111661, + 2112972, + 2113500, + 2115006, + 2115088, + 2116478, + 2116664, + 2116833, + 2117132, + 2117155, + 2117156, + 2117241, + 2117363, + 2117388, + 2117401, + 2117419, + 2117422, + 2117425, + 2117508, + 2117534, + 2117559, + 2117636, + 2117644, + 2117708, + 2117727, + 2117730, + 2117751, + 2117774, + 2117790, + 2117794, + 2117827, + 2117864, + 2117873, + 2117886, + 2117895, + 2117900, + 2117901, + 2117902, + 2117939, + 2117944, + 2118004, + 2118020, + 2118072, + 2118074, + 2118088, + 2118095, + 2118097, + 2118099, + 2118100, + 2118104, + 2118111, + 2118149, + 2118182, + 2118184, + 2118187, + 2118193, + 2118194, + 2118197, + 2118204, + 2118234, + 2118240, + 2118254, + 2118264, + 2118265, + 2118282, + 2118284, + 2118369, + 2118377, + 2118385, + 2118403, + 2118417, + 2118431, + 2118445, + 2118450, + 2118461, + 2118501, + 2118509, + 2118521, + 2118526, + 2118548, + 2118553, + 2118570, + 2118575, + 2118586, + 2118593, + 2118596, + 2118597, + 2118624, + 2118675, + 2118698, + 2118705, + 2118708, + 2118709, + 2118732, + 2118823, + 2118826, + 2118833, + 2118843, + 2118862, + 2118890, + 2118908, + 2118917, + 2118920, + 2118933, + 2118951, + 2118954, + 2118966, + 2118993, + 2119014, + 2119055, + 2119058, + 2119060, + 2119076, + 2119090, + 2119107, + 2119110, + 2119123, + 2119131, + 2119148, + 2119150, + 2119153, + 2119158, + 2119160, + 2119173, + 2119181, + 2119185, + 2119186, + 2119212, + 2119221, + 2119225, + 2119245, + 2119252, + 2119301, + 2119327, + 2119334, + 2119351, + 2119372, + 2119375, + 2119385, + 2119393, + 2119403, + 2119405, + 2119409, + 2119431, + 2119436, + 2119450, + 2119451, + 2119453, + 2119468, + 2119470, + 2119485, + 2119486, + 2119519, + 2119531, + 2119533, + 2119546, + 2119555, + 2119575, + 2119598, + 2119637, + 2119655, + 2119693, + 2119718, + 2119757, + 2119759, + 2119775, + 2119789, + 2119807, + 2119809, + 2119832, + 2119868, + 2119967, + 2119971, + 2120025, + 2120057, + 2120087, + 2120111, + 2120115, + 2120159, + 2120177, + 2120184, + 2120370, + 2120376, + 2120426, + 2120438, + 2120475, + 2120477, + 2120481, + 2120504, + 2120631, + 2120663, + 2120672, + 2120735, + 2120746, + 2120748, + 2120758, + 2120793, + 2120796, + 2120813, + 2120925, + 2120961, + 2121012, + 2121021, + 2121049, + 2121086, + 2121091, + 2121159, + 2121209, + 2121256, + 2121266, + 2121269, + 2121307, + 2121320, + 2121322, + 2121335, + 2121344, + 2121355, + 2121395, + 2121405, + 2121425, + 2121428, + 2121429, + 2121549, + 2121644, + 2121706, + 2121735, + 2121801, + 2121812, + 2121831, + 2121915, + 2121924, + 2121981, + 2121994, + 2122006, + 2122026, + 2122038, + 2122078, + 2122084, + 2122107, + 2122109, + 2122111, + 2122141, + 2122168, + 2122204, + 2122210, + 2122213, + 2122216, + 2122244, + 2122247, + 2122289, + 2122297, + 2122301, + 2122362, + 2122384, + 2122408, + 2122458, + 2122484, + 2122518, + 2122538, + 2122550, + 2122566, + 2122571, + 2122579, + 2122609, + 2122613, + 2122623, + 2122626, + 2122634, + 2122670, + 2122671, + 2122730, + 2122744, + 2122745, + 2122770, + 2122776, + 2122784, + 2122788, + 2122794, + 2122805, + 2122813, + 2122815, + 2122834, + 2122847, + 2122868, + 2122896, + 2122904, + 2122905, + 2122924, + 2122931, + 2122989, + 2122992, + 2123035, + 2123039, + 2123054, + 2123081, + 2123104, + 2123154, + 2123157, + 2123188, + 2123198, + 2123208, + 2123214, + 2123216, + 2123231, + 2123390, + 2123403, + 2123404, + 2123443, + 2123456, + 2123471, + 2123557, + 2123573, + 2123605, + 2123648, + 2123663, + 2123665, + 2123684, + 2123697, + 2123701, + 2123710, + 2123816, + 2123910, + 2124011, + 2124021, + 2124055, + 2124083, + 2124088, + 2124123, + 2124133, + 2124200, + 2124203, + 2124207, + 2124261, + 2124273, + 2124362, + 2124373, + 2124391, + 2124401, + 2124463, + 2124488, + 2124489, + 2124547, + 2124603, + 2124607, + 2124669, + 2124670, + 2124720, + 2124791, + 2124793, + 2124804, + 2124809, + 2124813, + 2124844, + 2124874, + 2124882, + 2124884, + 2124921, + 2124972, + 2124980, + 2125010, + 2125153, + 2125180, + 2125241, + 2125296, + 2125381, + 2125427, + 2125435, + 2125437, + 2125449, + 2125500, + 2125530, + 2125531, + 2125606, + 2125609, + 2125616, + 2125703, + 2125725, + 2125742, + 2125751, + 2125837, + 2125856, + 2125897, + 2125976, + 2126000, + 2126037, + 2126038, + 2126149, + 2126258, + 2126324, + 2126359, + 2126367, + 2126403, + 2126415, + 2126416, + 2126426, + 2126432, + 2126440, + 2126455, + 2126468, + 2126537, + 2126565, + 2126580, + 2126594, + 2126603, + 2126622, + 2126626, + 2126650, + 2126651, + 2126669, + 2126680, + 2126695, + 2126962, + 2127023, + 2127071, + 2127076, + 2127092, + 2127099, + 2127126, + 2127137, + 2127167, + 2127198, + 2127257, + 2127268, + 2127297, + 2127300, + 2127308, + 2127319, + 2127324, + 2127329, + 2127343, + 2127364, + 2127372, + 2127389, + 2127410, + 2127416, + 2127429, + 2127434, + 2127455, + 2127533, + 2127549, + 2127577, + 2127595, + 2127600, + 2127609, + 2127616, + 2127630, + 2127650, + 2127656, + 2127663, + 2127673, + 2127678, + 2127685, + 2127690, + 2127695, + 2127710, + 2127716, + 2127719, + 2127724, + 2127748, + 2127756, + 2127757, + 2127766, + 2127783, + 2127791, + 2127799, + 2127806, + 2127817, + 2127825, + 2127833, + 2127857, + 2127927, + 2127964, + 2127998, + 2128024, + 2128033, + 2128049, + 2128051, + 2128073, + 2128083, + 2128140, + 2128159, + 2128167, + 2128168, + 2128191, + 2128194, + 2128212, + 2128235, + 2128252, + 2128299, + 2128324, + 2128362, + 2128386, + 2128396, + 2128432, + 2128442, + 2128452, + 2128512, + 2128518, + 2128532, + 2128565, + 2128573, + 2128638, + 2128683, + 2128759, + 2128800, + 2128812, + 2128816, + 2128872, + 2128882, + 2128888, + 2128892, + 2128894, + 2128905, + 2128936, + 2128943, + 2128962, + 2128978, + 2128979, + 2128987, + 2128988, + 2128989, + 2129010, + 2129021, + 2129031, + 2129054, + 2129082, + 2129095, + 2129107, + 2129114, + 2129212, + 2129229, + 2129282, + 2129285, + 2129293, + 2129297, + 2129310, + 2129331, + 2129337, + 2129360, + 2129381, + 2129397, + 2129398, + 2129455, + 2129462, + 2129476, + 2129519, + 2129528, + 2129537, + 2129725, + 2129755, + 2129757, + 2129765, + 2129777, + 2129791, + 2129792, + 2129803, + 2129826, + 2129917, + 2129918, + 2129919, + 2129927, + 2129933, + 2129950, + 2129977, + 2130056, + 2130062, + 2130127, + 2130132, + 2130157, + 2130160, + 2130167, + 2130170, + 2130174, + 2130179, + 2130199, + 2130224, + 2130263, + 2130287, + 2130291, + 2130315, + 2130320, + 2130331, + 2130334, + 2130379, + 2130389, + 2130397, + 2130398, + 2130401, + 2130415, + 2130422, + 2130432, + 2130443, + 2130451, + 2130452, + 2130458, + 2130490, + 2130500, + 2130541, + 2130564, + 2130569, + 2130577, + 2130602, + 2130608, + 2130640, + 2130666, + 2130671, + 2130678, + 2130774, + 2130808, + 2130936, + 2130940, + 2131032, + 2131091, + 2131121, + 2131133, + 2131195, + 2131270, + 2131286, + 2131293, + 2131333, + 2131352, + 2131522, + 2131526, + 2131648, + 2131732, + 2131746, + 2131758, + 2131769, + 2131805, + 2131835, + 2131852, + 2131854, + 2131863, + 2131864, + 2131870, + 2131875, + 2131886, + 2131903, + 2131913, + 2131930, + 2131992, + 2131995, + 2132013, + 2132026, + 2132037, + 2132043, + 2132046, + 2132053, + 2132058, + 2132078, + 2132122, + 2132123, + 2132124, + 2132173, + 2132192, + 2132207, + 2132238, + 2132239, + 2132262, + 2132277, + 2132314, + 2132316, + 2132331, + 2132336, + 2132348, + 2132389, + 2132405, + 2132412, + 2132437, + 2132553, + 2132567, + 2132583, + 2132606, + 2132614, + 2132630, + 2132662, + 2132681, + 2132689, + 2132701, + 2132716, + 2132725, + 2132742, + 2132751, + 2132753, + 2132805, + 2132818, + 2132845, + 2132856, + 2132860, + 2132862, + 2132869, + 2132895, + 2133067, + 2133075, + 2133115, + 2133178, + 2133189, + 2133193, + 2133202, + 2133228, + 2133237, + 2133239, + 2133249, + 2133251, + 2133271, + 2133276, + 2133358, + 2133393, + 2133407, + 2133419, + 2133426, + 2133461, + 2133479, + 2133489, + 2133490, + 2133492, + 2133505, + 2133515, + 2133542, + 2133553, + 2133568, + 2133569, + 2133581, + 2133583, + 2133596, + 2133601, + 2133609, + 2133617, + 2133621, + 2133623, + 2133641, + 2133648, + 2133653, + 2133658, + 2133671, + 2133673, + 2133677, + 2133736, + 2133744, + 2133767, + 2133784, + 2133797, + 2133799, + 2133804, + 2133813, + 2133818, + 2133827, + 2133831, + 2133841, + 2133845, + 2133920, + 2133921, + 2133922, + 2133925, + 2134020, + 2134043, + 2134063, + 2134092, + 2134107, + 2134128, + 2134132, + 2134137, + 2134155, + 2134168, + 2134176, + 2134194, + 2134205, + 2134217, + 2134256, + 2134277, + 2134309, + 2134362, + 2134375, + 2134394, + 2134410, + 2134417, + 2134421, + 2134448, + 2134459, + 2134461, + 2134466, + 2134469, + 2134528, + 2134537, + 2134563, + 2134646, + 2134670, + 2134703, + 2134715, + 2134716, + 2134721, + 2134723, + 2134725, + 2134728, + 2134804, + 2134835, + 2134838, + 2134872, + 2134911, + 2134914, + 2134922, + 2134971, + 2134988, + 2135014, + 2135033, + 2135042, + 2135053, + 2135054, + 2135086, + 2135116, + 2135432, + 2135457, + 2135487, + 2135494, + 2135497, + 2135505, + 2135506, + 2135520, + 2135524, + 2135526, + 2135588, + 2135601, + 2135608, + 2135613, + 2135636, + 2135668, + 2135675, + 2135679, + 2135681, + 2135683, + 2135689, + 2135702, + 2135726, + 2135811, + 2135835, + 2135841, + 2135842, + 2135848, + 2135857, + 2135911, + 2135926, + 2135933, + 2135935, + 2135961, + 2135967, + 2135980, + 2135993, + 2136013, + 2136032, + 2136047, + 2136071, + 2136102, + 2136110, + 2136162, + 2136163, + 2136244, + 2136261, + 2136322, + 2136337, + 2136341, + 2136373, + 2136392, + 2136404, + 2136414, + 2136545, + 2136588, + 2136592, + 2136611, + 2136641, + 2136657, + 2136765, + 2136766, + 2136833, + 2136841, + 2136843, + 2136845, + 2136846, + 2136857, + 2136885, + 2136904, + 2136917, + 2136936, + 2136960, + 2136966, + 2136976, + 2136989, + 2137008, + 2137023, + 2137032, + 2137087, + 2137090, + 2137116, + 2137141, + 2137156, + 2137174, + 2137185, + 2137192, + 2137392, + 2137405, + 2137450, + 2137467, + 2137573, + 2137577, + 2137587, + 2137722, + 2137730, + 2137731, + 2137732, + 2137776, + 2137828, + 2137840, + 2137842, + 2137865, + 2137871, + 2137876, + 2137883, + 2137890, + 2137894, + 2137898, + 2137899, + 2137908, + 2137946, + 2137967, + 2138014, + 2138021, + 2228469, + 2248196, + 2248690, + 2260339, + 2118029, + 4216196, + 4218722, + 4219208, + 4220959, + 2133716, + 2110942, + 2138047, + 2138048, + 2138049, + 2138050, + 2269874, + 4214286, + 4214310, + 2228568, + 4214643, + 4214870, + 4215021, + 4215147, + 2229681, + 8409566, + 4215293, + 2229996, + 4215396, + 4215409, + 6312562, + 4215615, + 2275155, + 4215872, + 2231640, + 4216220, + 6313387, + 4216329, + 6313646, + 8410798, + 2275162, + 2275164, + 4216526, + 4216558, + 4216790, + 4216893, + 4216921, + 4217167, + 6314321, + 4217184, + 4217186, + 4217562, + 4217690, + 4217715, + 4217724, + 8412083, + 2251212, + 4218435, + 2275190, + 6315747, + 4218680, + 4218785, + 4218845, + 4219234, + 6316466, + 4219384, + 2111908, + 2111928, + 2240066, + 2275196, + 4220150, + 2112092, + 2230216, + 4220254, + 2240491, + 4220295, + 4220297, + 2259380, + 4220302, + 2112196, + 2112203, + 4220385, + 4220519, + 4220526, + 6317761, + 2275202, + 2112133, + 4220672, + 4220769, + 4220868, + 4220930, + 4221245, + 4221278, + 2275211, + 4221596, + 2112499, + 2242545, + 2275220, + 4222008, + 6319274, + 2138060, + 4222436, + 2112817, + 4222472, + 4222578, + 6319819, + 4222677, + 4222683, + 4222811, + 6319963, + 4222820, + 4222836, + 2244683, + 4223550, + 2113088, + 2111649, + 6321098, + 4224189, + 4224349, + 4224444, + 2275244, + 4224520, + 4224612, + 4224617, + 2275247, + 4224823, + 4224894, + 4225447, + 4225457, + 4225726, + 4226016, + 6323280, + 4226313, + 4226482, + 6323634, + 4226878, + 6324193, + 4227090, + 2275273, + 4227286, + 4227337, + 4227369, + 4227596, + 4227611, + 4227648, + 2275279, + 4228052, + 4228111, + 2275282, + 4228330, + 2256030, + 4228433, + 4228451, + 4228559, + 4228686, + 4228706, + 4228746, + 4229186, + 4229239, + 4229441, + 4229974, + 6327126, + 4229980, + 2115359, + 2260028, + 4230250, + 4230265, + 6327498, + 4230503, + 2115614, + 4230915, + 6328132, + 6328261, + 6328276, + 4231158, + 6328439, + 8425591, + 31494281, + 16814218, + 4231336, + 4231501, + 4231913, + 4231989, + 4232075, + 2275312, + 4232653, + 4232746, + 6330008, + 4232871, + 8427519, + 10524671, + 2275173, + 4233505, + 8427863, + 4234152, + 4234158, + 4234169, + 4234248, + 4234276, + 4234299, + 2275341, + 4234470, + 4234688, + 4234690, + 2275351, + 6330607, + 4339773, + 6322952, + 4220015, + 6323262, + 4225909, + 6321429, + 6326813, + 6316130, + 4223096, + 12604329, + 4226178, + 4232857, + 4228692, + 4227441, + 4232053, + 4215980, + 4223713, + 4221079, + 4234155, + 4215753, + 4220758, + 4224294, + 8418577, + 4225736, + 4219706, + 6328385, + 4233665, + 4220327, + 4231644, + 4233133, + 4227730, + 6323326, + 4223546, + 6326277, + 4228867, + 2136861, + 2136876, + 2117634, + 2118110, + 2118407, + 2120684, + 4218570, + 2123294, + 2123543, + 2125898, + 4215262, + 2119009, + 2124858, + 2128480, + 2253644, + 2131971, + 2135467, + 2135893, + 2268733, + 2270746, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + 6319778, + 8413682, + 6325778, + 4230015, + 2117173, + 2117212, + 2117219, + 2117224, + 2117236, + 2117237, + 2117271, + 2117295, + 2117339, + 2117346, + 2117352, + 2117359, + 2117374, + 2117378, + 2117384, + 2117394, + 2117399, + 2117427, + 2117429, + 2117440, + 2117442, + 2117451, + 2117452, + 2117458, + 2117475, + 2117486, + 2117489, + 2117497, + 2117505, + 2117513, + 2117516, + 2117518, + 2117520, + 2117523, + 2117529, + 2117535, + 2117561, + 2117563, + 2117564, + 2117565, + 2117568, + 2117569, + 2117574, + 2117576, + 2117580, + 2117596, + 2117602, + 2117616, + 2117628, + 2117639, + 2117642, + 2117655, + 2117661, + 2117680, + 2117682, + 2117683, + 2117685, + 2117701, + 2117706, + 2117713, + 2117714, + 2117721, + 2117728, + 2117735, + 2117741, + 2117745, + 2117761, + 2117763, + 2117764, + 2117766, + 2117770, + 2117776, + 2117787, + 2117791, + 2117792, + 2117793, + 2117807, + 2117808, + 2117817, + 2117821, + 2117824, + 2117843, + 2117852, + 2117853, + 2117855, + 2117858, + 2117860, + 2117878, + 2117882, + 4215026, + 2117913, + 2117916, + 2117917, + 2117923, + 2117927, + 2117928, + 2117932, + 2117933, + 2117935, + 2117937, + 2117940, + 2117945, + 2117954, + 2117967, + 2117971, + 2117976, + 2117990, + 2118014, + 2118030, + 2118079, + 2118082, + 2118098, + 2118101, + 2118117, + 2118130, + 2118135, + 2118168, + 2118178, + 2118213, + 2118232, + 2118239, + 2118272, + 2118277, + 2118293, + 2118294, + 2118295, + 2118298, + 2118309, + 2118311, + 2118320, + 2118326, + 2118327, + 2118328, + 2118333, + 2118340, + 2118342, + 2118351, + 2118356, + 2118364, + 2118373, + 2118376, + 2118378, + 2118380, + 2118388, + 2118390, + 2118412, + 2118419, + 2118424, + 2118427, + 2118430, + 2118437, + 2118439, + 2118440, + 2118441, + 2118443, + 2118444, + 2118448, + 2118460, + 2118489, + 2118491, + 4215653, + 2118531, + 2118535, + 2118536, + 2118542, + 2118561, + 2118581, + 2118584, + 2118589, + 2118607, + 2118610, + 2118611, + 2118622, + 4215776, + 2118631, + 2118658, + 2118682, + 2118689, + 2118703, + 2118724, + 2118727, + 2118735, + 2118750, + 2118756, + 2118759, + 2118761, + 2118765, + 2118766, + 2118785, + 2118787, + 2118789, + 2118793, + 2118801, + 2118815, + 2118858, + 2118880, + 2118902, + 2118910, + 2118924, + 2118925, + 2118962, + 2118971, + 2118973, + 2118985, + 2118989, + 2119000, + 2119002, + 2119003, + 2119039, + 2119059, + 2119063, + 2119075, + 2119105, + 2119115, + 2119127, + 2119128, + 2119134, + 2119167, + 4216325, + 2119178, + 2119193, + 2119219, + 2119228, + 2119233, + 2119235, + 2119236, + 2119238, + 2119265, + 2119266, + 2119267, + 2119285, + 2119300, + 2119307, + 2119335, + 2119339, + 2119358, + 2119371, + 2119376, + 2119388, + 2119397, + 2119398, + 2119399, + 2119425, + 2119426, + 2119441, + 2119456, + 2119458, + 2119460, + 2119461, + 2119466, + 2119487, + 2119506, + 2119522, + 2119527, + 2119534, + 2119537, + 2119545, + 2119550, + 2119553, + 2119572, + 2119577, + 2119583, + 2119585, + 2119573, + 2119591, + 2119593, + 2119613, + 2119645, + 2119657, + 2119678, + 2119683, + 2119688, + 2119649, + 2119692, + 2119707, + 2119711, + 2119725, + 2119743, + 2119760, + 2119765, + 2119784, + 2119800, + 2119815, + 2119816, + 2119820, + 2119830, + 2119840, + 2119841, + 2119842, + 2119846, + 2119876, + 2119874, + 2119880, + 2119894, + 2119901, + 2119905, + 4217094, + 2119954, + 2119955, + 2119965, + 2119969, + 2119976, + 2119984, + 2119987, + 2119989, + 2119990, + 2119999, + 2120003, + 2120018, + 2120030, + 2120043, + 2120047, + 2120050, + 2120059, + 2120076, + 2120078, + 2120085, + 2120103, + 2120109, + 2120112, + 2120119, + 2120129, + 2120132, + 2120175, + 2120178, + 2120180, + 2120183, + 2120192, + 2120206, + 2120210, + 2120222, + 2120228, + 2120232, + 2120234, + 2120240, + 2120260, + 2120261, + 2120264, + 2120268, + 2120272, + 2120286, + 2120315, + 2120336, + 2120339, + 2120342, + 2120345, + 2120379, + 2120390, + 2120392, + 2120399, + 2120445, + 2120449, + 2120523, + 2120542, + 2120558, + 2120582, + 2120590, + 2120592, + 2120593, + 2120596, + 2120616, + 2120617, + 2120621, + 2120623, + 2120625, + 2120626, + 2120634, + 2120636, + 2120641, + 2120653, + 2120655, + 2120665, + 2120666, + 2120687, + 2120692, + 2120716, + 2120727, + 2120742, + 2120750, + 2120754, + 2120757, + 2120794, + 2120820, + 2120821, + 2120827, + 2120829, + 2120839, + 2120850, + 2120861, + 2120882, + 2120884, + 2120919, + 2120942, + 2120945, + 2120946, + 2120978, + 2120995, + 2121023, + 2121032, + 2121045, + 2121041, + 2121055, + 2121056, + 2121058, + 2121060, + 2121081, + 2121082, + 2121087, + 2121098, + 2121107, + 2121109, + 2121115, + 2121119, + 2121131, + 2121155, + 2121166, + 2121177, + 2121223, + 2121229, + 2121248, + 2121291, + 2121296, + 2121297, + 2121308, + 2121328, + 2121358, + 2121378, + 2121380, + 2121393, + 2121420, + 2121422, + 2121436, + 2121438, + 2121445, + 2121451, + 2121478, + 2121497, + 2121508, + 2121515, + 2121516, + 2121518, + 2121520, + 2121535, + 2121540, + 2121563, + 2121568, + 2121583, + 2121588, + 2121589, + 2121592, + 2121594, + 2121613, + 2121622, + 2121629, + 2121643, + 2121648, + 2121649, + 2121672, + 2121680, + 2121681, + 2121704, + 2121708, + 2121714, + 2121718, + 2121722, + 2121738, + 2121747, + 2121759, + 2121773, + 2121792, + 2121800, + 2121809, + 2121814, + 2121815, + 2121841, + 2121854, + 2121858, + 2121862, + 2121864, + 2121870, + 2121873, + 2121875, + 2121880, + 4219038, + 2121890, + 2121893, + 2121911, + 2121922, + 2121929, + 2121930, + 2121934, + 2121935, + 2121954, + 2121957, + 2121980, + 2121986, + 2121991, + 2121996, + 2122007, + 2122018, + 2122033, + 2122037, + 2122041, + 2122053, + 2122057, + 2122092, + 2122098, + 2122104, + 2122112, + 2122113, + 2122115, + 2122116, + 2122123, + 2122140, + 2122144, + 2122154, + 2122176, + 2122177, + 2122190, + 2122191, + 2122206, + 2122209, + 2122215, + 2122217, + 2122220, + 2122221, + 2122223, + 2122241, + 2122243, + 2122268, + 2122272, + 2122279, + 2122283, + 2122306, + 2122308, + 2122320, + 2122324, + 2122332, + 2122365, + 2122381, + 2122382, + 2122383, + 2122419, + 2122422, + 2122423, + 2122426, + 2122430, + 2122431, + 2122446, + 2122474, + 2122482, + 2122500, + 2122507, + 2122515, + 2122537, + 2122541, + 2122570, + 2122578, + 2122580, + 2122584, + 2122587, + 2122598, + 2122605, + 2122616, + 2122645, + 2122650, + 2122660, + 2122662, + 2122669, + 2122689, + 2122693, + 2122696, + 2122702, + 2122707, + 2122739, + 2122762, + 2122800, + 2122827, + 2122831, + 2122835, + 2122844, + 2122849, + 2122851, + 2122885, + 2122895, + 2122907, + 2122913, + 2122915, + 2122918, + 2122920, + 2122941, + 2122953, + 2122961, + 2122985, + 2122986, + 2122997, + 2123009, + 2123016, + 2123017, + 2123018, + 2123027, + 2123046, + 2123057, + 2123066, + 2123068, + 2123069, + 2123075, + 2123088, + 2123090, + 2123103, + 2123133, + 2123160, + 2123168, + 2123171, + 2123174, + 2123182, + 2123187, + 2123222, + 2123224, + 4220383, + 2123252, + 2123253, + 2123262, + 2123263, + 2123277, + 2123281, + 2123282, + 2123286, + 2123293, + 2123299, + 2123302, + 2123305, + 2123321, + 2123319, + 2123328, + 2123334, + 2123338, + 2123352, + 2123360, + 2123381, + 2123391, + 2123385, + 2123388, + 2123418, + 2123419, + 2123420, + 2123423, + 4220597, + 2123458, + 2123459, + 2123468, + 2123470, + 2123476, + 2123487, + 2123499, + 2123502, + 2123527, + 2123548, + 2123552, + 2123554, + 2123582, + 2123589, + 2123628, + 2123652, + 2123662, + 2123670, + 2123673, + 2123708, + 2123709, + 2123714, + 2123717, + 2123721, + 2123740, + 2123745, + 2123750, + 2123762, + 2123766, + 2123796, + 2123801, + 2123815, + 2123823, + 2123839, + 2123850, + 2123864, + 2123887, + 2123888, + 2123889, + 2123897, + 2123899, + 2123912, + 2123937, + 2123945, + 2123950, + 2123985, + 2123987, + 2123996, + 2123997, + 2124010, + 2124022, + 2124029, + 2124038, + 2124041, + 2124048, + 2124054, + 2124081, + 2124101, + 2124110, + 2124134, + 2124144, + 2124145, + 2124155, + 2124173, + 2124193, + 2124216, + 2124229, + 2124232, + 4221438, + 2124288, + 2124291, + 2124320, + 2124324, + 2124343, + 4221525, + 2124394, + 2124417, + 2124422, + 2124423, + 2124443, + 2124464, + 2124465, + 2124468, + 2124478, + 2124479, + 2124492, + 2124501, + 2124502, + 2124528, + 2124540, + 2124546, + 2124550, + 2124551, + 2124553, + 2124584, + 2124587, + 2124598, + 2124621, + 2124626, + 2124637, + 2124651, + 2124654, + 2124656, + 2124677, + 2124695, + 2124703, + 2124704, + 2124706, + 2124707, + 2124712, + 2124716, + 2124728, + 2124729, + 2124739, + 2124740, + 2124771, + 2124818, + 2124825, + 2124831, + 2124838, + 2124839, + 2124840, + 2124846, + 2124859, + 2124875, + 2124879, + 2124907, + 2124920, + 2124935, + 2124959, + 2124976, + 2124978, + 2125005, + 2125007, + 2125009, + 2125031, + 2125042, + 2125044, + 2125063, + 2125071, + 2125075, + 2125082, + 2125096, + 2125151, + 2125159, + 2125202, + 2125207, + 2125239, + 2125245, + 2125280, + 2125282, + 2125285, + 2125295, + 2125300, + 2125312, + 2125316, + 2125371, + 2125394, + 2125405, + 2125410, + 2125416, + 2125453, + 2125465, + 2125472, + 2125485, + 2125486, + 2125491, + 2125499, + 2125504, + 2125512, + 2125517, + 2125519, + 2125549, + 2125550, + 2125572, + 2125576, + 2125581, + 2125590, + 2125595, + 2125627, + 2125613, + 2125647, + 2125651, + 2125661, + 2125676, + 2125699, + 2125715, + 2125734, + 2125744, + 2125765, + 2125800, + 2125821, + 2125847, + 2125871, + 2125876, + 2125879, + 2125892, + 2125896, + 2125909, + 2125972, + 2125974, + 2125979, + 2126004, + 2126074, + 2126085, + 2126091, + 2126125, + 2126136, + 2126145, + 2126155, + 4223314, + 2126167, + 2126170, + 2126220, + 2126234, + 2126256, + 2126271, + 2126272, + 2126284, + 2126298, + 2126328, + 2126344, + 2126345, + 2126355, + 2126362, + 2126372, + 2126383, + 2126405, + 2126414, + 2126430, + 2126443, + 2126449, + 2126459, + 2126460, + 2126473, + 2126483, + 2126504, + 2126549, + 2126550, + 2126552, + 2126559, + 2126590, + 2126605, + 2126611, + 2126642, + 2126645, + 2126678, + 2126685, + 2126686, + 2126687, + 2126688, + 2126697, + 2126713, + 2126720, + 2126734, + 2126736, + 2126739, + 2126743, + 2126762, + 2126765, + 2126790, + 2126796, + 2126803, + 2126813, + 2126822, + 2126839, + 2126843, + 2126847, + 2126848, + 2126865, + 2126893, + 2126951, + 2126952, + 2126958, + 2126991, + 2126993, + 2127002, + 2127022, + 2127025, + 2127026, + 2127052, + 2127056, + 2127059, + 4224216, + 2127067, + 2127080, + 2127082, + 4224239, + 2127100, + 2127110, + 2127122, + 2127143, + 2127145, + 2127158, + 2127161, + 2127171, + 2127175, + 2127191, + 2127199, + 2127201, + 2127227, + 2127228, + 2127237, + 2127253, + 2127260, + 2127290, + 2127378, + 2127395, + 2127401, + 2127417, + 2127418, + 2127424, + 2127428, + 2127449, + 2127493, + 2127500, + 2127501, + 2127519, + 2127522, + 2127523, + 2127553, + 2127563, + 4224724, + 2127584, + 2127606, + 2127622, + 2127634, + 2127636, + 2127637, + 2127644, + 2127662, + 2127677, + 2127682, + 2127698, + 2127702, + 2127703, + 2127728, + 2127731, + 2127732, + 4224909, + 4224930, + 2127790, + 2127793, + 2127797, + 2127811, + 2127826, + 2127829, + 2127864, + 2127886, + 2127889, + 2127901, + 2127907, + 2127940, + 2127944, + 2127948, + 2127954, + 2127966, + 2127968, + 2127969, + 2127971, + 2128015, + 2128040, + 2128044, + 2128050, + 2128061, + 2128063, + 2128071, + 2128082, + 2128086, + 2128091, + 2128095, + 2128106, + 2128115, + 2128118, + 2128127, + 2128134, + 2128154, + 2128158, + 2128160, + 2128169, + 2128173, + 2128181, + 2128196, + 2128203, + 2128207, + 2128209, + 2128233, + 2128251, + 2128254, + 2128268, + 2128273, + 2128275, + 2128284, + 2128296, + 2128303, + 2128335, + 2128349, + 2128352, + 2128354, + 2128357, + 2128369, + 2128376, + 2128380, + 2128391, + 2128417, + 2128423, + 2128427, + 2128431, + 2128436, + 2128437, + 2128456, + 2128469, + 2128485, + 2128510, + 2128523, + 2128529, + 2128542, + 2128585, + 2128603, + 2128617, + 2128620, + 2128625, + 2128635, + 2128671, + 2128675, + 2128681, + 2128688, + 2128692, + 2128703, + 2128704, + 2128746, + 2128772, + 2128777, + 2128782, + 2128790, + 2128805, + 2128818, + 2128822, + 2128826, + 2128827, + 2128829, + 2128834, + 2128840, + 2128859, + 2128884, + 2128885, + 2128889, + 2128890, + 2128898, + 2128900, + 2128902, + 2128908, + 2128921, + 2128923, + 2128933, + 2128940, + 2128948, + 2128953, + 2128954, + 2128966, + 2128981, + 2128986, + 2128995, + 4226153, + 2129020, + 2129030, + 2129072, + 2129083, + 2129103, + 2129108, + 2129129, + 2129167, + 2129169, + 2129174, + 2129190, + 2129194, + 2129197, + 2129233, + 2129239, + 2129253, + 2129255, + 2129272, + 2129275, + 2129281, + 2129302, + 2129347, + 2129348, + 2129349, + 2129350, + 2129357, + 2129358, + 2129408, + 2129378, + 2129386, + 2129389, + 2129402, + 2129436, + 2129453, + 2129459, + 2129471, + 2129486, + 2129488, + 2129496, + 2129503, + 2129509, + 2129557, + 2129565, + 2129566, + 2129727, + 2129756, + 2129766, + 4226944, + 2129805, + 2129807, + 2129830, + 2129834, + 2129844, + 2129852, + 2129856, + 2129864, + 2129896, + 2129935, + 2129939, + 2129949, + 2129951, + 2129952, + 2129966, + 2129972, + 2129982, + 2129984, + 2129988, + 2130020, + 2130029, + 2130049, + 2130105, + 2130120, + 2130125, + 2130130, + 2130158, + 2130162, + 2130166, + 2130169, + 2130187, + 2130204, + 2130208, + 2130236, + 2130245, + 2130247, + 2130258, + 2130273, + 2130295, + 2130310, + 2130318, + 2130326, + 2130338, + 2130350, + 2130373, + 2130382, + 2130411, + 2130416, + 2130417, + 2130418, + 2130421, + 2130424, + 4227584, + 2130447, + 2130461, + 2130472, + 2130499, + 2130510, + 2130513, + 2130518, + 2130535, + 2130555, + 2130560, + 2130561, + 2130567, + 2130580, + 2130582, + 2130584, + 2130586, + 2130587, + 2130592, + 2130650, + 2130656, + 2130660, + 2130669, + 2130698, + 2130699, + 2130718, + 2130719, + 2130721, + 2130732, + 2130734, + 2130739, + 2130743, + 2130749, + 2130754, + 2130765, + 2130766, + 2130800, + 2130816, + 2130818, + 2130820, + 2130841, + 2130844, + 2130854, + 2130860, + 2130878, + 2130771, + 2130920, + 2130969, + 2130861, + 2130991, + 2131013, + 2131015, + 2131021, + 2131030, + 4228188, + 2131040, + 2131044, + 2131047, + 2131050, + 2131060, + 2131069, + 2131090, + 2131093, + 2131113, + 2131114, + 2131143, + 2131144, + 2131148, + 2131186, + 2131191, + 2131202, + 2131203, + 2131207, + 2131214, + 2131216, + 2131228, + 2131234, + 2131239, + 2131242, + 2131251, + 2131254, + 2131263, + 2131280, + 2131282, + 2131292, + 4228445, + 2131295, + 2131296, + 2131321, + 2131337, + 2131339, + 2131360, + 2131365, + 2131367, + 2131380, + 2131382, + 2131384, + 2131389, + 2131390, + 2131391, + 2131394, + 2131418, + 2131424, + 2131432, + 2131443, + 2131452, + 2131469, + 2131470, + 2131481, + 2131483, + 2131510, + 2131514, + 2131517, + 2131544, + 2131545, + 2131549, + 2131552, + 2131553, + 2131556, + 2131561, + 2131574, + 2131606, + 2131610, + 2131617, + 2131622, + 2131629, + 2131636, + 2131637, + 2131639, + 2131641, + 2131647, + 2131653, + 2131666, + 2131674, + 2131676, + 2131680, + 2131685, + 2131687, + 2131592, + 2131716, + 2131727, + 2131759, + 2131762, + 2131772, + 2131773, + 2131781, + 2131789, + 2131809, + 2131823, + 2131843, + 2131844, + 2131845, + 2131846, + 2131856, + 2131861, + 4229027, + 2131889, + 2131912, + 2131914, + 2131925, + 2131929, + 2131932, + 2131938, + 2131940, + 2131953, + 2131955, + 2131960, + 2131962, + 2131967, + 2131977, + 2131993, + 2131986, + 2131994, + 2131998, + 2132016, + 2132021, + 2132033, + 2132035, + 2132040, + 2132041, + 4229195, + 2132049, + 2132060, + 2132064, + 2132081, + 2132089, + 2132091, + 2132096, + 2132127, + 2132136, + 2132154, + 2132171, + 2132172, + 2132190, + 2132199, + 2132215, + 2132237, + 2132245, + 2132246, + 2132256, + 2132264, + 2132273, + 2132282, + 2132294, + 2132303, + 2132306, + 2132311, + 2132315, + 2132321, + 2132323, + 2132334, + 2132339, + 2132341, + 2132346, + 2132349, + 2132365, + 2132373, + 2132379, + 2132380, + 2132384, + 2132404, + 2132406, + 2132439, + 2132457, + 2132461, + 2132473, + 2132484, + 2132485, + 2132510, + 2132512, + 2132516, + 2132518, + 2132523, + 2132524, + 2132527, + 2132541, + 2132544, + 2132547, + 2132563, + 2132566, + 2132572, + 2132581, + 2132598, + 2132599, + 2132602, + 2132603, + 2132608, + 2132611, + 2132619, + 2132623, + 2132626, + 2132631, + 2132633, + 2132639, + 2132649, + 2132655, + 2132659, + 2132667, + 2132675, + 2132678, + 2132680, + 2132682, + 2132691, + 2132692, + 2132693, + 2132720, + 2132735, + 2132747, + 2132766, + 2132784, + 2132796, + 2132802, + 2132808, + 2132813, + 2132835, + 2132857, + 2132868, + 2132877, + 2132879, + 2133048, + 2133054, + 2133073, + 2133080, + 2133083, + 2133085, + 2133081, + 2133091, + 2133092, + 2133094, + 2133109, + 2133110, + 2133118, + 2133126, + 2133127, + 2133131, + 2133136, + 4230299, + 2133148, + 2133177, + 2133190, + 2133195, + 2133199, + 2133213, + 2133224, + 2133231, + 2133234, + 2133247, + 2133349, + 2133375, + 2133378, + 2133384, + 2133392, + 2133406, + 2133408, + 2133420, + 2133429, + 2133431, + 2133433, + 2133435, + 2133440, + 2133445, + 2133447, + 2133450, + 2133460, + 2133477, + 2133488, + 2133436, + 2133508, + 2133509, + 2133521, + 2133555, + 2133559, + 2133560, + 2133582, + 2133595, + 2133597, + 2133598, + 2133625, + 2133634, + 2133635, + 2133659, + 2133661, + 2133666, + 2133690, + 2133697, + 2133699, + 2133700, + 2133703, + 2133724, + 2133742, + 2133745, + 2133751, + 2133741, + 2133762, + 2133775, + 2133776, + 2133782, + 2133792, + 2133793, + 2133795, + 2133800, + 2133806, + 2133812, + 2133815, + 2133825, + 2133839, + 2133842, + 2133843, + 2133853, + 2133854, + 2133861, + 2133917, + 2133944, + 2133950, + 2133952, + 2133963, + 2133968, + 2133970, + 2133987, + 2134014, + 2134040, + 2134056, + 2134057, + 2134058, + 2134067, + 2134068, + 2134079, + 2134114, + 2134118, + 2134124, + 2134158, + 2134181, + 2134220, + 2134229, + 2134232, + 2134233, + 2134245, + 2134226, + 2134280, + 2134285, + 2134288, + 2134298, + 2134304, + 2134313, + 2134318, + 2134326, + 2134332, + 2134339, + 2134351, + 2134355, + 2134381, + 2134395, + 2134401, + 2134406, + 2134419, + 2134420, + 2134424, + 2134433, + 2134438, + 2134463, + 2134483, + 2134484, + 2134489, + 2134505, + 2134506, + 2134511, + 2134521, + 2134525, + 2134532, + 2134533, + 2134540, + 2134546, + 2134547, + 2134552, + 2134556, + 2134557, + 2134564, + 2134565, + 2134566, + 2134574, + 2134575, + 2134576, + 2134581, + 2134582, + 2134590, + 2134598, + 2134605, + 2134616, + 2134620, + 2134621, + 2134633, + 2134638, + 2134639, + 2134640, + 2134645, + 2134649, + 2134651, + 2134666, + 2134674, + 2134688, + 2134692, + 2134693, + 2134696, + 2134710, + 2134712, + 2134714, + 2134717, + 2134727, + 2134733, + 2134744, + 2134748, + 2134749, + 2134753, + 2134755, + 2134760, + 2134764, + 2134766, + 2134768, + 2134784, + 2134792, + 2134812, + 2134820, + 2134826, + 2134836, + 2134839, + 2134864, + 2134869, + 2134878, + 2134887, + 2134889, + 2134895, + 2134900, + 2134902, + 2134906, + 2134909, + 2134912, + 2134913, + 2134925, + 2134930, + 2134933, + 2134936, + 4232097, + 2134950, + 2134952, + 2134955, + 2134964, + 2134965, + 2134966, + 2134980, + 2134981, + 2134985, + 2134987, + 2134989, + 2134995, + 2135001, + 2135031, + 2135041, + 2135048, + 2135061, + 2135071, + 2135087, + 2135101, + 2135107, + 2135129, + 2135132, + 2135135, + 2135137, + 2135144, + 2135150, + 2135172, + 2135171, + 2135422, + 2135428, + 2135453, + 2135454, + 2135482, + 2135513, + 2135517, + 2135519, + 2135582, + 2135586, + 2135589, + 2135590, + 2135607, + 2135609, + 2135610, + 2135634, + 2135638, + 2135639, + 2135662, + 2135676, + 2135678, + 2135697, + 2135711, + 2135718, + 2135754, + 4232922, + 2135775, + 2135802, + 2135813, + 2135834, + 2135837, + 4232993, + 2135882, + 2135896, + 2135927, + 2135928, + 2135931, + 2135936, + 2135945, + 2135959, + 2135992, + 2135996, + 2135999, + 2136004, + 2136005, + 2136007, + 2136010, + 2136014, + 2136016, + 2136023, + 2136029, + 2136036, + 2136055, + 2136056, + 2136058, + 2136089, + 2136092, + 2136096, + 2136111, + 2136117, + 2136132, + 2136138, + 2136145, + 2136170, + 2136238, + 2136268, + 2136294, + 2136310, + 2136327, + 2136351, + 2136354, + 2136358, + 2136363, + 2136372, + 2136377, + 2136391, + 2136409, + 2136411, + 2136475, + 2136477, + 2136479, + 2136496, + 2136498, + 2136501, + 2136531, + 2136538, + 2136540, + 2136551, + 2136554, + 2136555, + 2136556, + 2136564, + 2136565, + 2136573, + 2136574, + 2136580, + 2136587, + 2136606, + 2136610, + 2136627, + 2136629, + 2136647, + 4233802, + 2136651, + 2136660, + 2136669, + 2136746, + 2136748, + 2136750, + 2136754, + 2136756, + 2136763, + 2136767, + 2136776, + 2136791, + 2136795, + 2136804, + 2136807, + 2136812, + 2136818, + 2136819, + 2136821, + 2136826, + 2136829, + 2136831, + 2136832, + 2136836, + 2136837, + 2136859, + 2136870, + 4234037, + 2136887, + 2136889, + 2136890, + 2136908, + 2136918, + 2136919, + 2136923, + 2136929, + 2136938, + 2136941, + 2136942, + 2136952, + 2136959, + 2136965, + 2136967, + 2136969, + 2136971, + 2136973, + 2136980, + 2136986, + 2137001, + 2137015, + 2137020, + 2137040, + 2137081, + 2137103, + 2137105, + 2137118, + 2137126, + 2137128, + 2137149, + 2137155, + 2137166, + 2137182, + 2137211, + 2137335, + 2137337, + 2137372, + 2137391, + 2137395, + 2137396, + 2137402, + 2137404, + 2137413, + 2137427, + 2137428, + 2137445, + 2137475, + 2137478, + 2137486, + 2137490, + 2137491, + 2137493, + 2137495, + 2137496, + 2137514, + 2137518, + 4234687, + 2137546, + 2137556, + 2137557, + 2137566, + 2137582, + 2137584, + 2137598, + 2137614, + 2137616, + 2137617, + 2137618, + 2137622, + 2137735, + 2137742, + 2137743, + 2137750, + 2137752, + 2137774, + 2137779, + 2137798, + 2137800, + 2137803, + 2137813, + 2137836, + 2137837, + 2137841, + 2137845, + 2137848, + 2137873, + 2137878, + 2137882, + 2137887, + 2137905, + 2137906, + 2137916, + 2137919, + 2137923, + 2137924, + 2137927, + 2137942, + 2137950, + 2137966, + 2137971, + 2137978, + 2137981, + 2137999, + 2138001, + 2138002, + 2138006, + 2138017, + 2138019, +}} diff --git a/macros/luatex/generic/luatexja/src/ltj-jfmglue.lua b/macros/luatex/generic/luatexja/src/ltj-jfmglue.lua new file mode 100644 index 0000000000..f94b028452 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-jfmglue.lua @@ -0,0 +1,1375 @@ +-- +-- luatexja/ltj-jfmglue.lua +-- +luatexbase.provides_module({ + name = 'luatexja.jfmglue', + date = '2019/07/26', + description = 'Insertion process of JFM glues, [x]kanjiskip and others', +}) +luatexja.jfmglue = luatexja.jfmglue or {} + +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('stack'); local ltjs = luatexja.stack +luatexja.load_module('jfont'); local ltjf = luatexja.jfont +luatexja.load_module('direction'); local ltjd = luatexja.direction +luatexja.load_module('setwidth'); local ltjw = luatexja.setwidth +local pairs = pairs + +--local to_node = node.direct.tonode +--local to_direct = node.direct.todirect + +local setfield = node.direct.setfield +local setglue = luatexja.setglue +local getfield = node.direct.getfield +local getid = node.direct.getid +local getfont = node.direct.getfont +local getlist = node.direct.getlist +local getchar = node.direct.getchar +local getsubtype = node.direct.getsubtype +local if_lang_ja +do + local lang_ja = luatexja.lang_ja + local getlang = node.direct.getlang + if_lang_ja = getlang + and function (n) return getlang(n)==lang_ja end + or function (n) return getfield(n,'lang')==lang_ja end +end + +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local insert_before = node.direct.insert_before +local insert_after = node.direct.insert_after +local node_next = node.direct.getnext +local ltjd_make_dir_whatsit = ltjd.make_dir_whatsit +local ltjf_font_metric_table = ltjf.font_metric_table +local ltjf_find_char_class = ltjf.find_char_class +local node_new = node.direct.new +local node_copy = node.direct.copy +local node_tail = node.direct.tail +local node_free = node.direct.free +local node_remove = node.direct.remove + +local id_glyph = node.id('glyph') +local id_hlist = node.id('hlist') +local id_vlist = node.id('vlist') +local id_rule = node.id('rule') +local id_ins = node.id('ins') +local id_mark = node.id('mark') +local id_adjust = node.id('adjust') +local id_disc = node.id('disc') +local id_whatsit = node.id('whatsit') +local id_math = node.id('math') +local id_glue = node.id('glue') +local id_kern = node.id('kern') +local id_penalty = node.id('penalty') + +local id_jglyph = 512 -- Japanese character +local id_box_like = 256 -- vbox, shifted hbox +local id_pbox = 257 -- already processed nodes (by \unhbox) +local id_pbox_w = 258 -- cluster which consists of a whatsit +local sid_user = node.subtype('user_defined') + +local ITALIC = luatexja.icflag_table.ITALIC +local PACKED = luatexja.icflag_table.PACKED +local KINSOKU = luatexja.icflag_table.KINSOKU +local FROM_JFM = luatexja.icflag_table.FROM_JFM +local PROCESSED = luatexja.icflag_table.PROCESSED +local IC_PROCESSED = luatexja.icflag_table.IC_PROCESSED +local BOXBDD = luatexja.icflag_table.BOXBDD +local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG + +local attr_icflag = luatexbase.attributes['ltj@icflag'] +local kanji_skip +local xkanji_skip +local table_current_stack +local list_dir +local capsule_glyph +local tex_dir +local attr_ablshift +local set_np_xspc_jachar, set_np_xspc_alchar +local set_np_xspc_jachar_hbox + +local ltjs_orig_char_table = ltjs.orig_char_table + +local function get_attr_icflag(p) + return (has_attr(p, attr_icflag) or 0)%PROCESSED_BEGIN_FLAG +end + +-------------------- Helper functions + +-- This function is called only for acquiring `special' characters. +local function fast_find_char_class(c,m) + return m.chars[c] or 0 +end + +-- 文字クラスの決定 +local slow_find_char_class +do + local start_time_measure = ltjb.start_time_measure + local stop_time_measure = ltjb.stop_time_measure + slow_find_char_class = function (c, m, oc) + local cls = ltjf_find_char_class(oc, m) + if oc~=c and c and cls==0 then + return ltjf_find_char_class(c, m) + else + return cls + end + end +end + +local function skip_table_to_glue(n) + local g, st = node_new(id_glue), ltjs.fast_get_stack_skip(n) + setglue(g, st.width, st.stretch, st.shrink, st.stretch_order, st.shrink_order) + return g, (st.width==1073741823) +end + + +-- penalty 値の計算 +local add_penalty +do +local setpenalty = node.direct.setpenalty or function(n, a) setfield(n,'penalty',a) end +local getpenalty = node.direct.getpenalty or function(n) return getfield(n,'penalty') end +function add_penalty(p,e) + local pp = getpenalty(p) + if (pp>-10000) and (pp<10000) then + if e>=10000 then setpenalty(p, 10000) + elseif e<=-10000 then setpenalty(p, -10000) + else + pp = pp + e + if pp>=10000 then setpenalty(p, 10000) + elseif pp<=-10000 then setpenalty(p, -10000) + else setpenalty(p, pp) end + end + end +end +end + +-- 「異なる JFM」の間の調整方法 +luatexja.jfmglue.diffmet_rule = math.two_paverage +function math.two_add(a,b) return a+b end +function math.two_average(a,b) return (a+b)*0.5 end +function math.two_paverage(a,b) return (a+b)/2 end +function math.two_pleft(a,b) return a end +function math.two_pright(a,b) return b end + +local head -- the head of current list + +local Np, Nq, Bp +local widow_Bp, widow_Np -- \jcharwidowpenalty 挿入位置管理用 + +local non_ihb_flag -- JFM グルー挿入抑止用 flag +-- false: \inhibitglue 指定時 true: それ以外 + +-------------------- hlist 内の文字の検索 + +local first_char, last_char, find_first_char +local check_box_high +do +local ltjd_glyph_from_packed = ltjd.glyph_from_packed +local function check_box(box_ptr, box_end) + local p = box_ptr; local found_visible_node = false + if not p then + find_first_char = false; last_char = nil + return true + end + while p and p~=box_end do + local pid = getid(p) + if pid==id_kern and getsubtype(p)==2 then + p = node_next(node_next(node_next(p))); pid = getid(p) -- p must be glyph_node + end + if pid==id_glyph then + repeat + if find_first_char then + first_char = p; find_first_char = false + end + last_char = p; found_visible_node = true; p=node_next(p) + if (not p) or p==box_end then + return found_visible_node + end + until getid(p)~=id_glyph + pid = getid(p) -- p must be non-nil + end + if pid==id_kern then + local pa = get_attr_icflag(p) + if pa==IC_PROCESSED then + -- do nothing + elseif getsubtype(p)==2 then + p = node_next(node_next(p)); + -- Note that another node_next will be executed outside this if-statement. + else + found_visible_node = true + find_first_char = false; last_char = nil + end + elseif pid==id_hlist then + if PACKED == get_attr_icflag(p) then + local s = ltjd_glyph_from_packed(p) + if find_first_char then + first_char = s; find_first_char = false + end + last_char = s; found_visible_node = true + else + if getfield(p, 'shift')==0 then + last_char = nil + if check_box(getlist(p), nil) then found_visible_node = true end + find_first_char = false + else + find_first_char = false; last_char = nil + end + end + elseif pid==id_math then + if find_first_char then + first_char = p; find_first_char = false + end + last_char = p; found_visible_node = true + elseif pid==id_rule and get_attr_icflag(p)==PACKED then + -- do nothing + elseif not (pid==id_ins or pid==id_mark + or pid==id_adjust or pid==id_whatsit + or pid==id_penalty) then + found_visible_node = true + find_first_char = false; last_char = nil + end + p = node_next(p) + end + return found_visible_node +end + +check_box_high = function (Nx, box_ptr, box_end) + first_char = nil; last_char = nil; find_first_char = true + if check_box(box_ptr, box_end) then + local first_char = first_char + if first_char then + if getid(first_char)==id_glyph then + if if_lang_ja(first_char) then + set_np_xspc_jachar_hbox(Nx, first_char) + else + set_np_xspc_alchar(Nx, getchar(first_char),first_char, 1) + end + else -- math_node + set_np_xspc_alchar(Nx, -1,first_char) + end + end + end + return last_char +end +end +-------------------- Np の計算と情報取得 + +luatexbase.create_callback("luatexja.jfmglue.whatsit_getinfo", "data", + function (Np, lp, Nq) + if Np.nuc then return Np + else + return Np -- your code + end + end) +luatexbase.create_callback("luatexja.jfmglue.whatsit_after", "data", + function (stat, Nq, Np) return false end) + +-- calc next Np +local calc_np +do -- 001 ----------------------------------------------- + +local traverse = node.direct.traverse +local function check_next_ickern(lp) + local lx = Np.nuc + while lp and getid(lp) == id_kern and ( getsubtype(lp)==0 or + getsubtype(lp)==3 or ITALIC == get_attr_icflag(lp)) do + set_attr(lp, attr_icflag, IC_PROCESSED); + lx, lp = lp, node_next(lp) + end + Np.last = lx; return lp +end + +local function calc_np_pbox(lp, last) + local first, nc = (not Np.first), nil + --local lpa = get_attr_icflag(lp)==PACKED and PACKED or KINSOKU -- KINSOKU: dummy + local lpa = get_attr_icflag(lp) + Np.first = Np.first or lp; Np.id = id_pbox + set_attr(lp, attr_icflag, get_attr_icflag(lp)); + while lp ~=last and (lpa>=PACKED) and (lpa<BOXBDD) do + local lpi = getid(lp) + if lpa==PACKED then + if lpi==id_rule then lp = node_next(lp) end + nc, lp = lp, node_next(lp) + elseif lpi==id_hlist or lpi==id_vlist then + head, lp, nc = ltjd_make_dir_whatsit(head, lp, list_dir, 'jfm pbox') + Np.first = first and nc or Np.first + else + nc, lp = lp, node_next(lp) + end + first, lpa = false, (lp and has_attr(lp, attr_icflag) or 0) + -- get_attr_icflag() ではいけない! + end + Np.nuc = nc + lp = check_next_ickern(lp) + Np.last_char = check_box_high(Np, Np.first, lp) + return lp +end + +local calc_np_aux_glyph_common +do -- 002 --------------------------------------- + local min, max = math.min, math.max + local getwhd = node.direct.getwhd + local attr_jchar_class = luatexbase.attributes['ltj@charclass'] + local attr_jchar_code = luatexbase.attributes['ltj@charcode'] + local identifiers = fonts.hashes.identifiers + local function calc_np_notdef(lp) + local ident = identifiers[getfont(lp)] + if not ident.descriptions[getchar(lp)] then + local ln = node_next(lp) + if (ident.shared and ident.shared.features and ident.shared.features.notdef) + and ln and getid(ln)==id_glyph then + set_attr(lp, attr_icflag, PROCESSED) + set_attr(ln, attr_jchar_code, has_attr(lp, attr_jchar_code) or getchar(lp)) + set_attr(ln, attr_jchar_class, has_attr(lp, attr_jchar_class) or 0) + Np.nuc, lp = ln, ln + end + end + return lp + end +function calc_np_aux_glyph_common(lp, acc_flag) + Np.nuc, Np.first = lp, (Np.first or lp) + if if_lang_ja(lp) then -- JAchar + Np.id = id_jglyph + local m, mc, cls = set_np_xspc_jachar(Np, lp) + local npi, npf + local w, h, d = getwhd(lp) + if w==0 and h==0 and d==0 then lp = calc_np_notdef(lp) end + lp, head, npi, npf = capsule_glyph(lp, m, mc[cls], head, tex_dir) + Np.first = (Np.first~=Np.nuc) and Np.first or npf or npi + Np.nuc = npi + return true, check_next_ickern(lp); + else --ALchar + Np.id = id_glyph + set_np_xspc_alchar(Np, getchar(lp), lp, 1) + -- loop + local first_glyph, last_glyph = lp + set_attr(lp, attr_icflag, PROCESSED); Np.last = lp + local y_adjust = has_attr(lp,attr_ablshift) or 0 + local node_depth = getfield(lp, 'depth') + min(y_adjust, 0) + local adj_depth = (y_adjust>0) and (getfield(lp, 'depth') + y_adjust) or 0 + setfield(lp, 'yoffset', getfield(lp, 'yoffset') - y_adjust) + lp = node_next(lp) + for lx in traverse(lp) do + local lai = get_attr_icflag(lx) + if lx==last or lai>=PACKED then + lp=lx; break + else + local lid = getid(lx) + if lid==id_glyph and not if_lang_ja(lx) then + -- 欧文文字 + last_glyph = lx; set_attr(lx, attr_icflag, PROCESSED); Np.last = lx + y_adjust = has_attr(lx,attr_ablshift) or 0 + node_depth = max(getfield(lx, 'depth') + min(y_adjust, 0), node_depth) + adj_depth = (y_adjust>0) and max(getfield(lx, 'depth') + y_adjust, adj_depth) or adj_depth + setfield(lx, 'yoffset', getfield(lx, 'yoffset') - y_adjust) + elseif lid==id_kern then + local ls = getsubtype(lx) + if ls==2 then -- アクセント用の kern + set_attr(lx, attr_icflag, PROCESSED) + lx = node_next(lx) -- lx: アクセント本体 + if getid(lx)==id_glyph then + setfield(lx, 'yoffset', getfield(lx, 'yoffset') - (has_attr(lx,attr_ablshift) or 0)) + else -- アクセントは上下にシフトされている + setfield(lx, 'shift', getfield(lx, 'shift') + (has_attr(lx,attr_ablshift) or 0)) + end + lx = node_next(node_next(lx)) + elseif ls==0 then + Np.last = lx + elseif (ls==3) or (lai==ITALIC) then + Np.last = lx; set_attr(lx, attr_icflag, IC_PROCESSED) + else + lp=lx; break + end + else + lp=lx; break + end + end + end + local r + if adj_depth>node_depth then + r = node_new(id_rule,3) + setfield(r, 'width', 0); setfield(r, 'height', 0) + setfield(r, 'depth',adj_depth); setfield(r, 'dir', tex_dir) + set_attr(r, attr_icflag, PROCESSED) + end + if last_glyph then + Np.last_char = last_glyph + if r then insert_after(head, first_glyph, r) end + else + local npn = Np.nuc + Np.last_char = npn + if r then + local nf, nc = getfont(npn), getchar(npn) + local ct = (font.getfont(nf) or font.fonts[nf] ).characters[nc] + if not ct then -- variation selector + node_free(r) + elseif (ct.left_protruding or 0) == 0 then + head = insert_before(head, npn, r) + Np.first = acc_flag and Np.first or ((Np.first==npn) and r or npn) + elseif (ct.right_protruding or 0) == 0 then + insert_after(head, npn, r); Np.last, lp = r, r + else + ltjb.package_warning_no_line( + 'luatexja', + 'Check depth of glyph node ' .. tostring(npn) .. '(font=' .. nf + .. ', char=' .. nc .. '), because its \\lpcode is ' .. tostring(ct.left_protruding) + .. ' and its \\rpcode is ' .. tostring(ct.right_protruding) + ); node_free(r) + end + end + end + return true, lp + end +end +end -- 002 --------------------------------------- +local calc_np_auxtable +do -- 002 --------------------------------------- +local ltjw_apply_ashift_math = ltjw.apply_ashift_math +local ltjw_apply_ashift_disc = ltjw.apply_ashift_disc +local node_end_of_math = node.direct.end_of_math +local dir_tate = luatexja.dir_table.dir_tate +local sid_start_link = node.subtype('pdf_start_link') +local sid_start_thread = node.subtype('pdf_start_thread') +local sid_end_link = node.subtype('pdf_end_link') +local sid_end_thread = node.subtype('pdf_end_thread') +calc_np_auxtable = { + [id_glyph] = calc_np_aux_glyph_common, + [id_hlist] = function(lp) + local op, flag + head, lp, op, flag = ltjd_make_dir_whatsit(head, lp, list_dir, 'jfm hlist') + set_attr(op, attr_icflag, PROCESSED) + Np.first = Np.first or op; Np.last = op; Np.nuc = op; + if (flag or getfield(op, 'shift')~=0) then + Np.id = id_box_like + else + Np.id = id_hlist + Np.last_char = check_box_high(Np, getlist(op), nil) + end + return true, lp + end, + [id_vlist] = function(lp) + local op + head, lp, op = ltjd_make_dir_whatsit(head, lp, list_dir, 'jfm:' .. getid(lp)) + Np.first = Np.first or op; Np.last = op; Np.nuc = op; + Np.id = id_box_like; + return true, lp + end, + box_like = function(lp) + Np.first = Np.first or lp; Np.last = lp; Np.nuc = lp; + Np.id = id_box_like; + return true, node_next(lp) + end, + [id_whatsit] = function(lp) + local lps = getsubtype(lp) + if lps==sid_user then + if getfield(lp, 'user_id')==luatexja.userid_table.IHB then + local lq = node_next(lp); + head = node_remove(head, lp); node_free(lp); non_ihb_flag = false + return false, lq; + elseif getfield(lp, 'user_id')==luatexja.userid_table.JA_AL_BDD then + local lq = node_next(lp); + head = node_remove(head, lp); node_free(lp) + return false, lq; + else + set_attr(lp, attr_icflag, PROCESSED) + luatexbase.call_callback("luatexja.jfmglue.whatsit_getinfo", + Np, lp, Nq) + if Np.nuc then + Np.id = id_pbox_w; Np.first = Np.nuc; Np.last = Np.nuc; + return true, node_next(lp) + else + return false, node_next(lp) + end + end + else + -- we do special treatment for these whatsit nodes. + if lps == sid_start_link or lps == sid_start_thread then + Np.first = lp + elseif lps == sid_end_link or lps == sid_end_thread then + Np.first, Nq.last = nil, lp; + end + set_attr(lp, attr_icflag, PROCESSED) + return false, node_next(lp) + end + end, + [id_math] = function(lp) + Np.first, Np.nuc = (Np.first or lp), lp; + set_attr(lp, attr_icflag, PROCESSED) + set_np_xspc_alchar(Np, -1, lp) + local end_math = node_end_of_math(lp) + ltjw_apply_ashift_math(lp, end_math, attr_ablshift) + set_attr(end_math, attr_icflag, PROCESSED) + Np.last, Np.id = end_math, id_math; + return true, node_next(end_math); + end, + [id_glue] = function(lp) + Np.first, Np.nuc, Np.last = (Np.first or lp), lp, lp; + Np.id = getid(lp); set_attr(lp, attr_icflag, PROCESSED) + return true, node_next(lp) + end, + [id_disc] = function(lp) + Np.first, Np.nuc, Np.last = (Np.first or lp), lp, lp; + Np.id = getid(lp); set_attr(lp, attr_icflag, PROCESSED) + ltjw_apply_ashift_disc(lp, (list_dir==dir_tate), tex_dir) + Np.last_char = check_box_high(Np, getfield(lp, 'replace'), nil) + return true, node_next(lp) + end, + [id_kern] = function(lp) + if getsubtype(lp)==2 then + Np.first = Np.first or lp + set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp) + if getid(lp)==id_glyph then -- アクセント本体 + setfield(lp, 'yoffset', getfield(lp, 'yoffset') - (has_attr(lp,attr_ablshift) or 0)) + else -- アクセントは上下にシフトされている + setfield(lp, 'shift', getfield(lp, 'shift') + (has_attr(lp,attr_ablshift) or 0)) + end + set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp) + set_attr(lp, attr_icflag, PROCESSED); lp = node_next(lp) + set_attr(lp, attr_icflag, PROCESSED); + return calc_np_aux_glyph_common(lp, true) + else + Np.first = Np.first or lp + Np.id = id_kern; set_attr(lp, attr_icflag, PROCESSED) + Np.last = lp; return true, node_next(lp) + end + end, + [id_penalty] = function(lp) + Bp[#Bp+1] = lp; set_attr(lp, attr_icflag, PROCESSED) + return false, node_next(lp) + end, +} +end -- 002 --------------------------------------- +calc_np_auxtable[id_rule] = calc_np_auxtable.box_like +calc_np_auxtable[15] = calc_np_auxtable.box_like + +local function calc_np_aux_skip (lp) + set_attr(lp, attr_icflag, PROCESSED) + return false, node_next(lp) +end + +function calc_np(last, lp) + local k + -- We assume lp = node_next(Np.last) + Np, Nq, non_ihb_flag = Nq, Np, true + -- We clear `predefined' entries of Np before pairs() loop, + -- because using only pairs() loop is slower. + Np.post, Np.pre, Np.xspc = nil, nil, nil + Np.first, Np.id, Np.last, Np.met, Np.class= nil, nil, nil, nil + Np.auto_kspc, Np.auto_xspc, Np.char, Np.nuc = nil, nil, nil, nil + for k in pairs(Np) do Np[k] = nil end + + for k = 1,#Bp do Bp[k] = nil end + while lp ~= last do + local lpa = has_attr(lp, attr_icflag) or 0 + -- unbox 由来ノードの検出 + if lpa>=PACKED then + if lpa%PROCESSED_BEGIN_FLAG == BOXBDD then + local lq = node_next(lp) + head = node_remove(head, lp); node_free(lp); lp = lq + else + return calc_np_pbox(lp, last) + end -- id_pbox + else + k, lp = (calc_np_auxtable[getid(lp)] or calc_np_aux_skip)(lp) + if k then return lp end + end + end + Np=nil +end +end -- 001 ----------------------------------------------- + +-- extract informations from Np +-- We think that "Np is a Japanese character" if Np.met~=nil, +-- "Np is an alphabetic character" if Np.pre~=nil, +-- "Np is not a character" otherwise. +local after_hlist = nil -- global +local after_alchar, extract_np +do + local PRE = luatexja.stack_table_index.PRE + local POST = luatexja.stack_table_index.POST + local KCAT = luatexja.stack_table_index.KCAT + local XSP = luatexja.stack_table_index.XSP + local dir_tate = luatexja.dir_table.dir_tate + +-- 和文文字のデータを取得 + local attr_jchar_class = luatexbase.attributes['ltj@charclass'] + local attr_jchar_code = luatexbase.attributes['ltj@charcode'] + local attr_autospc = luatexbase.attributes['ltj@autospc'] + local attr_autoxspc = luatexbase.attributes['ltj@autoxspc'] + local getcomponents = node.direct.getcomponents + --local ltjf_get_vert_glyph = ltjf.get_vert_glyph + function set_np_xspc_jachar(Nx, x) + local m = ltjf_font_metric_table[getfont(x)] + local c, c_glyph = (not getcomponents(x) and ltjs_orig_char_table[x]), getchar(x) + if c and c~=c_glyph then set_attr(x, attr_jchar_code, c) end + c = c or c_glyph + local cls = slow_find_char_class(c, m, c_glyph) + Nx.met, Nx.class, Nx.char = m, cls, c; + local mc = m.char_type; Nx.char_type = mc + if cls~=0 then set_attr(x, attr_jchar_class, cls) end + Nx.pre = table_current_stack[PRE + c] or 0 + Nx.post = table_current_stack[POST + c] or 0 + Nx.xspc = table_current_stack[XSP + c] or 3 + Nx.kcat = table_current_stack[KCAT + c] or 0 + Nx.auto_kspc, Nx.auto_xspc = (has_attr(x, attr_autospc)==1), (has_attr(x, attr_autoxspc)==1) + return m, mc, cls + end + function set_np_xspc_jachar_hbox(Nx, x) + local m = ltjf_font_metric_table[getfont(x)] + local c = has_attr(x, attr_jchar_code) or getchar(x) + Nx.met, Nx.char = m, c; Nx.class = has_attr(x, attr_jchar_class) or 0; + local mc = m.char_type; Nx.char_type = mc + Nx.pre = table_current_stack[PRE + c] or 0 + Nx.post = table_current_stack[POST + c] or 0 + Nx.xspc = table_current_stack[XSP + c] or 3 + Nx.kcat = table_current_stack[KCAT + c] or 0 + Nx.auto_kspc, Nx.auto_xspc = (has_attr(x, attr_autospc)==1), (has_attr(x, attr_autoxspc)==1) + end + +-- 欧文文字のデータを取得 + local floor = math.floor + local nullfunc = function(n) return n end + function set_np_xspc_alchar(Nx, c,x, lig) + if c~=-1 then + local f = (lig ==1) and nullfunc or node_tail + local xc, xs = getcomponents(x), getsubtype(x) + while xc and xs and xs%4>=2 do + x = f(xc); + if getid(x)==id_disc then x, xc, xs = nil, getfield(x,'replace'), 2 + else xc, xs = getcomponents(x), getsubtype(x) end + end + c = x and getchar(x) or c + Nx.pre = table_current_stack[PRE + c] or 0 + Nx.post = table_current_stack[POST + c] or 0 + else + Nx.pre, Nx.post = 0, 0 + end + Nx.met = nil + Nx.xspc = table_current_stack[XSP + c] or 3 + Nx.auto_xspc = (has_attr(x, attr_autoxspc)==1) + end + local set_np_xspc_alchar = set_np_xspc_alchar + + -- change the information for the next loop + -- (will be done if Nx is an alphabetic character or a hlist) + after_hlist = function (Nx) + local s = Nx.last_char + if s then + if getid(s)==id_glyph then + if if_lang_ja(s) then + set_np_xspc_jachar_hbox(Nx, s) + else + set_np_xspc_alchar(Nx, getchar(s), s, 2) + end + else + set_np_xspc_alchar(Nx, -1, s) + end + else + Nx.pre, Nx.met = nil, nil + end + end + + after_alchar = function (Nx) + local x = Nx.last_char + return set_np_xspc_alchar(Nx, getchar(x), x, 2) + end + +end + +-------------------- 最下層の処理 + +luatexbase.create_callback('luatexja.adjust_jfmglue', 'simple', function(n) return n end) + +-- change penalties (or create a new penalty, if needed) +local function handle_penalty_normal(post, pre, g) + luatexbase.call_callback('luatexja.adjust_jfmglue', head, Nq, Np, Bp) + local a = (pre or 0) + (post or 0) + if #Bp == 0 then + if (a~=0 and not(g and getid(g)==id_kern)) then + local p = node_new(id_penalty) + if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end + setfield(p, 'penalty', a) + head = insert_before(head, Np.first, p) + Bp[1]=p; + set_attr(p, attr_icflag, KINSOKU) + end + else for _, v in pairs(Bp) do add_penalty(v,a) end + end +end + +local function handle_penalty_always(post, pre, g) + luatexbase.call_callback('luatexja.adjust_jfmglue', head, Nq, Np, Bp) + local a = (pre or 0) + (post or 0) + if #Bp == 0 then + if not (g and getid(g)==id_glue) or a~=0 then + local p = node_new(id_penalty) + if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end + setfield(p, 'penalty', a) + head = insert_before(head, Np.first, p) + Bp[1]=p + set_attr(p, attr_icflag, KINSOKU) + end + else for _, v in pairs(Bp) do add_penalty(v,a) end + end +end + +local function handle_penalty_suppress(post, pre, g) + luatexbase.call_callback('luatexja.adjust_jfmglue', head, Nq, Np, Bp) + if #Bp == 0 then + if g and getid(g)==id_glue then + local p = node_new(id_penalty) + setfield(p, 'penalty', 10000); head = insert_before(head, Np.first, p) + Bp[1]=p + set_attr(p, attr_icflag, KINSOKU) + end + else + local a = (pre or 0) + (post or 0) + for _, v in pairs(Bp) do add_penalty(v,a) end + end +end + +local function handle_penalty_jwp() + local a = table_current_stack[luatexja.stack_table_index.JWP] + if #widow_Bp == 0 then + if a~=0 then + local p = node_new(id_penalty) + if a<-10000 then a = -10000 elseif a>10000 then a = 10000 end + setfield(p, 'penalty', a) + head = insert_before(head, widow_Np.first, p) + widow_Bp[1]=p; + set_attr(p, attr_icflag, KINSOKU) + end + else for _, v in pairs(widow_Bp) do add_penalty(v,a) end + end +end + +-- 和文文字間の JFM glue を node 化 +local function new_jfm_glue(mc, bc, ac) +-- bc, ac: char classes + local g = mc[bc][ac] + if g then + if g[1] then + return node_copy(g[1]), g.ratio, false, false, false + else + local f = node_new(id_glue) + set_attr(f, attr_icflag, g.priority) + setglue(f, g.width, g.stretch, g.shrink) + return f, g.ratio, g.kanjiskip_natural, g.kanjiskip_stretch, g.kanjiskip_shrink + end + end + return false, 0 +end + +-- Nq.last (kern w) .... (glue/kern g) Np.first +local function real_insert(g) + if g then + head = insert_before(head, Np.first, g) + Np.first = g + end +end + + +-------------------- 和文文字間空白量の決定 +local calc_ja_ja_aux +do + local round = tex.round + local bg_ag = 2*id_glue - id_glue + local bg_ak = 2*id_glue - id_kern + local bk_ag = 2*id_kern - id_glue + local bk_ak = 2*id_kern - id_kern + + local function blend_diffmet(b, a, rb, ra) + return round(luatexja.jfmglue.diffmet_rule((1-rb)*b+rb*a, (1-ra)*b+ra*a)) + end + calc_ja_ja_aux = function (gb, ga, db, da) + if luatexja.jfmglue.diffmet_rule ~= math.two_pleft and diffmet_rule ~= math.two_pright + and luatexja.jfmglue.diffmet_rule ~= math.two_paverage then + db, da = 0, 1 + end + if not gb then + if ga then + gb = node_new(id_kern, 1); setfield(gb, 'kern', 0) + else return nil end + elseif not ga then + ga = node_new(id_kern, 1); setfield(ga, 'kern', 0) + end + + local k = 2*getid(gb) - getid(ga) + if k == bg_ag then + -- 両方とも glue. + setglue(gb, blend_diffmet( + getfield(gb, 'width'), getfield(ga, 'width'), db, da), + blend_diffmet( + getfield(gb, 'stretch'), getfield(ga, 'stretch'), db, da), + -blend_diffmet( + -getfield(gb, 'shrink'), -getfield(ga, 'shrink'), db, da)) + node_free(ga) + return gb + elseif k == bk_ak then + -- 両方とも kern. + setfield(gb, 'kern', blend_diffmet( + getfield(gb, 'kern'), getfield(ga, 'kern'), db, da)) + node_free(ga) + return gb + elseif k == bk_ag then + -- gb: kern, ga: glue + setglue(ga, blend_diffmet( + getfield(gb, 'kern'), getfield(ga, 'width'), db, da), + blend_diffmet( + 0, getfield(ga, 'stretch'), db, da), + -blend_diffmet( + 0, -getfield(ga, 'shrink'), db, da)) + node_free(gb) + return ga, 0, 0, 0 + else + -- gb: glue, ga: kern + setglue(gb, blend_diffmet( + getfield(gb, 'width'), getfield(ga, 'kern'), db, da), + blend_diffmet( + getfield(gb, 'stretch'), 0, db, da), + -blend_diffmet( + -getfield(gb, 'shrink'), 0, db, da)) + node_free(ga) + return gb + end + end +end + +local null_skip_table = {0, 0, 0} +-- get kanjiskip +local get_kanjiskip, kanjiskip_jfm_flag +local get_kanjiskip_low +local calc_ja_ja_glue +do + local KANJI_SKIP = luatexja.icflag_table.KANJI_SKIP + local KANJI_SKIP_JFM = luatexja.icflag_table.KANJI_SKIP_JFM + + get_kanjiskip_low = function(flag, qm, bn, bp, bh) + if flag or (qm.with_kanjiskip and (bn or bp or bh)) then + if kanjiskip_jfm_flag then + local g = node_new(id_glue); + local bk = qm.kanjiskip or null_skip_table + setglue(g, bn and (bn*bk[1]) or 0, + bp and (bp*bk[2]) or 0, + bh and (bh*bk[3]) or 0, 0, 0) + set_attr(g, attr_icflag, KANJI_SKIP_JFM) + return g + elseif flag then + return node_copy(kanji_skip) + else + local g = node_new(id_glue); + setglue(g, + bn and (bn*getfield(kanji_skip, 'width')) or 0, + bp and (bp*getfield(kanji_skip, 'stretch')) or 0, + bh and (bh*getfield(kanji_skip, 'shrink')) or 0, + 0, 0) + set_attr(g, attr_icflag, KANJI_SKIP_JFM) + return g + end + end + end + + get_kanjiskip = function() + if Np.auto_kspc==0 or Nq.auto_kspc==0 then + return nil + elseif Np.auto_kspc or Nq.auto_kspc then + local pm, qm = Np.met, Nq.met + if (pm.char_type==qm.char_type) and (qm.var==pm.var) then + return get_kanjiskip_low(true, qm, 1, 1, 1) + else + local gb = get_kanjiskip_low(true, qm, 1, 1, 1) + local ga = get_kanjiskip_low(true, pm, 1, 1, 1) + return calc_ja_ja_aux(gb, ga, 0, 1) + end + else + local g = node_new(id_glue) + set_attr(g, attr_icflag, kanjiskip_jfm_flag and KANJI_SKIP_JFM or KANJI_SKIP) + return g + end + end + + calc_ja_ja_glue = function () + local qm, pm = Nq.met, Np.met + local qmc, pmc = qm.char_type, pm.char_type + if (qmc==pmc) and (qm.var==pm.var) then + local g, _, kn, kp, kh = new_jfm_glue(qmc, Nq.class, Np.class) + return g, (Np.auto_kspc or Nq.auto_kspc) and get_kanjiskip_low(false, qm, kn, kp, kh) + else + local npn, nqn = Np.nuc, Nq.nuc + local gb, db, bn, bp, bh + = new_jfm_glue(qmc, Nq.class, + slow_find_char_class(Np.char, + qm, getchar(npn))) + local ga, da, an, ap, ah + = new_jfm_glue(pmc, + slow_find_char_class(Nq.char, + pm, getchar(nqn)), + Np.class) + local g = calc_ja_ja_aux(gb, ga, db, da) + local k + if (pmc==qmc) and (qm.var==pm.var) then + gb = get_kanjiskip_low(false, qm, bn, bp, bh) + ga = get_kanjiskip_low(false, pm, an, ap, ah) + k = calc_ja_ja_aux(gb, ga, db, da) + end + return g, k + end + end +end + +-------------------- 和欧文間空白量の決定 + +-- get xkanjiskip +local get_xkanjiskip, xkanjiskip_jfm_flag +local get_xkanjiskip_normal, get_xkanjiskip_jfm +local get_xkanjiskip_low +do + local XKANJI_SKIP = luatexja.icflag_table.XKANJI_SKIP + local XKANJI_SKIP_JFM = luatexja.icflag_table.XKANJI_SKIP_JFM + + get_xkanjiskip_low = function(flag, qm, bn, bp, bh) + if flag or (qm.with_kanjiskip and (bn or bp or bh)) then + if xkanjiskip_jfm_flag then + local g = node_new(id_glue); + local bk = qm.xkanjiskip or null_skip_table + setglue(g, bn and bk[1] or 0, + bp and bk[2] or 0, + bh and bk[3] or 0, 0, 0) + set_attr(g, attr_icflag, XKANJI_SKIP_JFM) + return g + elseif flag then + return node_copy(xkanji_skip) + else + local g = node_new(id_glue); + setglue(g, + bn and (bn*getfield(xkanji_skip, 'width')) or 0, + bp and (bp*getfield(xkanji_skip, 'stretch')) or 0, + bh and (bh*getfield(xkanji_skip, 'shrink')) or 0, + 0, 0) + set_attr(g, attr_icflag, XKANJI_SKIP_JFM) + return g + end + end + end + + get_xkanjiskip = function(Nn) + if Np.auto_xspc==0 or Nq.auto_xspc==0 then + return nil + elseif (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then + return get_xkanjiskip_low(true, Nn.met, 1, 1, 1) + else + local g = node_new(id_glue) + set_attr(g, attr_icflag, xkanjiskip_jfm_flag and XKANJI_SKIP_JFM or XKANJI_SKIP) + return g + end + end +end + +-------------------- 隣接した「塊」間の処理 + +local function combine_spc(name) + return (Np[name] or Nq[name]) and ((Np[name]~=0) and (Nq[name]~=0)) +end + +-- NA, NB: alchar or math +local function get_NA_skip() + local pm = Np.met + local g, _, kn, kp, kh = new_jfm_glue( + pm.char_type, + fast_find_char_class( + (Nq.id == id_math and -1 or (Nq.xspc>=2 and 'alchar' or 'nox_alchar')), pm), + Np.class) + local k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc')) + and get_xkanjiskip_low(false, pm, kn, kp, kh) + return g, k +end +local function get_NB_skip() + local qm = Nq.met + local g, _, kn, kp, kh = new_jfm_glue( + qm.char_type, Nq.class, + fast_find_char_class( + (Np.id == id_math and -1 or (Np.xspc%2==1 and 'alchar' or 'nox_alchar')), qm) + ) + local k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc')) + and get_xkanjiskip_low(false, qm, kn, kp, kh) + return g, k +end + +local function get_OA_skip(is_kanji) + local pm = Np.met + local g, _, kn, kp, kh = new_jfm_glue( + pm.char_type, + fast_find_char_class( + (((Nq.id==id_glue)or(Nq.id==id_kern)) and 'glue' or 'jcharbdd'), pm), + Np.class) + local k + if is_kanji==0 then + k = combine_spc('auto_kspc') and get_kanjiskip_low(false, pm, kn, kp, kh) + end + return g, k +end +local function get_OB_skip(is_kanji) + local qm = Nq.met + local g, _, kn, kp, kh = new_jfm_glue( + qm.char_type, Nq.class, + fast_find_char_class( + (((Np.id==id_glue)or(Np.id==id_kern)) and 'glue' or 'jcharbdd'), qm)) + local k + if is_kanji==0 then + k = combine_spc('auto_kspc') and get_kanjiskip_low(false, qm, kn, kp, kh) + end + return g, k +end + +-- (anything) .. jachar +local function handle_np_jachar(mode) + local qid = Nq.id + if qid==id_jglyph or ((qid==id_pbox or qid==id_pbox_w) and Nq.met) then + local g, k + if non_ihb_flag then g, k = calc_ja_ja_glue() end -- M->K + if not g then g = get_kanjiskip() end + handle_penalty_normal(Nq.post, Np.pre, g); + real_insert(g); real_insert(k) + elseif Nq.met then -- qid==id_hlist + local g, k + if non_ihb_flag then g, k = get_OA_skip(0) end -- O_A->K + if not g then g = get_kanjiskip() end + handle_penalty_normal(0, Np.pre, g); real_insert(g); real_insert(k) + elseif Nq.pre then + local g, k + if non_ihb_flag then g, k = get_NA_skip() end -- N_A->X + if not g then g = get_xkanjiskip(Np) end + handle_penalty_normal((qid==id_hlist and 0 or Nq.post), Np.pre, g); + real_insert(g); real_insert(k) + else + local g = non_ihb_flag and (get_OA_skip()) -- O_A + if qid==id_glue then handle_penalty_normal(0, Np.pre, g) + elseif qid==id_kern then handle_penalty_suppress(0, Np.pre, g) + else handle_penalty_always(0, Np.pre, g) + end + real_insert(g) + end + if mode and Np.kcat%2~=1 then + widow_Np.first, widow_Bp, Bp = Np.first, Bp, widow_Bp + end +end + + +-- jachar .. (anything) +local function handle_nq_jachar() + if Np.pre then + local g = non_ihb_flag and get_NB_skip() or get_xkanjiskip(Nq) -- N_B->X + handle_penalty_normal(Nq.post, (Np.id==id_hlist and 0 or Np.pre), g); real_insert(g) + else + local g =non_ihb_flag and (get_OB_skip()) -- O_B + if Np.id==id_glue then handle_penalty_normal(Nq.post, 0, g) + elseif Np.id==id_kern then handle_penalty_suppress(Nq.post, 0, g) + else handle_penalty_always(Nq.post, 0, g) + end + real_insert(g) + end +end + +-- (anything) .. (和文文字で始まる hlist) +local function handle_np_ja_hlist() + local qid = Nq.id + if qid==id_jglyph or ((qid==id_pbox or qid == id_pbox_w) and Nq.met) then + local g = non_ihb_flag and get_OB_skip(0) or get_kanjiskip() -- O_B->K + handle_penalty_normal(Nq.post, 0, g); real_insert(g) + elseif Nq.met then -- Nq.id==id_hlist + local g = get_kanjiskip() -- K + handle_penalty_suppress(0, 0, g); real_insert(g) + elseif Nq.pre then + local g = get_xkanjiskip(Np) -- X + handle_penalty_suppress(0, 0, g); real_insert(g) + end +end + +-- (和文文字で終わる hlist) .. (anything) +local function handle_nq_ja_hlist() + if Np.pre then + local g = get_xkanjiskip(Nq) -- X + handle_penalty_suppress(0, 0, g); real_insert(g) + end +end + + +-- Nq が前側のクラスタとなることによる修正 +local adjust_nq +do + local adjust_nq_aux = { + [id_glyph] = function() after_alchar(Nq) end, -- after_alchar(Nq) + [id_hlist] = function() after_hlist(Nq) end, + [id_pbox] = function() after_hlist(Nq) end, + [id_disc] = function() after_hlist(Nq) end, + [id_pbox_w] = function() + luatexbase.call_callback("luatexja.jfmglue.whatsit_after", + false, Nq, Np) + end, + } + + adjust_nq=function() + local x = adjust_nq_aux[Nq.id] + if x then x() end + end +end + + +-------------------- 開始・終了時の処理 +do +local node_prev = node.direct.getprev +-- リスト末尾の処理 +local function handle_list_tail(mode, last) + adjust_nq() + if mode then + -- the current list is to be line-breaked. + -- Insert \jcharwidowpenalty + if widow_Np.first then handle_penalty_jwp() end + else + Np=Nq + -- the current list is the contents of a hbox + local npi, pm = Np.id, Np.met + if npi == id_jglyph or (npi==id_pbox and pm) then + local g = new_jfm_glue(pm.char_type, Np.class, fast_find_char_class('boxbdd', pm)) + if g then + set_attr(g, attr_icflag, BOXBDD) + head = insert_after(head, Np.last, g) + end + end + end +end + +-- リスト先頭の処理 +local function handle_list_head(par_indented) + local npi, pm = Np.id, Np.met + if npi == id_jglyph or (npi==id_pbox and pm) then + if non_ihb_flag then + local g = new_jfm_glue(pm.char_type, fast_find_char_class(par_indented, pm), Np.class) + if g then + set_attr(g, attr_icflag, BOXBDD) + if getid(g)==id_glue and #Bp==0 then + local h = node_new(id_penalty) + setfield(h, 'penalty', 10000); set_attr(h, attr_icflag, BOXBDD) + end + head = insert_before(head, Np.first, g) + end + end + end +end + +-- initialize +-- return value: (the initial cursor lp), (last node) +local init_var +do + local id_local = node.id('local_par') + local KANJI_SKIP = luatexja.icflag_table.KANJI_SKIP + local XKANJI_SKIP = luatexja.icflag_table.XKANJI_SKIP + local KSK = luatexja.stack_table_index.KSK + local XSK = luatexja.stack_table_index.XSK + local dir_yoko = luatexja.dir_table.dir_yoko + local dir_tate = luatexja.dir_table.dir_tate + local attr_yablshift = luatexbase.attributes['ltj@yablshift'] + local attr_tablshift = luatexbase.attributes['ltj@tablshift'] + local table_pool = { + {}, {}, {first=nil}, + { auto_kspc=nil, auto_xspc=nil, char=nil, class=nil, + first=nil, id=nil, last=nil, met=nil, nuc=nil, + post=nil, pre=nil, xspc=nil, }, + { auto_kspc=nil, auto_xspc=nil, char=nil, class=nil, + first=nil, id=nil, last=nil, met=nil, nuc=nil, + post=nil, pre=nil, xspc=nil, }, + } + init_var = function (mode,dir) + -- 1073741823: max_dimen + Bp, widow_Bp, widow_Np, Np, Nq + = table_pool[1], table_pool[2], table_pool[3], table_pool[4], table_pool[5] + for i=1,5 do for j,_ in pairs(table_pool[i]) do table_pool[i][j]=nil end end + table_current_stack = ltjs.table_current_stack + + list_dir, tex_dir = (ltjs.list_dir or dir_yoko), (dir or 'TLT') + local is_dir_tate = list_dir==dir_tate + capsule_glyph = is_dir_tate and ltjw.capsule_glyph_tate or ltjw.capsule_glyph_yoko + attr_ablshift = is_dir_tate and attr_tablshift or attr_yablshift + local TEMP = node_new(id_glue) + -- TEMP is a dummy node, which will be freed at the end of the callback. + -- ithout this node, set_attr(kanji_skip, ...) somehow creates an "orphaned" attribute list. + + do + kanji_skip, kanjiskip_jfm_flag = skip_table_to_glue(KSK) + set_attr(kanji_skip, attr_icflag, KANJI_SKIP) + end + + do + xkanji_skip, xkanjiskip_jfm_flag = skip_table_to_glue(XSK) + set_attr(xkanji_skip, attr_icflag, XKANJI_SKIP) + end + + if mode then + -- the current list is to be line-breaked: + -- hbox from \parindent is skipped. + local lp, par_indented, lpi, lps = head, 'boxbdd', getid(head), getsubtype(head) + while lp and + ((lpi==id_whatsit and lps~=sid_user) + or ((lpi==id_hlist) and (lps==3)) + or (lpi==id_local)) do + if (lpi==id_hlist) and (lps==3) then + Np.char, par_indented = 'parbdd', 'parbdd' + Np.width = getfield(lp, 'width') + end + lp=node_next(lp); lpi, lps = getid(lp), getsubtype(lp) end + return lp, node_tail(head), par_indented, TEMP + else + return head, nil, 'boxbdd', TEMP + end + end +end + +local ensure_tex_attr = ltjb.ensure_tex_attr +local function cleanup(mode, TEMP) + -- luatexja.ext_show_node_list(to_node(head), '> ', print) + -- adjust attr_icflag for avoiding error + if tex.getattribute(attr_icflag)~=0 then ensure_tex_attr(attr_icflag, 0) end + node_free(kanji_skip); + node_free(xkanji_skip); node_free(TEMP) + + if mode then + local h = node_next(head) + if getid(h) == id_penalty and getfield(h, 'penalty') == 10000 then + h = node_next(h) + if getid(h) == id_glue and getsubtype(h) == 15 and not node_next(h) then + return false + end + end + end + return head +end +-------------------- 外部から呼ばれる関数 + +-- main interface +function luatexja.jfmglue.main(ahead, mode, dir) + if not ahead then return ahead end + --luatexja.ext_show_node_list(to_node(ahead ), '>B ', print) + --print() + head = ahead; + local lp, last, par_indented, TEMP = init_var(mode,dir) + lp = calc_np(last, lp) + if Np then + handle_list_head(par_indented) + lp = calc_np(last,lp); + while Np do + adjust_nq(); + local pid, pm = Np.id, Np.met + -- 挿入部 + if pid == id_jglyph then + handle_np_jachar(mode) + elseif pm then + if pid==id_hlist then handle_np_ja_hlist() + else handle_np_jachar() end + elseif Nq.met then + if Nq.id==id_hlist then handle_nq_ja_hlist() + else handle_nq_jachar() end + end + lp = calc_np(last,lp) + end + handle_list_tail(mode, last) + end + --luatexja.ext_show_node_list(to_node(ahead ), '>A ', print) + --print() + return cleanup(mode, TEMP) +end +end + +do + local IHB = luatexja.userid_table.IHB + local BPAR = luatexja.userid_table.BPAR + local BOXB = luatexja.userid_table.BOXB + local node_prev = node.direct.getprev + local node_write = node.direct.write + + -- \inhibitglue + function luatexja.jfmglue.create_inhibitglue_node() + local tn = node_new(id_whatsit, sid_user) + setfield(tn, 'user_id', IHB) + setfield(tn, 'type', 100) + setfield(tn, 'value', 1) + node_write(tn) + end + + -- Node for indicating beginning of a paragraph + -- (for ltjsclasses) + function luatexja.jfmglue.create_beginpar_node() + local tn = node_new(id_whatsit, sid_user) + setfield(tn, 'user_id', BPAR) + setfield(tn, 'type', 100) + setfield(tn, 'value', 1) + node_write(tn) + end + + -- Node for indicating a head/end of a box + function luatexja.jfmglue.create_boxbdd_node() + local tn = node_new(id_whatsit, sid_user) + setfield(tn, 'user_id', BOXB) + setfield(tn, 'type', 100) + setfield(tn, 'value', 1) + node_write(tn) + end + + local function whatsit_callback(Np, lp, Nq) + if Np and Np.nuc then return Np + elseif Np and getfield(lp, 'user_id') == BPAR then + Np.first = lp; Np.nuc = lp; Np.last = lp + return Np + elseif Np and getfield(lp, 'user_id') == BOXB then + Np.first = lp; Np.nuc = lp; Np.last = lp + if Nq then + if Nq.met then + Np.class = fast_find_char_class('boxbdd', Nq.met) + end + Np.met = Nq.met; Np.pre = 0; Np.post = 0; Np.xspc = 0 + Np.auto_xspc, Np.auto_kspc = 0, 0 + end + return Np + else + return Np + end + end + + local function whatsit_after_callback(s, Nq, Np) + if not s and getfield(Nq.nuc, 'user_id') == BPAR then + local x, y = node_prev(Nq.nuc), Nq.nuc + Nq.first, Nq.nuc, Nq.last = x, x, x + if Np then + if Np.met then + Nq.class = fast_find_char_class('parbdd', Np.met) + end + Nq.met = Np.met; Nq.pre = 0; Nq.post = 0; Nq.xspc = 0 + Nq.auto_xspc, Nq.auto_kspc = 0, 0 + end + head = node_remove(head, y) + node_free(y) + elseif not s and getfield(Nq.nuc, 'user_id') == BOXB then + local x, y = node_prev(Nq.nuc), Nq.nuc + Nq.first, Nq.nuc, Nq.last = x, x, x + if Np then + if Np.met then + Nq.class = fast_find_char_class('boxbdd', Np.met) + end + Nq.met = Np.met; Nq.pre = 0; Nq.post = 0; Nq.xspc = 0 + Nq.auto_xspc, Nq.auto_kspc = 0, 0 + end + head = node_remove(head, y) + node_free(y) + end + return s + end + + luatexbase.add_to_callback("luatexja.jfmglue.whatsit_getinfo", whatsit_callback, + "luatexja.beginpar.np_info", 1) + luatexbase.add_to_callback("luatexja.jfmglue.whatsit_after", whatsit_after_callback, + "luatexja.beginpar.np_info_after", 1) + +end + +luatexja.jfmglue.after_hlist = after_hlist +luatexja.jfmglue.check_box_high = check_box_high diff --git a/macros/luatex/generic/luatexja/src/ltj-jfont.lua b/macros/luatex/generic/luatexja/src/ltj-jfont.lua new file mode 100644 index 0000000000..82e2808e5a --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-jfont.lua @@ -0,0 +1,1028 @@ +-- +-- luatexja/jfont.lua +-- +luatexbase.provides_module({ + name = 'luatexja.jfont', + date = '2019/07/08', + description = 'Loader for Japanese fonts', +}) + +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('charrange'); local ltjc = luatexja.charrange +luatexja.load_module('rmlgbm'); local ltjr = luatexja.rmlgbm +luatexja.load_module('direction'); local ltjd = luatexja.direction + +local setfield = node.direct.setfield +local getid = node.direct.getid +local to_direct = node.direct.todirect + +local node_new = node.direct.new +local node_free = node.direct.free +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local round = tex.round +local font_getfont = font.getfont + +local attr_icflag = luatexbase.attributes['ltj@icflag'] +local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] +local attr_curtfnt = luatexbase.attributes['ltj@curtfnt'] +local id_glyph = node.id('glyph') +local id_kern = node.id('kern') +local cat_lp = luatexbase.catcodetables['latex-package'] +local FROM_JFM = luatexja.icflag_table.FROM_JFM + +luatexja.jfont = luatexja.jfont or {} +------------------------------------------------------------------------ +-- LOADING JFM +------------------------------------------------------------------------ + +local metrics={} -- this table stores all metric informations +local font_metric_table={} -- [font number] -> jfm_name, jfm_var, size + +luatexbase.create_callback("luatexja.load_jfm", "data", function (ft, jn) return ft end) + +local jfm_file_name, jfm_var, jfm_ksp +local defjfm_res +local jfm_dir, is_def_jfont, vert_activated, auto_enable_vrt2 + +local function norm_val(a) + if (not a) or (a==0.) then + return nil + elseif a==true then + return 1 + else + return a + end +end + +local fastcopy=table.fastcopy +function luatexja.jfont.define_jfm(to) + local t = fastcopy(to) + local real_char -- Does current character class have the 'real' character? + if t.dir~=jfm_dir then + defjfm_res= nil; return + elseif type(t.zw)~='number' or type(t.zh)~='number' then + defjfm_res= nil; return + end + t.version = (type(t.version)=='number') and t.version or 1 + t.char_type = {}; t.chars = {} + for i,v in pairs(t) do + if type(i) == 'number' then -- char_type + if not v.chars then + if i ~= 0 then defjfm_res= nil; return end + else + for j,w in pairs(v.chars) do + if type(w) == 'number' and w~=-1 then + elseif type(w) == 'string' and utf.len(w)==1 then + w = utf.byte(w) + elseif type(w) == 'string' and utf.len(w)==2 and utf.sub(w,2) == '*' then + w = utf.byte(utf.sub(w,1,1)) + end + if not t.chars[w] then + t.chars[w] = i + else + defjfm_res= nil; return + end + end + v.chars = nil + end + if type(v.align)~='string' then + v.align = 'left' -- left + end + if type(v.width)~='number' then + v.width = nil + end + if type(v.height)~='number' then + v.height = (jfm_dir=='tate') and 0.0 + end + if type(v.depth)~='number' then + v.depth = (jfm_dir=='tate') and 0.0 + end + if type(v.italic)~='number' then + v.italic = 0.0 + end + if type(v.left)~='number' then + v.left = 0.0 + end + if type(v.down)~='number' then + v.down = 0.0 + end + if t.version>=2 then + if v.end_stretch then defjfm_res= nil; return end + if v.end_shrink then defjfm_res= nil; return end + if v.end_adjust then + if type(v.end_adjust)~='table' then + v.end_adjust = nil + elseif #(v.end_adjust)==0 then + v.end_adjust = nil + else + table.sort(v.end_adjust) + end + end + else + v.end_adjust = nil + if v.end_stretch and v.end_stretch~=0.0 then + v.end_adjust = (v.end_adjust or {}) + v.end_adjust[#(v.end_adjust)+1] = v.end_stretch + end + if v.end_shrink and v.end_ahrink~=0.0 then + v.end_adjust = (v.end_adjust or {}) + v.end_adjust[#(v.end_adjust)+1] = -v.end_shrink + end + if v.end_adjust then v.end_adjust[#(v.end_adjust)+1] = 0.0 end + end + v.kern = v.kern or {}; v.glue = v.glue or {} + for j,x in pairs(v.glue) do + if v.kern[j] then defjfm_res= nil; return end + x.ratio, x[5] = (x.ratio or (x[5] and 0.5*(1+x[5]) or 0.5)), nil + do + local xp + xp, x[4] = (x.priority or x[4]), nil + if type(xp)=='table' and t.version>=2 then + if type(xp[1])~='number' or xp[1]<-4 or xp[1]>3 then defjfm_res=nil end -- stretch + if type(xp[2])~='number' or xp[2]<-4 or xp[2]>3 then defjfm_res=nil end -- shrink + xp = (xp[1]+4)*8+(xp[2]+4) + elseif xp and type(xp)~='number' then + defjfm_res = nil + else + xp = (xp or 0)*9+36 + if xp<0 or xp>=64 then defjfm_res=nil end + end + x.priority = xp + end + x.kanjiskip_natural = norm_val(x.kanjiskip_natural) + x.kanjiskip_stretch = norm_val(x.kanjiskip_stretch) + x.kanjiskip_shrink = norm_val(x.kanjiskip_shrink) + end + for j,x in pairs(v.kern) do + if type(x)=='number' then + v.kern[j] = {x, 0.5} + elseif type(x)=='table' then + v.kern[j] = { x[1], (x.ratio or (x[2] and 0.5*(1+x[2]) or 0.5)) } + end + end + t.char_type[i] = v + t[i] = nil + end + end + if t.version<3 then + -- In version 3, 'jcharbdd' is divided into + -- 'alchar': ALchar (or math boundary) + -- 'nox_alchar': ALchar (or math boundary), where xkanjiskip won't inserted + -- 'glue': glue/kern, 'jcharbdd': other cases (和文B, rule, ...) + t.chars.alchar = t.chars.jcharbdd + t.chars.nox_alchar = t.chars.jcharbdd + t.chars.glue = t.chars.jcharbdd + end + t = luatexbase.call_callback("luatexja.load_jfm", t, jfm_file_name) + t.size_cache = {} + defjfm_res = t +end + +local update_jfm_cache +do + local floor = math.floor + local function myround(a) return floor(a+0.5) end + local function mult_table(old,scale) -- modified from table.fastcopy + if old then + local new = { } + for k,v in next, old do + if type(v) == "table" then + new[k] = mult_table(v,scale) + elseif type(v) == "number" then + new[k] = myround(v*scale) + else + new[k] = v + end + end + return new + else return nil end + end + local size_cache_num = 1 + update_jfm_cache = function (j,sz) + if metrics[j].size_cache[sz] then return metrics[j].size_cache[sz].index end + local t = {} + metrics[j].size_cache[sz] = t + t.chars = metrics[j].chars + t.char_type = mult_table(metrics[j].char_type, sz) + for i,v in pairs(t.char_type) do + v.align = (v.align=='left') and 0 or + ((v.align=='right') and 1 or 0.5) + if type(i) == 'number' then -- char_type + for k,w in pairs(v.glue) do + v[k] = { + nil, + ratio=w.ratio/sz, + priority=FROM_JFM + w.priority/sz, + width = w[1], stretch = w[2], shrink = w[3], + kanjiskip_natural = w.kanjiskip_natural and w.kanjiskip_natural/sz, + kanjiskip_stretch = w.kanjiskip_stretch and w.kanjiskip_stretch/sz, + kanjiskip_shrink = w.kanjiskip_shrink and w.kanjiskip_shrink/sz, + } + end + for k,w in pairs(v.kern) do + local g = node_new(id_kern, 1) + setfield(g, 'kern', w[1]) + set_attr(g, attr_icflag, FROM_JFM) + v[k] = {g, ratio=w[2]/sz} + end + end + v.glue, v.kern = nil, nil + end + t.kanjiskip = mult_table(metrics[j].kanjiskip, sz) + t.xkanjiskip = mult_table(metrics[j].xkanjiskip,sz) + t.zw = round(metrics[j].zw*sz) + t.zh = round(metrics[j].zh*sz) + t.size = sz + size_cache_num = size_cache_num + 1 + t.index = size_cache_num + return size_cache_num + end +end + +luatexbase.create_callback("luatexja.find_char_class", "data", + function (arg, fmtable, char) + return 0 + end) +local find_char_class +do + local start_time_measure = ltjb.start_time_measure + local stop_time_measure = ltjb.stop_time_measure + local fcc_temp = { chars_cbcache = {} } + setmetatable( + fcc_temp.chars_cbcache, + { + __index = function () return 0 end, + }) + function find_char_class(c,m) + -- c: character code, m: + local r = (m or fcc_temp).chars_cbcache[c] + if not r then + r = m.chars[c] or + luatexbase.call_callback("luatexja.find_char_class", 0, m, c) + m.chars_cbcache[c or 0] = r + end + return r + end +end + + +------------------------------------------------------------------------ +-- LOADING JAPANESE FONTS +------------------------------------------------------------------------ + +local load_jfont_metric +do + local cstemp + local global_flag -- true if \globaljfont, false if \jfont + load_jfont_metric = function() + if jfm_file_name=='' then + ltjb.package_error('luatexja', + 'no JFM specified', + 'To load and define a Japanese font, a JFM must be specified.'.. + "The JFM 'ujis' will be used for now.") + jfm_file_name='ujis' + end + for j,v in ipairs(metrics) do + if v.name==jfm_file_name then return j end + end + luatexja.load_lua('jfm-' .. jfm_file_name .. '.lua') + if defjfm_res then + defjfm_res.name = jfm_file_name + table.insert(metrics, defjfm_res) + return #metrics + else + return nil + end + end + +-- EXT + local utfbyte = utf.byte + function luatexja.jfont.jfontdefX(g, dir, csname) + jfm_dir, is_def_jfont = dir, true + cstemp = csname:sub( (utfbyte(csname,1,1) == tex.escapechar) and 2 or 1, -1) + cstemp = cstemp:sub(1, ((cstemp:sub(-1,-1)==' ') and (cstemp:len()>=2)) and -2 or -1) + global_flag = g and '\\global' or '' + tex.sprint(cat_lp, '\\expandafter\\font\\csname ', + (cstemp==' ') and '\\space' or cstemp, '\\endcsname') + end + + luatexbase.create_callback("luatexja.define_jfont", "data", function (ft, fn) return ft end) + +-- EXT + local identifiers = fonts.hashes.identifiers + local provides_feature = luaotfload.aux.provides_feature + function luatexja.jfont.jfontdefY() + local j = load_jfont_metric(jfm_dir) + local fn = font.id(cstemp) + local f = font_getfont(fn) + if not j then + ltjb.package_error('luatexja', + "bad JFM `" .. jfm_file_name .. "'", + 'The JFM file you specified is not valid JFM file.\n'.. + 'So defining Japanese font is cancelled.') + tex.sprint(cat_lp, global_flag, '\\expandafter\\let\\csname ', + (cstemp==' ') and '\\space' or cstemp, + '\\endcsname=\\relax') + return + end + if not f then return end + update_jfm_cache(j, f.size) + local ad = identifiers[fn].parameters + local sz = metrics[j].size_cache[f.size] + local fmtable = { jfm = j, size = f.size, var = jfm_var, + with_kanjiskip = jfm_ksp, + zw = sz.zw, zh = sz.zh, + ascent = ad.ascender, + descent = ad.descender, + chars = sz.chars, char_type = sz.char_type, + kanjiskip = sz.kanjiskip, xkanjiskip = sz.xkanjiskip, + chars_cbcache = {}, + vert_activated = vert_activated, + } + local t = identifiers[fn] + if auto_enable_vrt2 then + local lang, scr = t.properties.language, t.properties.script + local vrt2_exist = provides_feature( + fn, t.properties.script, t.properties.language, 'vrt2' + ) + t.shared.features[vrt2_exist and 'vrt2' or 'vert'] = true + end + + --texio.write_nl('term and log', + --'JFNT\t' .. identifiers[fn].name .. '\t' .. identifiers[fn].size .. '\t' .. fn, '') + + fmtable = luatexbase.call_callback("luatexja.define_jfont", fmtable, fn) + font_metric_table[fn]=fmtable + tex.sprint(cat_lp, global_flag, '\\protected\\expandafter\\def\\csname ', + (cstemp==' ') and '\\space' or cstemp, '\\endcsname{\\ltj@cur'.. + (jfm_dir == 'yoko' and 'j' or 't') .. 'fnt', fn, '\\relax}') + jfm_file_name = nil + end +end + +do + local get_dir_count = ltjd.get_dir_count + local dir_tate = luatexja.dir_table.dir_tate + local tex_get_attr = tex.getattribute + -- PUBLIC function + function luatexja.jfont.get_zw() + local a = font_metric_table[ + tex_get_attr((get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)] + return a and a.zw or 0 + end + function luatexja.jfont.get_zh() + local a = font_metric_table[ + tex_get_attr((get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt)] + return a and a.zw or 0 + end +end + +do + local gmatch = string.gmatch + -- extract jfm_file_name and jfm_var + -- normalize position of 'jfm=' and 'jfmvar=' keys + local function extract_metric(name) + do + local nametemp + nametemp = name:match('^{(.*)}$') + if nametemp then name = nametemp + else + nametemp = name:match('^"(.*)"$') + name = nametemp or name + end + end + jfm_file_name = ''; jfm_var = ''; jfm_ksp = true + local tmp, index = name:sub(1, 5), 1 + if tmp == 'file:' or tmp == 'name:' or tmp == 'psft:' then + index = 6 + end + local p = name:find(":", index); index = p and (p+1) or index + while index do + local l = name:len()+1 + local q = name:find(";", index) or l + if name:sub(index, index+3)=='jfm=' and q>index+4 then + jfm_file_name = name:sub(index+4, q-1) + if l~=q then + name = name:sub(1,index-1) .. name:sub(q+1) + else + name = name:sub(1,index-1) + index = nil + end + elseif name:sub(index, index+6)=='jfmvar=' and q>index+6 then + jfm_var = name:sub(index+7, q-1) + if l~=q then + name = name:sub(1,index-1) .. name:sub(q+1) + else + name = name:sub(1,index-1) + index = nil + end + else + index = (l~=q) and (q+1) or nil + end + end + if jfm_file_name~='' then + local l = name:sub(-1) + name = name + .. ((l==':' or l==';') and '' or ';') + .. 'jfm=' .. jfm_file_name + if jfm_var~='' then + name = name .. ';jfmvar=' .. jfm_var + end + end + for x in gmatch (name, "[:;]([+%%-]?)ltjks") do + jfm_ksp = not (x=='-') + end + if jfm_dir == 'tate' then + vert_activated = (not name:match('[:;]%-vert')) and (not name:match('[:;]%-vrt2')) + auto_enable_vrt2 + = (not name:match('[:;][+%-]?vert')) and (not name:match('[:;][+%-]?vrt2')) + else + vert_activated, auto_enable_vrt2 = nil, nil + end + return name + end + + -- define_font callback + local otfl_fdr + local ltjr_font_callback = ltjr.font_callback + function luatexja.font_callback(name, size, id) + local new_name = is_def_jfont and extract_metric(name) or name + is_def_jfont = false + local res = ltjr_font_callback(new_name, size, id, otfl_fdr) + luatexbase.call_callback('luatexja.define_font', res, new_name, size, id) + -- this callback processes variation selector, so we execute it always + return res + end + luatexbase.create_callback('luatexja.define_font', 'simple', function (n) return n end) + otfl_fdr= luatexbase.remove_from_callback('define_font', 'luaotfload.define_font') + luatexbase.add_to_callback('define_font',luatexja.font_callback,"luatexja.font_callback", 1) + + local match, sp = string.match, tex.sp + local function load_jfmonly(spec, dir) + local spec, size = match(spec,'(.+)%s+at%s*([%.%w]*)') + size = sp(size); extract_metric(spec) + jfm_dir = dir + local i = load_jfont_metric() + local j = -update_jfm_cache(i, size) + font_metric_table[j]=metrics[i].size_cache[s] + tex.sprint(cat_lp, '\\ltj@cur' .. (dir=='yoko' and 'j' or 't') .. 'fnt' .. tostring(j) .. '\\relax') + end + luatexja.jfont.load_jfmonly = load_jfmonly +end + +------------------------------------------------------------------------ +-- LATEX INTERFACE +------------------------------------------------------------------------ +do + -- these function are called from ltj-latex.sty + local fenc_list, kyenc_list, ktenc_list = {}, {}, {} + function luatexja.jfont.add_fenc_list(enc) fenc_list[enc] = 'true ' end + function luatexja.jfont.add_kyenc_list(enc) kyenc_list[enc] = 'true ' end + function luatexja.jfont.add_ktenc_list(enc) ktenc_list[enc] = 'true ' end + function luatexja.jfont.is_kyenc(enc) + tex.sprint(cat_lp, '\\let\\ifin@\\if' .. (kyenc_list[enc] or 'false ')) + end + function luatexja.jfont.is_ktenc(enc) + tex.sprint(cat_lp, '\\let\\ifin@\\if' .. (ktenc_list[enc] or 'false ')) + end + function luatexja.jfont.is_kenc(enc) + tex.sprint(cat_lp, '\\let\\ifin@\\if' + .. (kyenc_list[enc] or ktenc_list[enc] or 'false ')) + end + + local kfam_list, Nkfam_list = {}, {} + function luatexja.jfont.add_kfam(fam) + kfam_list[fam]=true + end + function luatexja.jfont.search_kfam(fam, use_fd) + if kfam_list[fam] then + tex.sprint(cat_lp, '\\let\\ifin@\\iftrue '); return + elseif Nkfam_list[fam] then + tex.sprint(cat_lp, '\\let\\ifin@\\iffalse '); return + elseif use_fd then + for i,_ in pairs(kyenc_list) do + if kpse.find_file(string.lower(i)..fam..'.fd') then + tex.sprint(cat_lp, '\\let\\ifin@\\iftrue '); return + end + end + for i,_ in pairs(ktenc_list) do + if kpse.find_file(string.lower(i)..fam..'.fd') then + tex.sprint(cat_lp, '\\let\\ifin@\\iftrue '); return + end + end + Nkfam_list[fam]=true; tex.sprint(cat_lp, '\\let\\ifin@\\iffalse '); return + else + tex.sprint(cat_lp, '\\let\\ifin@\\iffalse '); return + end + end + local ffam_list, Nffam_list = {}, {} + function luatexja.jfont.is_ffam(fam) + tex.sprint(cat_lp, '\\let\\ifin@\\if' .. (ffam_list[fam] or 'false ')) + end + function luatexja.jfont.add_ffam(fam) + ffam_list[fam]='true ' + end + function luatexja.jfont.search_ffam_declared() + local s = '' + for i,_ in pairs(fenc_list) do + s = s .. '\\cdp@elt{' .. i .. '}' + end + tex.sprint(cat_lp, s) + end + function luatexja.jfont.search_ffam_fd(fam) + if Nffam_list[fam] then + tex.sprint(cat_lp, '\\let\\ifin@\\iffalse '); return + else + for i,_ in pairs(fenc_list) do + if kpse.find_file(string.lower(i)..fam..'.fd') then + tex.sprint(cat_lp, '\\let\\ifin@\\iftrue '); return + end + end + Nffam_list[fam]=true; tex.sprint(cat_lp, '\\let\\ifin@\\iffalse '); return + end + end + +end +------------------------------------------------------------------------ +-- ALTERNATE FONTS +------------------------------------------------------------------------ +local alt_font_table = {} +local attr_curaltfnt = {} +local ucs_out = 0x110000 + +------ for TeX interface +-- EXT +function luatexja.jfont.set_alt_font(b,e,ind,bfnt) + -- ind: 新フォント, bfnt: 基底フォント + if b>e then b, e = e, b end + if b*e<=0 then + ltjb.package_error('luatexja', + 'bad character range ([' .. b .. ',' .. e .. ']). ' .. + 'I take the intersection with [0x80, 0x10ffff].') + b, e = math.max(0x80,b),math.min(ucs_out-1,e) + elseif e<0 then -- b<e<0 + -- do nothing + elseif b<0x80 or e>=ucs_out then + ltjb.package_warning('luatexja', + 'bad character range ([' .. b .. ',' .. e .. ']). ' .. + 'I take the intersection with [0x80, 0x10ffff].') + b, e = math.max(0x80,b), math.min(ucs_out-1,e) + end + if not alt_font_table[bfnt] then alt_font_table[bfnt]={} end + local t = alt_font_table[bfnt] + local ac = font_getfont(ind).characters + if bfnt==ind then ind = nil end -- ind == bfnt の場合はテーブルから削除 + if e>=0 then -- character range + for i=b, e do + if ac[i]then t[i]=ind end + end + else + b, e = -e, -b + local tx = font_metric_table[bfnt].chars + for i,v in pairs(tx) do + if b<=v and v<=e and ac[i] then t[i]=ind end + end + end +end + +-- EXT +function luatexja.jfont.clear_alt_font(bfnt) + if alt_font_table[bfnt] then + local t = alt_font_table[bfnt] + for i,_ in pairs(t) do t[i]=nil; end + end +end + +------ used in ltjp.suppress_hyphenate_ja callback +function luatexja.jfont.replace_altfont(pf, pc) + local a = alt_font_table[pf] + return a and a[pc] or pf +end + +------ for LaTeX interface + +local alt_font_table_latex = {} + +-- EXT +function luatexja.jfont.clear_alt_font_latex(bbase) + local t = alt_font_table_latex[bbase] + if t then + for j,v in pairs(t) do t[j] = nil end + end +end + +-- EXT +function luatexja.jfont.set_alt_font_latex(b,e,ind,bbase) + -- ind: Alt font の enc/fam/ser/shape, bbase: 基底フォントの enc/fam/ser/shape + if b>e then b, e = e, b end + if b*e<=0 then + ltjb.package_error('luatexja', + 'bad character range ([' .. b .. ',' .. e .. ']). ' .. + 'I take the intersection with [0x80, 0x10ffff].') + b, e = math.max(0x80,b),math.min(ucs_out-1,e) + elseif e<0 then -- b<e<0 + -- do nothing + elseif b<0x80 or e>=ucs_out then + ltjb.package_warning('luatexja', + 'bad character range ([' .. b .. ',' .. e .. ']). ' .. + 'I take the intersection with [0x80, 0x10ffff].') + b, e = math.max(0x80,b), math.min(ucs_out-1,e) + end + + if not alt_font_table_latex[bbase] then alt_font_table_latex[bbase]={} end + local t = alt_font_table_latex[bbase] + if not t[ind] then t[ind] = {} end + for i=b, e do + for j,v in pairs(t) do + if v[i] then -- remove old entry + if j~=ind then v[i]=nil end; break + end + end + t[ind][i]=true + end + -- remove the empty tables + for j,v in pairs(t) do + local flag_clear = true + for k,_ in pairs(v) do flag_clear = false; break end + if flag_clear then t[j]=nil end + end + if ind==bbase then t[bbase] = nil end +end + +-- ここから先は 新 \selectfont の内部でしか実行されない +do + local alt_font_base, alt_font_base_num + local aftl_base + -- EXT + function luatexja.jfont.does_alt_set(bbase) + aftl_base = alt_font_table_latex[bbase] + tex.sprint(cat_lp, aftl_base and '\\@firstofone' or '\\@gobble') + end + -- EXT + function luatexja.jfont.print_aftl_address() + return ';ltjaltfont' .. tostring(aftl_base):sub(8) + end + +-- EXT + function luatexja.jfont.output_alt_font_cmd(dir, bbase) + alt_font_base = bbase + if dir == 't' then + alt_font_base_num = tex.getattribute(attr_curtfnt) + else + alt_font_base_num = tex.getattribute(attr_curjfnt) + end + local t = alt_font_table[alt_font_base_num] + if t then + for i,_ in pairs(t) do t[i]=nil end + end + t = alt_font_table_latex[bbase] + if t then + for i,_ in pairs(t) do + tex.sprint(cat_lp, '\\ltj@pickup@altfont@aux' .. dir .. '{' .. i .. '}') + end + end + end + +-- EXT + function luatexja.jfont.pickup_alt_font_a(size_str) + local t = alt_font_table_latex[alt_font_base] + if t then + for i,v in pairs(t) do + tex.sprint(cat_lp, '\\expandafter\\ltj@pickup@altfont@copy' + .. '\\csname ' .. i .. '/' .. size_str .. '\\endcsname{' .. i .. '}') + end + end + end + + local function pickup_alt_font_class(class, afnt_num, afnt_chars) + local t = alt_font_table[alt_font_base_num] + local tx = font_metric_table[alt_font_base_num].chars + for i,v in pairs(tx) do + if v==class and afnt_chars[i] then t[i]=afnt_num end + end + end + +-- EXT + function luatexja.jfont.pickup_alt_font_b(afnt_num, afnt_base) + local t = alt_font_table[alt_font_base_num] + local ac = font_getfont(afnt_num).characters + if not t then t = {}; alt_font_table[alt_font_base_num] = t end + for i,v in pairs(alt_font_table_latex[alt_font_base]) do + if i == afnt_base then + for j,_ in pairs(v) do + if j>=0 then + if ac[j] then t[j]=afnt_num end + else -- -n (n>=1) means that the character class n, + -- which is defined in the JFM + pickup_alt_font_class(-j, afnt_num, ac) + end + end + return + end + end + end + +end +------------------------------------------------------------------------ +-- 終了時に各種ノードを破棄 +------------------------------------------------------------------------ +do + function luatexja.jfont.cleanup_size_cache() + --local gs, ke = 0, 0 + for _,n in pairs(metrics) do + for i,t in pairs(n.size_cache) do + for _,v in pairs(t.char_type) do + for k,w in pairs(v) do + if type(k)=='number' then + --if w[1] then gs = gs + 1 else ke = ke + 1 end + if w[1] then node_free(w[1]) end + end + end + end + n.size_cache[i]=nil + end + end + end +end + +------------------------------------------------------------------------ +-- 追加のフォント情報 +------------------------------------------------------------------------ +local font_extra_info = {} +luatexja.jfont.font_extra_info= font_extra_info -- key: fontnumber +local font_extra_basename = {} -- key: basename + +local list_rotate_glyphs +do + -- output of function_uax50.lua + -- UAX#50 for Unicode 12.1.0 + -- t[0] = true + local t={ 0, 167, 168, 169, 170, 174, 175, 177, 178, 188, 191, 215, 216, 247, 248, 746, 748, 888, 890, 896, 900, 907, 908, 909, 910, 930, 931, 1328, 1329, 1367, 1369, 1419, 1421, 1424, 1425, 1480, 1488, 1515, 1519, 1525, 1536, 1565, 1566, 1806, 1807, 1867, 1869, 1970, 1984, 2043, 2045, 2094, 2096, 2111, 2112, 2140, 2142, 2143, 2144, 2155, 2208, 2229, 2230, 2238, 2259, 2436, 2437, 2445, 2447, 2449, 2451, 2473, 2474, 2481, 2482, 2483, 2486, 2490, 2492, 2501, 2503, 2505, 2507, 2511, 2519, 2520, 2524, 2526, 2527, 2532, 2534, 2559, 2561, 2564, 2565, 2571, 2575, 2577, 2579, 2601, 2602, 2609, 2610, 2612, 2613, 2615, 2616, 2618, 2620, 2621, 2622, 2627, 2631, 2633, 2635, 2638, 2641, 2642, 2649, 2653, 2654, 2655, 2662, 2679, 2689, 2692, 2693, 2702, 2703, 2706, 2707, 2729, 2730, 2737, 2738, 2740, 2741, 2746, 2748, 2758, 2759, 2762, 2763, 2766, 2768, 2769, 2784, 2788, 2790, 2802, 2809, 2816, 2817, 2820, 2821, 2829, 2831, 2833, 2835, 2857, 2858, 2865, 2866, 2868, 2869, 2874, 2876, 2885, 2887, 2889, 2891, 2894, 2902, 2904, 2908, 2910, 2911, 2916, 2918, 2936, 2946, 2948, 2949, 2955, 2958, 2961, 2962, 2966, 2969, 2971, 2972, 2973, 2974, 2976, 2979, 2981, 2984, 2987, 2990, 3002, 3006, 3011, 3014, 3017, 3018, 3022, 3024, 3025, 3031, 3032, 3046, 3067, 3072, 3085, 3086, 3089, 3090, 3113, 3114, 3130, 3133, 3141, 3142, 3145, 3146, 3150, 3157, 3159, 3160, 3163, 3168, 3172, 3174, 3184, 3191, 3213, 3214, 3217, 3218, 3241, 3242, 3252, 3253, 3258, 3260, 3269, 3270, 3273, 3274, 3278, 3285, 3287, 3294, 3295, 3296, 3300, 3302, 3312, 3313, 3315, 3328, 3332, 3333, 3341, 3342, 3345, 3346, 3397, 3398, 3401, 3402, 3408, 3412, 3428, 3430, 3456, 3458, 3460, 3461, 3479, 3482, 3506, 3507, 3516, 3517, 3518, 3520, 3527, 3530, 3531, 3535, 3541, 3542, 3543, 3544, 3552, 3558, 3568, 3570, 3573, 3585, 3643, 3647, 3676, 3713, 3715, 3716, 3717, 3718, 3723, 3724, 3748, 3749, 3750, 3751, 3774, 3776, 3781, 3782, 3783, 3784, 3790, 3792, 3802, 3804, 3808, 3840, 3912, 3913, 3949, 3953, 3992, 3993, 4029, 4030, 4045, 4046, 4059, 4096, 4294, 4295, 4296, 4301, 4302, 4304, 4352, 4608, 4681, 4682, 4686, 4688, 4695, 4696, 4697, 4698, 4702, 4704, 4745, 4746, 4750, 4752, 4785, 4786, 4790, 4792, 4799, 4800, 4801, 4802, 4806, 4808, 4823, 4824, 4881, 4882, 4886, 4888, 4955, 4957, 4989, 4992, 5018, 5024, 5110, 5112, 5118, 5120, 5121, 5760, 5789, 5792, 5881, 5888, 5901, 5902, 5909, 5920, 5943, 5952, 5972, 5984, 5997, 5998, 6001, 6002, 6004, 6016, 6110, 6112, 6122, 6128, 6138, 6144, 6159, 6160, 6170, 6176, 6265, 6272, 6315, 6400, 6431, 6432, 6444, 6448, 6460, 6464, 6465, 6468, 6510, 6512, 6517, 6528, 6572, 6576, 6602, 6608, 6619, 6622, 6684, 6686, 6751, 6752, 6781, 6783, 6794, 6800, 6810, 6816, 6830, 6832, 6847, 6912, 6988, 6992, 7037, 7040, 7156, 7164, 7224, 7227, 7242, 7245, 7305, 7312, 7355, 7357, 7368, 7376, 7419, 7424, 7674, 7675, 7958, 7960, 7966, 7968, 8006, 8008, 8014, 8016, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8062, 8064, 8117, 8118, 8133, 8134, 8148, 8150, 8156, 8157, 8176, 8178, 8181, 8182, 8191, 8192, 8214, 8215, 8224, 8226, 8240, 8242, 8251, 8253, 8258, 8259, 8263, 8266, 8273, 8274, 8293, 8294, 8306, 8308, 8335, 8336, 8349, 8352, 8384, 8400, 8413, 8417, 8418, 8421, 8433, 8450, 8451, 8458, 8463, 8464, 8467, 8469, 8470, 8472, 8478, 8484, 8485, 8486, 8487, 8488, 8489, 8490, 8494, 8495, 8501, 8512, 8517, 8523, 8524, 8526, 8527, 8586, 8588, 8592, 8734, 8735, 8756, 8758, 8960, 8968, 8972, 8992, 8996, 9001, 9003, 9004, 9085, 9115, 9150, 9166, 9167, 9168, 9169, 9180, 9186, 9251, 9252, 9472, 9632, 9754, 9760, 10088, 10102, 10132, 11026, 11056, 11088, 11098, 11124, 11126, 11158, 11160, 11192, 11218, 11219, 11244, 11248, 11264, 11311, 11312, 11359, 11360, 11508, 11513, 11558, 11559, 11560, 11565, 11566, 11568, 11624, 11631, 11633, 11647, 11671, 11680, 11687, 11688, 11695, 11696, 11703, 11704, 11711, 11712, 11719, 11720, 11727, 11728, 11735, 11736, 11743, 11744, 11856, 12296, 12306, 12308, 12320, 12336, 12337, 12448, 12449, 12540, 12541, 42192, 42540, 42560, 42744, 42752, 42944, 42946, 42951, 42999, 43052, 43056, 43066, 43072, 43128, 43136, 43206, 43214, 43226, 43232, 43348, 43359, 43360, 43392, 43470, 43471, 43482, 43486, 43519, 43520, 43575, 43584, 43598, 43600, 43610, 43612, 43715, 43739, 43767, 43777, 43783, 43785, 43791, 43793, 43799, 43808, 43815, 43816, 43823, 43824, 43880, 43888, 44014, 44016, 44026, 55296, 57344, 64256, 64263, 64275, 64280, 64285, 64311, 64312, 64317, 64318, 64319, 64320, 64322, 64323, 64325, 64326, 64450, 64467, 64832, 64848, 64912, 64914, 64968, 65008, 65022, 65024, 65040, 65056, 65072, 65097, 65104, 65112, 65119, 65123, 65127, 65136, 65141, 65142, 65277, 65279, 65280, 65288, 65290, 65293, 65294, 65306, 65311, 65339, 65340, 65341, 65342, 65343, 65344, 65371, 65471, 65474, 65480, 65482, 65488, 65490, 65496, 65498, 65501, 65507, 65508, 65512, 65519, 65529, 65532, 65536, 65548, 65549, 65575, 65576, 65595, 65596, 65598, 65599, 65614, 65616, 65630, 65664, 65787, 65792, 65795, 65799, 65844, 65847, 65935, 65936, 65948, 65952, 65953, 66000, 66046, 66176, 66205, 66208, 66257, 66272, 66300, 66304, 66340, 66349, 66379, 66384, 66427, 66432, 66462, 66463, 66500, 66504, 66518, 66560, 66718, 66720, 66730, 66736, 66772, 66776, 66812, 66816, 66856, 66864, 66916, 66927, 66928, 67072, 67383, 67392, 67414, 67424, 67432, 67584, 67590, 67592, 67593, 67594, 67638, 67639, 67641, 67644, 67645, 67647, 67670, 67671, 67743, 67751, 67760, 67808, 67827, 67828, 67830, 67835, 67868, 67871, 67898, 67903, 67904, 68000, 68024, 68028, 68048, 68050, 68100, 68101, 68103, 68108, 68116, 68117, 68120, 68121, 68150, 68152, 68155, 68159, 68169, 68176, 68185, 68192, 68256, 68288, 68327, 68331, 68343, 68352, 68406, 68409, 68438, 68440, 68467, 68472, 68498, 68505, 68509, 68521, 68528, 68608, 68681, 68736, 68787, 68800, 68851, 68858, 68904, 68912, 68922, 69216, 69247, 69376, 69416, 69424, 69466, 69600, 69623, 69632, 69710, 69714, 69744, 69759, 69826, 69837, 69838, 69840, 69865, 69872, 69882, 69888, 69941, 69942, 69959, 69968, 70007, 70016, 70094, 70096, 70112, 70113, 70133, 70144, 70162, 70163, 70207, 70272, 70279, 70280, 70281, 70282, 70286, 70287, 70302, 70303, 70314, 70320, 70379, 70384, 70394, 70400, 70404, 70405, 70413, 70415, 70417, 70419, 70441, 70442, 70449, 70450, 70452, 70453, 70458, 70459, 70469, 70471, 70473, 70475, 70478, 70480, 70481, 70487, 70488, 70493, 70500, 70502, 70509, 70512, 70517, 70656, 70746, 70747, 70748, 70749, 70752, 70784, 70856, 70864, 70874, 71168, 71237, 71248, 71258, 71264, 71277, 71296, 71353, 71360, 71370, 71424, 71451, 71453, 71468, 71472, 71488, 71680, 71740, 71840, 71923, 71935, 71936, 72096, 72104, 72106, 72152, 72154, 72165, 72384, 72441, 72704, 72713, 72714, 72759, 72760, 72774, 72784, 72813, 72816, 72848, 72850, 72872, 72873, 72887, 72960, 72967, 72968, 72970, 72971, 73015, 73018, 73019, 73020, 73022, 73023, 73032, 73040, 73050, 73056, 73062, 73063, 73065, 73066, 73103, 73104, 73106, 73107, 73113, 73120, 73130, 73440, 73465, 73664, 73714, 73727, 74650, 74752, 74863, 74864, 74869, 74880, 75076, 92160, 92729, 92736, 92767, 92768, 92778, 92782, 92784, 92880, 92910, 92912, 92918, 92928, 92998, 93008, 93018, 93019, 93026, 93027, 93048, 93053, 93072, 93760, 93851, 93952, 94027, 94031, 94088, 94095, 94112, 113664, 113771, 113776, 113789, 113792, 113801, 113808, 113818, 113820, 113828, 119296, 119366, 119808, 119893, 119894, 119965, 119966, 119968, 119970, 119971, 119973, 119975, 119977, 119981, 119982, 119994, 119995, 119996, 119997, 120004, 120005, 120070, 120071, 120075, 120077, 120085, 120086, 120093, 120094, 120122, 120123, 120127, 120128, 120133, 120134, 120135, 120138, 120145, 120146, 120486, 120488, 120780, 120782, 120832, 122880, 122887, 122888, 122905, 122907, 122914, 122915, 122917, 122918, 122923, 123136, 123181, 123184, 123198, 123200, 123210, 123214, 123216, 123584, 123642, 123647, 123648, 124928, 125125, 125127, 125143, 125184, 125260, 125264, 125274, 125278, 125280, 126065, 126133, 126209, 126270, 126464, 126468, 126469, 126496, 126497, 126499, 126500, 126501, 126503, 126504, 126505, 126515, 126516, 126520, 126521, 126522, 126523, 126524, 126530, 126531, 126535, 126536, 126537, 126538, 126539, 126540, 126541, 126544, 126545, 126547, 126548, 126549, 126551, 126552, 126553, 126554, 126555, 126556, 126557, 126558, 126559, 126560, 126561, 126563, 126564, 126565, 126567, 126571, 126572, 126579, 126580, 126584, 126585, 126589, 126590, 126591, 126592, 126602, 126603, 126620, 126625, 126628, 126629, 126634, 126635, 126652, 126704, 126706, 129024, 129036, 129040, 129096, 129104, 129114, 129120, 129160, 129168, 129198, 917505, 917506, 917536, 917632, 917760, 918000 } + local function rotate_in_uax50(i) + local lo, hi = 1, #t + while lo < hi do + local mi = math.ceil((lo+hi)/2) + if t[mi]<=i then lo=mi else hi=mi-1 end + end + return lo%2==1 + end + list_rotate_glyphs = function (dest, id) + if id.specification and id.resources then + local rot = {} + for i,_ in pairs(id.characters) do + if rotate_in_uax50(i) then rot[i] = true end + end + if id.resources.sequences then + for _,i in pairs(id.resources.sequences) do + if i.order[1]== 'vert' and i.type == 'gsub_single' and i.steps then + for _,j in pairs(i.steps) do + if type(j)=='table' then + if type(j.coverage)=='table' then + for i,_ in pairs(j.coverage) do rot[i]=nil end + end + end + end + end + end; end + -- コードポイントが共有されているグリフについて + if id.resources.duplicates then + for i,v in pairs(id.resources.duplicates) do + local f = rot[i] + for j,_ in pairs(v) do f = f and rot[j] end + rot[i]=f + for j,_ in pairs(v) do rot[j] = f end + end; end + + for i,_ in pairs(rot) do + dest = dest or {} + dest.rotation = dest.rotation or {} + dest.rotation[i] = true + end + end + return dest + end +end + +-- vertical metrics +local prepare_fl_data +do + local sort = table.sort + prepare_fl_data = function (dest, id) + local ascent = id.shared.rawdata.metadata.ascender + local t_vorigin, t_ind_to_uni = {}, {} + for i,v in pairs(id.shared.rawdata.descriptions) do + t_ind_to_uni[v.index] = i + if v.tsb then + local j = v.boundingbox[4] + v.tsb + if j~=ascent then t_vorigin[i]=j end + end + end + dest = dest or {} + dest.ind_to_uni = t_ind_to_uni + dest.vorigin = t_vorigin + return dest + end +end + +-- +do + local function prepare_extra_data_base(id) + if (not id) or (not id.filename) then return end + local bname = id.psname or file.nameonly(id.filename) + if not font_extra_basename[bname] then + ltjb.remove_cache("extra_" .. string.lower(bname)) -- remove cache + local dat = prepare_fl_data(dat, id) + dat = list_rotate_glyphs(dat, id) + font_extra_basename[bname] = dat or {} + return bname + end + end + local function prepare_extra_data_font(id, res) + if type(res)=='table' and res.shared and (res.psname or res.filename) then + font_extra_info[id] = font_extra_basename[res.psname or file.nameonly(res.filename)] + end + end + luatexbase.add_to_callback( + 'luaotfload.patch_font', + function (tfmdata) + -- these function is executed one time per one fontfile + prepare_extra_data_base(tfmdata); return tfmdata + end, + 'ltj.prepare_extra_data', 1) + luatexbase.add_to_callback( + 'luatexja.define_font', + function (res, name, size, id) + prepare_extra_data_font(id, res) + end, + 'ltj.prepare_extra_data', 1) + + local nulltable = {} -- dummy + ltjr.vert_addfunc = function (n) font_extra_info[n] = nulltable end + + local identifiers = fonts.hashes.identifiers + for i=1,font.nextid()-1 do + if identifiers[i] then + prepare_extra_data_base(identifiers[i]) + prepare_extra_data_font(i,identifiers[i]) + end + end +end + +------------------------------------------------------------------------ +-- make table of vertical glyphs which does not covered by vert feature +-- nor UTR#50 +------------------------------------------------------------------------ +do +------------------------------------------------------------------------ +-- VERT VARIANT TABLE +------------------------------------------------------------------------ + local provides_feature = luaotfload.aux.provides_feature + local vert_form_table = { + [0x3001]=0xFE11, [0x3002]=0xFE12, [0x3016]=0xFE17, [0x3017]=0xFE18, + [0x2026]=0xFE19, + [0x2025]=0xFE30, [0x2014]=0xFE31, [0x2013]=0xFE32, [0xFF3F]=0xFE33, + [0xFF08]=0xFE35, [0xFF09]=0xFE36, [0xFF5B]=0xFE37, [0xFF5D]=0xFE38, + [0x3014]=0xFE39, [0x3015]=0xFE3A, [0x3010]=0xFE3B, [0x3011]=0xFE3C, + [0x300A]=0xFE3D, [0x300B]=0xFE3E, [0x3008]=0xFE3F, [0x3009]=0xFE40, + [0x300C]=0xFE41, [0x300D]=0xFE42, [0x300E]=0xFE43, [0x300F]=0xFE44, + [0xFF3B]=0xFE47, [0xFF3D]=0xFE48, + } + local vert_jpotf_table = {} + local function add_vform(coverage, vform, ft, add_vert, jpotf_vert) + if type(coverage)~='table' then return end + for i,v in pairs(vert_form_table) do + if not coverage[i] and ft.characters[v] then vform[i] = v end + end + if jpotf_vert then + for i,v in pairs(vert_jpotf_table) do + if ft.characters[v] then vform[i] = coverage[v] or vform[v] or v end + end + end + if add_vert then -- vert feature が有効にならない場合 + for i,v in pairs(coverage) do vform[i] = vform[i] or v end + end + end + + local utfbyte, utfsub = utf.byte, utf.sub + luatexja.jfont.register_vert_replace = function(t) + for i,v in pairs(t) do + local ic = (type(i)=='number') and i or + ((type(i)=='string') and utfbyte(utfsub(i,1,1)) or nil) + if ic then + vert_jpotf_table[ic] = (type(v)=='number') and v or + ((type(v)=='string') and utfbyte(utfsub(v,1,1)) or nil) + end + end + end + +luatexbase.add_to_callback( + "luatexja.define_jfont", + function (fmtable, fnum) + local vform = {}; fmtable.vform = vform + local t = font_getfont(fnum) + if t.specification and t.resources then + local add_vert + = not (provides_feature(fnum, t.properties.script, t.properties.language, 'vert')) + and not (provides_feature(fnum, t.properties.script, t.properties.language, 'vrt2')) + local jpotf_vert = t.shared.features.jpotf + -- 現在の language, script で vert もvrt2 も有効にできない場合,強制的に vert 適用 + for _,i in pairs(t.resources.sequences) do + if i.order[1]== 'vert' and i.type == 'gsub_single' and i.steps then + for _,j in pairs(i.steps) do + if type(j)=='table' then + add_vform(j.coverage,vform, t, add_vert, jpotf_vert) + end + end + end + end + end + return fmtable + end, 'ltj.get_vert_form', 1 +) +end + +------------------------------------------------------------------------ +-- supply tounicode entries +------------------------------------------------------------------------ +do + local ltjr_prepare_cid_font = ltjr.prepare_cid_font + luatexbase.add_to_callback( + 'luaotfload.patch_font', + function (tfmdata) + local cidinfo = tfmdata.cidinfo or tfmdata.resources.cidinfo + if cidinfo and cidinfo.registry and cidinfo.ordering then + local rd = ltjr_prepare_cid_font(cidinfo.registry, cidinfo.ordering) + if rd then + local ru, rc = rd.resources.unicodes, rd.characters + for i,v in pairs(tfmdata.characters) do + local w = ru["Japan1." .. tostring(v.index)] + if w then + v.tounicode = v.tounicode or rc[w]. tounicode + end + end + end + end + + return tfmdata + end, + 'ltj.supply_tounicode', 1) +end + + +------------------------------------------------------------------------ +-- MISC +------------------------------------------------------------------------ +do + local getfont = node.direct.getfont + local getchar = node.direct.getchar + local get_dir_count = ltjd.get_dir_count + local is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char_direct + local ensure_tex_attr = ltjb.ensure_tex_attr + local node_write = node.direct.write + local font = font + local new_ic_kern + local dir_tate = luatexja.dir_table.dir_tate + if status.luatex_version>=89 then + new_ic_kern = function(g) return node_new(id_kern,3) end + else + local ITALIC = luatexja.icflag_table.ITALIC + new_ic_kern = function() + local g = node_new(id_kern, 1) + set_attr(g, attr_icflag, ITALIC) + return g + end + end + -- EXT: italic correction + function luatexja.jfont.append_italic() + local p = to_direct(tex.nest[tex.nest.ptr].tail) + local TEMP = node_new(id_kern) + if p and getid(p)==id_glyph then + if is_ucs_in_japanese_char(p) then + local j = font_metric_table[ + has_attr(p, (get_dir_count()==dir_tate) and attr_curtfnt or attr_curjfnt) + ] + local g = new_ic_kern() + setfield(g, 'kern', j.char_type[find_char_class(getchar(p), j)].italic) + node_write(g); ensure_tex_attr(attr_icflag, 0) + else + local f = getfont(p) + local h = font_getfont(f) or font.fonts[f] + if h then + local g = new_ic_kern() + if h.characters[getchar(p)] and h.characters[getchar(p)].italic then + setfield(g, 'kern', h.characters[getchar(p)].italic) + node_write(g); ensure_tex_attr(attr_icflag, 0) + end + end + end + end + node_free(TEMP) + end +end + +luatexja.jfont.metrics = metrics +luatexja.jfont.font_metric_table = font_metric_table +luatexja.jfont.find_char_class = find_char_class + +luatexja.jfont.update_jfm_cache = update_jfm_cache diff --git a/macros/luatex/generic/luatexja/src/ltj-jisx0208.lua b/macros/luatex/generic/luatexja/src/ltj-jisx0208.lua new file mode 100644 index 0000000000..a31dbcd786 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-jisx0208.lua @@ -0,0 +1,6883 @@ +return { +version = 2, +table_jisx0208_uptex = { + [0x101] = 0x3000, --( ) + [0x102] = 0x3001, --(、) + [0x103] = 0x3002, --(。) + [0x104] = 0xFF0C, --(,) + [0x105] = 0xFF0E, --(.) + [0x106] = 0x30FB, --(・) + [0x107] = 0xFF1A, --(:) + [0x108] = 0xFF1B, --(;) + [0x109] = 0xFF1F, --(?) + [0x10A] = 0xFF01, --(!) + [0x10B] = 0x309B, --(゛) + [0x10C] = 0x309C, --(゜) + [0x10D] = 0xB4, + [0x10E] = 0xFF40, --(`) + [0x10F] = 0xA8, + [0x110] = 0xFF3E, --(^) + [0x111] = 0xFFE3, --( ̄) + [0x112] = 0xFF3F, --(_) + [0x113] = 0x30FD, --(ヽ) + [0x114] = 0x30FE, --(ヾ) + [0x115] = 0x309D, --(ゝ) + [0x116] = 0x309E, --(ゞ) + [0x117] = 0x3003, --(〃) + [0x118] = 0x4EDD, --(仝) + [0x119] = 0x3005, --(々) + [0x11A] = 0x3006, --(〆) + [0x11B] = 0x3007, --(〇) + [0x11C] = 0x30FC, --(ー) + [0x11D] = 0x2015, --(―) + [0x11E] = 0x2010, --(‐) + [0x11F] = 0xFF0F, --(/) + [0x120] = 0xFF3C, --(\) + [0x121] = 0x301C, --(〜) + [0x122] = 0x2016, --(‖) + [0x123] = 0xFF5C, --(|) + [0x124] = 0x2026, --(…) + [0x125] = 0x2025, --(‥) + [0x126] = 0x2018, --(‘) + [0x127] = 0x2019, --(’) + [0x128] = 0x201C, --(“) + [0x129] = 0x201D, --(”) + [0x12A] = 0xFF08, --(() + [0x12B] = 0xFF09, --()) + [0x12C] = 0x3014, --(〔) + [0x12D] = 0x3015, --(〕) + [0x12E] = 0xFF3B, --([) + [0x12F] = 0xFF3D, --(]) + [0x130] = 0xFF5B, --({) + [0x131] = 0xFF5D, --(}) + [0x132] = 0x3008, --(〈) + [0x133] = 0x3009, --(〉) + [0x134] = 0x300A, --(《) + [0x135] = 0x300B, --(》) + [0x136] = 0x300C, --(「) + [0x137] = 0x300D, --(」) + [0x138] = 0x300E, --(『) + [0x139] = 0x300F, --(』) + [0x13A] = 0x3010, --(【) + [0x13B] = 0x3011, --(】) + [0x13C] = 0xFF0B, --(+) + [0x13D] = 0x2212, --(−) + [0x13E] = 0xB1, + [0x13F] = 0xD7, + [0x140] = 0xF7, + [0x141] = 0xFF1D, --(=) + [0x142] = 0x2260, --(≠) + [0x143] = 0xFF1C, --(<) + [0x144] = 0xFF1E, --(>) + [0x145] = 0x2266, --(≦) + [0x146] = 0x2267, --(≧) + [0x147] = 0x221E, --(∞) + [0x148] = 0x2234, --(∴) + [0x149] = 0x2642, --(♂) + [0x14A] = 0x2640, --(♀) + [0x14B] = 0xB0, + [0x14C] = 0x2032, --(′) + [0x14D] = 0x2033, --(″) + [0x14E] = 0x2103, --(℃) + [0x14F] = 0xFFE5, --(¥) + [0x150] = 0xFF04, --($) + [0x151] = 0xFFE0, --(¢) + [0x152] = 0xFFE1, --(£) + [0x153] = 0xFF05, --(%) + [0x154] = 0xFF03, --(#) + [0x155] = 0xFF06, --(&) + [0x156] = 0xFF0A, --(*) + [0x157] = 0xFF20, --(@) + [0x158] = 0xA7, + [0x159] = 0x2606, --(☆) + [0x15A] = 0x2605, --(★) + [0x15B] = 0x25CB, --(○) + [0x15C] = 0x25CF, --(●) + [0x15D] = 0x25CE, --(◎) + [0x15E] = 0x25C7, --(◇) + [0x201] = 0x25C6, --(◆) + [0x202] = 0x25A1, --(□) + [0x203] = 0x25A0, --(■) + [0x204] = 0x25B3, --(△) + [0x205] = 0x25B2, --(▲) + [0x206] = 0x25BD, --(▽) + [0x207] = 0x25BC, --(▼) + [0x208] = 0x203B, --(※) + [0x209] = 0x3012, --(〒) + [0x20A] = 0x2192, --(→) + [0x20B] = 0x2190, --(←) + [0x20C] = 0x2191, --(↑) + [0x20D] = 0x2193, --(↓) + [0x20E] = 0x3013, --(〓) + [0x21A] = 0x2208, --(∈) + [0x21B] = 0x220B, --(∋) + [0x21C] = 0x2286, --(⊆) + [0x21D] = 0x2287, --(⊇) + [0x21E] = 0x2282, --(⊂) + [0x21F] = 0x2283, --(⊃) + [0x220] = 0x222A, --(∪) + [0x221] = 0x2229, --(∩) + [0x22A] = 0x2227, --(∧) + [0x22B] = 0x2228, --(∨) + [0x22C] = 0xFFE2, --(¬) + [0x22D] = 0x21D2, --(⇒) + [0x22E] = 0x21D4, --(⇔) + [0x22F] = 0x2200, --(∀) + [0x230] = 0x2203, --(∃) + [0x23C] = 0x2220, --(∠) + [0x23D] = 0x22A5, --(⊥) + [0x23E] = 0x2312, --(⌒) + [0x23F] = 0x2202, --(∂) + [0x240] = 0x2207, --(∇) + [0x241] = 0x2261, --(≡) + [0x242] = 0x2252, --(≒) + [0x243] = 0x226A, --(≪) + [0x244] = 0x226B, --(≫) + [0x245] = 0x221A, --(√) + [0x246] = 0x223D, --(∽) + [0x247] = 0x221D, --(∝) + [0x248] = 0x2235, --(∵) + [0x249] = 0x222B, --(∫) + [0x24A] = 0x222C, --(∬) + [0x252] = 0x212B, --(Å) + [0x253] = 0x2030, --(‰) + [0x254] = 0x266F, --(♯) + [0x255] = 0x266D, --(♭) + [0x256] = 0x266A, --(♪) + [0x257] = 0x2020, --(†) + [0x258] = 0x2021, --(‡) + [0x259] = 0xB6, + [0x25E] = 0x25EF, --(◯) + [0x310] = 0xFF10, --(0) + [0x311] = 0xFF11, --(1) + [0x312] = 0xFF12, --(2) + [0x313] = 0xFF13, --(3) + [0x314] = 0xFF14, --(4) + [0x315] = 0xFF15, --(5) + [0x316] = 0xFF16, --(6) + [0x317] = 0xFF17, --(7) + [0x318] = 0xFF18, --(8) + [0x319] = 0xFF19, --(9) + [0x321] = 0xFF21, --(A) + [0x322] = 0xFF22, --(B) + [0x323] = 0xFF23, --(C) + [0x324] = 0xFF24, --(D) + [0x325] = 0xFF25, --(E) + [0x326] = 0xFF26, --(F) + [0x327] = 0xFF27, --(G) + [0x328] = 0xFF28, --(H) + [0x329] = 0xFF29, --(I) + [0x32A] = 0xFF2A, --(J) + [0x32B] = 0xFF2B, --(K) + [0x32C] = 0xFF2C, --(L) + [0x32D] = 0xFF2D, --(M) + [0x32E] = 0xFF2E, --(N) + [0x32F] = 0xFF2F, --(O) + [0x330] = 0xFF30, --(P) + [0x331] = 0xFF31, --(Q) + [0x332] = 0xFF32, --(R) + [0x333] = 0xFF33, --(S) + [0x334] = 0xFF34, --(T) + [0x335] = 0xFF35, --(U) + [0x336] = 0xFF36, --(V) + [0x337] = 0xFF37, --(W) + [0x338] = 0xFF38, --(X) + [0x339] = 0xFF39, --(Y) + [0x33A] = 0xFF3A, --(Z) + [0x341] = 0xFF41, --(a) + [0x342] = 0xFF42, --(b) + [0x343] = 0xFF43, --(c) + [0x344] = 0xFF44, --(d) + [0x345] = 0xFF45, --(e) + [0x346] = 0xFF46, --(f) + [0x347] = 0xFF47, --(g) + [0x348] = 0xFF48, --(h) + [0x349] = 0xFF49, --(i) + [0x34A] = 0xFF4A, --(j) + [0x34B] = 0xFF4B, --(k) + [0x34C] = 0xFF4C, --(l) + [0x34D] = 0xFF4D, --(m) + [0x34E] = 0xFF4E, --(n) + [0x34F] = 0xFF4F, --(o) + [0x350] = 0xFF50, --(p) + [0x351] = 0xFF51, --(q) + [0x352] = 0xFF52, --(r) + [0x353] = 0xFF53, --(s) + [0x354] = 0xFF54, --(t) + [0x355] = 0xFF55, --(u) + [0x356] = 0xFF56, --(v) + [0x357] = 0xFF57, --(w) + [0x358] = 0xFF58, --(x) + [0x359] = 0xFF59, --(y) + [0x35A] = 0xFF5A, --(z) + [0x401] = 0x3041, --(ぁ) + [0x402] = 0x3042, --(あ) + [0x403] = 0x3043, --(ぃ) + [0x404] = 0x3044, --(い) + [0x405] = 0x3045, --(ぅ) + [0x406] = 0x3046, --(う) + [0x407] = 0x3047, --(ぇ) + [0x408] = 0x3048, --(え) + [0x409] = 0x3049, --(ぉ) + [0x40A] = 0x304A, --(お) + [0x40B] = 0x304B, --(か) + [0x40C] = 0x304C, --(が) + [0x40D] = 0x304D, --(き) + [0x40E] = 0x304E, --(ぎ) + [0x40F] = 0x304F, --(く) + [0x410] = 0x3050, --(ぐ) + [0x411] = 0x3051, --(け) + [0x412] = 0x3052, --(げ) + [0x413] = 0x3053, --(こ) + [0x414] = 0x3054, --(ご) + [0x415] = 0x3055, --(さ) + [0x416] = 0x3056, --(ざ) + [0x417] = 0x3057, --(し) + [0x418] = 0x3058, --(じ) + [0x419] = 0x3059, --(す) + [0x41A] = 0x305A, --(ず) + [0x41B] = 0x305B, --(せ) + [0x41C] = 0x305C, --(ぜ) + [0x41D] = 0x305D, --(そ) + [0x41E] = 0x305E, --(ぞ) + [0x41F] = 0x305F, --(た) + [0x420] = 0x3060, --(だ) + [0x421] = 0x3061, --(ち) + [0x422] = 0x3062, --(ぢ) + [0x423] = 0x3063, --(っ) + [0x424] = 0x3064, --(つ) + [0x425] = 0x3065, --(づ) + [0x426] = 0x3066, --(て) + [0x427] = 0x3067, --(で) + [0x428] = 0x3068, --(と) + [0x429] = 0x3069, --(ど) + [0x42A] = 0x306A, --(な) + [0x42B] = 0x306B, --(に) + [0x42C] = 0x306C, --(ぬ) + [0x42D] = 0x306D, --(ね) + [0x42E] = 0x306E, --(の) + [0x42F] = 0x306F, --(は) + [0x430] = 0x3070, --(ば) + [0x431] = 0x3071, --(ぱ) + [0x432] = 0x3072, --(ひ) + [0x433] = 0x3073, --(び) + [0x434] = 0x3074, --(ぴ) + [0x435] = 0x3075, --(ふ) + [0x436] = 0x3076, --(ぶ) + [0x437] = 0x3077, --(ぷ) + [0x438] = 0x3078, --(へ) + [0x439] = 0x3079, --(べ) + [0x43A] = 0x307A, --(ぺ) + [0x43B] = 0x307B, --(ほ) + [0x43C] = 0x307C, --(ぼ) + [0x43D] = 0x307D, --(ぽ) + [0x43E] = 0x307E, --(ま) + [0x43F] = 0x307F, --(み) + [0x440] = 0x3080, --(む) + [0x441] = 0x3081, --(め) + [0x442] = 0x3082, --(も) + [0x443] = 0x3083, --(ゃ) + [0x444] = 0x3084, --(や) + [0x445] = 0x3085, --(ゅ) + [0x446] = 0x3086, --(ゆ) + [0x447] = 0x3087, --(ょ) + [0x448] = 0x3088, --(よ) + [0x449] = 0x3089, --(ら) + [0x44A] = 0x308A, --(り) + [0x44B] = 0x308B, --(る) + [0x44C] = 0x308C, --(れ) + [0x44D] = 0x308D, --(ろ) + [0x44E] = 0x308E, --(ゎ) + [0x44F] = 0x308F, --(わ) + [0x450] = 0x3090, --(ゐ) + [0x451] = 0x3091, --(ゑ) + [0x452] = 0x3092, --(を) + [0x453] = 0x3093, --(ん) + [0x501] = 0x30A1, --(ァ) + [0x502] = 0x30A2, --(ア) + [0x503] = 0x30A3, --(ィ) + [0x504] = 0x30A4, --(イ) + [0x505] = 0x30A5, --(ゥ) + [0x506] = 0x30A6, --(ウ) + [0x507] = 0x30A7, --(ェ) + [0x508] = 0x30A8, --(エ) + [0x509] = 0x30A9, --(ォ) + [0x50A] = 0x30AA, --(オ) + [0x50B] = 0x30AB, --(カ) + [0x50C] = 0x30AC, --(ガ) + [0x50D] = 0x30AD, --(キ) + [0x50E] = 0x30AE, --(ギ) + [0x50F] = 0x30AF, --(ク) + [0x510] = 0x30B0, --(グ) + [0x511] = 0x30B1, --(ケ) + [0x512] = 0x30B2, --(ゲ) + [0x513] = 0x30B3, --(コ) + [0x514] = 0x30B4, --(ゴ) + [0x515] = 0x30B5, --(サ) + [0x516] = 0x30B6, --(ザ) + [0x517] = 0x30B7, --(シ) + [0x518] = 0x30B8, --(ジ) + [0x519] = 0x30B9, --(ス) + [0x51A] = 0x30BA, --(ズ) + [0x51B] = 0x30BB, --(セ) + [0x51C] = 0x30BC, --(ゼ) + [0x51D] = 0x30BD, --(ソ) + [0x51E] = 0x30BE, --(ゾ) + [0x51F] = 0x30BF, --(タ) + [0x520] = 0x30C0, --(ダ) + [0x521] = 0x30C1, --(チ) + [0x522] = 0x30C2, --(ヂ) + [0x523] = 0x30C3, --(ッ) + [0x524] = 0x30C4, --(ツ) + [0x525] = 0x30C5, --(ヅ) + [0x526] = 0x30C6, --(テ) + [0x527] = 0x30C7, --(デ) + [0x528] = 0x30C8, --(ト) + [0x529] = 0x30C9, --(ド) + [0x52A] = 0x30CA, --(ナ) + [0x52B] = 0x30CB, --(ニ) + [0x52C] = 0x30CC, --(ヌ) + [0x52D] = 0x30CD, --(ネ) + [0x52E] = 0x30CE, --(ノ) + [0x52F] = 0x30CF, --(ハ) + [0x530] = 0x30D0, --(バ) + [0x531] = 0x30D1, --(パ) + [0x532] = 0x30D2, --(ヒ) + [0x533] = 0x30D3, --(ビ) + [0x534] = 0x30D4, --(ピ) + [0x535] = 0x30D5, --(フ) + [0x536] = 0x30D6, --(ブ) + [0x537] = 0x30D7, --(プ) + [0x538] = 0x30D8, --(ヘ) + [0x539] = 0x30D9, --(ベ) + [0x53A] = 0x30DA, --(ペ) + [0x53B] = 0x30DB, --(ホ) + [0x53C] = 0x30DC, --(ボ) + [0x53D] = 0x30DD, --(ポ) + [0x53E] = 0x30DE, --(マ) + [0x53F] = 0x30DF, --(ミ) + [0x540] = 0x30E0, --(ム) + [0x541] = 0x30E1, --(メ) + [0x542] = 0x30E2, --(モ) + [0x543] = 0x30E3, --(ャ) + [0x544] = 0x30E4, --(ヤ) + [0x545] = 0x30E5, --(ュ) + [0x546] = 0x30E6, --(ユ) + [0x547] = 0x30E7, --(ョ) + [0x548] = 0x30E8, --(ヨ) + [0x549] = 0x30E9, --(ラ) + [0x54A] = 0x30EA, --(リ) + [0x54B] = 0x30EB, --(ル) + [0x54C] = 0x30EC, --(レ) + [0x54D] = 0x30ED, --(ロ) + [0x54E] = 0x30EE, --(ヮ) + [0x54F] = 0x30EF, --(ワ) + [0x550] = 0x30F0, --(ヰ) + [0x551] = 0x30F1, --(ヱ) + [0x552] = 0x30F2, --(ヲ) + [0x553] = 0x30F3, --(ン) + [0x554] = 0x30F4, --(ヴ) + [0x555] = 0x30F5, --(ヵ) + [0x556] = 0x30F6, --(ヶ) + [0x601] = 0x391, --(Α) + [0x602] = 0x392, --(Β) + [0x603] = 0x393, --(Γ) + [0x604] = 0x394, --(Δ) + [0x605] = 0x395, --(Ε) + [0x606] = 0x396, --(Ζ) + [0x607] = 0x397, --(Η) + [0x608] = 0x398, --(Θ) + [0x609] = 0x399, --(Ι) + [0x60A] = 0x39A, --(Κ) + [0x60B] = 0x39B, --(Λ) + [0x60C] = 0x39C, --(Μ) + [0x60D] = 0x39D, --(Ν) + [0x60E] = 0x39E, --(Ξ) + [0x60F] = 0x39F, --(Ο) + [0x610] = 0x3A0, --(Π) + [0x611] = 0x3A1, --(Ρ) + [0x612] = 0x3A3, --(Σ) + [0x613] = 0x3A4, --(Τ) + [0x614] = 0x3A5, --(Υ) + [0x615] = 0x3A6, --(Φ) + [0x616] = 0x3A7, --(Χ) + [0x617] = 0x3A8, --(Ψ) + [0x618] = 0x3A9, --(Ω) + [0x621] = 0x3B1, --(α) + [0x622] = 0x3B2, --(β) + [0x623] = 0x3B3, --(γ) + [0x624] = 0x3B4, --(δ) + [0x625] = 0x3B5, --(ε) + [0x626] = 0x3B6, --(ζ) + [0x627] = 0x3B7, --(η) + [0x628] = 0x3B8, --(θ) + [0x629] = 0x3B9, --(ι) + [0x62A] = 0x3BA, --(κ) + [0x62B] = 0x3BB, --(λ) + [0x62C] = 0x3BC, --(μ) + [0x62D] = 0x3BD, --(ν) + [0x62E] = 0x3BE, --(ξ) + [0x62F] = 0x3BF, --(ο) + [0x630] = 0x3C0, --(π) + [0x631] = 0x3C1, --(ρ) + [0x632] = 0x3C3, --(σ) + [0x633] = 0x3C4, --(τ) + [0x634] = 0x3C5, --(υ) + [0x635] = 0x3C6, --(φ) + [0x636] = 0x3C7, --(χ) + [0x637] = 0x3C8, --(ψ) + [0x638] = 0x3C9, --(ω) + [0x701] = 0x410, --(А) + [0x702] = 0x411, --(Б) + [0x703] = 0x412, --(В) + [0x704] = 0x413, --(Г) + [0x705] = 0x414, --(Д) + [0x706] = 0x415, --(Е) + [0x707] = 0x401, --(Ё) + [0x708] = 0x416, --(Ж) + [0x709] = 0x417, --(З) + [0x70A] = 0x418, --(И) + [0x70B] = 0x419, --(Й) + [0x70C] = 0x41A, --(К) + [0x70D] = 0x41B, --(Л) + [0x70E] = 0x41C, --(М) + [0x70F] = 0x41D, --(Н) + [0x710] = 0x41E, --(О) + [0x711] = 0x41F, --(П) + [0x712] = 0x420, --(Р) + [0x713] = 0x421, --(С) + [0x714] = 0x422, --(Т) + [0x715] = 0x423, --(У) + [0x716] = 0x424, --(Ф) + [0x717] = 0x425, --(Х) + [0x718] = 0x426, --(Ц) + [0x719] = 0x427, --(Ч) + [0x71A] = 0x428, --(Ш) + [0x71B] = 0x429, --(Щ) + [0x71C] = 0x42A, --(Ъ) + [0x71D] = 0x42B, --(Ы) + [0x71E] = 0x42C, --(Ь) + [0x71F] = 0x42D, --(Э) + [0x720] = 0x42E, --(Ю) + [0x721] = 0x42F, --(Я) + [0x731] = 0x430, --(а) + [0x732] = 0x431, --(б) + [0x733] = 0x432, --(в) + [0x734] = 0x433, --(г) + [0x735] = 0x434, --(д) + [0x736] = 0x435, --(е) + [0x737] = 0x451, --(ё) + [0x738] = 0x436, --(ж) + [0x739] = 0x437, --(з) + [0x73A] = 0x438, --(и) + [0x73B] = 0x439, --(й) + [0x73C] = 0x43A, --(к) + [0x73D] = 0x43B, --(л) + [0x73E] = 0x43C, --(м) + [0x73F] = 0x43D, --(н) + [0x740] = 0x43E, --(о) + [0x741] = 0x43F, --(п) + [0x742] = 0x440, --(р) + [0x743] = 0x441, --(с) + [0x744] = 0x442, --(т) + [0x745] = 0x443, --(у) + [0x746] = 0x444, --(ф) + [0x747] = 0x445, --(х) + [0x748] = 0x446, --(ц) + [0x749] = 0x447, --(ч) + [0x74A] = 0x448, --(ш) + [0x74B] = 0x449, --(щ) + [0x74C] = 0x44A, --(ъ) + [0x74D] = 0x44B, --(ы) + [0x74E] = 0x44C, --(ь) + [0x74F] = 0x44D, --(э) + [0x750] = 0x44E, --(ю) + [0x751] = 0x44F, --(я) + [0x801] = 0x2500, --(─) + [0x802] = 0x2502, --(│) + [0x803] = 0x250C, --(┌) + [0x804] = 0x2510, --(┐) + [0x805] = 0x2518, --(┘) + [0x806] = 0x2514, --(└) + [0x807] = 0x251C, --(├) + [0x808] = 0x252C, --(┬) + [0x809] = 0x2524, --(┤) + [0x80A] = 0x2534, --(┴) + [0x80B] = 0x253C, --(┼) + [0x80C] = 0x2501, --(━) + [0x80D] = 0x2503, --(┃) + [0x80E] = 0x250F, --(┏) + [0x80F] = 0x2513, --(┓) + [0x810] = 0x251B, --(┛) + [0x811] = 0x2517, --(┗) + [0x812] = 0x2523, --(┣) + [0x813] = 0x2533, --(┳) + [0x814] = 0x252B, --(┫) + [0x815] = 0x253B, --(┻) + [0x816] = 0x254B, --(╋) + [0x817] = 0x2520, --(┠) + [0x818] = 0x252F, --(┯) + [0x819] = 0x2528, --(┨) + [0x81A] = 0x2537, --(┷) + [0x81B] = 0x253F, --(┿) + [0x81C] = 0x251D, --(┝) + [0x81D] = 0x2530, --(┰) + [0x81E] = 0x2525, --(┥) + [0x81F] = 0x2538, --(┸) + [0x820] = 0x2542, --(╂) + [0x1001] = 0x4E9C, --(亜) + [0x1002] = 0x5516, --(唖) + [0x1003] = 0x5A03, --(娃) + [0x1004] = 0x963F, --(阿) + [0x1005] = 0x54C0, --(哀) + [0x1006] = 0x611B, --(愛) + [0x1007] = 0x6328, --(挨) + [0x1008] = 0x59F6, --(姶) + [0x1009] = 0x9022, --(逢) + [0x100A] = 0x8475, --(葵) + [0x100B] = 0x831C, --(茜) + [0x100C] = 0x7A50, --(穐) + [0x100D] = 0x60AA, --(悪) + [0x100E] = 0x63E1, --(握) + [0x100F] = 0x6E25, --(渥) + [0x1010] = 0x65ED, --(旭) + [0x1011] = 0x8466, --(葦) + [0x1012] = 0x82A6, --(芦) + [0x1013] = 0x9BF5, --(鯵) + [0x1014] = 0x6893, --(梓) + [0x1015] = 0x5727, --(圧) + [0x1016] = 0x65A1, --(斡) + [0x1017] = 0x6271, --(扱) + [0x1018] = 0x5B9B, --(宛) + [0x1019] = 0x59D0, --(姐) + [0x101A] = 0x867B, --(虻) + [0x101B] = 0x98F4, --(飴) + [0x101C] = 0x7D62, --(絢) + [0x101D] = 0x7DBE, --(綾) + [0x101E] = 0x9B8E, --(鮎) + [0x101F] = 0x6216, --(或) + [0x1020] = 0x7C9F, --(粟) + [0x1021] = 0x88B7, --(袷) + [0x1022] = 0x5B89, --(安) + [0x1023] = 0x5EB5, --(庵) + [0x1024] = 0x6309, --(按) + [0x1025] = 0x6697, --(暗) + [0x1026] = 0x6848, --(案) + [0x1027] = 0x95C7, --(闇) + [0x1028] = 0x978D, --(鞍) + [0x1029] = 0x674F, --(杏) + [0x102A] = 0x4EE5, --(以) + [0x102B] = 0x4F0A, --(伊) + [0x102C] = 0x4F4D, --(位) + [0x102D] = 0x4F9D, --(依) + [0x102E] = 0x5049, --(偉) + [0x102F] = 0x56F2, --(囲) + [0x1030] = 0x5937, --(夷) + [0x1031] = 0x59D4, --(委) + [0x1032] = 0x5A01, --(威) + [0x1033] = 0x5C09, --(尉) + [0x1034] = 0x60DF, --(惟) + [0x1035] = 0x610F, --(意) + [0x1036] = 0x6170, --(慰) + [0x1037] = 0x6613, --(易) + [0x1038] = 0x6905, --(椅) + [0x1039] = 0x70BA, --(為) + [0x103A] = 0x754F, --(畏) + [0x103B] = 0x7570, --(異) + [0x103C] = 0x79FB, --(移) + [0x103D] = 0x7DAD, --(維) + [0x103E] = 0x7DEF, --(緯) + [0x103F] = 0x80C3, --(胃) + [0x1040] = 0x840E, --(萎) + [0x1041] = 0x8863, --(衣) + [0x1042] = 0x8B02, --(謂) + [0x1043] = 0x9055, --(違) + [0x1044] = 0x907A, --(遺) + [0x1045] = 0x533B, --(医) + [0x1046] = 0x4E95, --(井) + [0x1047] = 0x4EA5, --(亥) + [0x1048] = 0x57DF, --(域) + [0x1049] = 0x80B2, --(育) + [0x104A] = 0x90C1, --(郁) + [0x104B] = 0x78EF, --(磯) + [0x104C] = 0x4E00, --(一) + [0x104D] = 0x58F1, --(壱) + [0x104E] = 0x6EA2, --(溢) + [0x104F] = 0x9038, --(逸) + [0x1050] = 0x7A32, --(稲) + [0x1051] = 0x8328, --(茨) + [0x1052] = 0x828B, --(芋) + [0x1053] = 0x9C2F, --(鰯) + [0x1054] = 0x5141, --(允) + [0x1055] = 0x5370, --(印) + [0x1056] = 0x54BD, --(咽) + [0x1057] = 0x54E1, --(員) + [0x1058] = 0x56E0, --(因) + [0x1059] = 0x59FB, --(姻) + [0x105A] = 0x5F15, --(引) + [0x105B] = 0x98F2, --(飲) + [0x105C] = 0x6DEB, --(淫) + [0x105D] = 0x80E4, --(胤) + [0x105E] = 0x852D, --(蔭) + [0x1101] = 0x9662, --(院) + [0x1102] = 0x9670, --(陰) + [0x1103] = 0x96A0, --(隠) + [0x1104] = 0x97FB, --(韻) + [0x1105] = 0x540B, --(吋) + [0x1106] = 0x53F3, --(右) + [0x1107] = 0x5B87, --(宇) + [0x1108] = 0x70CF, --(烏) + [0x1109] = 0x7FBD, --(羽) + [0x110A] = 0x8FC2, --(迂) + [0x110B] = 0x96E8, --(雨) + [0x110C] = 0x536F, --(卯) + [0x110D] = 0x9D5C, --(鵜) + [0x110E] = 0x7ABA, --(窺) + [0x110F] = 0x4E11, --(丑) + [0x1110] = 0x7893, --(碓) + [0x1111] = 0x81FC, --(臼) + [0x1112] = 0x6E26, --(渦) + [0x1113] = 0x5618, --(嘘) + [0x1114] = 0x5504, --(唄) + [0x1115] = 0x6B1D, --(欝) + [0x1116] = 0x851A, --(蔚) + [0x1117] = 0x9C3B, --(鰻) + [0x1118] = 0x59E5, --(姥) + [0x1119] = 0x53A9, --(厩) + [0x111A] = 0x6D66, --(浦) + [0x111B] = 0x74DC, --(瓜) + [0x111C] = 0x958F, --(閏) + [0x111D] = 0x5642, --(噂) + [0x111E] = 0x4E91, --(云) + [0x111F] = 0x904B, --(運) + [0x1120] = 0x96F2, --(雲) + [0x1121] = 0x834F, --(荏) + [0x1122] = 0x990C, --(餌) + [0x1123] = 0x53E1, --(叡) + [0x1124] = 0x55B6, --(営) + [0x1125] = 0x5B30, --(嬰) + [0x1126] = 0x5F71, --(影) + [0x1127] = 0x6620, --(映) + [0x1128] = 0x66F3, --(曳) + [0x1129] = 0x6804, --(栄) + [0x112A] = 0x6C38, --(永) + [0x112B] = 0x6CF3, --(泳) + [0x112C] = 0x6D29, --(洩) + [0x112D] = 0x745B, --(瑛) + [0x112E] = 0x76C8, --(盈) + [0x112F] = 0x7A4E, --(穎) + [0x1130] = 0x9834, --(頴) + [0x1131] = 0x82F1, --(英) + [0x1132] = 0x885B, --(衛) + [0x1133] = 0x8A60, --(詠) + [0x1134] = 0x92ED, --(鋭) + [0x1135] = 0x6DB2, --(液) + [0x1136] = 0x75AB, --(疫) + [0x1137] = 0x76CA, --(益) + [0x1138] = 0x99C5, --(駅) + [0x1139] = 0x60A6, --(悦) + [0x113A] = 0x8B01, --(謁) + [0x113B] = 0x8D8A, --(越) + [0x113C] = 0x95B2, --(閲) + [0x113D] = 0x698E, --(榎) + [0x113E] = 0x53AD, --(厭) + [0x113F] = 0x5186, --(円) + [0x1140] = 0x5712, --(園) + [0x1141] = 0x5830, --(堰) + [0x1142] = 0x5944, --(奄) + [0x1143] = 0x5BB4, --(宴) + [0x1144] = 0x5EF6, --(延) + [0x1145] = 0x6028, --(怨) + [0x1146] = 0x63A9, --(掩) + [0x1147] = 0x63F4, --(援) + [0x1148] = 0x6CBF, --(沿) + [0x1149] = 0x6F14, --(演) + [0x114A] = 0x708E, --(炎) + [0x114B] = 0x7114, --(焔) + [0x114C] = 0x7159, --(煙) + [0x114D] = 0x71D5, --(燕) + [0x114E] = 0x733F, --(猿) + [0x114F] = 0x7E01, --(縁) + [0x1150] = 0x8276, --(艶) + [0x1151] = 0x82D1, --(苑) + [0x1152] = 0x8597, --(薗) + [0x1153] = 0x9060, --(遠) + [0x1154] = 0x925B, --(鉛) + [0x1155] = 0x9D1B, --(鴛) + [0x1156] = 0x5869, --(塩) + [0x1157] = 0x65BC, --(於) + [0x1158] = 0x6C5A, --(汚) + [0x1159] = 0x7525, --(甥) + [0x115A] = 0x51F9, --(凹) + [0x115B] = 0x592E, --(央) + [0x115C] = 0x5965, --(奥) + [0x115D] = 0x5F80, --(往) + [0x115E] = 0x5FDC, --(応) + [0x1201] = 0x62BC, --(押) + [0x1202] = 0x65FA, --(旺) + [0x1203] = 0x6A2A, --(横) + [0x1204] = 0x6B27, --(欧) + [0x1205] = 0x6BB4, --(殴) + [0x1206] = 0x738B, --(王) + [0x1207] = 0x7FC1, --(翁) + [0x1208] = 0x8956, --(襖) + [0x1209] = 0x9D2C, --(鴬) + [0x120A] = 0x9D0E, --(鴎) + [0x120B] = 0x9EC4, --(黄) + [0x120C] = 0x5CA1, --(岡) + [0x120D] = 0x6C96, --(沖) + [0x120E] = 0x837B, --(荻) + [0x120F] = 0x5104, --(億) + [0x1210] = 0x5C4B, --(屋) + [0x1211] = 0x61B6, --(憶) + [0x1212] = 0x81C6, --(臆) + [0x1213] = 0x6876, --(桶) + [0x1214] = 0x7261, --(牡) + [0x1215] = 0x4E59, --(乙) + [0x1216] = 0x4FFA, --(俺) + [0x1217] = 0x5378, --(卸) + [0x1218] = 0x6069, --(恩) + [0x1219] = 0x6E29, --(温) + [0x121A] = 0x7A4F, --(穏) + [0x121B] = 0x97F3, --(音) + [0x121C] = 0x4E0B, --(下) + [0x121D] = 0x5316, --(化) + [0x121E] = 0x4EEE, --(仮) + [0x121F] = 0x4F55, --(何) + [0x1220] = 0x4F3D, --(伽) + [0x1221] = 0x4FA1, --(価) + [0x1222] = 0x4F73, --(佳) + [0x1223] = 0x52A0, --(加) + [0x1224] = 0x53EF, --(可) + [0x1225] = 0x5609, --(嘉) + [0x1226] = 0x590F, --(夏) + [0x1227] = 0x5AC1, --(嫁) + [0x1228] = 0x5BB6, --(家) + [0x1229] = 0x5BE1, --(寡) + [0x122A] = 0x79D1, --(科) + [0x122B] = 0x6687, --(暇) + [0x122C] = 0x679C, --(果) + [0x122D] = 0x67B6, --(架) + [0x122E] = 0x6B4C, --(歌) + [0x122F] = 0x6CB3, --(河) + [0x1230] = 0x706B, --(火) + [0x1231] = 0x73C2, --(珂) + [0x1232] = 0x798D, --(禍) + [0x1233] = 0x79BE, --(禾) + [0x1234] = 0x7A3C, --(稼) + [0x1235] = 0x7B87, --(箇) + [0x1236] = 0x82B1, --(花) + [0x1237] = 0x82DB, --(苛) + [0x1238] = 0x8304, --(茄) + [0x1239] = 0x8377, --(荷) + [0x123A] = 0x83EF, --(華) + [0x123B] = 0x83D3, --(菓) + [0x123C] = 0x8766, --(蝦) + [0x123D] = 0x8AB2, --(課) + [0x123E] = 0x5629, --(嘩) + [0x123F] = 0x8CA8, --(貨) + [0x1240] = 0x8FE6, --(迦) + [0x1241] = 0x904E, --(過) + [0x1242] = 0x971E, --(霞) + [0x1243] = 0x868A, --(蚊) + [0x1244] = 0x4FC4, --(俄) + [0x1245] = 0x5CE8, --(峨) + [0x1246] = 0x6211, --(我) + [0x1247] = 0x7259, --(牙) + [0x1248] = 0x753B, --(画) + [0x1249] = 0x81E5, --(臥) + [0x124A] = 0x82BD, --(芽) + [0x124B] = 0x86FE, --(蛾) + [0x124C] = 0x8CC0, --(賀) + [0x124D] = 0x96C5, --(雅) + [0x124E] = 0x9913, --(餓) + [0x124F] = 0x99D5, --(駕) + [0x1250] = 0x4ECB, --(介) + [0x1251] = 0x4F1A, --(会) + [0x1252] = 0x89E3, --(解) + [0x1253] = 0x56DE, --(回) + [0x1254] = 0x584A, --(塊) + [0x1255] = 0x58CA, --(壊) + [0x1256] = 0x5EFB, --(廻) + [0x1257] = 0x5FEB, --(快) + [0x1258] = 0x602A, --(怪) + [0x1259] = 0x6094, --(悔) + [0x125A] = 0x6062, --(恢) + [0x125B] = 0x61D0, --(懐) + [0x125C] = 0x6212, --(戒) + [0x125D] = 0x62D0, --(拐) + [0x125E] = 0x6539, --(改) + [0x1301] = 0x9B41, --(魁) + [0x1302] = 0x6666, --(晦) + [0x1303] = 0x68B0, --(械) + [0x1304] = 0x6D77, --(海) + [0x1305] = 0x7070, --(灰) + [0x1306] = 0x754C, --(界) + [0x1307] = 0x7686, --(皆) + [0x1308] = 0x7D75, --(絵) + [0x1309] = 0x82A5, --(芥) + [0x130A] = 0x87F9, --(蟹) + [0x130B] = 0x958B, --(開) + [0x130C] = 0x968E, --(階) + [0x130D] = 0x8C9D, --(貝) + [0x130E] = 0x51F1, --(凱) + [0x130F] = 0x52BE, --(劾) + [0x1310] = 0x5916, --(外) + [0x1311] = 0x54B3, --(咳) + [0x1312] = 0x5BB3, --(害) + [0x1313] = 0x5D16, --(崖) + [0x1314] = 0x6168, --(慨) + [0x1315] = 0x6982, --(概) + [0x1316] = 0x6DAF, --(涯) + [0x1317] = 0x788D, --(碍) + [0x1318] = 0x84CB, --(蓋) + [0x1319] = 0x8857, --(街) + [0x131A] = 0x8A72, --(該) + [0x131B] = 0x93A7, --(鎧) + [0x131C] = 0x9AB8, --(骸) + [0x131D] = 0x6D6C, --(浬) + [0x131E] = 0x99A8, --(馨) + [0x131F] = 0x86D9, --(蛙) + [0x1320] = 0x57A3, --(垣) + [0x1321] = 0x67FF, --(柿) + [0x1322] = 0x86CE, --(蛎) + [0x1323] = 0x920E, --(鈎) + [0x1324] = 0x5283, --(劃) + [0x1325] = 0x5687, --(嚇) + [0x1326] = 0x5404, --(各) + [0x1327] = 0x5ED3, --(廓) + [0x1328] = 0x62E1, --(拡) + [0x1329] = 0x64B9, --(撹) + [0x132A] = 0x683C, --(格) + [0x132B] = 0x6838, --(核) + [0x132C] = 0x6BBB, --(殻) + [0x132D] = 0x7372, --(獲) + [0x132E] = 0x78BA, --(確) + [0x132F] = 0x7A6B, --(穫) + [0x1330] = 0x899A, --(覚) + [0x1331] = 0x89D2, --(角) + [0x1332] = 0x8D6B, --(赫) + [0x1333] = 0x8F03, --(較) + [0x1334] = 0x90ED, --(郭) + [0x1335] = 0x95A3, --(閣) + [0x1336] = 0x9694, --(隔) + [0x1337] = 0x9769, --(革) + [0x1338] = 0x5B66, --(学) + [0x1339] = 0x5CB3, --(岳) + [0x133A] = 0x697D, --(楽) + [0x133B] = 0x984D, --(額) + [0x133C] = 0x984E, --(顎) + [0x133D] = 0x639B, --(掛) + [0x133E] = 0x7B20, --(笠) + [0x133F] = 0x6A2B, --(樫) + [0x1340] = 0x6A7F, --(橿) + [0x1341] = 0x68B6, --(梶) + [0x1342] = 0x9C0D, --(鰍) + [0x1343] = 0x6F5F, --(潟) + [0x1344] = 0x5272, --(割) + [0x1345] = 0x559D, --(喝) + [0x1346] = 0x6070, --(恰) + [0x1347] = 0x62EC, --(括) + [0x1348] = 0x6D3B, --(活) + [0x1349] = 0x6E07, --(渇) + [0x134A] = 0x6ED1, --(滑) + [0x134B] = 0x845B, --(葛) + [0x134C] = 0x8910, --(褐) + [0x134D] = 0x8F44, --(轄) + [0x134E] = 0x4E14, --(且) + [0x134F] = 0x9C39, --(鰹) + [0x1350] = 0x53F6, --(叶) + [0x1351] = 0x691B, --(椛) + [0x1352] = 0x6A3A, --(樺) + [0x1353] = 0x9784, --(鞄) + [0x1354] = 0x682A, --(株) + [0x1355] = 0x515C, --(兜) + [0x1356] = 0x7AC3, --(竃) + [0x1357] = 0x84B2, --(蒲) + [0x1358] = 0x91DC, --(釜) + [0x1359] = 0x938C, --(鎌) + [0x135A] = 0x565B, --(噛) + [0x135B] = 0x9D28, --(鴨) + [0x135C] = 0x6822, --(栢) + [0x135D] = 0x8305, --(茅) + [0x135E] = 0x8431, --(萱) + [0x1401] = 0x7CA5, --(粥) + [0x1402] = 0x5208, --(刈) + [0x1403] = 0x82C5, --(苅) + [0x1404] = 0x74E6, --(瓦) + [0x1405] = 0x4E7E, --(乾) + [0x1406] = 0x4F83, --(侃) + [0x1407] = 0x51A0, --(冠) + [0x1408] = 0x5BD2, --(寒) + [0x1409] = 0x520A, --(刊) + [0x140A] = 0x52D8, --(勘) + [0x140B] = 0x52E7, --(勧) + [0x140C] = 0x5DFB, --(巻) + [0x140D] = 0x559A, --(喚) + [0x140E] = 0x582A, --(堪) + [0x140F] = 0x59E6, --(姦) + [0x1410] = 0x5B8C, --(完) + [0x1411] = 0x5B98, --(官) + [0x1412] = 0x5BDB, --(寛) + [0x1413] = 0x5E72, --(干) + [0x1414] = 0x5E79, --(幹) + [0x1415] = 0x60A3, --(患) + [0x1416] = 0x611F, --(感) + [0x1417] = 0x6163, --(慣) + [0x1418] = 0x61BE, --(憾) + [0x1419] = 0x63DB, --(換) + [0x141A] = 0x6562, --(敢) + [0x141B] = 0x67D1, --(柑) + [0x141C] = 0x6853, --(桓) + [0x141D] = 0x68FA, --(棺) + [0x141E] = 0x6B3E, --(款) + [0x141F] = 0x6B53, --(歓) + [0x1420] = 0x6C57, --(汗) + [0x1421] = 0x6F22, --(漢) + [0x1422] = 0x6F97, --(澗) + [0x1423] = 0x6F45, --(潅) + [0x1424] = 0x74B0, --(環) + [0x1425] = 0x7518, --(甘) + [0x1426] = 0x76E3, --(監) + [0x1427] = 0x770B, --(看) + [0x1428] = 0x7AFF, --(竿) + [0x1429] = 0x7BA1, --(管) + [0x142A] = 0x7C21, --(簡) + [0x142B] = 0x7DE9, --(緩) + [0x142C] = 0x7F36, --(缶) + [0x142D] = 0x7FF0, --(翰) + [0x142E] = 0x809D, --(肝) + [0x142F] = 0x8266, --(艦) + [0x1430] = 0x839E, --(莞) + [0x1431] = 0x89B3, --(観) + [0x1432] = 0x8ACC, --(諌) + [0x1433] = 0x8CAB, --(貫) + [0x1434] = 0x9084, --(還) + [0x1435] = 0x9451, --(鑑) + [0x1436] = 0x9593, --(間) + [0x1437] = 0x9591, --(閑) + [0x1438] = 0x95A2, --(関) + [0x1439] = 0x9665, --(陥) + [0x143A] = 0x97D3, --(韓) + [0x143B] = 0x9928, --(館) + [0x143C] = 0x8218, --(舘) + [0x143D] = 0x4E38, --(丸) + [0x143E] = 0x542B, --(含) + [0x143F] = 0x5CB8, --(岸) + [0x1440] = 0x5DCC, --(巌) + [0x1441] = 0x73A9, --(玩) + [0x1442] = 0x764C, --(癌) + [0x1443] = 0x773C, --(眼) + [0x1444] = 0x5CA9, --(岩) + [0x1445] = 0x7FEB, --(翫) + [0x1446] = 0x8D0B, --(贋) + [0x1447] = 0x96C1, --(雁) + [0x1448] = 0x9811, --(頑) + [0x1449] = 0x9854, --(顔) + [0x144A] = 0x9858, --(願) + [0x144B] = 0x4F01, --(企) + [0x144C] = 0x4F0E, --(伎) + [0x144D] = 0x5371, --(危) + [0x144E] = 0x559C, --(喜) + [0x144F] = 0x5668, --(器) + [0x1450] = 0x57FA, --(基) + [0x1451] = 0x5947, --(奇) + [0x1452] = 0x5B09, --(嬉) + [0x1453] = 0x5BC4, --(寄) + [0x1454] = 0x5C90, --(岐) + [0x1455] = 0x5E0C, --(希) + [0x1456] = 0x5E7E, --(幾) + [0x1457] = 0x5FCC, --(忌) + [0x1458] = 0x63EE, --(揮) + [0x1459] = 0x673A, --(机) + [0x145A] = 0x65D7, --(旗) + [0x145B] = 0x65E2, --(既) + [0x145C] = 0x671F, --(期) + [0x145D] = 0x68CB, --(棋) + [0x145E] = 0x68C4, --(棄) + [0x1501] = 0x6A5F, --(機) + [0x1502] = 0x5E30, --(帰) + [0x1503] = 0x6BC5, --(毅) + [0x1504] = 0x6C17, --(気) + [0x1505] = 0x6C7D, --(汽) + [0x1506] = 0x757F, --(畿) + [0x1507] = 0x7948, --(祈) + [0x1508] = 0x5B63, --(季) + [0x1509] = 0x7A00, --(稀) + [0x150A] = 0x7D00, --(紀) + [0x150B] = 0x5FBD, --(徽) + [0x150C] = 0x898F, --(規) + [0x150D] = 0x8A18, --(記) + [0x150E] = 0x8CB4, --(貴) + [0x150F] = 0x8D77, --(起) + [0x1510] = 0x8ECC, --(軌) + [0x1511] = 0x8F1D, --(輝) + [0x1512] = 0x98E2, --(飢) + [0x1513] = 0x9A0E, --(騎) + [0x1514] = 0x9B3C, --(鬼) + [0x1515] = 0x4E80, --(亀) + [0x1516] = 0x507D, --(偽) + [0x1517] = 0x5100, --(儀) + [0x1518] = 0x5993, --(妓) + [0x1519] = 0x5B9C, --(宜) + [0x151A] = 0x622F, --(戯) + [0x151B] = 0x6280, --(技) + [0x151C] = 0x64EC, --(擬) + [0x151D] = 0x6B3A, --(欺) + [0x151E] = 0x72A0, --(犠) + [0x151F] = 0x7591, --(疑) + [0x1520] = 0x7947, --(祇) + [0x1521] = 0x7FA9, --(義) + [0x1522] = 0x87FB, --(蟻) + [0x1523] = 0x8ABC, --(誼) + [0x1524] = 0x8B70, --(議) + [0x1525] = 0x63AC, --(掬) + [0x1526] = 0x83CA, --(菊) + [0x1527] = 0x97A0, --(鞠) + [0x1528] = 0x5409, --(吉) + [0x1529] = 0x5403, --(吃) + [0x152A] = 0x55AB, --(喫) + [0x152B] = 0x6854, --(桔) + [0x152C] = 0x6A58, --(橘) + [0x152D] = 0x8A70, --(詰) + [0x152E] = 0x7827, --(砧) + [0x152F] = 0x6775, --(杵) + [0x1530] = 0x9ECD, --(黍) + [0x1531] = 0x5374, --(却) + [0x1532] = 0x5BA2, --(客) + [0x1533] = 0x811A, --(脚) + [0x1534] = 0x8650, --(虐) + [0x1535] = 0x9006, --(逆) + [0x1536] = 0x4E18, --(丘) + [0x1537] = 0x4E45, --(久) + [0x1538] = 0x4EC7, --(仇) + [0x1539] = 0x4F11, --(休) + [0x153A] = 0x53CA, --(及) + [0x153B] = 0x5438, --(吸) + [0x153C] = 0x5BAE, --(宮) + [0x153D] = 0x5F13, --(弓) + [0x153E] = 0x6025, --(急) + [0x153F] = 0x6551, --(救) + [0x1540] = 0x673D, --(朽) + [0x1541] = 0x6C42, --(求) + [0x1542] = 0x6C72, --(汲) + [0x1543] = 0x6CE3, --(泣) + [0x1544] = 0x7078, --(灸) + [0x1545] = 0x7403, --(球) + [0x1546] = 0x7A76, --(究) + [0x1547] = 0x7AAE, --(窮) + [0x1548] = 0x7B08, --(笈) + [0x1549] = 0x7D1A, --(級) + [0x154A] = 0x7CFE, --(糾) + [0x154B] = 0x7D66, --(給) + [0x154C] = 0x65E7, --(旧) + [0x154D] = 0x725B, --(牛) + [0x154E] = 0x53BB, --(去) + [0x154F] = 0x5C45, --(居) + [0x1550] = 0x5DE8, --(巨) + [0x1551] = 0x62D2, --(拒) + [0x1552] = 0x62E0, --(拠) + [0x1553] = 0x6319, --(挙) + [0x1554] = 0x6E20, --(渠) + [0x1555] = 0x865A, --(虚) + [0x1556] = 0x8A31, --(許) + [0x1557] = 0x8DDD, --(距) + [0x1558] = 0x92F8, --(鋸) + [0x1559] = 0x6F01, --(漁) + [0x155A] = 0x79A6, --(禦) + [0x155B] = 0x9B5A, --(魚) + [0x155C] = 0x4EA8, --(亨) + [0x155D] = 0x4EAB, --(享) + [0x155E] = 0x4EAC, --(京) + [0x1601] = 0x4F9B, --(供) + [0x1602] = 0x4FA0, --(侠) + [0x1603] = 0x50D1, --(僑) + [0x1604] = 0x5147, --(兇) + [0x1605] = 0x7AF6, --(競) + [0x1606] = 0x5171, --(共) + [0x1607] = 0x51F6, --(凶) + [0x1608] = 0x5354, --(協) + [0x1609] = 0x5321, --(匡) + [0x160A] = 0x537F, --(卿) + [0x160B] = 0x53EB, --(叫) + [0x160C] = 0x55AC, --(喬) + [0x160D] = 0x5883, --(境) + [0x160E] = 0x5CE1, --(峡) + [0x160F] = 0x5F37, --(強) + [0x1610] = 0x5F4A, --(彊) + [0x1611] = 0x602F, --(怯) + [0x1612] = 0x6050, --(恐) + [0x1613] = 0x606D, --(恭) + [0x1614] = 0x631F, --(挟) + [0x1615] = 0x6559, --(教) + [0x1616] = 0x6A4B, --(橋) + [0x1617] = 0x6CC1, --(況) + [0x1618] = 0x72C2, --(狂) + [0x1619] = 0x72ED, --(狭) + [0x161A] = 0x77EF, --(矯) + [0x161B] = 0x80F8, --(胸) + [0x161C] = 0x8105, --(脅) + [0x161D] = 0x8208, --(興) + [0x161E] = 0x854E, --(蕎) + [0x161F] = 0x90F7, --(郷) + [0x1620] = 0x93E1, --(鏡) + [0x1621] = 0x97FF, --(響) + [0x1622] = 0x9957, --(饗) + [0x1623] = 0x9A5A, --(驚) + [0x1624] = 0x4EF0, --(仰) + [0x1625] = 0x51DD, --(凝) + [0x1626] = 0x5C2D, --(尭) + [0x1627] = 0x6681, --(暁) + [0x1628] = 0x696D, --(業) + [0x1629] = 0x5C40, --(局) + [0x162A] = 0x66F2, --(曲) + [0x162B] = 0x6975, --(極) + [0x162C] = 0x7389, --(玉) + [0x162D] = 0x6850, --(桐) + [0x162E] = 0x7C81, --(粁) + [0x162F] = 0x50C5, --(僅) + [0x1630] = 0x52E4, --(勤) + [0x1631] = 0x5747, --(均) + [0x1632] = 0x5DFE, --(巾) + [0x1633] = 0x9326, --(錦) + [0x1634] = 0x65A4, --(斤) + [0x1635] = 0x6B23, --(欣) + [0x1636] = 0x6B3D, --(欽) + [0x1637] = 0x7434, --(琴) + [0x1638] = 0x7981, --(禁) + [0x1639] = 0x79BD, --(禽) + [0x163A] = 0x7B4B, --(筋) + [0x163B] = 0x7DCA, --(緊) + [0x163C] = 0x82B9, --(芹) + [0x163D] = 0x83CC, --(菌) + [0x163E] = 0x887F, --(衿) + [0x163F] = 0x895F, --(襟) + [0x1640] = 0x8B39, --(謹) + [0x1641] = 0x8FD1, --(近) + [0x1642] = 0x91D1, --(金) + [0x1643] = 0x541F, --(吟) + [0x1644] = 0x9280, --(銀) + [0x1645] = 0x4E5D, --(九) + [0x1646] = 0x5036, --(倶) + [0x1647] = 0x53E5, --(句) + [0x1648] = 0x533A, --(区) + [0x1649] = 0x72D7, --(狗) + [0x164A] = 0x7396, --(玖) + [0x164B] = 0x77E9, --(矩) + [0x164C] = 0x82E6, --(苦) + [0x164D] = 0x8EAF, --(躯) + [0x164E] = 0x99C6, --(駆) + [0x164F] = 0x99C8, --(駈) + [0x1650] = 0x99D2, --(駒) + [0x1651] = 0x5177, --(具) + [0x1652] = 0x611A, --(愚) + [0x1653] = 0x865E, --(虞) + [0x1654] = 0x55B0, --(喰) + [0x1655] = 0x7A7A, --(空) + [0x1656] = 0x5076, --(偶) + [0x1657] = 0x5BD3, --(寓) + [0x1658] = 0x9047, --(遇) + [0x1659] = 0x9685, --(隅) + [0x165A] = 0x4E32, --(串) + [0x165B] = 0x6ADB, --(櫛) + [0x165C] = 0x91E7, --(釧) + [0x165D] = 0x5C51, --(屑) + [0x165E] = 0x5C48, --(屈) + [0x1701] = 0x6398, --(掘) + [0x1702] = 0x7A9F, --(窟) + [0x1703] = 0x6C93, --(沓) + [0x1704] = 0x9774, --(靴) + [0x1705] = 0x8F61, --(轡) + [0x1706] = 0x7AAA, --(窪) + [0x1707] = 0x718A, --(熊) + [0x1708] = 0x9688, --(隈) + [0x1709] = 0x7C82, --(粂) + [0x170A] = 0x6817, --(栗) + [0x170B] = 0x7E70, --(繰) + [0x170C] = 0x6851, --(桑) + [0x170D] = 0x936C, --(鍬) + [0x170E] = 0x52F2, --(勲) + [0x170F] = 0x541B, --(君) + [0x1710] = 0x85AB, --(薫) + [0x1711] = 0x8A13, --(訓) + [0x1712] = 0x7FA4, --(群) + [0x1713] = 0x8ECD, --(軍) + [0x1714] = 0x90E1, --(郡) + [0x1715] = 0x5366, --(卦) + [0x1716] = 0x8888, --(袈) + [0x1717] = 0x7941, --(祁) + [0x1718] = 0x4FC2, --(係) + [0x1719] = 0x50BE, --(傾) + [0x171A] = 0x5211, --(刑) + [0x171B] = 0x5144, --(兄) + [0x171C] = 0x5553, --(啓) + [0x171D] = 0x572D, --(圭) + [0x171E] = 0x73EA, --(珪) + [0x171F] = 0x578B, --(型) + [0x1720] = 0x5951, --(契) + [0x1721] = 0x5F62, --(形) + [0x1722] = 0x5F84, --(径) + [0x1723] = 0x6075, --(恵) + [0x1724] = 0x6176, --(慶) + [0x1725] = 0x6167, --(慧) + [0x1726] = 0x61A9, --(憩) + [0x1727] = 0x63B2, --(掲) + [0x1728] = 0x643A, --(携) + [0x1729] = 0x656C, --(敬) + [0x172A] = 0x666F, --(景) + [0x172B] = 0x6842, --(桂) + [0x172C] = 0x6E13, --(渓) + [0x172D] = 0x7566, --(畦) + [0x172E] = 0x7A3D, --(稽) + [0x172F] = 0x7CFB, --(系) + [0x1730] = 0x7D4C, --(経) + [0x1731] = 0x7D99, --(継) + [0x1732] = 0x7E4B, --(繋) + [0x1733] = 0x7F6B, --(罫) + [0x1734] = 0x830E, --(茎) + [0x1735] = 0x834A, --(荊) + [0x1736] = 0x86CD, --(蛍) + [0x1737] = 0x8A08, --(計) + [0x1738] = 0x8A63, --(詣) + [0x1739] = 0x8B66, --(警) + [0x173A] = 0x8EFD, --(軽) + [0x173B] = 0x981A, --(頚) + [0x173C] = 0x9D8F, --(鶏) + [0x173D] = 0x82B8, --(芸) + [0x173E] = 0x8FCE, --(迎) + [0x173F] = 0x9BE8, --(鯨) + [0x1740] = 0x5287, --(劇) + [0x1741] = 0x621F, --(戟) + [0x1742] = 0x6483, --(撃) + [0x1743] = 0x6FC0, --(激) + [0x1744] = 0x9699, --(隙) + [0x1745] = 0x6841, --(桁) + [0x1746] = 0x5091, --(傑) + [0x1747] = 0x6B20, --(欠) + [0x1748] = 0x6C7A, --(決) + [0x1749] = 0x6F54, --(潔) + [0x174A] = 0x7A74, --(穴) + [0x174B] = 0x7D50, --(結) + [0x174C] = 0x8840, --(血) + [0x174D] = 0x8A23, --(訣) + [0x174E] = 0x6708, --(月) + [0x174F] = 0x4EF6, --(件) + [0x1750] = 0x5039, --(倹) + [0x1751] = 0x5026, --(倦) + [0x1752] = 0x5065, --(健) + [0x1753] = 0x517C, --(兼) + [0x1754] = 0x5238, --(券) + [0x1755] = 0x5263, --(剣) + [0x1756] = 0x55A7, --(喧) + [0x1757] = 0x570F, --(圏) + [0x1758] = 0x5805, --(堅) + [0x1759] = 0x5ACC, --(嫌) + [0x175A] = 0x5EFA, --(建) + [0x175B] = 0x61B2, --(憲) + [0x175C] = 0x61F8, --(懸) + [0x175D] = 0x62F3, --(拳) + [0x175E] = 0x6372, --(捲) + [0x1801] = 0x691C, --(検) + [0x1802] = 0x6A29, --(権) + [0x1803] = 0x727D, --(牽) + [0x1804] = 0x72AC, --(犬) + [0x1805] = 0x732E, --(献) + [0x1806] = 0x7814, --(研) + [0x1807] = 0x786F, --(硯) + [0x1808] = 0x7D79, --(絹) + [0x1809] = 0x770C, --(県) + [0x180A] = 0x80A9, --(肩) + [0x180B] = 0x898B, --(見) + [0x180C] = 0x8B19, --(謙) + [0x180D] = 0x8CE2, --(賢) + [0x180E] = 0x8ED2, --(軒) + [0x180F] = 0x9063, --(遣) + [0x1810] = 0x9375, --(鍵) + [0x1811] = 0x967A, --(険) + [0x1812] = 0x9855, --(顕) + [0x1813] = 0x9A13, --(験) + [0x1814] = 0x9E78, --(鹸) + [0x1815] = 0x5143, --(元) + [0x1816] = 0x539F, --(原) + [0x1817] = 0x53B3, --(厳) + [0x1818] = 0x5E7B, --(幻) + [0x1819] = 0x5F26, --(弦) + [0x181A] = 0x6E1B, --(減) + [0x181B] = 0x6E90, --(源) + [0x181C] = 0x7384, --(玄) + [0x181D] = 0x73FE, --(現) + [0x181E] = 0x7D43, --(絃) + [0x181F] = 0x8237, --(舷) + [0x1820] = 0x8A00, --(言) + [0x1821] = 0x8AFA, --(諺) + [0x1822] = 0x9650, --(限) + [0x1823] = 0x4E4E, --(乎) + [0x1824] = 0x500B, --(個) + [0x1825] = 0x53E4, --(古) + [0x1826] = 0x547C, --(呼) + [0x1827] = 0x56FA, --(固) + [0x1828] = 0x59D1, --(姑) + [0x1829] = 0x5B64, --(孤) + [0x182A] = 0x5DF1, --(己) + [0x182B] = 0x5EAB, --(庫) + [0x182C] = 0x5F27, --(弧) + [0x182D] = 0x6238, --(戸) + [0x182E] = 0x6545, --(故) + [0x182F] = 0x67AF, --(枯) + [0x1830] = 0x6E56, --(湖) + [0x1831] = 0x72D0, --(狐) + [0x1832] = 0x7CCA, --(糊) + [0x1833] = 0x88B4, --(袴) + [0x1834] = 0x80A1, --(股) + [0x1835] = 0x80E1, --(胡) + [0x1836] = 0x83F0, --(菰) + [0x1837] = 0x864E, --(虎) + [0x1838] = 0x8A87, --(誇) + [0x1839] = 0x8DE8, --(跨) + [0x183A] = 0x9237, --(鈷) + [0x183B] = 0x96C7, --(雇) + [0x183C] = 0x9867, --(顧) + [0x183D] = 0x9F13, --(鼓) + [0x183E] = 0x4E94, --(五) + [0x183F] = 0x4E92, --(互) + [0x1840] = 0x4F0D, --(伍) + [0x1841] = 0x5348, --(午) + [0x1842] = 0x5449, --(呉) + [0x1843] = 0x543E, --(吾) + [0x1844] = 0x5A2F, --(娯) + [0x1845] = 0x5F8C, --(後) + [0x1846] = 0x5FA1, --(御) + [0x1847] = 0x609F, --(悟) + [0x1848] = 0x68A7, --(梧) + [0x1849] = 0x6A8E, --(檎) + [0x184A] = 0x745A, --(瑚) + [0x184B] = 0x7881, --(碁) + [0x184C] = 0x8A9E, --(語) + [0x184D] = 0x8AA4, --(誤) + [0x184E] = 0x8B77, --(護) + [0x184F] = 0x9190, --(醐) + [0x1850] = 0x4E5E, --(乞) + [0x1851] = 0x9BC9, --(鯉) + [0x1852] = 0x4EA4, --(交) + [0x1853] = 0x4F7C, --(佼) + [0x1854] = 0x4FAF, --(侯) + [0x1855] = 0x5019, --(候) + [0x1856] = 0x5016, --(倖) + [0x1857] = 0x5149, --(光) + [0x1858] = 0x516C, --(公) + [0x1859] = 0x529F, --(功) + [0x185A] = 0x52B9, --(効) + [0x185B] = 0x52FE, --(勾) + [0x185C] = 0x539A, --(厚) + [0x185D] = 0x53E3, --(口) + [0x185E] = 0x5411, --(向) + [0x1901] = 0x540E, --(后) + [0x1902] = 0x5589, --(喉) + [0x1903] = 0x5751, --(坑) + [0x1904] = 0x57A2, --(垢) + [0x1905] = 0x597D, --(好) + [0x1906] = 0x5B54, --(孔) + [0x1907] = 0x5B5D, --(孝) + [0x1908] = 0x5B8F, --(宏) + [0x1909] = 0x5DE5, --(工) + [0x190A] = 0x5DE7, --(巧) + [0x190B] = 0x5DF7, --(巷) + [0x190C] = 0x5E78, --(幸) + [0x190D] = 0x5E83, --(広) + [0x190E] = 0x5E9A, --(庚) + [0x190F] = 0x5EB7, --(康) + [0x1910] = 0x5F18, --(弘) + [0x1911] = 0x6052, --(恒) + [0x1912] = 0x614C, --(慌) + [0x1913] = 0x6297, --(抗) + [0x1914] = 0x62D8, --(拘) + [0x1915] = 0x63A7, --(控) + [0x1916] = 0x653B, --(攻) + [0x1917] = 0x6602, --(昂) + [0x1918] = 0x6643, --(晃) + [0x1919] = 0x66F4, --(更) + [0x191A] = 0x676D, --(杭) + [0x191B] = 0x6821, --(校) + [0x191C] = 0x6897, --(梗) + [0x191D] = 0x69CB, --(構) + [0x191E] = 0x6C5F, --(江) + [0x191F] = 0x6D2A, --(洪) + [0x1920] = 0x6D69, --(浩) + [0x1921] = 0x6E2F, --(港) + [0x1922] = 0x6E9D, --(溝) + [0x1923] = 0x7532, --(甲) + [0x1924] = 0x7687, --(皇) + [0x1925] = 0x786C, --(硬) + [0x1926] = 0x7A3F, --(稿) + [0x1927] = 0x7CE0, --(糠) + [0x1928] = 0x7D05, --(紅) + [0x1929] = 0x7D18, --(紘) + [0x192A] = 0x7D5E, --(絞) + [0x192B] = 0x7DB1, --(綱) + [0x192C] = 0x8015, --(耕) + [0x192D] = 0x8003, --(考) + [0x192E] = 0x80AF, --(肯) + [0x192F] = 0x80B1, --(肱) + [0x1930] = 0x8154, --(腔) + [0x1931] = 0x818F, --(膏) + [0x1932] = 0x822A, --(航) + [0x1933] = 0x8352, --(荒) + [0x1934] = 0x884C, --(行) + [0x1935] = 0x8861, --(衡) + [0x1936] = 0x8B1B, --(講) + [0x1937] = 0x8CA2, --(貢) + [0x1938] = 0x8CFC, --(購) + [0x1939] = 0x90CA, --(郊) + [0x193A] = 0x9175, --(酵) + [0x193B] = 0x9271, --(鉱) + [0x193C] = 0x783F, --(砿) + [0x193D] = 0x92FC, --(鋼) + [0x193E] = 0x95A4, --(閤) + [0x193F] = 0x964D, --(降) + [0x1940] = 0x9805, --(項) + [0x1941] = 0x9999, --(香) + [0x1942] = 0x9AD8, --(高) + [0x1943] = 0x9D3B, --(鴻) + [0x1944] = 0x525B, --(剛) + [0x1945] = 0x52AB, --(劫) + [0x1946] = 0x53F7, --(号) + [0x1947] = 0x5408, --(合) + [0x1948] = 0x58D5, --(壕) + [0x1949] = 0x62F7, --(拷) + [0x194A] = 0x6FE0, --(濠) + [0x194B] = 0x8C6A, --(豪) + [0x194C] = 0x8F5F, --(轟) + [0x194D] = 0x9EB9, --(麹) + [0x194E] = 0x514B, --(克) + [0x194F] = 0x523B, --(刻) + [0x1950] = 0x544A, --(告) + [0x1951] = 0x56FD, --(国) + [0x1952] = 0x7A40, --(穀) + [0x1953] = 0x9177, --(酷) + [0x1954] = 0x9D60, --(鵠) + [0x1955] = 0x9ED2, --(黒) + [0x1956] = 0x7344, --(獄) + [0x1957] = 0x6F09, --(漉) + [0x1958] = 0x8170, --(腰) + [0x1959] = 0x7511, --(甑) + [0x195A] = 0x5FFD, --(忽) + [0x195B] = 0x60DA, --(惚) + [0x195C] = 0x9AA8, --(骨) + [0x195D] = 0x72DB, --(狛) + [0x195E] = 0x8FBC, --(込) + [0x1A01] = 0x6B64, --(此) + [0x1A02] = 0x9803, --(頃) + [0x1A03] = 0x4ECA, --(今) + [0x1A04] = 0x56F0, --(困) + [0x1A05] = 0x5764, --(坤) + [0x1A06] = 0x58BE, --(墾) + [0x1A07] = 0x5A5A, --(婚) + [0x1A08] = 0x6068, --(恨) + [0x1A09] = 0x61C7, --(懇) + [0x1A0A] = 0x660F, --(昏) + [0x1A0B] = 0x6606, --(昆) + [0x1A0C] = 0x6839, --(根) + [0x1A0D] = 0x68B1, --(梱) + [0x1A0E] = 0x6DF7, --(混) + [0x1A0F] = 0x75D5, --(痕) + [0x1A10] = 0x7D3A, --(紺) + [0x1A11] = 0x826E, --(艮) + [0x1A12] = 0x9B42, --(魂) + [0x1A13] = 0x4E9B, --(些) + [0x1A14] = 0x4F50, --(佐) + [0x1A15] = 0x53C9, --(叉) + [0x1A16] = 0x5506, --(唆) + [0x1A17] = 0x5D6F, --(嵯) + [0x1A18] = 0x5DE6, --(左) + [0x1A19] = 0x5DEE, --(差) + [0x1A1A] = 0x67FB, --(査) + [0x1A1B] = 0x6C99, --(沙) + [0x1A1C] = 0x7473, --(瑳) + [0x1A1D] = 0x7802, --(砂) + [0x1A1E] = 0x8A50, --(詐) + [0x1A1F] = 0x9396, --(鎖) + [0x1A20] = 0x88DF, --(裟) + [0x1A21] = 0x5750, --(坐) + [0x1A22] = 0x5EA7, --(座) + [0x1A23] = 0x632B, --(挫) + [0x1A24] = 0x50B5, --(債) + [0x1A25] = 0x50AC, --(催) + [0x1A26] = 0x518D, --(再) + [0x1A27] = 0x6700, --(最) + [0x1A28] = 0x54C9, --(哉) + [0x1A29] = 0x585E, --(塞) + [0x1A2A] = 0x59BB, --(妻) + [0x1A2B] = 0x5BB0, --(宰) + [0x1A2C] = 0x5F69, --(彩) + [0x1A2D] = 0x624D, --(才) + [0x1A2E] = 0x63A1, --(採) + [0x1A2F] = 0x683D, --(栽) + [0x1A30] = 0x6B73, --(歳) + [0x1A31] = 0x6E08, --(済) + [0x1A32] = 0x707D, --(災) + [0x1A33] = 0x91C7, --(采) + [0x1A34] = 0x7280, --(犀) + [0x1A35] = 0x7815, --(砕) + [0x1A36] = 0x7826, --(砦) + [0x1A37] = 0x796D, --(祭) + [0x1A38] = 0x658E, --(斎) + [0x1A39] = 0x7D30, --(細) + [0x1A3A] = 0x83DC, --(菜) + [0x1A3B] = 0x88C1, --(裁) + [0x1A3C] = 0x8F09, --(載) + [0x1A3D] = 0x969B, --(際) + [0x1A3E] = 0x5264, --(剤) + [0x1A3F] = 0x5728, --(在) + [0x1A40] = 0x6750, --(材) + [0x1A41] = 0x7F6A, --(罪) + [0x1A42] = 0x8CA1, --(財) + [0x1A43] = 0x51B4, --(冴) + [0x1A44] = 0x5742, --(坂) + [0x1A45] = 0x962A, --(阪) + [0x1A46] = 0x583A, --(堺) + [0x1A47] = 0x698A, --(榊) + [0x1A48] = 0x80B4, --(肴) + [0x1A49] = 0x54B2, --(咲) + [0x1A4A] = 0x5D0E, --(崎) + [0x1A4B] = 0x57FC, --(埼) + [0x1A4C] = 0x7895, --(碕) + [0x1A4D] = 0x9DFA, --(鷺) + [0x1A4E] = 0x4F5C, --(作) + [0x1A4F] = 0x524A, --(削) + [0x1A50] = 0x548B, --(咋) + [0x1A51] = 0x643E, --(搾) + [0x1A52] = 0x6628, --(昨) + [0x1A53] = 0x6714, --(朔) + [0x1A54] = 0x67F5, --(柵) + [0x1A55] = 0x7A84, --(窄) + [0x1A56] = 0x7B56, --(策) + [0x1A57] = 0x7D22, --(索) + [0x1A58] = 0x932F, --(錯) + [0x1A59] = 0x685C, --(桜) + [0x1A5A] = 0x9BAD, --(鮭) + [0x1A5B] = 0x7B39, --(笹) + [0x1A5C] = 0x5319, --(匙) + [0x1A5D] = 0x518A, --(冊) + [0x1A5E] = 0x5237, --(刷) + [0x1B01] = 0x5BDF, --(察) + [0x1B02] = 0x62F6, --(拶) + [0x1B03] = 0x64AE, --(撮) + [0x1B04] = 0x64E6, --(擦) + [0x1B05] = 0x672D, --(札) + [0x1B06] = 0x6BBA, --(殺) + [0x1B07] = 0x85A9, --(薩) + [0x1B08] = 0x96D1, --(雑) + [0x1B09] = 0x7690, --(皐) + [0x1B0A] = 0x9BD6, --(鯖) + [0x1B0B] = 0x634C, --(捌) + [0x1B0C] = 0x9306, --(錆) + [0x1B0D] = 0x9BAB, --(鮫) + [0x1B0E] = 0x76BF, --(皿) + [0x1B0F] = 0x6652, --(晒) + [0x1B10] = 0x4E09, --(三) + [0x1B11] = 0x5098, --(傘) + [0x1B12] = 0x53C2, --(参) + [0x1B13] = 0x5C71, --(山) + [0x1B14] = 0x60E8, --(惨) + [0x1B15] = 0x6492, --(撒) + [0x1B16] = 0x6563, --(散) + [0x1B17] = 0x685F, --(桟) + [0x1B18] = 0x71E6, --(燦) + [0x1B19] = 0x73CA, --(珊) + [0x1B1A] = 0x7523, --(産) + [0x1B1B] = 0x7B97, --(算) + [0x1B1C] = 0x7E82, --(纂) + [0x1B1D] = 0x8695, --(蚕) + [0x1B1E] = 0x8B83, --(讃) + [0x1B1F] = 0x8CDB, --(賛) + [0x1B20] = 0x9178, --(酸) + [0x1B21] = 0x9910, --(餐) + [0x1B22] = 0x65AC, --(斬) + [0x1B23] = 0x66AB, --(暫) + [0x1B24] = 0x6B8B, --(残) + [0x1B25] = 0x4ED5, --(仕) + [0x1B26] = 0x4ED4, --(仔) + [0x1B27] = 0x4F3A, --(伺) + [0x1B28] = 0x4F7F, --(使) + [0x1B29] = 0x523A, --(刺) + [0x1B2A] = 0x53F8, --(司) + [0x1B2B] = 0x53F2, --(史) + [0x1B2C] = 0x55E3, --(嗣) + [0x1B2D] = 0x56DB, --(四) + [0x1B2E] = 0x58EB, --(士) + [0x1B2F] = 0x59CB, --(始) + [0x1B30] = 0x59C9, --(姉) + [0x1B31] = 0x59FF, --(姿) + [0x1B32] = 0x5B50, --(子) + [0x1B33] = 0x5C4D, --(屍) + [0x1B34] = 0x5E02, --(市) + [0x1B35] = 0x5E2B, --(師) + [0x1B36] = 0x5FD7, --(志) + [0x1B37] = 0x601D, --(思) + [0x1B38] = 0x6307, --(指) + [0x1B39] = 0x652F, --(支) + [0x1B3A] = 0x5B5C, --(孜) + [0x1B3B] = 0x65AF, --(斯) + [0x1B3C] = 0x65BD, --(施) + [0x1B3D] = 0x65E8, --(旨) + [0x1B3E] = 0x679D, --(枝) + [0x1B3F] = 0x6B62, --(止) + [0x1B40] = 0x6B7B, --(死) + [0x1B41] = 0x6C0F, --(氏) + [0x1B42] = 0x7345, --(獅) + [0x1B43] = 0x7949, --(祉) + [0x1B44] = 0x79C1, --(私) + [0x1B45] = 0x7CF8, --(糸) + [0x1B46] = 0x7D19, --(紙) + [0x1B47] = 0x7D2B, --(紫) + [0x1B48] = 0x80A2, --(肢) + [0x1B49] = 0x8102, --(脂) + [0x1B4A] = 0x81F3, --(至) + [0x1B4B] = 0x8996, --(視) + [0x1B4C] = 0x8A5E, --(詞) + [0x1B4D] = 0x8A69, --(詩) + [0x1B4E] = 0x8A66, --(試) + [0x1B4F] = 0x8A8C, --(誌) + [0x1B50] = 0x8AEE, --(諮) + [0x1B51] = 0x8CC7, --(資) + [0x1B52] = 0x8CDC, --(賜) + [0x1B53] = 0x96CC, --(雌) + [0x1B54] = 0x98FC, --(飼) + [0x1B55] = 0x6B6F, --(歯) + [0x1B56] = 0x4E8B, --(事) + [0x1B57] = 0x4F3C, --(似) + [0x1B58] = 0x4F8D, --(侍) + [0x1B59] = 0x5150, --(児) + [0x1B5A] = 0x5B57, --(字) + [0x1B5B] = 0x5BFA, --(寺) + [0x1B5C] = 0x6148, --(慈) + [0x1B5D] = 0x6301, --(持) + [0x1B5E] = 0x6642, --(時) + [0x1C01] = 0x6B21, --(次) + [0x1C02] = 0x6ECB, --(滋) + [0x1C03] = 0x6CBB, --(治) + [0x1C04] = 0x723E, --(爾) + [0x1C05] = 0x74BD, --(璽) + [0x1C06] = 0x75D4, --(痔) + [0x1C07] = 0x78C1, --(磁) + [0x1C08] = 0x793A, --(示) + [0x1C09] = 0x800C, --(而) + [0x1C0A] = 0x8033, --(耳) + [0x1C0B] = 0x81EA, --(自) + [0x1C0C] = 0x8494, --(蒔) + [0x1C0D] = 0x8F9E, --(辞) + [0x1C0E] = 0x6C50, --(汐) + [0x1C0F] = 0x9E7F, --(鹿) + [0x1C10] = 0x5F0F, --(式) + [0x1C11] = 0x8B58, --(識) + [0x1C12] = 0x9D2B, --(鴫) + [0x1C13] = 0x7AFA, --(竺) + [0x1C14] = 0x8EF8, --(軸) + [0x1C15] = 0x5B8D, --(宍) + [0x1C16] = 0x96EB, --(雫) + [0x1C17] = 0x4E03, --(七) + [0x1C18] = 0x53F1, --(叱) + [0x1C19] = 0x57F7, --(執) + [0x1C1A] = 0x5931, --(失) + [0x1C1B] = 0x5AC9, --(嫉) + [0x1C1C] = 0x5BA4, --(室) + [0x1C1D] = 0x6089, --(悉) + [0x1C1E] = 0x6E7F, --(湿) + [0x1C1F] = 0x6F06, --(漆) + [0x1C20] = 0x75BE, --(疾) + [0x1C21] = 0x8CEA, --(質) + [0x1C22] = 0x5B9F, --(実) + [0x1C23] = 0x8500, --(蔀) + [0x1C24] = 0x7BE0, --(篠) + [0x1C25] = 0x5072, --(偲) + [0x1C26] = 0x67F4, --(柴) + [0x1C27] = 0x829D, --(芝) + [0x1C28] = 0x5C61, --(屡) + [0x1C29] = 0x854A, --(蕊) + [0x1C2A] = 0x7E1E, --(縞) + [0x1C2B] = 0x820E, --(舎) + [0x1C2C] = 0x5199, --(写) + [0x1C2D] = 0x5C04, --(射) + [0x1C2E] = 0x6368, --(捨) + [0x1C2F] = 0x8D66, --(赦) + [0x1C30] = 0x659C, --(斜) + [0x1C31] = 0x716E, --(煮) + [0x1C32] = 0x793E, --(社) + [0x1C33] = 0x7D17, --(紗) + [0x1C34] = 0x8005, --(者) + [0x1C35] = 0x8B1D, --(謝) + [0x1C36] = 0x8ECA, --(車) + [0x1C37] = 0x906E, --(遮) + [0x1C38] = 0x86C7, --(蛇) + [0x1C39] = 0x90AA, --(邪) + [0x1C3A] = 0x501F, --(借) + [0x1C3B] = 0x52FA, --(勺) + [0x1C3C] = 0x5C3A, --(尺) + [0x1C3D] = 0x6753, --(杓) + [0x1C3E] = 0x707C, --(灼) + [0x1C3F] = 0x7235, --(爵) + [0x1C40] = 0x914C, --(酌) + [0x1C41] = 0x91C8, --(釈) + [0x1C42] = 0x932B, --(錫) + [0x1C43] = 0x82E5, --(若) + [0x1C44] = 0x5BC2, --(寂) + [0x1C45] = 0x5F31, --(弱) + [0x1C46] = 0x60F9, --(惹) + [0x1C47] = 0x4E3B, --(主) + [0x1C48] = 0x53D6, --(取) + [0x1C49] = 0x5B88, --(守) + [0x1C4A] = 0x624B, --(手) + [0x1C4B] = 0x6731, --(朱) + [0x1C4C] = 0x6B8A, --(殊) + [0x1C4D] = 0x72E9, --(狩) + [0x1C4E] = 0x73E0, --(珠) + [0x1C4F] = 0x7A2E, --(種) + [0x1C50] = 0x816B, --(腫) + [0x1C51] = 0x8DA3, --(趣) + [0x1C52] = 0x9152, --(酒) + [0x1C53] = 0x9996, --(首) + [0x1C54] = 0x5112, --(儒) + [0x1C55] = 0x53D7, --(受) + [0x1C56] = 0x546A, --(呪) + [0x1C57] = 0x5BFF, --(寿) + [0x1C58] = 0x6388, --(授) + [0x1C59] = 0x6A39, --(樹) + [0x1C5A] = 0x7DAC, --(綬) + [0x1C5B] = 0x9700, --(需) + [0x1C5C] = 0x56DA, --(囚) + [0x1C5D] = 0x53CE, --(収) + [0x1C5E] = 0x5468, --(周) + [0x1D01] = 0x5B97, --(宗) + [0x1D02] = 0x5C31, --(就) + [0x1D03] = 0x5DDE, --(州) + [0x1D04] = 0x4FEE, --(修) + [0x1D05] = 0x6101, --(愁) + [0x1D06] = 0x62FE, --(拾) + [0x1D07] = 0x6D32, --(洲) + [0x1D08] = 0x79C0, --(秀) + [0x1D09] = 0x79CB, --(秋) + [0x1D0A] = 0x7D42, --(終) + [0x1D0B] = 0x7E4D, --(繍) + [0x1D0C] = 0x7FD2, --(習) + [0x1D0D] = 0x81ED, --(臭) + [0x1D0E] = 0x821F, --(舟) + [0x1D0F] = 0x8490, --(蒐) + [0x1D10] = 0x8846, --(衆) + [0x1D11] = 0x8972, --(襲) + [0x1D12] = 0x8B90, --(讐) + [0x1D13] = 0x8E74, --(蹴) + [0x1D14] = 0x8F2F, --(輯) + [0x1D15] = 0x9031, --(週) + [0x1D16] = 0x914B, --(酋) + [0x1D17] = 0x916C, --(酬) + [0x1D18] = 0x96C6, --(集) + [0x1D19] = 0x919C, --(醜) + [0x1D1A] = 0x4EC0, --(什) + [0x1D1B] = 0x4F4F, --(住) + [0x1D1C] = 0x5145, --(充) + [0x1D1D] = 0x5341, --(十) + [0x1D1E] = 0x5F93, --(従) + [0x1D1F] = 0x620E, --(戎) + [0x1D20] = 0x67D4, --(柔) + [0x1D21] = 0x6C41, --(汁) + [0x1D22] = 0x6E0B, --(渋) + [0x1D23] = 0x7363, --(獣) + [0x1D24] = 0x7E26, --(縦) + [0x1D25] = 0x91CD, --(重) + [0x1D26] = 0x9283, --(銃) + [0x1D27] = 0x53D4, --(叔) + [0x1D28] = 0x5919, --(夙) + [0x1D29] = 0x5BBF, --(宿) + [0x1D2A] = 0x6DD1, --(淑) + [0x1D2B] = 0x795D, --(祝) + [0x1D2C] = 0x7E2E, --(縮) + [0x1D2D] = 0x7C9B, --(粛) + [0x1D2E] = 0x587E, --(塾) + [0x1D2F] = 0x719F, --(熟) + [0x1D30] = 0x51FA, --(出) + [0x1D31] = 0x8853, --(術) + [0x1D32] = 0x8FF0, --(述) + [0x1D33] = 0x4FCA, --(俊) + [0x1D34] = 0x5CFB, --(峻) + [0x1D35] = 0x6625, --(春) + [0x1D36] = 0x77AC, --(瞬) + [0x1D37] = 0x7AE3, --(竣) + [0x1D38] = 0x821C, --(舜) + [0x1D39] = 0x99FF, --(駿) + [0x1D3A] = 0x51C6, --(准) + [0x1D3B] = 0x5FAA, --(循) + [0x1D3C] = 0x65EC, --(旬) + [0x1D3D] = 0x696F, --(楯) + [0x1D3E] = 0x6B89, --(殉) + [0x1D3F] = 0x6DF3, --(淳) + [0x1D40] = 0x6E96, --(準) + [0x1D41] = 0x6F64, --(潤) + [0x1D42] = 0x76FE, --(盾) + [0x1D43] = 0x7D14, --(純) + [0x1D44] = 0x5DE1, --(巡) + [0x1D45] = 0x9075, --(遵) + [0x1D46] = 0x9187, --(醇) + [0x1D47] = 0x9806, --(順) + [0x1D48] = 0x51E6, --(処) + [0x1D49] = 0x521D, --(初) + [0x1D4A] = 0x6240, --(所) + [0x1D4B] = 0x6691, --(暑) + [0x1D4C] = 0x66D9, --(曙) + [0x1D4D] = 0x6E1A, --(渚) + [0x1D4E] = 0x5EB6, --(庶) + [0x1D4F] = 0x7DD2, --(緒) + [0x1D50] = 0x7F72, --(署) + [0x1D51] = 0x66F8, --(書) + [0x1D52] = 0x85AF, --(薯) + [0x1D53] = 0x85F7, --(藷) + [0x1D54] = 0x8AF8, --(諸) + [0x1D55] = 0x52A9, --(助) + [0x1D56] = 0x53D9, --(叙) + [0x1D57] = 0x5973, --(女) + [0x1D58] = 0x5E8F, --(序) + [0x1D59] = 0x5F90, --(徐) + [0x1D5A] = 0x6055, --(恕) + [0x1D5B] = 0x92E4, --(鋤) + [0x1D5C] = 0x9664, --(除) + [0x1D5D] = 0x50B7, --(傷) + [0x1D5E] = 0x511F, --(償) + [0x1E01] = 0x52DD, --(勝) + [0x1E02] = 0x5320, --(匠) + [0x1E03] = 0x5347, --(升) + [0x1E04] = 0x53EC, --(召) + [0x1E05] = 0x54E8, --(哨) + [0x1E06] = 0x5546, --(商) + [0x1E07] = 0x5531, --(唱) + [0x1E08] = 0x5617, --(嘗) + [0x1E09] = 0x5968, --(奨) + [0x1E0A] = 0x59BE, --(妾) + [0x1E0B] = 0x5A3C, --(娼) + [0x1E0C] = 0x5BB5, --(宵) + [0x1E0D] = 0x5C06, --(将) + [0x1E0E] = 0x5C0F, --(小) + [0x1E0F] = 0x5C11, --(少) + [0x1E10] = 0x5C1A, --(尚) + [0x1E11] = 0x5E84, --(庄) + [0x1E12] = 0x5E8A, --(床) + [0x1E13] = 0x5EE0, --(廠) + [0x1E14] = 0x5F70, --(彰) + [0x1E15] = 0x627F, --(承) + [0x1E16] = 0x6284, --(抄) + [0x1E17] = 0x62DB, --(招) + [0x1E18] = 0x638C, --(掌) + [0x1E19] = 0x6377, --(捷) + [0x1E1A] = 0x6607, --(昇) + [0x1E1B] = 0x660C, --(昌) + [0x1E1C] = 0x662D, --(昭) + [0x1E1D] = 0x6676, --(晶) + [0x1E1E] = 0x677E, --(松) + [0x1E1F] = 0x68A2, --(梢) + [0x1E20] = 0x6A1F, --(樟) + [0x1E21] = 0x6A35, --(樵) + [0x1E22] = 0x6CBC, --(沼) + [0x1E23] = 0x6D88, --(消) + [0x1E24] = 0x6E09, --(渉) + [0x1E25] = 0x6E58, --(湘) + [0x1E26] = 0x713C, --(焼) + [0x1E27] = 0x7126, --(焦) + [0x1E28] = 0x7167, --(照) + [0x1E29] = 0x75C7, --(症) + [0x1E2A] = 0x7701, --(省) + [0x1E2B] = 0x785D, --(硝) + [0x1E2C] = 0x7901, --(礁) + [0x1E2D] = 0x7965, --(祥) + [0x1E2E] = 0x79F0, --(称) + [0x1E2F] = 0x7AE0, --(章) + [0x1E30] = 0x7B11, --(笑) + [0x1E31] = 0x7CA7, --(粧) + [0x1E32] = 0x7D39, --(紹) + [0x1E33] = 0x8096, --(肖) + [0x1E34] = 0x83D6, --(菖) + [0x1E35] = 0x848B, --(蒋) + [0x1E36] = 0x8549, --(蕉) + [0x1E37] = 0x885D, --(衝) + [0x1E38] = 0x88F3, --(裳) + [0x1E39] = 0x8A1F, --(訟) + [0x1E3A] = 0x8A3C, --(証) + [0x1E3B] = 0x8A54, --(詔) + [0x1E3C] = 0x8A73, --(詳) + [0x1E3D] = 0x8C61, --(象) + [0x1E3E] = 0x8CDE, --(賞) + [0x1E3F] = 0x91A4, --(醤) + [0x1E40] = 0x9266, --(鉦) + [0x1E41] = 0x937E, --(鍾) + [0x1E42] = 0x9418, --(鐘) + [0x1E43] = 0x969C, --(障) + [0x1E44] = 0x9798, --(鞘) + [0x1E45] = 0x4E0A, --(上) + [0x1E46] = 0x4E08, --(丈) + [0x1E47] = 0x4E1E, --(丞) + [0x1E48] = 0x4E57, --(乗) + [0x1E49] = 0x5197, --(冗) + [0x1E4A] = 0x5270, --(剰) + [0x1E4B] = 0x57CE, --(城) + [0x1E4C] = 0x5834, --(場) + [0x1E4D] = 0x58CC, --(壌) + [0x1E4E] = 0x5B22, --(嬢) + [0x1E4F] = 0x5E38, --(常) + [0x1E50] = 0x60C5, --(情) + [0x1E51] = 0x64FE, --(擾) + [0x1E52] = 0x6761, --(条) + [0x1E53] = 0x6756, --(杖) + [0x1E54] = 0x6D44, --(浄) + [0x1E55] = 0x72B6, --(状) + [0x1E56] = 0x7573, --(畳) + [0x1E57] = 0x7A63, --(穣) + [0x1E58] = 0x84B8, --(蒸) + [0x1E59] = 0x8B72, --(譲) + [0x1E5A] = 0x91B8, --(醸) + [0x1E5B] = 0x9320, --(錠) + [0x1E5C] = 0x5631, --(嘱) + [0x1E5D] = 0x57F4, --(埴) + [0x1E5E] = 0x98FE, --(飾) + [0x1F01] = 0x62ED, --(拭) + [0x1F02] = 0x690D, --(植) + [0x1F03] = 0x6B96, --(殖) + [0x1F04] = 0x71ED, --(燭) + [0x1F05] = 0x7E54, --(織) + [0x1F06] = 0x8077, --(職) + [0x1F07] = 0x8272, --(色) + [0x1F08] = 0x89E6, --(触) + [0x1F09] = 0x98DF, --(食) + [0x1F0A] = 0x8755, --(蝕) + [0x1F0B] = 0x8FB1, --(辱) + [0x1F0C] = 0x5C3B, --(尻) + [0x1F0D] = 0x4F38, --(伸) + [0x1F0E] = 0x4FE1, --(信) + [0x1F0F] = 0x4FB5, --(侵) + [0x1F10] = 0x5507, --(唇) + [0x1F11] = 0x5A20, --(娠) + [0x1F12] = 0x5BDD, --(寝) + [0x1F13] = 0x5BE9, --(審) + [0x1F14] = 0x5FC3, --(心) + [0x1F15] = 0x614E, --(慎) + [0x1F16] = 0x632F, --(振) + [0x1F17] = 0x65B0, --(新) + [0x1F18] = 0x664B, --(晋) + [0x1F19] = 0x68EE, --(森) + [0x1F1A] = 0x699B, --(榛) + [0x1F1B] = 0x6D78, --(浸) + [0x1F1C] = 0x6DF1, --(深) + [0x1F1D] = 0x7533, --(申) + [0x1F1E] = 0x75B9, --(疹) + [0x1F1F] = 0x771F, --(真) + [0x1F20] = 0x795E, --(神) + [0x1F21] = 0x79E6, --(秦) + [0x1F22] = 0x7D33, --(紳) + [0x1F23] = 0x81E3, --(臣) + [0x1F24] = 0x82AF, --(芯) + [0x1F25] = 0x85AA, --(薪) + [0x1F26] = 0x89AA, --(親) + [0x1F27] = 0x8A3A, --(診) + [0x1F28] = 0x8EAB, --(身) + [0x1F29] = 0x8F9B, --(辛) + [0x1F2A] = 0x9032, --(進) + [0x1F2B] = 0x91DD, --(針) + [0x1F2C] = 0x9707, --(震) + [0x1F2D] = 0x4EBA, --(人) + [0x1F2E] = 0x4EC1, --(仁) + [0x1F2F] = 0x5203, --(刃) + [0x1F30] = 0x5875, --(塵) + [0x1F31] = 0x58EC, --(壬) + [0x1F32] = 0x5C0B, --(尋) + [0x1F33] = 0x751A, --(甚) + [0x1F34] = 0x5C3D, --(尽) + [0x1F35] = 0x814E, --(腎) + [0x1F36] = 0x8A0A, --(訊) + [0x1F37] = 0x8FC5, --(迅) + [0x1F38] = 0x9663, --(陣) + [0x1F39] = 0x976D, --(靭) + [0x1F3A] = 0x7B25, --(笥) + [0x1F3B] = 0x8ACF, --(諏) + [0x1F3C] = 0x9808, --(須) + [0x1F3D] = 0x9162, --(酢) + [0x1F3E] = 0x56F3, --(図) + [0x1F3F] = 0x53A8, --(厨) + [0x1F40] = 0x9017, --(逗) + [0x1F41] = 0x5439, --(吹) + [0x1F42] = 0x5782, --(垂) + [0x1F43] = 0x5E25, --(帥) + [0x1F44] = 0x63A8, --(推) + [0x1F45] = 0x6C34, --(水) + [0x1F46] = 0x708A, --(炊) + [0x1F47] = 0x7761, --(睡) + [0x1F48] = 0x7C8B, --(粋) + [0x1F49] = 0x7FE0, --(翠) + [0x1F4A] = 0x8870, --(衰) + [0x1F4B] = 0x9042, --(遂) + [0x1F4C] = 0x9154, --(酔) + [0x1F4D] = 0x9310, --(錐) + [0x1F4E] = 0x9318, --(錘) + [0x1F4F] = 0x968F, --(随) + [0x1F50] = 0x745E, --(瑞) + [0x1F51] = 0x9AC4, --(髄) + [0x1F52] = 0x5D07, --(崇) + [0x1F53] = 0x5D69, --(嵩) + [0x1F54] = 0x6570, --(数) + [0x1F55] = 0x67A2, --(枢) + [0x1F56] = 0x8DA8, --(趨) + [0x1F57] = 0x96DB, --(雛) + [0x1F58] = 0x636E, --(据) + [0x1F59] = 0x6749, --(杉) + [0x1F5A] = 0x6919, --(椙) + [0x1F5B] = 0x83C5, --(菅) + [0x1F5C] = 0x9817, --(頗) + [0x1F5D] = 0x96C0, --(雀) + [0x1F5E] = 0x88FE, --(裾) + [0x2001] = 0x6F84, --(澄) + [0x2002] = 0x647A, --(摺) + [0x2003] = 0x5BF8, --(寸) + [0x2004] = 0x4E16, --(世) + [0x2005] = 0x702C, --(瀬) + [0x2006] = 0x755D, --(畝) + [0x2007] = 0x662F, --(是) + [0x2008] = 0x51C4, --(凄) + [0x2009] = 0x5236, --(制) + [0x200A] = 0x52E2, --(勢) + [0x200B] = 0x59D3, --(姓) + [0x200C] = 0x5F81, --(征) + [0x200D] = 0x6027, --(性) + [0x200E] = 0x6210, --(成) + [0x200F] = 0x653F, --(政) + [0x2010] = 0x6574, --(整) + [0x2011] = 0x661F, --(星) + [0x2012] = 0x6674, --(晴) + [0x2013] = 0x68F2, --(棲) + [0x2014] = 0x6816, --(栖) + [0x2015] = 0x6B63, --(正) + [0x2016] = 0x6E05, --(清) + [0x2017] = 0x7272, --(牲) + [0x2018] = 0x751F, --(生) + [0x2019] = 0x76DB, --(盛) + [0x201A] = 0x7CBE, --(精) + [0x201B] = 0x8056, --(聖) + [0x201C] = 0x58F0, --(声) + [0x201D] = 0x88FD, --(製) + [0x201E] = 0x897F, --(西) + [0x201F] = 0x8AA0, --(誠) + [0x2020] = 0x8A93, --(誓) + [0x2021] = 0x8ACB, --(請) + [0x2022] = 0x901D, --(逝) + [0x2023] = 0x9192, --(醒) + [0x2024] = 0x9752, --(青) + [0x2025] = 0x9759, --(静) + [0x2026] = 0x6589, --(斉) + [0x2027] = 0x7A0E, --(税) + [0x2028] = 0x8106, --(脆) + [0x2029] = 0x96BB, --(隻) + [0x202A] = 0x5E2D, --(席) + [0x202B] = 0x60DC, --(惜) + [0x202C] = 0x621A, --(戚) + [0x202D] = 0x65A5, --(斥) + [0x202E] = 0x6614, --(昔) + [0x202F] = 0x6790, --(析) + [0x2030] = 0x77F3, --(石) + [0x2031] = 0x7A4D, --(積) + [0x2032] = 0x7C4D, --(籍) + [0x2033] = 0x7E3E, --(績) + [0x2034] = 0x810A, --(脊) + [0x2035] = 0x8CAC, --(責) + [0x2036] = 0x8D64, --(赤) + [0x2037] = 0x8DE1, --(跡) + [0x2038] = 0x8E5F, --(蹟) + [0x2039] = 0x78A9, --(碩) + [0x203A] = 0x5207, --(切) + [0x203B] = 0x62D9, --(拙) + [0x203C] = 0x63A5, --(接) + [0x203D] = 0x6442, --(摂) + [0x203E] = 0x6298, --(折) + [0x203F] = 0x8A2D, --(設) + [0x2040] = 0x7A83, --(窃) + [0x2041] = 0x7BC0, --(節) + [0x2042] = 0x8AAC, --(説) + [0x2043] = 0x96EA, --(雪) + [0x2044] = 0x7D76, --(絶) + [0x2045] = 0x820C, --(舌) + [0x2046] = 0x8749, --(蝉) + [0x2047] = 0x4ED9, --(仙) + [0x2048] = 0x5148, --(先) + [0x2049] = 0x5343, --(千) + [0x204A] = 0x5360, --(占) + [0x204B] = 0x5BA3, --(宣) + [0x204C] = 0x5C02, --(専) + [0x204D] = 0x5C16, --(尖) + [0x204E] = 0x5DDD, --(川) + [0x204F] = 0x6226, --(戦) + [0x2050] = 0x6247, --(扇) + [0x2051] = 0x64B0, --(撰) + [0x2052] = 0x6813, --(栓) + [0x2053] = 0x6834, --(栴) + [0x2054] = 0x6CC9, --(泉) + [0x2055] = 0x6D45, --(浅) + [0x2056] = 0x6D17, --(洗) + [0x2057] = 0x67D3, --(染) + [0x2058] = 0x6F5C, --(潜) + [0x2059] = 0x714E, --(煎) + [0x205A] = 0x717D, --(煽) + [0x205B] = 0x65CB, --(旋) + [0x205C] = 0x7A7F, --(穿) + [0x205D] = 0x7BAD, --(箭) + [0x205E] = 0x7DDA, --(線) + [0x2101] = 0x7E4A, --(繊) + [0x2102] = 0x7FA8, --(羨) + [0x2103] = 0x817A, --(腺) + [0x2104] = 0x821B, --(舛) + [0x2105] = 0x8239, --(船) + [0x2106] = 0x85A6, --(薦) + [0x2107] = 0x8A6E, --(詮) + [0x2108] = 0x8CCE, --(賎) + [0x2109] = 0x8DF5, --(践) + [0x210A] = 0x9078, --(選) + [0x210B] = 0x9077, --(遷) + [0x210C] = 0x92AD, --(銭) + [0x210D] = 0x9291, --(銑) + [0x210E] = 0x9583, --(閃) + [0x210F] = 0x9BAE, --(鮮) + [0x2110] = 0x524D, --(前) + [0x2111] = 0x5584, --(善) + [0x2112] = 0x6F38, --(漸) + [0x2113] = 0x7136, --(然) + [0x2114] = 0x5168, --(全) + [0x2115] = 0x7985, --(禅) + [0x2116] = 0x7E55, --(繕) + [0x2117] = 0x81B3, --(膳) + [0x2118] = 0x7CCE, --(糎) + [0x2119] = 0x564C, --(噌) + [0x211A] = 0x5851, --(塑) + [0x211B] = 0x5CA8, --(岨) + [0x211C] = 0x63AA, --(措) + [0x211D] = 0x66FE, --(曾) + [0x211E] = 0x66FD, --(曽) + [0x211F] = 0x695A, --(楚) + [0x2120] = 0x72D9, --(狙) + [0x2121] = 0x758F, --(疏) + [0x2122] = 0x758E, --(疎) + [0x2123] = 0x790E, --(礎) + [0x2124] = 0x7956, --(祖) + [0x2125] = 0x79DF, --(租) + [0x2126] = 0x7C97, --(粗) + [0x2127] = 0x7D20, --(素) + [0x2128] = 0x7D44, --(組) + [0x2129] = 0x8607, --(蘇) + [0x212A] = 0x8A34, --(訴) + [0x212B] = 0x963B, --(阻) + [0x212C] = 0x9061, --(遡) + [0x212D] = 0x9F20, --(鼠) + [0x212E] = 0x50E7, --(僧) + [0x212F] = 0x5275, --(創) + [0x2130] = 0x53CC, --(双) + [0x2131] = 0x53E2, --(叢) + [0x2132] = 0x5009, --(倉) + [0x2133] = 0x55AA, --(喪) + [0x2134] = 0x58EE, --(壮) + [0x2135] = 0x594F, --(奏) + [0x2136] = 0x723D, --(爽) + [0x2137] = 0x5B8B, --(宋) + [0x2138] = 0x5C64, --(層) + [0x2139] = 0x531D, --(匝) + [0x213A] = 0x60E3, --(惣) + [0x213B] = 0x60F3, --(想) + [0x213C] = 0x635C, --(捜) + [0x213D] = 0x6383, --(掃) + [0x213E] = 0x633F, --(挿) + [0x213F] = 0x63BB, --(掻) + [0x2140] = 0x64CD, --(操) + [0x2141] = 0x65E9, --(早) + [0x2142] = 0x66F9, --(曹) + [0x2143] = 0x5DE3, --(巣) + [0x2144] = 0x69CD, --(槍) + [0x2145] = 0x69FD, --(槽) + [0x2146] = 0x6F15, --(漕) + [0x2147] = 0x71E5, --(燥) + [0x2148] = 0x4E89, --(争) + [0x2149] = 0x75E9, --(痩) + [0x214A] = 0x76F8, --(相) + [0x214B] = 0x7A93, --(窓) + [0x214C] = 0x7CDF, --(糟) + [0x214D] = 0x7DCF, --(総) + [0x214E] = 0x7D9C, --(綜) + [0x214F] = 0x8061, --(聡) + [0x2150] = 0x8349, --(草) + [0x2151] = 0x8358, --(荘) + [0x2152] = 0x846C, --(葬) + [0x2153] = 0x84BC, --(蒼) + [0x2154] = 0x85FB, --(藻) + [0x2155] = 0x88C5, --(装) + [0x2156] = 0x8D70, --(走) + [0x2157] = 0x9001, --(送) + [0x2158] = 0x906D, --(遭) + [0x2159] = 0x9397, --(鎗) + [0x215A] = 0x971C, --(霜) + [0x215B] = 0x9A12, --(騒) + [0x215C] = 0x50CF, --(像) + [0x215D] = 0x5897, --(増) + [0x215E] = 0x618E, --(憎) + [0x2201] = 0x81D3, --(臓) + [0x2202] = 0x8535, --(蔵) + [0x2203] = 0x8D08, --(贈) + [0x2204] = 0x9020, --(造) + [0x2205] = 0x4FC3, --(促) + [0x2206] = 0x5074, --(側) + [0x2207] = 0x5247, --(則) + [0x2208] = 0x5373, --(即) + [0x2209] = 0x606F, --(息) + [0x220A] = 0x6349, --(捉) + [0x220B] = 0x675F, --(束) + [0x220C] = 0x6E2C, --(測) + [0x220D] = 0x8DB3, --(足) + [0x220E] = 0x901F, --(速) + [0x220F] = 0x4FD7, --(俗) + [0x2210] = 0x5C5E, --(属) + [0x2211] = 0x8CCA, --(賊) + [0x2212] = 0x65CF, --(族) + [0x2213] = 0x7D9A, --(続) + [0x2214] = 0x5352, --(卒) + [0x2215] = 0x8896, --(袖) + [0x2216] = 0x5176, --(其) + [0x2217] = 0x63C3, --(揃) + [0x2218] = 0x5B58, --(存) + [0x2219] = 0x5B6B, --(孫) + [0x221A] = 0x5C0A, --(尊) + [0x221B] = 0x640D, --(損) + [0x221C] = 0x6751, --(村) + [0x221D] = 0x905C, --(遜) + [0x221E] = 0x4ED6, --(他) + [0x221F] = 0x591A, --(多) + [0x2220] = 0x592A, --(太) + [0x2221] = 0x6C70, --(汰) + [0x2222] = 0x8A51, --(詑) + [0x2223] = 0x553E, --(唾) + [0x2224] = 0x5815, --(堕) + [0x2225] = 0x59A5, --(妥) + [0x2226] = 0x60F0, --(惰) + [0x2227] = 0x6253, --(打) + [0x2228] = 0x67C1, --(柁) + [0x2229] = 0x8235, --(舵) + [0x222A] = 0x6955, --(楕) + [0x222B] = 0x9640, --(陀) + [0x222C] = 0x99C4, --(駄) + [0x222D] = 0x9A28, --(騨) + [0x222E] = 0x4F53, --(体) + [0x222F] = 0x5806, --(堆) + [0x2230] = 0x5BFE, --(対) + [0x2231] = 0x8010, --(耐) + [0x2232] = 0x5CB1, --(岱) + [0x2233] = 0x5E2F, --(帯) + [0x2234] = 0x5F85, --(待) + [0x2235] = 0x6020, --(怠) + [0x2236] = 0x614B, --(態) + [0x2237] = 0x6234, --(戴) + [0x2238] = 0x66FF, --(替) + [0x2239] = 0x6CF0, --(泰) + [0x223A] = 0x6EDE, --(滞) + [0x223B] = 0x80CE, --(胎) + [0x223C] = 0x817F, --(腿) + [0x223D] = 0x82D4, --(苔) + [0x223E] = 0x888B, --(袋) + [0x223F] = 0x8CB8, --(貸) + [0x2240] = 0x9000, --(退) + [0x2241] = 0x902E, --(逮) + [0x2242] = 0x968A, --(隊) + [0x2243] = 0x9EDB, --(黛) + [0x2244] = 0x9BDB, --(鯛) + [0x2245] = 0x4EE3, --(代) + [0x2246] = 0x53F0, --(台) + [0x2247] = 0x5927, --(大) + [0x2248] = 0x7B2C, --(第) + [0x2249] = 0x918D, --(醍) + [0x224A] = 0x984C, --(題) + [0x224B] = 0x9DF9, --(鷹) + [0x224C] = 0x6EDD, --(滝) + [0x224D] = 0x7027, --(瀧) + [0x224E] = 0x5353, --(卓) + [0x224F] = 0x5544, --(啄) + [0x2250] = 0x5B85, --(宅) + [0x2251] = 0x6258, --(托) + [0x2252] = 0x629E, --(択) + [0x2253] = 0x62D3, --(拓) + [0x2254] = 0x6CA2, --(沢) + [0x2255] = 0x6FEF, --(濯) + [0x2256] = 0x7422, --(琢) + [0x2257] = 0x8A17, --(託) + [0x2258] = 0x9438, --(鐸) + [0x2259] = 0x6FC1, --(濁) + [0x225A] = 0x8AFE, --(諾) + [0x225B] = 0x8338, --(茸) + [0x225C] = 0x51E7, --(凧) + [0x225D] = 0x86F8, --(蛸) + [0x225E] = 0x53EA, --(只) + [0x2301] = 0x53E9, --(叩) + [0x2302] = 0x4F46, --(但) + [0x2303] = 0x9054, --(達) + [0x2304] = 0x8FB0, --(辰) + [0x2305] = 0x596A, --(奪) + [0x2306] = 0x8131, --(脱) + [0x2307] = 0x5DFD, --(巽) + [0x2308] = 0x7AEA, --(竪) + [0x2309] = 0x8FBF, --(辿) + [0x230A] = 0x68DA, --(棚) + [0x230B] = 0x8C37, --(谷) + [0x230C] = 0x72F8, --(狸) + [0x230D] = 0x9C48, --(鱈) + [0x230E] = 0x6A3D, --(樽) + [0x230F] = 0x8AB0, --(誰) + [0x2310] = 0x4E39, --(丹) + [0x2311] = 0x5358, --(単) + [0x2312] = 0x5606, --(嘆) + [0x2313] = 0x5766, --(坦) + [0x2314] = 0x62C5, --(担) + [0x2315] = 0x63A2, --(探) + [0x2316] = 0x65E6, --(旦) + [0x2317] = 0x6B4E, --(歎) + [0x2318] = 0x6DE1, --(淡) + [0x2319] = 0x6E5B, --(湛) + [0x231A] = 0x70AD, --(炭) + [0x231B] = 0x77ED, --(短) + [0x231C] = 0x7AEF, --(端) + [0x231D] = 0x7BAA, --(箪) + [0x231E] = 0x7DBB, --(綻) + [0x231F] = 0x803D, --(耽) + [0x2320] = 0x80C6, --(胆) + [0x2321] = 0x86CB, --(蛋) + [0x2322] = 0x8A95, --(誕) + [0x2323] = 0x935B, --(鍛) + [0x2324] = 0x56E3, --(団) + [0x2325] = 0x58C7, --(壇) + [0x2326] = 0x5F3E, --(弾) + [0x2327] = 0x65AD, --(断) + [0x2328] = 0x6696, --(暖) + [0x2329] = 0x6A80, --(檀) + [0x232A] = 0x6BB5, --(段) + [0x232B] = 0x7537, --(男) + [0x232C] = 0x8AC7, --(談) + [0x232D] = 0x5024, --(値) + [0x232E] = 0x77E5, --(知) + [0x232F] = 0x5730, --(地) + [0x2330] = 0x5F1B, --(弛) + [0x2331] = 0x6065, --(恥) + [0x2332] = 0x667A, --(智) + [0x2333] = 0x6C60, --(池) + [0x2334] = 0x75F4, --(痴) + [0x2335] = 0x7A1A, --(稚) + [0x2336] = 0x7F6E, --(置) + [0x2337] = 0x81F4, --(致) + [0x2338] = 0x8718, --(蜘) + [0x2339] = 0x9045, --(遅) + [0x233A] = 0x99B3, --(馳) + [0x233B] = 0x7BC9, --(築) + [0x233C] = 0x755C, --(畜) + [0x233D] = 0x7AF9, --(竹) + [0x233E] = 0x7B51, --(筑) + [0x233F] = 0x84C4, --(蓄) + [0x2340] = 0x9010, --(逐) + [0x2341] = 0x79E9, --(秩) + [0x2342] = 0x7A92, --(窒) + [0x2343] = 0x8336, --(茶) + [0x2344] = 0x5AE1, --(嫡) + [0x2345] = 0x7740, --(着) + [0x2346] = 0x4E2D, --(中) + [0x2347] = 0x4EF2, --(仲) + [0x2348] = 0x5B99, --(宙) + [0x2349] = 0x5FE0, --(忠) + [0x234A] = 0x62BD, --(抽) + [0x234B] = 0x663C, --(昼) + [0x234C] = 0x67F1, --(柱) + [0x234D] = 0x6CE8, --(注) + [0x234E] = 0x866B, --(虫) + [0x234F] = 0x8877, --(衷) + [0x2350] = 0x8A3B, --(註) + [0x2351] = 0x914E, --(酎) + [0x2352] = 0x92F3, --(鋳) + [0x2353] = 0x99D0, --(駐) + [0x2354] = 0x6A17, --(樗) + [0x2355] = 0x7026, --(瀦) + [0x2356] = 0x732A, --(猪) + [0x2357] = 0x82E7, --(苧) + [0x2358] = 0x8457, --(著) + [0x2359] = 0x8CAF, --(貯) + [0x235A] = 0x4E01, --(丁) + [0x235B] = 0x5146, --(兆) + [0x235C] = 0x51CB, --(凋) + [0x235D] = 0x558B, --(喋) + [0x235E] = 0x5BF5, --(寵) + [0x2401] = 0x5E16, --(帖) + [0x2402] = 0x5E33, --(帳) + [0x2403] = 0x5E81, --(庁) + [0x2404] = 0x5F14, --(弔) + [0x2405] = 0x5F35, --(張) + [0x2406] = 0x5F6B, --(彫) + [0x2407] = 0x5FB4, --(徴) + [0x2408] = 0x61F2, --(懲) + [0x2409] = 0x6311, --(挑) + [0x240A] = 0x66A2, --(暢) + [0x240B] = 0x671D, --(朝) + [0x240C] = 0x6F6E, --(潮) + [0x240D] = 0x7252, --(牒) + [0x240E] = 0x753A, --(町) + [0x240F] = 0x773A, --(眺) + [0x2410] = 0x8074, --(聴) + [0x2411] = 0x8139, --(脹) + [0x2412] = 0x8178, --(腸) + [0x2413] = 0x8776, --(蝶) + [0x2414] = 0x8ABF, --(調) + [0x2415] = 0x8ADC, --(諜) + [0x2416] = 0x8D85, --(超) + [0x2417] = 0x8DF3, --(跳) + [0x2418] = 0x929A, --(銚) + [0x2419] = 0x9577, --(長) + [0x241A] = 0x9802, --(頂) + [0x241B] = 0x9CE5, --(鳥) + [0x241C] = 0x52C5, --(勅) + [0x241D] = 0x6357, --(捗) + [0x241E] = 0x76F4, --(直) + [0x241F] = 0x6715, --(朕) + [0x2420] = 0x6C88, --(沈) + [0x2421] = 0x73CD, --(珍) + [0x2422] = 0x8CC3, --(賃) + [0x2423] = 0x93AE, --(鎮) + [0x2424] = 0x9673, --(陳) + [0x2425] = 0x6D25, --(津) + [0x2426] = 0x589C, --(墜) + [0x2427] = 0x690E, --(椎) + [0x2428] = 0x69CC, --(槌) + [0x2429] = 0x8FFD, --(追) + [0x242A] = 0x939A, --(鎚) + [0x242B] = 0x75DB, --(痛) + [0x242C] = 0x901A, --(通) + [0x242D] = 0x585A, --(塚) + [0x242E] = 0x6802, --(栂) + [0x242F] = 0x63B4, --(掴) + [0x2430] = 0x69FB, --(槻) + [0x2431] = 0x4F43, --(佃) + [0x2432] = 0x6F2C, --(漬) + [0x2433] = 0x67D8, --(柘) + [0x2434] = 0x8FBB, --(辻) + [0x2435] = 0x8526, --(蔦) + [0x2436] = 0x7DB4, --(綴) + [0x2437] = 0x9354, --(鍔) + [0x2438] = 0x693F, --(椿) + [0x2439] = 0x6F70, --(潰) + [0x243A] = 0x576A, --(坪) + [0x243B] = 0x58F7, --(壷) + [0x243C] = 0x5B2C, --(嬬) + [0x243D] = 0x7D2C, --(紬) + [0x243E] = 0x722A, --(爪) + [0x243F] = 0x540A, --(吊) + [0x2440] = 0x91E3, --(釣) + [0x2441] = 0x9DB4, --(鶴) + [0x2442] = 0x4EAD, --(亭) + [0x2443] = 0x4F4E, --(低) + [0x2444] = 0x505C, --(停) + [0x2445] = 0x5075, --(偵) + [0x2446] = 0x5243, --(剃) + [0x2447] = 0x8C9E, --(貞) + [0x2448] = 0x5448, --(呈) + [0x2449] = 0x5824, --(堤) + [0x244A] = 0x5B9A, --(定) + [0x244B] = 0x5E1D, --(帝) + [0x244C] = 0x5E95, --(底) + [0x244D] = 0x5EAD, --(庭) + [0x244E] = 0x5EF7, --(廷) + [0x244F] = 0x5F1F, --(弟) + [0x2450] = 0x608C, --(悌) + [0x2451] = 0x62B5, --(抵) + [0x2452] = 0x633A, --(挺) + [0x2453] = 0x63D0, --(提) + [0x2454] = 0x68AF, --(梯) + [0x2455] = 0x6C40, --(汀) + [0x2456] = 0x7887, --(碇) + [0x2457] = 0x798E, --(禎) + [0x2458] = 0x7A0B, --(程) + [0x2459] = 0x7DE0, --(締) + [0x245A] = 0x8247, --(艇) + [0x245B] = 0x8A02, --(訂) + [0x245C] = 0x8AE6, --(諦) + [0x245D] = 0x8E44, --(蹄) + [0x245E] = 0x9013, --(逓) + [0x2501] = 0x90B8, --(邸) + [0x2502] = 0x912D, --(鄭) + [0x2503] = 0x91D8, --(釘) + [0x2504] = 0x9F0E, --(鼎) + [0x2505] = 0x6CE5, --(泥) + [0x2506] = 0x6458, --(摘) + [0x2507] = 0x64E2, --(擢) + [0x2508] = 0x6575, --(敵) + [0x2509] = 0x6EF4, --(滴) + [0x250A] = 0x7684, --(的) + [0x250B] = 0x7B1B, --(笛) + [0x250C] = 0x9069, --(適) + [0x250D] = 0x93D1, --(鏑) + [0x250E] = 0x6EBA, --(溺) + [0x250F] = 0x54F2, --(哲) + [0x2510] = 0x5FB9, --(徹) + [0x2511] = 0x64A4, --(撤) + [0x2512] = 0x8F4D, --(轍) + [0x2513] = 0x8FED, --(迭) + [0x2514] = 0x9244, --(鉄) + [0x2515] = 0x5178, --(典) + [0x2516] = 0x586B, --(填) + [0x2517] = 0x5929, --(天) + [0x2518] = 0x5C55, --(展) + [0x2519] = 0x5E97, --(店) + [0x251A] = 0x6DFB, --(添) + [0x251B] = 0x7E8F, --(纏) + [0x251C] = 0x751C, --(甜) + [0x251D] = 0x8CBC, --(貼) + [0x251E] = 0x8EE2, --(転) + [0x251F] = 0x985B, --(顛) + [0x2520] = 0x70B9, --(点) + [0x2521] = 0x4F1D, --(伝) + [0x2522] = 0x6BBF, --(殿) + [0x2523] = 0x6FB1, --(澱) + [0x2524] = 0x7530, --(田) + [0x2525] = 0x96FB, --(電) + [0x2526] = 0x514E, --(兎) + [0x2527] = 0x5410, --(吐) + [0x2528] = 0x5835, --(堵) + [0x2529] = 0x5857, --(塗) + [0x252A] = 0x59AC, --(妬) + [0x252B] = 0x5C60, --(屠) + [0x252C] = 0x5F92, --(徒) + [0x252D] = 0x6597, --(斗) + [0x252E] = 0x675C, --(杜) + [0x252F] = 0x6E21, --(渡) + [0x2530] = 0x767B, --(登) + [0x2531] = 0x83DF, --(菟) + [0x2532] = 0x8CED, --(賭) + [0x2533] = 0x9014, --(途) + [0x2534] = 0x90FD, --(都) + [0x2535] = 0x934D, --(鍍) + [0x2536] = 0x7825, --(砥) + [0x2537] = 0x783A, --(砺) + [0x2538] = 0x52AA, --(努) + [0x2539] = 0x5EA6, --(度) + [0x253A] = 0x571F, --(土) + [0x253B] = 0x5974, --(奴) + [0x253C] = 0x6012, --(怒) + [0x253D] = 0x5012, --(倒) + [0x253E] = 0x515A, --(党) + [0x253F] = 0x51AC, --(冬) + [0x2540] = 0x51CD, --(凍) + [0x2541] = 0x5200, --(刀) + [0x2542] = 0x5510, --(唐) + [0x2543] = 0x5854, --(塔) + [0x2544] = 0x5858, --(塘) + [0x2545] = 0x5957, --(套) + [0x2546] = 0x5B95, --(宕) + [0x2547] = 0x5CF6, --(島) + [0x2548] = 0x5D8B, --(嶋) + [0x2549] = 0x60BC, --(悼) + [0x254A] = 0x6295, --(投) + [0x254B] = 0x642D, --(搭) + [0x254C] = 0x6771, --(東) + [0x254D] = 0x6843, --(桃) + [0x254E] = 0x68BC, --(梼) + [0x254F] = 0x68DF, --(棟) + [0x2550] = 0x76D7, --(盗) + [0x2551] = 0x6DD8, --(淘) + [0x2552] = 0x6E6F, --(湯) + [0x2553] = 0x6D9B, --(涛) + [0x2554] = 0x706F, --(灯) + [0x2555] = 0x71C8, --(燈) + [0x2556] = 0x5F53, --(当) + [0x2557] = 0x75D8, --(痘) + [0x2558] = 0x7977, --(祷) + [0x2559] = 0x7B49, --(等) + [0x255A] = 0x7B54, --(答) + [0x255B] = 0x7B52, --(筒) + [0x255C] = 0x7CD6, --(糖) + [0x255D] = 0x7D71, --(統) + [0x255E] = 0x5230, --(到) + [0x2601] = 0x8463, --(董) + [0x2602] = 0x8569, --(蕩) + [0x2603] = 0x85E4, --(藤) + [0x2604] = 0x8A0E, --(討) + [0x2605] = 0x8B04, --(謄) + [0x2606] = 0x8C46, --(豆) + [0x2607] = 0x8E0F, --(踏) + [0x2608] = 0x9003, --(逃) + [0x2609] = 0x900F, --(透) + [0x260A] = 0x9419, --(鐙) + [0x260B] = 0x9676, --(陶) + [0x260C] = 0x982D, --(頭) + [0x260D] = 0x9A30, --(騰) + [0x260E] = 0x95D8, --(闘) + [0x260F] = 0x50CD, --(働) + [0x2610] = 0x52D5, --(動) + [0x2611] = 0x540C, --(同) + [0x2612] = 0x5802, --(堂) + [0x2613] = 0x5C0E, --(導) + [0x2614] = 0x61A7, --(憧) + [0x2615] = 0x649E, --(撞) + [0x2616] = 0x6D1E, --(洞) + [0x2617] = 0x77B3, --(瞳) + [0x2618] = 0x7AE5, --(童) + [0x2619] = 0x80F4, --(胴) + [0x261A] = 0x8404, --(萄) + [0x261B] = 0x9053, --(道) + [0x261C] = 0x9285, --(銅) + [0x261D] = 0x5CE0, --(峠) + [0x261E] = 0x9D07, --(鴇) + [0x261F] = 0x533F, --(匿) + [0x2620] = 0x5F97, --(得) + [0x2621] = 0x5FB3, --(徳) + [0x2622] = 0x6D9C, --(涜) + [0x2623] = 0x7279, --(特) + [0x2624] = 0x7763, --(督) + [0x2625] = 0x79BF, --(禿) + [0x2626] = 0x7BE4, --(篤) + [0x2627] = 0x6BD2, --(毒) + [0x2628] = 0x72EC, --(独) + [0x2629] = 0x8AAD, --(読) + [0x262A] = 0x6803, --(栃) + [0x262B] = 0x6A61, --(橡) + [0x262C] = 0x51F8, --(凸) + [0x262D] = 0x7A81, --(突) + [0x262E] = 0x6934, --(椴) + [0x262F] = 0x5C4A, --(届) + [0x2630] = 0x9CF6, --(鳶) + [0x2631] = 0x82EB, --(苫) + [0x2632] = 0x5BC5, --(寅) + [0x2633] = 0x9149, --(酉) + [0x2634] = 0x701E, --(瀞) + [0x2635] = 0x5678, --(噸) + [0x2636] = 0x5C6F, --(屯) + [0x2637] = 0x60C7, --(惇) + [0x2638] = 0x6566, --(敦) + [0x2639] = 0x6C8C, --(沌) + [0x263A] = 0x8C5A, --(豚) + [0x263B] = 0x9041, --(遁) + [0x263C] = 0x9813, --(頓) + [0x263D] = 0x5451, --(呑) + [0x263E] = 0x66C7, --(曇) + [0x263F] = 0x920D, --(鈍) + [0x2640] = 0x5948, --(奈) + [0x2641] = 0x90A3, --(那) + [0x2642] = 0x5185, --(内) + [0x2643] = 0x4E4D, --(乍) + [0x2644] = 0x51EA, --(凪) + [0x2645] = 0x8599, --(薙) + [0x2646] = 0x8B0E, --(謎) + [0x2647] = 0x7058, --(灘) + [0x2648] = 0x637A, --(捺) + [0x2649] = 0x934B, --(鍋) + [0x264A] = 0x6962, --(楢) + [0x264B] = 0x99B4, --(馴) + [0x264C] = 0x7E04, --(縄) + [0x264D] = 0x7577, --(畷) + [0x264E] = 0x5357, --(南) + [0x264F] = 0x6960, --(楠) + [0x2650] = 0x8EDF, --(軟) + [0x2651] = 0x96E3, --(難) + [0x2652] = 0x6C5D, --(汝) + [0x2653] = 0x4E8C, --(二) + [0x2654] = 0x5C3C, --(尼) + [0x2655] = 0x5F10, --(弐) + [0x2656] = 0x8FE9, --(迩) + [0x2657] = 0x5302, --(匂) + [0x2658] = 0x8CD1, --(賑) + [0x2659] = 0x8089, --(肉) + [0x265A] = 0x8679, --(虹) + [0x265B] = 0x5EFF, --(廿) + [0x265C] = 0x65E5, --(日) + [0x265D] = 0x4E73, --(乳) + [0x265E] = 0x5165, --(入) + [0x2701] = 0x5982, --(如) + [0x2702] = 0x5C3F, --(尿) + [0x2703] = 0x97EE, --(韮) + [0x2704] = 0x4EFB, --(任) + [0x2705] = 0x598A, --(妊) + [0x2706] = 0x5FCD, --(忍) + [0x2707] = 0x8A8D, --(認) + [0x2708] = 0x6FE1, --(濡) + [0x2709] = 0x79B0, --(禰) + [0x270A] = 0x7962, --(祢) + [0x270B] = 0x5BE7, --(寧) + [0x270C] = 0x8471, --(葱) + [0x270D] = 0x732B, --(猫) + [0x270E] = 0x71B1, --(熱) + [0x270F] = 0x5E74, --(年) + [0x2710] = 0x5FF5, --(念) + [0x2711] = 0x637B, --(捻) + [0x2712] = 0x649A, --(撚) + [0x2713] = 0x71C3, --(燃) + [0x2714] = 0x7C98, --(粘) + [0x2715] = 0x4E43, --(乃) + [0x2716] = 0x5EFC, --(廼) + [0x2717] = 0x4E4B, --(之) + [0x2718] = 0x57DC, --(埜) + [0x2719] = 0x56A2, --(嚢) + [0x271A] = 0x60A9, --(悩) + [0x271B] = 0x6FC3, --(濃) + [0x271C] = 0x7D0D, --(納) + [0x271D] = 0x80FD, --(能) + [0x271E] = 0x8133, --(脳) + [0x271F] = 0x81BF, --(膿) + [0x2720] = 0x8FB2, --(農) + [0x2721] = 0x8997, --(覗) + [0x2722] = 0x86A4, --(蚤) + [0x2723] = 0x5DF4, --(巴) + [0x2724] = 0x628A, --(把) + [0x2725] = 0x64AD, --(播) + [0x2726] = 0x8987, --(覇) + [0x2727] = 0x6777, --(杷) + [0x2728] = 0x6CE2, --(波) + [0x2729] = 0x6D3E, --(派) + [0x272A] = 0x7436, --(琶) + [0x272B] = 0x7834, --(破) + [0x272C] = 0x5A46, --(婆) + [0x272D] = 0x7F75, --(罵) + [0x272E] = 0x82AD, --(芭) + [0x272F] = 0x99AC, --(馬) + [0x2730] = 0x4FF3, --(俳) + [0x2731] = 0x5EC3, --(廃) + [0x2732] = 0x62DD, --(拝) + [0x2733] = 0x6392, --(排) + [0x2734] = 0x6557, --(敗) + [0x2735] = 0x676F, --(杯) + [0x2736] = 0x76C3, --(盃) + [0x2737] = 0x724C, --(牌) + [0x2738] = 0x80CC, --(背) + [0x2739] = 0x80BA, --(肺) + [0x273A] = 0x8F29, --(輩) + [0x273B] = 0x914D, --(配) + [0x273C] = 0x500D, --(倍) + [0x273D] = 0x57F9, --(培) + [0x273E] = 0x5A92, --(媒) + [0x273F] = 0x6885, --(梅) + [0x2740] = 0x6973, --(楳) + [0x2741] = 0x7164, --(煤) + [0x2742] = 0x72FD, --(狽) + [0x2743] = 0x8CB7, --(買) + [0x2744] = 0x58F2, --(売) + [0x2745] = 0x8CE0, --(賠) + [0x2746] = 0x966A, --(陪) + [0x2747] = 0x9019, --(這) + [0x2748] = 0x877F, --(蝿) + [0x2749] = 0x79E4, --(秤) + [0x274A] = 0x77E7, --(矧) + [0x274B] = 0x8429, --(萩) + [0x274C] = 0x4F2F, --(伯) + [0x274D] = 0x5265, --(剥) + [0x274E] = 0x535A, --(博) + [0x274F] = 0x62CD, --(拍) + [0x2750] = 0x67CF, --(柏) + [0x2751] = 0x6CCA, --(泊) + [0x2752] = 0x767D, --(白) + [0x2753] = 0x7B94, --(箔) + [0x2754] = 0x7C95, --(粕) + [0x2755] = 0x8236, --(舶) + [0x2756] = 0x8584, --(薄) + [0x2757] = 0x8FEB, --(迫) + [0x2758] = 0x66DD, --(曝) + [0x2759] = 0x6F20, --(漠) + [0x275A] = 0x7206, --(爆) + [0x275B] = 0x7E1B, --(縛) + [0x275C] = 0x83AB, --(莫) + [0x275D] = 0x99C1, --(駁) + [0x275E] = 0x9EA6, --(麦) + [0x2801] = 0x51FD, --(函) + [0x2802] = 0x7BB1, --(箱) + [0x2803] = 0x7872, --(硲) + [0x2804] = 0x7BB8, --(箸) + [0x2805] = 0x8087, --(肇) + [0x2806] = 0x7B48, --(筈) + [0x2807] = 0x6AE8, --(櫨) + [0x2808] = 0x5E61, --(幡) + [0x2809] = 0x808C, --(肌) + [0x280A] = 0x7551, --(畑) + [0x280B] = 0x7560, --(畠) + [0x280C] = 0x516B, --(八) + [0x280D] = 0x9262, --(鉢) + [0x280E] = 0x6E8C, --(溌) + [0x280F] = 0x767A, --(発) + [0x2810] = 0x9197, --(醗) + [0x2811] = 0x9AEA, --(髪) + [0x2812] = 0x4F10, --(伐) + [0x2813] = 0x7F70, --(罰) + [0x2814] = 0x629C, --(抜) + [0x2815] = 0x7B4F, --(筏) + [0x2816] = 0x95A5, --(閥) + [0x2817] = 0x9CE9, --(鳩) + [0x2818] = 0x567A, --(噺) + [0x2819] = 0x5859, --(塙) + [0x281A] = 0x86E4, --(蛤) + [0x281B] = 0x96BC, --(隼) + [0x281C] = 0x4F34, --(伴) + [0x281D] = 0x5224, --(判) + [0x281E] = 0x534A, --(半) + [0x281F] = 0x53CD, --(反) + [0x2820] = 0x53DB, --(叛) + [0x2821] = 0x5E06, --(帆) + [0x2822] = 0x642C, --(搬) + [0x2823] = 0x6591, --(斑) + [0x2824] = 0x677F, --(板) + [0x2825] = 0x6C3E, --(氾) + [0x2826] = 0x6C4E, --(汎) + [0x2827] = 0x7248, --(版) + [0x2828] = 0x72AF, --(犯) + [0x2829] = 0x73ED, --(班) + [0x282A] = 0x7554, --(畔) + [0x282B] = 0x7E41, --(繁) + [0x282C] = 0x822C, --(般) + [0x282D] = 0x85E9, --(藩) + [0x282E] = 0x8CA9, --(販) + [0x282F] = 0x7BC4, --(範) + [0x2830] = 0x91C6, --(釆) + [0x2831] = 0x7169, --(煩) + [0x2832] = 0x9812, --(頒) + [0x2833] = 0x98EF, --(飯) + [0x2834] = 0x633D, --(挽) + [0x2835] = 0x6669, --(晩) + [0x2836] = 0x756A, --(番) + [0x2837] = 0x76E4, --(盤) + [0x2838] = 0x78D0, --(磐) + [0x2839] = 0x8543, --(蕃) + [0x283A] = 0x86EE, --(蛮) + [0x283B] = 0x532A, --(匪) + [0x283C] = 0x5351, --(卑) + [0x283D] = 0x5426, --(否) + [0x283E] = 0x5983, --(妃) + [0x283F] = 0x5E87, --(庇) + [0x2840] = 0x5F7C, --(彼) + [0x2841] = 0x60B2, --(悲) + [0x2842] = 0x6249, --(扉) + [0x2843] = 0x6279, --(批) + [0x2844] = 0x62AB, --(披) + [0x2845] = 0x6590, --(斐) + [0x2846] = 0x6BD4, --(比) + [0x2847] = 0x6CCC, --(泌) + [0x2848] = 0x75B2, --(疲) + [0x2849] = 0x76AE, --(皮) + [0x284A] = 0x7891, --(碑) + [0x284B] = 0x79D8, --(秘) + [0x284C] = 0x7DCB, --(緋) + [0x284D] = 0x7F77, --(罷) + [0x284E] = 0x80A5, --(肥) + [0x284F] = 0x88AB, --(被) + [0x2850] = 0x8AB9, --(誹) + [0x2851] = 0x8CBB, --(費) + [0x2852] = 0x907F, --(避) + [0x2853] = 0x975E, --(非) + [0x2854] = 0x98DB, --(飛) + [0x2855] = 0x6A0B, --(樋) + [0x2856] = 0x7C38, --(簸) + [0x2857] = 0x5099, --(備) + [0x2858] = 0x5C3E, --(尾) + [0x2859] = 0x5FAE, --(微) + [0x285A] = 0x6787, --(枇) + [0x285B] = 0x6BD8, --(毘) + [0x285C] = 0x7435, --(琵) + [0x285D] = 0x7709, --(眉) + [0x285E] = 0x7F8E, --(美) + [0x2901] = 0x9F3B, --(鼻) + [0x2902] = 0x67CA, --(柊) + [0x2903] = 0x7A17, --(稗) + [0x2904] = 0x5339, --(匹) + [0x2905] = 0x758B, --(疋) + [0x2906] = 0x9AED, --(髭) + [0x2907] = 0x5F66, --(彦) + [0x2908] = 0x819D, --(膝) + [0x2909] = 0x83F1, --(菱) + [0x290A] = 0x8098, --(肘) + [0x290B] = 0x5F3C, --(弼) + [0x290C] = 0x5FC5, --(必) + [0x290D] = 0x7562, --(畢) + [0x290E] = 0x7B46, --(筆) + [0x290F] = 0x903C, --(逼) + [0x2910] = 0x6867, --(桧) + [0x2911] = 0x59EB, --(姫) + [0x2912] = 0x5A9B, --(媛) + [0x2913] = 0x7D10, --(紐) + [0x2914] = 0x767E, --(百) + [0x2915] = 0x8B2C, --(謬) + [0x2916] = 0x4FF5, --(俵) + [0x2917] = 0x5F6A, --(彪) + [0x2918] = 0x6A19, --(標) + [0x2919] = 0x6C37, --(氷) + [0x291A] = 0x6F02, --(漂) + [0x291B] = 0x74E2, --(瓢) + [0x291C] = 0x7968, --(票) + [0x291D] = 0x8868, --(表) + [0x291E] = 0x8A55, --(評) + [0x291F] = 0x8C79, --(豹) + [0x2920] = 0x5EDF, --(廟) + [0x2921] = 0x63CF, --(描) + [0x2922] = 0x75C5, --(病) + [0x2923] = 0x79D2, --(秒) + [0x2924] = 0x82D7, --(苗) + [0x2925] = 0x9328, --(錨) + [0x2926] = 0x92F2, --(鋲) + [0x2927] = 0x849C, --(蒜) + [0x2928] = 0x86ED, --(蛭) + [0x2929] = 0x9C2D, --(鰭) + [0x292A] = 0x54C1, --(品) + [0x292B] = 0x5F6C, --(彬) + [0x292C] = 0x658C, --(斌) + [0x292D] = 0x6D5C, --(浜) + [0x292E] = 0x7015, --(瀕) + [0x292F] = 0x8CA7, --(貧) + [0x2930] = 0x8CD3, --(賓) + [0x2931] = 0x983B, --(頻) + [0x2932] = 0x654F, --(敏) + [0x2933] = 0x74F6, --(瓶) + [0x2934] = 0x4E0D, --(不) + [0x2935] = 0x4ED8, --(付) + [0x2936] = 0x57E0, --(埠) + [0x2937] = 0x592B, --(夫) + [0x2938] = 0x5A66, --(婦) + [0x2939] = 0x5BCC, --(富) + [0x293A] = 0x51A8, --(冨) + [0x293B] = 0x5E03, --(布) + [0x293C] = 0x5E9C, --(府) + [0x293D] = 0x6016, --(怖) + [0x293E] = 0x6276, --(扶) + [0x293F] = 0x6577, --(敷) + [0x2940] = 0x65A7, --(斧) + [0x2941] = 0x666E, --(普) + [0x2942] = 0x6D6E, --(浮) + [0x2943] = 0x7236, --(父) + [0x2944] = 0x7B26, --(符) + [0x2945] = 0x8150, --(腐) + [0x2946] = 0x819A, --(膚) + [0x2947] = 0x8299, --(芙) + [0x2948] = 0x8B5C, --(譜) + [0x2949] = 0x8CA0, --(負) + [0x294A] = 0x8CE6, --(賦) + [0x294B] = 0x8D74, --(赴) + [0x294C] = 0x961C, --(阜) + [0x294D] = 0x9644, --(附) + [0x294E] = 0x4FAE, --(侮) + [0x294F] = 0x64AB, --(撫) + [0x2950] = 0x6B66, --(武) + [0x2951] = 0x821E, --(舞) + [0x2952] = 0x8461, --(葡) + [0x2953] = 0x856A, --(蕪) + [0x2954] = 0x90E8, --(部) + [0x2955] = 0x5C01, --(封) + [0x2956] = 0x6953, --(楓) + [0x2957] = 0x98A8, --(風) + [0x2958] = 0x847A, --(葺) + [0x2959] = 0x8557, --(蕗) + [0x295A] = 0x4F0F, --(伏) + [0x295B] = 0x526F, --(副) + [0x295C] = 0x5FA9, --(復) + [0x295D] = 0x5E45, --(幅) + [0x295E] = 0x670D, --(服) + [0x2A01] = 0x798F, --(福) + [0x2A02] = 0x8179, --(腹) + [0x2A03] = 0x8907, --(複) + [0x2A04] = 0x8986, --(覆) + [0x2A05] = 0x6DF5, --(淵) + [0x2A06] = 0x5F17, --(弗) + [0x2A07] = 0x6255, --(払) + [0x2A08] = 0x6CB8, --(沸) + [0x2A09] = 0x4ECF, --(仏) + [0x2A0A] = 0x7269, --(物) + [0x2A0B] = 0x9B92, --(鮒) + [0x2A0C] = 0x5206, --(分) + [0x2A0D] = 0x543B, --(吻) + [0x2A0E] = 0x5674, --(噴) + [0x2A0F] = 0x58B3, --(墳) + [0x2A10] = 0x61A4, --(憤) + [0x2A11] = 0x626E, --(扮) + [0x2A12] = 0x711A, --(焚) + [0x2A13] = 0x596E, --(奮) + [0x2A14] = 0x7C89, --(粉) + [0x2A15] = 0x7CDE, --(糞) + [0x2A16] = 0x7D1B, --(紛) + [0x2A17] = 0x96F0, --(雰) + [0x2A18] = 0x6587, --(文) + [0x2A19] = 0x805E, --(聞) + [0x2A1A] = 0x4E19, --(丙) + [0x2A1B] = 0x4F75, --(併) + [0x2A1C] = 0x5175, --(兵) + [0x2A1D] = 0x5840, --(塀) + [0x2A1E] = 0x5E63, --(幣) + [0x2A1F] = 0x5E73, --(平) + [0x2A20] = 0x5F0A, --(弊) + [0x2A21] = 0x67C4, --(柄) + [0x2A22] = 0x4E26, --(並) + [0x2A23] = 0x853D, --(蔽) + [0x2A24] = 0x9589, --(閉) + [0x2A25] = 0x965B, --(陛) + [0x2A26] = 0x7C73, --(米) + [0x2A27] = 0x9801, --(頁) + [0x2A28] = 0x50FB, --(僻) + [0x2A29] = 0x58C1, --(壁) + [0x2A2A] = 0x7656, --(癖) + [0x2A2B] = 0x78A7, --(碧) + [0x2A2C] = 0x5225, --(別) + [0x2A2D] = 0x77A5, --(瞥) + [0x2A2E] = 0x8511, --(蔑) + [0x2A2F] = 0x7B86, --(箆) + [0x2A30] = 0x504F, --(偏) + [0x2A31] = 0x5909, --(変) + [0x2A32] = 0x7247, --(片) + [0x2A33] = 0x7BC7, --(篇) + [0x2A34] = 0x7DE8, --(編) + [0x2A35] = 0x8FBA, --(辺) + [0x2A36] = 0x8FD4, --(返) + [0x2A37] = 0x904D, --(遍) + [0x2A38] = 0x4FBF, --(便) + [0x2A39] = 0x52C9, --(勉) + [0x2A3A] = 0x5A29, --(娩) + [0x2A3B] = 0x5F01, --(弁) + [0x2A3C] = 0x97AD, --(鞭) + [0x2A3D] = 0x4FDD, --(保) + [0x2A3E] = 0x8217, --(舗) + [0x2A3F] = 0x92EA, --(鋪) + [0x2A40] = 0x5703, --(圃) + [0x2A41] = 0x6355, --(捕) + [0x2A42] = 0x6B69, --(歩) + [0x2A43] = 0x752B, --(甫) + [0x2A44] = 0x88DC, --(補) + [0x2A45] = 0x8F14, --(輔) + [0x2A46] = 0x7A42, --(穂) + [0x2A47] = 0x52DF, --(募) + [0x2A48] = 0x5893, --(墓) + [0x2A49] = 0x6155, --(慕) + [0x2A4A] = 0x620A, --(戊) + [0x2A4B] = 0x66AE, --(暮) + [0x2A4C] = 0x6BCD, --(母) + [0x2A4D] = 0x7C3F, --(簿) + [0x2A4E] = 0x83E9, --(菩) + [0x2A4F] = 0x5023, --(倣) + [0x2A50] = 0x4FF8, --(俸) + [0x2A51] = 0x5305, --(包) + [0x2A52] = 0x5446, --(呆) + [0x2A53] = 0x5831, --(報) + [0x2A54] = 0x5949, --(奉) + [0x2A55] = 0x5B9D, --(宝) + [0x2A56] = 0x5CF0, --(峰) + [0x2A57] = 0x5CEF, --(峯) + [0x2A58] = 0x5D29, --(崩) + [0x2A59] = 0x5E96, --(庖) + [0x2A5A] = 0x62B1, --(抱) + [0x2A5B] = 0x6367, --(捧) + [0x2A5C] = 0x653E, --(放) + [0x2A5D] = 0x65B9, --(方) + [0x2A5E] = 0x670B, --(朋) + [0x2B01] = 0x6CD5, --(法) + [0x2B02] = 0x6CE1, --(泡) + [0x2B03] = 0x70F9, --(烹) + [0x2B04] = 0x7832, --(砲) + [0x2B05] = 0x7E2B, --(縫) + [0x2B06] = 0x80DE, --(胞) + [0x2B07] = 0x82B3, --(芳) + [0x2B08] = 0x840C, --(萌) + [0x2B09] = 0x84EC, --(蓬) + [0x2B0A] = 0x8702, --(蜂) + [0x2B0B] = 0x8912, --(褒) + [0x2B0C] = 0x8A2A, --(訪) + [0x2B0D] = 0x8C4A, --(豊) + [0x2B0E] = 0x90A6, --(邦) + [0x2B0F] = 0x92D2, --(鋒) + [0x2B10] = 0x98FD, --(飽) + [0x2B11] = 0x9CF3, --(鳳) + [0x2B12] = 0x9D6C, --(鵬) + [0x2B13] = 0x4E4F, --(乏) + [0x2B14] = 0x4EA1, --(亡) + [0x2B15] = 0x508D, --(傍) + [0x2B16] = 0x5256, --(剖) + [0x2B17] = 0x574A, --(坊) + [0x2B18] = 0x59A8, --(妨) + [0x2B19] = 0x5E3D, --(帽) + [0x2B1A] = 0x5FD8, --(忘) + [0x2B1B] = 0x5FD9, --(忙) + [0x2B1C] = 0x623F, --(房) + [0x2B1D] = 0x66B4, --(暴) + [0x2B1E] = 0x671B, --(望) + [0x2B1F] = 0x67D0, --(某) + [0x2B20] = 0x68D2, --(棒) + [0x2B21] = 0x5192, --(冒) + [0x2B22] = 0x7D21, --(紡) + [0x2B23] = 0x80AA, --(肪) + [0x2B24] = 0x81A8, --(膨) + [0x2B25] = 0x8B00, --(謀) + [0x2B26] = 0x8C8C, --(貌) + [0x2B27] = 0x8CBF, --(貿) + [0x2B28] = 0x927E, --(鉾) + [0x2B29] = 0x9632, --(防) + [0x2B2A] = 0x5420, --(吠) + [0x2B2B] = 0x982C, --(頬) + [0x2B2C] = 0x5317, --(北) + [0x2B2D] = 0x50D5, --(僕) + [0x2B2E] = 0x535C, --(卜) + [0x2B2F] = 0x58A8, --(墨) + [0x2B30] = 0x64B2, --(撲) + [0x2B31] = 0x6734, --(朴) + [0x2B32] = 0x7267, --(牧) + [0x2B33] = 0x7766, --(睦) + [0x2B34] = 0x7A46, --(穆) + [0x2B35] = 0x91E6, --(釦) + [0x2B36] = 0x52C3, --(勃) + [0x2B37] = 0x6CA1, --(没) + [0x2B38] = 0x6B86, --(殆) + [0x2B39] = 0x5800, --(堀) + [0x2B3A] = 0x5E4C, --(幌) + [0x2B3B] = 0x5954, --(奔) + [0x2B3C] = 0x672C, --(本) + [0x2B3D] = 0x7FFB, --(翻) + [0x2B3E] = 0x51E1, --(凡) + [0x2B3F] = 0x76C6, --(盆) + [0x2B40] = 0x6469, --(摩) + [0x2B41] = 0x78E8, --(磨) + [0x2B42] = 0x9B54, --(魔) + [0x2B43] = 0x9EBB, --(麻) + [0x2B44] = 0x57CB, --(埋) + [0x2B45] = 0x59B9, --(妹) + [0x2B46] = 0x6627, --(昧) + [0x2B47] = 0x679A, --(枚) + [0x2B48] = 0x6BCE, --(毎) + [0x2B49] = 0x54E9, --(哩) + [0x2B4A] = 0x69D9, --(槙) + [0x2B4B] = 0x5E55, --(幕) + [0x2B4C] = 0x819C, --(膜) + [0x2B4D] = 0x6795, --(枕) + [0x2B4E] = 0x9BAA, --(鮪) + [0x2B4F] = 0x67FE, --(柾) + [0x2B50] = 0x9C52, --(鱒) + [0x2B51] = 0x685D, --(桝) + [0x2B52] = 0x4EA6, --(亦) + [0x2B53] = 0x4FE3, --(俣) + [0x2B54] = 0x53C8, --(又) + [0x2B55] = 0x62B9, --(抹) + [0x2B56] = 0x672B, --(末) + [0x2B57] = 0x6CAB, --(沫) + [0x2B58] = 0x8FC4, --(迄) + [0x2B59] = 0x4FAD, --(侭) + [0x2B5A] = 0x7E6D, --(繭) + [0x2B5B] = 0x9EBF, --(麿) + [0x2B5C] = 0x4E07, --(万) + [0x2B5D] = 0x6162, --(慢) + [0x2B5E] = 0x6E80, --(満) + [0x2C01] = 0x6F2B, --(漫) + [0x2C02] = 0x8513, --(蔓) + [0x2C03] = 0x5473, --(味) + [0x2C04] = 0x672A, --(未) + [0x2C05] = 0x9B45, --(魅) + [0x2C06] = 0x5DF3, --(巳) + [0x2C07] = 0x7B95, --(箕) + [0x2C08] = 0x5CAC, --(岬) + [0x2C09] = 0x5BC6, --(密) + [0x2C0A] = 0x871C, --(蜜) + [0x2C0B] = 0x6E4A, --(湊) + [0x2C0C] = 0x84D1, --(蓑) + [0x2C0D] = 0x7A14, --(稔) + [0x2C0E] = 0x8108, --(脈) + [0x2C0F] = 0x5999, --(妙) + [0x2C10] = 0x7C8D, --(粍) + [0x2C11] = 0x6C11, --(民) + [0x2C12] = 0x7720, --(眠) + [0x2C13] = 0x52D9, --(務) + [0x2C14] = 0x5922, --(夢) + [0x2C15] = 0x7121, --(無) + [0x2C16] = 0x725F, --(牟) + [0x2C17] = 0x77DB, --(矛) + [0x2C18] = 0x9727, --(霧) + [0x2C19] = 0x9D61, --(鵡) + [0x2C1A] = 0x690B, --(椋) + [0x2C1B] = 0x5A7F, --(婿) + [0x2C1C] = 0x5A18, --(娘) + [0x2C1D] = 0x51A5, --(冥) + [0x2C1E] = 0x540D, --(名) + [0x2C1F] = 0x547D, --(命) + [0x2C20] = 0x660E, --(明) + [0x2C21] = 0x76DF, --(盟) + [0x2C22] = 0x8FF7, --(迷) + [0x2C23] = 0x9298, --(銘) + [0x2C24] = 0x9CF4, --(鳴) + [0x2C25] = 0x59EA, --(姪) + [0x2C26] = 0x725D, --(牝) + [0x2C27] = 0x6EC5, --(滅) + [0x2C28] = 0x514D, --(免) + [0x2C29] = 0x68C9, --(棉) + [0x2C2A] = 0x7DBF, --(綿) + [0x2C2B] = 0x7DEC, --(緬) + [0x2C2C] = 0x9762, --(面) + [0x2C2D] = 0x9EBA, --(麺) + [0x2C2E] = 0x6478, --(摸) + [0x2C2F] = 0x6A21, --(模) + [0x2C30] = 0x8302, --(茂) + [0x2C31] = 0x5984, --(妄) + [0x2C32] = 0x5B5F, --(孟) + [0x2C33] = 0x6BDB, --(毛) + [0x2C34] = 0x731B, --(猛) + [0x2C35] = 0x76F2, --(盲) + [0x2C36] = 0x7DB2, --(網) + [0x2C37] = 0x8017, --(耗) + [0x2C38] = 0x8499, --(蒙) + [0x2C39] = 0x5132, --(儲) + [0x2C3A] = 0x6728, --(木) + [0x2C3B] = 0x9ED9, --(黙) + [0x2C3C] = 0x76EE, --(目) + [0x2C3D] = 0x6762, --(杢) + [0x2C3E] = 0x52FF, --(勿) + [0x2C3F] = 0x9905, --(餅) + [0x2C40] = 0x5C24, --(尤) + [0x2C41] = 0x623B, --(戻) + [0x2C42] = 0x7C7E, --(籾) + [0x2C43] = 0x8CB0, --(貰) + [0x2C44] = 0x554F, --(問) + [0x2C45] = 0x60B6, --(悶) + [0x2C46] = 0x7D0B, --(紋) + [0x2C47] = 0x9580, --(門) + [0x2C48] = 0x5301, --(匁) + [0x2C49] = 0x4E5F, --(也) + [0x2C4A] = 0x51B6, --(冶) + [0x2C4B] = 0x591C, --(夜) + [0x2C4C] = 0x723A, --(爺) + [0x2C4D] = 0x8036, --(耶) + [0x2C4E] = 0x91CE, --(野) + [0x2C4F] = 0x5F25, --(弥) + [0x2C50] = 0x77E2, --(矢) + [0x2C51] = 0x5384, --(厄) + [0x2C52] = 0x5F79, --(役) + [0x2C53] = 0x7D04, --(約) + [0x2C54] = 0x85AC, --(薬) + [0x2C55] = 0x8A33, --(訳) + [0x2C56] = 0x8E8D, --(躍) + [0x2C57] = 0x9756, --(靖) + [0x2C58] = 0x67F3, --(柳) + [0x2C59] = 0x85AE, --(薮) + [0x2C5A] = 0x9453, --(鑓) + [0x2C5B] = 0x6109, --(愉) + [0x2C5C] = 0x6108, --(愈) + [0x2C5D] = 0x6CB9, --(油) + [0x2C5E] = 0x7652, --(癒) + [0x2D01] = 0x8AED, --(諭) + [0x2D02] = 0x8F38, --(輸) + [0x2D03] = 0x552F, --(唯) + [0x2D04] = 0x4F51, --(佑) + [0x2D05] = 0x512A, --(優) + [0x2D06] = 0x52C7, --(勇) + [0x2D07] = 0x53CB, --(友) + [0x2D08] = 0x5BA5, --(宥) + [0x2D09] = 0x5E7D, --(幽) + [0x2D0A] = 0x60A0, --(悠) + [0x2D0B] = 0x6182, --(憂) + [0x2D0C] = 0x63D6, --(揖) + [0x2D0D] = 0x6709, --(有) + [0x2D0E] = 0x67DA, --(柚) + [0x2D0F] = 0x6E67, --(湧) + [0x2D10] = 0x6D8C, --(涌) + [0x2D11] = 0x7336, --(猶) + [0x2D12] = 0x7337, --(猷) + [0x2D13] = 0x7531, --(由) + [0x2D14] = 0x7950, --(祐) + [0x2D15] = 0x88D5, --(裕) + [0x2D16] = 0x8A98, --(誘) + [0x2D17] = 0x904A, --(遊) + [0x2D18] = 0x9091, --(邑) + [0x2D19] = 0x90F5, --(郵) + [0x2D1A] = 0x96C4, --(雄) + [0x2D1B] = 0x878D, --(融) + [0x2D1C] = 0x5915, --(夕) + [0x2D1D] = 0x4E88, --(予) + [0x2D1E] = 0x4F59, --(余) + [0x2D1F] = 0x4E0E, --(与) + [0x2D20] = 0x8A89, --(誉) + [0x2D21] = 0x8F3F, --(輿) + [0x2D22] = 0x9810, --(預) + [0x2D23] = 0x50AD, --(傭) + [0x2D24] = 0x5E7C, --(幼) + [0x2D25] = 0x5996, --(妖) + [0x2D26] = 0x5BB9, --(容) + [0x2D27] = 0x5EB8, --(庸) + [0x2D28] = 0x63DA, --(揚) + [0x2D29] = 0x63FA, --(揺) + [0x2D2A] = 0x64C1, --(擁) + [0x2D2B] = 0x66DC, --(曜) + [0x2D2C] = 0x694A, --(楊) + [0x2D2D] = 0x69D8, --(様) + [0x2D2E] = 0x6D0B, --(洋) + [0x2D2F] = 0x6EB6, --(溶) + [0x2D30] = 0x7194, --(熔) + [0x2D31] = 0x7528, --(用) + [0x2D32] = 0x7AAF, --(窯) + [0x2D33] = 0x7F8A, --(羊) + [0x2D34] = 0x8000, --(耀) + [0x2D35] = 0x8449, --(葉) + [0x2D36] = 0x84C9, --(蓉) + [0x2D37] = 0x8981, --(要) + [0x2D38] = 0x8B21, --(謡) + [0x2D39] = 0x8E0A, --(踊) + [0x2D3A] = 0x9065, --(遥) + [0x2D3B] = 0x967D, --(陽) + [0x2D3C] = 0x990A, --(養) + [0x2D3D] = 0x617E, --(慾) + [0x2D3E] = 0x6291, --(抑) + [0x2D3F] = 0x6B32, --(欲) + [0x2D40] = 0x6C83, --(沃) + [0x2D41] = 0x6D74, --(浴) + [0x2D42] = 0x7FCC, --(翌) + [0x2D43] = 0x7FFC, --(翼) + [0x2D44] = 0x6DC0, --(淀) + [0x2D45] = 0x7F85, --(羅) + [0x2D46] = 0x87BA, --(螺) + [0x2D47] = 0x88F8, --(裸) + [0x2D48] = 0x6765, --(来) + [0x2D49] = 0x83B1, --(莱) + [0x2D4A] = 0x983C, --(頼) + [0x2D4B] = 0x96F7, --(雷) + [0x2D4C] = 0x6D1B, --(洛) + [0x2D4D] = 0x7D61, --(絡) + [0x2D4E] = 0x843D, --(落) + [0x2D4F] = 0x916A, --(酪) + [0x2D50] = 0x4E71, --(乱) + [0x2D51] = 0x5375, --(卵) + [0x2D52] = 0x5D50, --(嵐) + [0x2D53] = 0x6B04, --(欄) + [0x2D54] = 0x6FEB, --(濫) + [0x2D55] = 0x85CD, --(藍) + [0x2D56] = 0x862D, --(蘭) + [0x2D57] = 0x89A7, --(覧) + [0x2D58] = 0x5229, --(利) + [0x2D59] = 0x540F, --(吏) + [0x2D5A] = 0x5C65, --(履) + [0x2D5B] = 0x674E, --(李) + [0x2D5C] = 0x68A8, --(梨) + [0x2D5D] = 0x7406, --(理) + [0x2D5E] = 0x7483, --(璃) + [0x2E01] = 0x75E2, --(痢) + [0x2E02] = 0x88CF, --(裏) + [0x2E03] = 0x88E1, --(裡) + [0x2E04] = 0x91CC, --(里) + [0x2E05] = 0x96E2, --(離) + [0x2E06] = 0x9678, --(陸) + [0x2E07] = 0x5F8B, --(律) + [0x2E08] = 0x7387, --(率) + [0x2E09] = 0x7ACB, --(立) + [0x2E0A] = 0x844E, --(葎) + [0x2E0B] = 0x63A0, --(掠) + [0x2E0C] = 0x7565, --(略) + [0x2E0D] = 0x5289, --(劉) + [0x2E0E] = 0x6D41, --(流) + [0x2E0F] = 0x6E9C, --(溜) + [0x2E10] = 0x7409, --(琉) + [0x2E11] = 0x7559, --(留) + [0x2E12] = 0x786B, --(硫) + [0x2E13] = 0x7C92, --(粒) + [0x2E14] = 0x9686, --(隆) + [0x2E15] = 0x7ADC, --(竜) + [0x2E16] = 0x9F8D, --(龍) + [0x2E17] = 0x4FB6, --(侶) + [0x2E18] = 0x616E, --(慮) + [0x2E19] = 0x65C5, --(旅) + [0x2E1A] = 0x865C, --(虜) + [0x2E1B] = 0x4E86, --(了) + [0x2E1C] = 0x4EAE, --(亮) + [0x2E1D] = 0x50DA, --(僚) + [0x2E1E] = 0x4E21, --(両) + [0x2E1F] = 0x51CC, --(凌) + [0x2E20] = 0x5BEE, --(寮) + [0x2E21] = 0x6599, --(料) + [0x2E22] = 0x6881, --(梁) + [0x2E23] = 0x6DBC, --(涼) + [0x2E24] = 0x731F, --(猟) + [0x2E25] = 0x7642, --(療) + [0x2E26] = 0x77AD, --(瞭) + [0x2E27] = 0x7A1C, --(稜) + [0x2E28] = 0x7CE7, --(糧) + [0x2E29] = 0x826F, --(良) + [0x2E2A] = 0x8AD2, --(諒) + [0x2E2B] = 0x907C, --(遼) + [0x2E2C] = 0x91CF, --(量) + [0x2E2D] = 0x9675, --(陵) + [0x2E2E] = 0x9818, --(領) + [0x2E2F] = 0x529B, --(力) + [0x2E30] = 0x7DD1, --(緑) + [0x2E31] = 0x502B, --(倫) + [0x2E32] = 0x5398, --(厘) + [0x2E33] = 0x6797, --(林) + [0x2E34] = 0x6DCB, --(淋) + [0x2E35] = 0x71D0, --(燐) + [0x2E36] = 0x7433, --(琳) + [0x2E37] = 0x81E8, --(臨) + [0x2E38] = 0x8F2A, --(輪) + [0x2E39] = 0x96A3, --(隣) + [0x2E3A] = 0x9C57, --(鱗) + [0x2E3B] = 0x9E9F, --(麟) + [0x2E3C] = 0x7460, --(瑠) + [0x2E3D] = 0x5841, --(塁) + [0x2E3E] = 0x6D99, --(涙) + [0x2E3F] = 0x7D2F, --(累) + [0x2E40] = 0x985E, --(類) + [0x2E41] = 0x4EE4, --(令) + [0x2E42] = 0x4F36, --(伶) + [0x2E43] = 0x4F8B, --(例) + [0x2E44] = 0x51B7, --(冷) + [0x2E45] = 0x52B1, --(励) + [0x2E46] = 0x5DBA, --(嶺) + [0x2E47] = 0x601C, --(怜) + [0x2E48] = 0x73B2, --(玲) + [0x2E49] = 0x793C, --(礼) + [0x2E4A] = 0x82D3, --(苓) + [0x2E4B] = 0x9234, --(鈴) + [0x2E4C] = 0x96B7, --(隷) + [0x2E4D] = 0x96F6, --(零) + [0x2E4E] = 0x970A, --(霊) + [0x2E4F] = 0x9E97, --(麗) + [0x2E50] = 0x9F62, --(齢) + [0x2E51] = 0x66A6, --(暦) + [0x2E52] = 0x6B74, --(歴) + [0x2E53] = 0x5217, --(列) + [0x2E54] = 0x52A3, --(劣) + [0x2E55] = 0x70C8, --(烈) + [0x2E56] = 0x88C2, --(裂) + [0x2E57] = 0x5EC9, --(廉) + [0x2E58] = 0x604B, --(恋) + [0x2E59] = 0x6190, --(憐) + [0x2E5A] = 0x6F23, --(漣) + [0x2E5B] = 0x7149, --(煉) + [0x2E5C] = 0x7C3E, --(簾) + [0x2E5D] = 0x7DF4, --(練) + [0x2E5E] = 0x806F, --(聯) + [0x2F01] = 0x84EE, --(蓮) + [0x2F02] = 0x9023, --(連) + [0x2F03] = 0x932C, --(錬) + [0x2F04] = 0x5442, --(呂) + [0x2F05] = 0x9B6F, --(魯) + [0x2F06] = 0x6AD3, --(櫓) + [0x2F07] = 0x7089, --(炉) + [0x2F08] = 0x8CC2, --(賂) + [0x2F09] = 0x8DEF, --(路) + [0x2F0A] = 0x9732, --(露) + [0x2F0B] = 0x52B4, --(労) + [0x2F0C] = 0x5A41, --(婁) + [0x2F0D] = 0x5ECA, --(廊) + [0x2F0E] = 0x5F04, --(弄) + [0x2F0F] = 0x6717, --(朗) + [0x2F10] = 0x697C, --(楼) + [0x2F11] = 0x6994, --(榔) + [0x2F12] = 0x6D6A, --(浪) + [0x2F13] = 0x6F0F, --(漏) + [0x2F14] = 0x7262, --(牢) + [0x2F15] = 0x72FC, --(狼) + [0x2F16] = 0x7BED, --(篭) + [0x2F17] = 0x8001, --(老) + [0x2F18] = 0x807E, --(聾) + [0x2F19] = 0x874B, --(蝋) + [0x2F1A] = 0x90CE, --(郎) + [0x2F1B] = 0x516D, --(六) + [0x2F1C] = 0x9E93, --(麓) + [0x2F1D] = 0x7984, --(禄) + [0x2F1E] = 0x808B, --(肋) + [0x2F1F] = 0x9332, --(録) + [0x2F20] = 0x8AD6, --(論) + [0x2F21] = 0x502D, --(倭) + [0x2F22] = 0x548C, --(和) + [0x2F23] = 0x8A71, --(話) + [0x2F24] = 0x6B6A, --(歪) + [0x2F25] = 0x8CC4, --(賄) + [0x2F26] = 0x8107, --(脇) + [0x2F27] = 0x60D1, --(惑) + [0x2F28] = 0x67A0, --(枠) + [0x2F29] = 0x9DF2, --(鷲) + [0x2F2A] = 0x4E99, --(亙) + [0x2F2B] = 0x4E98, --(亘) + [0x2F2C] = 0x9C10, --(鰐) + [0x2F2D] = 0x8A6B, --(詫) + [0x2F2E] = 0x85C1, --(藁) + [0x2F2F] = 0x8568, --(蕨) + [0x2F30] = 0x6900, --(椀) + [0x2F31] = 0x6E7E, --(湾) + [0x2F32] = 0x7897, --(碗) + [0x2F33] = 0x8155, --(腕) + [0x3001] = 0x5F0C, --(弌) + [0x3002] = 0x4E10, --(丐) + [0x3003] = 0x4E15, --(丕) + [0x3004] = 0x4E2A, --(个) + [0x3005] = 0x4E31, --(丱) + [0x3006] = 0x4E36, --(丶) + [0x3007] = 0x4E3C, --(丼) + [0x3008] = 0x4E3F, --(丿) + [0x3009] = 0x4E42, --(乂) + [0x300A] = 0x4E56, --(乖) + [0x300B] = 0x4E58, --(乘) + [0x300C] = 0x4E82, --(亂) + [0x300D] = 0x4E85, --(亅) + [0x300E] = 0x8C6B, --(豫) + [0x300F] = 0x4E8A, --(亊) + [0x3010] = 0x8212, --(舒) + [0x3011] = 0x5F0D, --(弍) + [0x3012] = 0x4E8E, --(于) + [0x3013] = 0x4E9E, --(亞) + [0x3014] = 0x4E9F, --(亟) + [0x3015] = 0x4EA0, --(亠) + [0x3016] = 0x4EA2, --(亢) + [0x3017] = 0x4EB0, --(亰) + [0x3018] = 0x4EB3, --(亳) + [0x3019] = 0x4EB6, --(亶) + [0x301A] = 0x4ECE, --(从) + [0x301B] = 0x4ECD, --(仍) + [0x301C] = 0x4EC4, --(仄) + [0x301D] = 0x4EC6, --(仆) + [0x301E] = 0x4EC2, --(仂) + [0x301F] = 0x4ED7, --(仗) + [0x3020] = 0x4EDE, --(仞) + [0x3021] = 0x4EED, --(仭) + [0x3022] = 0x4EDF, --(仟) + [0x3023] = 0x4EF7, --(价) + [0x3024] = 0x4F09, --(伉) + [0x3025] = 0x4F5A, --(佚) + [0x3026] = 0x4F30, --(估) + [0x3027] = 0x4F5B, --(佛) + [0x3028] = 0x4F5D, --(佝) + [0x3029] = 0x4F57, --(佗) + [0x302A] = 0x4F47, --(佇) + [0x302B] = 0x4F76, --(佶) + [0x302C] = 0x4F88, --(侈) + [0x302D] = 0x4F8F, --(侏) + [0x302E] = 0x4F98, --(侘) + [0x302F] = 0x4F7B, --(佻) + [0x3030] = 0x4F69, --(佩) + [0x3031] = 0x4F70, --(佰) + [0x3032] = 0x4F91, --(侑) + [0x3033] = 0x4F6F, --(佯) + [0x3034] = 0x4F86, --(來) + [0x3035] = 0x4F96, --(侖) + [0x3036] = 0x5118, --(儘) + [0x3037] = 0x4FD4, --(俔) + [0x3038] = 0x4FDF, --(俟) + [0x3039] = 0x4FCE, --(俎) + [0x303A] = 0x4FD8, --(俘) + [0x303B] = 0x4FDB, --(俛) + [0x303C] = 0x4FD1, --(俑) + [0x303D] = 0x4FDA, --(俚) + [0x303E] = 0x4FD0, --(俐) + [0x303F] = 0x4FE4, --(俤) + [0x3040] = 0x4FE5, --(俥) + [0x3041] = 0x501A, --(倚) + [0x3042] = 0x5028, --(倨) + [0x3043] = 0x5014, --(倔) + [0x3044] = 0x502A, --(倪) + [0x3045] = 0x5025, --(倥) + [0x3046] = 0x5005, --(倅) + [0x3047] = 0x4F1C, --(伜) + [0x3048] = 0x4FF6, --(俶) + [0x3049] = 0x5021, --(倡) + [0x304A] = 0x5029, --(倩) + [0x304B] = 0x502C, --(倬) + [0x304C] = 0x4FFE, --(俾) + [0x304D] = 0x4FEF, --(俯) + [0x304E] = 0x5011, --(們) + [0x304F] = 0x5006, --(倆) + [0x3050] = 0x5043, --(偃) + [0x3051] = 0x5047, --(假) + [0x3052] = 0x6703, --(會) + [0x3053] = 0x5055, --(偕) + [0x3054] = 0x5050, --(偐) + [0x3055] = 0x5048, --(偈) + [0x3056] = 0x505A, --(做) + [0x3057] = 0x5056, --(偖) + [0x3058] = 0x506C, --(偬) + [0x3059] = 0x5078, --(偸) + [0x305A] = 0x5080, --(傀) + [0x305B] = 0x509A, --(傚) + [0x305C] = 0x5085, --(傅) + [0x305D] = 0x50B4, --(傴) + [0x305E] = 0x50B2, --(傲) + [0x3101] = 0x50C9, --(僉) + [0x3102] = 0x50CA, --(僊) + [0x3103] = 0x50B3, --(傳) + [0x3104] = 0x50C2, --(僂) + [0x3105] = 0x50D6, --(僖) + [0x3106] = 0x50DE, --(僞) + [0x3107] = 0x50E5, --(僥) + [0x3108] = 0x50ED, --(僭) + [0x3109] = 0x50E3, --(僣) + [0x310A] = 0x50EE, --(僮) + [0x310B] = 0x50F9, --(價) + [0x310C] = 0x50F5, --(僵) + [0x310D] = 0x5109, --(儉) + [0x310E] = 0x5101, --(儁) + [0x310F] = 0x5102, --(儂) + [0x3110] = 0x5116, --(儖) + [0x3111] = 0x5115, --(儕) + [0x3112] = 0x5114, --(儔) + [0x3113] = 0x511A, --(儚) + [0x3114] = 0x5121, --(儡) + [0x3115] = 0x513A, --(儺) + [0x3116] = 0x5137, --(儷) + [0x3117] = 0x513C, --(儼) + [0x3118] = 0x513B, --(儻) + [0x3119] = 0x513F, --(儿) + [0x311A] = 0x5140, --(兀) + [0x311B] = 0x5152, --(兒) + [0x311C] = 0x514C, --(兌) + [0x311D] = 0x5154, --(兔) + [0x311E] = 0x5162, --(兢) + [0x311F] = 0x7AF8, --(竸) + [0x3120] = 0x5169, --(兩) + [0x3121] = 0x516A, --(兪) + [0x3122] = 0x516E, --(兮) + [0x3123] = 0x5180, --(冀) + [0x3124] = 0x5182, --(冂) + [0x3125] = 0x56D8, --(囘) + [0x3126] = 0x518C, --(册) + [0x3127] = 0x5189, --(冉) + [0x3128] = 0x518F, --(冏) + [0x3129] = 0x5191, --(冑) + [0x312A] = 0x5193, --(冓) + [0x312B] = 0x5195, --(冕) + [0x312C] = 0x5196, --(冖) + [0x312D] = 0x51A4, --(冤) + [0x312E] = 0x51A6, --(冦) + [0x312F] = 0x51A2, --(冢) + [0x3130] = 0x51A9, --(冩) + [0x3131] = 0x51AA, --(冪) + [0x3132] = 0x51AB, --(冫) + [0x3133] = 0x51B3, --(决) + [0x3134] = 0x51B1, --(冱) + [0x3135] = 0x51B2, --(冲) + [0x3136] = 0x51B0, --(冰) + [0x3137] = 0x51B5, --(况) + [0x3138] = 0x51BD, --(冽) + [0x3139] = 0x51C5, --(凅) + [0x313A] = 0x51C9, --(凉) + [0x313B] = 0x51DB, --(凛) + [0x313C] = 0x51E0, --(几) + [0x313D] = 0x8655, --(處) + [0x313E] = 0x51E9, --(凩) + [0x313F] = 0x51ED, --(凭) + [0x3140] = 0x51F0, --(凰) + [0x3141] = 0x51F5, --(凵) + [0x3142] = 0x51FE, --(凾) + [0x3143] = 0x5204, --(刄) + [0x3144] = 0x520B, --(刋) + [0x3145] = 0x5214, --(刔) + [0x3146] = 0x520E, --(刎) + [0x3147] = 0x5227, --(刧) + [0x3148] = 0x522A, --(刪) + [0x3149] = 0x522E, --(刮) + [0x314A] = 0x5233, --(刳) + [0x314B] = 0x5239, --(刹) + [0x314C] = 0x524F, --(剏) + [0x314D] = 0x5244, --(剄) + [0x314E] = 0x524B, --(剋) + [0x314F] = 0x524C, --(剌) + [0x3150] = 0x525E, --(剞) + [0x3151] = 0x5254, --(剔) + [0x3152] = 0x526A, --(剪) + [0x3153] = 0x5274, --(剴) + [0x3154] = 0x5269, --(剩) + [0x3155] = 0x5273, --(剳) + [0x3156] = 0x527F, --(剿) + [0x3157] = 0x527D, --(剽) + [0x3158] = 0x528D, --(劍) + [0x3159] = 0x5294, --(劔) + [0x315A] = 0x5292, --(劒) + [0x315B] = 0x5271, --(剱) + [0x315C] = 0x5288, --(劈) + [0x315D] = 0x5291, --(劑) + [0x315E] = 0x8FA8, --(辨) + [0x3201] = 0x8FA7, --(辧) + [0x3202] = 0x52AC, --(劬) + [0x3203] = 0x52AD, --(劭) + [0x3204] = 0x52BC, --(劼) + [0x3205] = 0x52B5, --(劵) + [0x3206] = 0x52C1, --(勁) + [0x3207] = 0x52CD, --(勍) + [0x3208] = 0x52D7, --(勗) + [0x3209] = 0x52DE, --(勞) + [0x320A] = 0x52E3, --(勣) + [0x320B] = 0x52E6, --(勦) + [0x320C] = 0x98ED, --(飭) + [0x320D] = 0x52E0, --(勠) + [0x320E] = 0x52F3, --(勳) + [0x320F] = 0x52F5, --(勵) + [0x3210] = 0x52F8, --(勸) + [0x3211] = 0x52F9, --(勹) + [0x3212] = 0x5306, --(匆) + [0x3213] = 0x5308, --(匈) + [0x3214] = 0x7538, --(甸) + [0x3215] = 0x530D, --(匍) + [0x3216] = 0x5310, --(匐) + [0x3217] = 0x530F, --(匏) + [0x3218] = 0x5315, --(匕) + [0x3219] = 0x531A, --(匚) + [0x321A] = 0x5323, --(匣) + [0x321B] = 0x532F, --(匯) + [0x321C] = 0x5331, --(匱) + [0x321D] = 0x5333, --(匳) + [0x321E] = 0x5338, --(匸) + [0x321F] = 0x5340, --(區) + [0x3220] = 0x5346, --(卆) + [0x3221] = 0x5345, --(卅) + [0x3222] = 0x4E17, --(丗) + [0x3223] = 0x5349, --(卉) + [0x3224] = 0x534D, --(卍) + [0x3225] = 0x51D6, --(凖) + [0x3226] = 0x535E, --(卞) + [0x3227] = 0x5369, --(卩) + [0x3228] = 0x536E, --(卮) + [0x3229] = 0x5918, --(夘) + [0x322A] = 0x537B, --(卻) + [0x322B] = 0x5377, --(卷) + [0x322C] = 0x5382, --(厂) + [0x322D] = 0x5396, --(厖) + [0x322E] = 0x53A0, --(厠) + [0x322F] = 0x53A6, --(厦) + [0x3230] = 0x53A5, --(厥) + [0x3231] = 0x53AE, --(厮) + [0x3232] = 0x53B0, --(厰) + [0x3233] = 0x53B6, --(厶) + [0x3234] = 0x53C3, --(參) + [0x3235] = 0x7C12, --(簒) + [0x3236] = 0x96D9, --(雙) + [0x3237] = 0x53DF, --(叟) + [0x3238] = 0x66FC, --(曼) + [0x3239] = 0x71EE, --(燮) + [0x323A] = 0x53EE, --(叮) + [0x323B] = 0x53E8, --(叨) + [0x323C] = 0x53ED, --(叭) + [0x323D] = 0x53FA, --(叺) + [0x323E] = 0x5401, --(吁) + [0x323F] = 0x543D, --(吽) + [0x3240] = 0x5440, --(呀) + [0x3241] = 0x542C, --(听) + [0x3242] = 0x542D, --(吭) + [0x3243] = 0x543C, --(吼) + [0x3244] = 0x542E, --(吮) + [0x3245] = 0x5436, --(吶) + [0x3246] = 0x5429, --(吩) + [0x3247] = 0x541D, --(吝) + [0x3248] = 0x544E, --(呎) + [0x3249] = 0x548F, --(咏) + [0x324A] = 0x5475, --(呵) + [0x324B] = 0x548E, --(咎) + [0x324C] = 0x545F, --(呟) + [0x324D] = 0x5471, --(呱) + [0x324E] = 0x5477, --(呷) + [0x324F] = 0x5470, --(呰) + [0x3250] = 0x5492, --(咒) + [0x3251] = 0x547B, --(呻) + [0x3252] = 0x5480, --(咀) + [0x3253] = 0x5476, --(呶) + [0x3254] = 0x5484, --(咄) + [0x3255] = 0x5490, --(咐) + [0x3256] = 0x5486, --(咆) + [0x3257] = 0x54C7, --(哇) + [0x3258] = 0x54A2, --(咢) + [0x3259] = 0x54B8, --(咸) + [0x325A] = 0x54A5, --(咥) + [0x325B] = 0x54AC, --(咬) + [0x325C] = 0x54C4, --(哄) + [0x325D] = 0x54C8, --(哈) + [0x325E] = 0x54A8, --(咨) + [0x3301] = 0x54AB, --(咫) + [0x3302] = 0x54C2, --(哂) + [0x3303] = 0x54A4, --(咤) + [0x3304] = 0x54BE, --(咾) + [0x3305] = 0x54BC, --(咼) + [0x3306] = 0x54D8, --(哘) + [0x3307] = 0x54E5, --(哥) + [0x3308] = 0x54E6, --(哦) + [0x3309] = 0x550F, --(唏) + [0x330A] = 0x5514, --(唔) + [0x330B] = 0x54FD, --(哽) + [0x330C] = 0x54EE, --(哮) + [0x330D] = 0x54ED, --(哭) + [0x330E] = 0x54FA, --(哺) + [0x330F] = 0x54E2, --(哢) + [0x3310] = 0x5539, --(唹) + [0x3311] = 0x5540, --(啀) + [0x3312] = 0x5563, --(啣) + [0x3313] = 0x554C, --(啌) + [0x3314] = 0x552E, --(售) + [0x3315] = 0x555C, --(啜) + [0x3316] = 0x5545, --(啅) + [0x3317] = 0x5556, --(啖) + [0x3318] = 0x5557, --(啗) + [0x3319] = 0x5538, --(唸) + [0x331A] = 0x5533, --(唳) + [0x331B] = 0x555D, --(啝) + [0x331C] = 0x5599, --(喙) + [0x331D] = 0x5580, --(喀) + [0x331E] = 0x54AF, --(咯) + [0x331F] = 0x558A, --(喊) + [0x3320] = 0x559F, --(喟) + [0x3321] = 0x557B, --(啻) + [0x3322] = 0x557E, --(啾) + [0x3323] = 0x5598, --(喘) + [0x3324] = 0x559E, --(喞) + [0x3325] = 0x55AE, --(單) + [0x3326] = 0x557C, --(啼) + [0x3327] = 0x5583, --(喃) + [0x3328] = 0x55A9, --(喩) + [0x3329] = 0x5587, --(喇) + [0x332A] = 0x55A8, --(喨) + [0x332B] = 0x55DA, --(嗚) + [0x332C] = 0x55C5, --(嗅) + [0x332D] = 0x55DF, --(嗟) + [0x332E] = 0x55C4, --(嗄) + [0x332F] = 0x55DC, --(嗜) + [0x3330] = 0x55E4, --(嗤) + [0x3331] = 0x55D4, --(嗔) + [0x3332] = 0x5614, --(嘔) + [0x3333] = 0x55F7, --(嗷) + [0x3334] = 0x5616, --(嘖) + [0x3335] = 0x55FE, --(嗾) + [0x3336] = 0x55FD, --(嗽) + [0x3337] = 0x561B, --(嘛) + [0x3338] = 0x55F9, --(嗹) + [0x3339] = 0x564E, --(噎) + [0x333A] = 0x5650, --(噐) + [0x333B] = 0x71DF, --(營) + [0x333C] = 0x5634, --(嘴) + [0x333D] = 0x5636, --(嘶) + [0x333E] = 0x5632, --(嘲) + [0x333F] = 0x5638, --(嘸) + [0x3340] = 0x566B, --(噫) + [0x3341] = 0x5664, --(噤) + [0x3342] = 0x562F, --(嘯) + [0x3343] = 0x566C, --(噬) + [0x3344] = 0x566A, --(噪) + [0x3345] = 0x5686, --(嚆) + [0x3346] = 0x5680, --(嚀) + [0x3347] = 0x568A, --(嚊) + [0x3348] = 0x56A0, --(嚠) + [0x3349] = 0x5694, --(嚔) + [0x334A] = 0x568F, --(嚏) + [0x334B] = 0x56A5, --(嚥) + [0x334C] = 0x56AE, --(嚮) + [0x334D] = 0x56B6, --(嚶) + [0x334E] = 0x56B4, --(嚴) + [0x334F] = 0x56C2, --(囂) + [0x3350] = 0x56BC, --(嚼) + [0x3351] = 0x56C1, --(囁) + [0x3352] = 0x56C3, --(囃) + [0x3353] = 0x56C0, --(囀) + [0x3354] = 0x56C8, --(囈) + [0x3355] = 0x56CE, --(囎) + [0x3356] = 0x56D1, --(囑) + [0x3357] = 0x56D3, --(囓) + [0x3358] = 0x56D7, --(囗) + [0x3359] = 0x56EE, --(囮) + [0x335A] = 0x56F9, --(囹) + [0x335B] = 0x5700, --(圀) + [0x335C] = 0x56FF, --(囿) + [0x335D] = 0x5704, --(圄) + [0x335E] = 0x5709, --(圉) + [0x3401] = 0x5708, --(圈) + [0x3402] = 0x570B, --(國) + [0x3403] = 0x570D, --(圍) + [0x3404] = 0x5713, --(圓) + [0x3405] = 0x5718, --(團) + [0x3406] = 0x5716, --(圖) + [0x3407] = 0x55C7, --(嗇) + [0x3408] = 0x571C, --(圜) + [0x3409] = 0x5726, --(圦) + [0x340A] = 0x5737, --(圷) + [0x340B] = 0x5738, --(圸) + [0x340C] = 0x574E, --(坎) + [0x340D] = 0x573B, --(圻) + [0x340E] = 0x5740, --(址) + [0x340F] = 0x574F, --(坏) + [0x3410] = 0x5769, --(坩) + [0x3411] = 0x57C0, --(埀) + [0x3412] = 0x5788, --(垈) + [0x3413] = 0x5761, --(坡) + [0x3414] = 0x577F, --(坿) + [0x3415] = 0x5789, --(垉) + [0x3416] = 0x5793, --(垓) + [0x3417] = 0x57A0, --(垠) + [0x3418] = 0x57B3, --(垳) + [0x3419] = 0x57A4, --(垤) + [0x341A] = 0x57AA, --(垪) + [0x341B] = 0x57B0, --(垰) + [0x341C] = 0x57C3, --(埃) + [0x341D] = 0x57C6, --(埆) + [0x341E] = 0x57D4, --(埔) + [0x341F] = 0x57D2, --(埒) + [0x3420] = 0x57D3, --(埓) + [0x3421] = 0x580A, --(堊) + [0x3422] = 0x57D6, --(埖) + [0x3423] = 0x57E3, --(埣) + [0x3424] = 0x580B, --(堋) + [0x3425] = 0x5819, --(堙) + [0x3426] = 0x581D, --(堝) + [0x3427] = 0x5872, --(塲) + [0x3428] = 0x5821, --(堡) + [0x3429] = 0x5862, --(塢) + [0x342A] = 0x584B, --(塋) + [0x342B] = 0x5870, --(塰) + [0x342C] = 0x6BC0, --(毀) + [0x342D] = 0x5852, --(塒) + [0x342E] = 0x583D, --(堽) + [0x342F] = 0x5879, --(塹) + [0x3430] = 0x5885, --(墅) + [0x3431] = 0x58B9, --(墹) + [0x3432] = 0x589F, --(墟) + [0x3433] = 0x58AB, --(墫) + [0x3434] = 0x58BA, --(墺) + [0x3435] = 0x58DE, --(壞) + [0x3436] = 0x58BB, --(墻) + [0x3437] = 0x58B8, --(墸) + [0x3438] = 0x58AE, --(墮) + [0x3439] = 0x58C5, --(壅) + [0x343A] = 0x58D3, --(壓) + [0x343B] = 0x58D1, --(壑) + [0x343C] = 0x58D7, --(壗) + [0x343D] = 0x58D9, --(壙) + [0x343E] = 0x58D8, --(壘) + [0x343F] = 0x58E5, --(壥) + [0x3440] = 0x58DC, --(壜) + [0x3441] = 0x58E4, --(壤) + [0x3442] = 0x58DF, --(壟) + [0x3443] = 0x58EF, --(壯) + [0x3444] = 0x58FA, --(壺) + [0x3445] = 0x58F9, --(壹) + [0x3446] = 0x58FB, --(壻) + [0x3447] = 0x58FC, --(壼) + [0x3448] = 0x58FD, --(壽) + [0x3449] = 0x5902, --(夂) + [0x344A] = 0x590A, --(夊) + [0x344B] = 0x5910, --(夐) + [0x344C] = 0x591B, --(夛) + [0x344D] = 0x68A6, --(梦) + [0x344E] = 0x5925, --(夥) + [0x344F] = 0x592C, --(夬) + [0x3450] = 0x592D, --(夭) + [0x3451] = 0x5932, --(夲) + [0x3452] = 0x5938, --(夸) + [0x3453] = 0x593E, --(夾) + [0x3454] = 0x7AD2, --(竒) + [0x3455] = 0x5955, --(奕) + [0x3456] = 0x5950, --(奐) + [0x3457] = 0x594E, --(奎) + [0x3458] = 0x595A, --(奚) + [0x3459] = 0x5958, --(奘) + [0x345A] = 0x5962, --(奢) + [0x345B] = 0x5960, --(奠) + [0x345C] = 0x5967, --(奧) + [0x345D] = 0x596C, --(奬) + [0x345E] = 0x5969, --(奩) + [0x3501] = 0x5978, --(奸) + [0x3502] = 0x5981, --(妁) + [0x3503] = 0x599D, --(妝) + [0x3504] = 0x4F5E, --(佞) + [0x3505] = 0x4FAB, --(侫) + [0x3506] = 0x59A3, --(妣) + [0x3507] = 0x59B2, --(妲) + [0x3508] = 0x59C6, --(姆) + [0x3509] = 0x59E8, --(姨) + [0x350A] = 0x59DC, --(姜) + [0x350B] = 0x598D, --(妍) + [0x350C] = 0x59D9, --(姙) + [0x350D] = 0x59DA, --(姚) + [0x350E] = 0x5A25, --(娥) + [0x350F] = 0x5A1F, --(娟) + [0x3510] = 0x5A11, --(娑) + [0x3511] = 0x5A1C, --(娜) + [0x3512] = 0x5A09, --(娉) + [0x3513] = 0x5A1A, --(娚) + [0x3514] = 0x5A40, --(婀) + [0x3515] = 0x5A6C, --(婬) + [0x3516] = 0x5A49, --(婉) + [0x3517] = 0x5A35, --(娵) + [0x3518] = 0x5A36, --(娶) + [0x3519] = 0x5A62, --(婢) + [0x351A] = 0x5A6A, --(婪) + [0x351B] = 0x5A9A, --(媚) + [0x351C] = 0x5ABC, --(媼) + [0x351D] = 0x5ABE, --(媾) + [0x351E] = 0x5ACB, --(嫋) + [0x351F] = 0x5AC2, --(嫂) + [0x3520] = 0x5ABD, --(媽) + [0x3521] = 0x5AE3, --(嫣) + [0x3522] = 0x5AD7, --(嫗) + [0x3523] = 0x5AE6, --(嫦) + [0x3524] = 0x5AE9, --(嫩) + [0x3525] = 0x5AD6, --(嫖) + [0x3526] = 0x5AFA, --(嫺) + [0x3527] = 0x5AFB, --(嫻) + [0x3528] = 0x5B0C, --(嬌) + [0x3529] = 0x5B0B, --(嬋) + [0x352A] = 0x5B16, --(嬖) + [0x352B] = 0x5B32, --(嬲) + [0x352C] = 0x5AD0, --(嫐) + [0x352D] = 0x5B2A, --(嬪) + [0x352E] = 0x5B36, --(嬶) + [0x352F] = 0x5B3E, --(嬾) + [0x3530] = 0x5B43, --(孃) + [0x3531] = 0x5B45, --(孅) + [0x3532] = 0x5B40, --(孀) + [0x3533] = 0x5B51, --(孑) + [0x3534] = 0x5B55, --(孕) + [0x3535] = 0x5B5A, --(孚) + [0x3536] = 0x5B5B, --(孛) + [0x3537] = 0x5B65, --(孥) + [0x3538] = 0x5B69, --(孩) + [0x3539] = 0x5B70, --(孰) + [0x353A] = 0x5B73, --(孳) + [0x353B] = 0x5B75, --(孵) + [0x353C] = 0x5B78, --(學) + [0x353D] = 0x6588, --(斈) + [0x353E] = 0x5B7A, --(孺) + [0x353F] = 0x5B80, --(宀) + [0x3540] = 0x5B83, --(它) + [0x3541] = 0x5BA6, --(宦) + [0x3542] = 0x5BB8, --(宸) + [0x3543] = 0x5BC3, --(寃) + [0x3544] = 0x5BC7, --(寇) + [0x3545] = 0x5BC9, --(寉) + [0x3546] = 0x5BD4, --(寔) + [0x3547] = 0x5BD0, --(寐) + [0x3548] = 0x5BE4, --(寤) + [0x3549] = 0x5BE6, --(實) + [0x354A] = 0x5BE2, --(寢) + [0x354B] = 0x5BDE, --(寞) + [0x354C] = 0x5BE5, --(寥) + [0x354D] = 0x5BEB, --(寫) + [0x354E] = 0x5BF0, --(寰) + [0x354F] = 0x5BF6, --(寶) + [0x3550] = 0x5BF3, --(寳) + [0x3551] = 0x5C05, --(尅) + [0x3552] = 0x5C07, --(將) + [0x3553] = 0x5C08, --(專) + [0x3554] = 0x5C0D, --(對) + [0x3555] = 0x5C13, --(尓) + [0x3556] = 0x5C20, --(尠) + [0x3557] = 0x5C22, --(尢) + [0x3558] = 0x5C28, --(尨) + [0x3559] = 0x5C38, --(尸) + [0x355A] = 0x5C39, --(尹) + [0x355B] = 0x5C41, --(屁) + [0x355C] = 0x5C46, --(屆) + [0x355D] = 0x5C4E, --(屎) + [0x355E] = 0x5C53, --(屓) + [0x3601] = 0x5C50, --(屐) + [0x3602] = 0x5C4F, --(屏) + [0x3603] = 0x5B71, --(孱) + [0x3604] = 0x5C6C, --(屬) + [0x3605] = 0x5C6E, --(屮) + [0x3606] = 0x4E62, --(乢) + [0x3607] = 0x5C76, --(屶) + [0x3608] = 0x5C79, --(屹) + [0x3609] = 0x5C8C, --(岌) + [0x360A] = 0x5C91, --(岑) + [0x360B] = 0x5C94, --(岔) + [0x360C] = 0x599B, --(妛) + [0x360D] = 0x5CAB, --(岫) + [0x360E] = 0x5CBB, --(岻) + [0x360F] = 0x5CB6, --(岶) + [0x3610] = 0x5CBC, --(岼) + [0x3611] = 0x5CB7, --(岷) + [0x3612] = 0x5CC5, --(峅) + [0x3613] = 0x5CBE, --(岾) + [0x3614] = 0x5CC7, --(峇) + [0x3615] = 0x5CD9, --(峙) + [0x3616] = 0x5CE9, --(峩) + [0x3617] = 0x5CFD, --(峽) + [0x3618] = 0x5CFA, --(峺) + [0x3619] = 0x5CED, --(峭) + [0x361A] = 0x5D8C, --(嶌) + [0x361B] = 0x5CEA, --(峪) + [0x361C] = 0x5D0B, --(崋) + [0x361D] = 0x5D15, --(崕) + [0x361E] = 0x5D17, --(崗) + [0x361F] = 0x5D5C, --(嵜) + [0x3620] = 0x5D1F, --(崟) + [0x3621] = 0x5D1B, --(崛) + [0x3622] = 0x5D11, --(崑) + [0x3623] = 0x5D14, --(崔) + [0x3624] = 0x5D22, --(崢) + [0x3625] = 0x5D1A, --(崚) + [0x3626] = 0x5D19, --(崙) + [0x3627] = 0x5D18, --(崘) + [0x3628] = 0x5D4C, --(嵌) + [0x3629] = 0x5D52, --(嵒) + [0x362A] = 0x5D4E, --(嵎) + [0x362B] = 0x5D4B, --(嵋) + [0x362C] = 0x5D6C, --(嵬) + [0x362D] = 0x5D73, --(嵳) + [0x362E] = 0x5D76, --(嵶) + [0x362F] = 0x5D87, --(嶇) + [0x3630] = 0x5D84, --(嶄) + [0x3631] = 0x5D82, --(嶂) + [0x3632] = 0x5DA2, --(嶢) + [0x3633] = 0x5D9D, --(嶝) + [0x3634] = 0x5DAC, --(嶬) + [0x3635] = 0x5DAE, --(嶮) + [0x3636] = 0x5DBD, --(嶽) + [0x3637] = 0x5D90, --(嶐) + [0x3638] = 0x5DB7, --(嶷) + [0x3639] = 0x5DBC, --(嶼) + [0x363A] = 0x5DC9, --(巉) + [0x363B] = 0x5DCD, --(巍) + [0x363C] = 0x5DD3, --(巓) + [0x363D] = 0x5DD2, --(巒) + [0x363E] = 0x5DD6, --(巖) + [0x363F] = 0x5DDB, --(巛) + [0x3640] = 0x5DEB, --(巫) + [0x3641] = 0x5DF2, --(已) + [0x3642] = 0x5DF5, --(巵) + [0x3643] = 0x5E0B, --(帋) + [0x3644] = 0x5E1A, --(帚) + [0x3645] = 0x5E19, --(帙) + [0x3646] = 0x5E11, --(帑) + [0x3647] = 0x5E1B, --(帛) + [0x3648] = 0x5E36, --(帶) + [0x3649] = 0x5E37, --(帷) + [0x364A] = 0x5E44, --(幄) + [0x364B] = 0x5E43, --(幃) + [0x364C] = 0x5E40, --(幀) + [0x364D] = 0x5E4E, --(幎) + [0x364E] = 0x5E57, --(幗) + [0x364F] = 0x5E54, --(幔) + [0x3650] = 0x5E5F, --(幟) + [0x3651] = 0x5E62, --(幢) + [0x3652] = 0x5E64, --(幤) + [0x3653] = 0x5E47, --(幇) + [0x3654] = 0x5E75, --(幵) + [0x3655] = 0x5E76, --(并) + [0x3656] = 0x5E7A, --(幺) + [0x3657] = 0x9EBC, --(麼) + [0x3658] = 0x5E7F, --(广) + [0x3659] = 0x5EA0, --(庠) + [0x365A] = 0x5EC1, --(廁) + [0x365B] = 0x5EC2, --(廂) + [0x365C] = 0x5EC8, --(廈) + [0x365D] = 0x5ED0, --(廐) + [0x365E] = 0x5ECF, --(廏) + [0x3701] = 0x5ED6, --(廖) + [0x3702] = 0x5EE3, --(廣) + [0x3703] = 0x5EDD, --(廝) + [0x3704] = 0x5EDA, --(廚) + [0x3705] = 0x5EDB, --(廛) + [0x3706] = 0x5EE2, --(廢) + [0x3707] = 0x5EE1, --(廡) + [0x3708] = 0x5EE8, --(廨) + [0x3709] = 0x5EE9, --(廩) + [0x370A] = 0x5EEC, --(廬) + [0x370B] = 0x5EF1, --(廱) + [0x370C] = 0x5EF3, --(廳) + [0x370D] = 0x5EF0, --(廰) + [0x370E] = 0x5EF4, --(廴) + [0x370F] = 0x5EF8, --(廸) + [0x3710] = 0x5EFE, --(廾) + [0x3711] = 0x5F03, --(弃) + [0x3712] = 0x5F09, --(弉) + [0x3713] = 0x5F5D, --(彝) + [0x3714] = 0x5F5C, --(彜) + [0x3715] = 0x5F0B, --(弋) + [0x3716] = 0x5F11, --(弑) + [0x3717] = 0x5F16, --(弖) + [0x3718] = 0x5F29, --(弩) + [0x3719] = 0x5F2D, --(弭) + [0x371A] = 0x5F38, --(弸) + [0x371B] = 0x5F41, --(彁) + [0x371C] = 0x5F48, --(彈) + [0x371D] = 0x5F4C, --(彌) + [0x371E] = 0x5F4E, --(彎) + [0x371F] = 0x5F2F, --(弯) + [0x3720] = 0x5F51, --(彑) + [0x3721] = 0x5F56, --(彖) + [0x3722] = 0x5F57, --(彗) + [0x3723] = 0x5F59, --(彙) + [0x3724] = 0x5F61, --(彡) + [0x3725] = 0x5F6D, --(彭) + [0x3726] = 0x5F73, --(彳) + [0x3727] = 0x5F77, --(彷) + [0x3728] = 0x5F83, --(徃) + [0x3729] = 0x5F82, --(徂) + [0x372A] = 0x5F7F, --(彿) + [0x372B] = 0x5F8A, --(徊) + [0x372C] = 0x5F88, --(很) + [0x372D] = 0x5F91, --(徑) + [0x372E] = 0x5F87, --(徇) + [0x372F] = 0x5F9E, --(從) + [0x3730] = 0x5F99, --(徙) + [0x3731] = 0x5F98, --(徘) + [0x3732] = 0x5FA0, --(徠) + [0x3733] = 0x5FA8, --(徨) + [0x3734] = 0x5FAD, --(徭) + [0x3735] = 0x5FBC, --(徼) + [0x3736] = 0x5FD6, --(忖) + [0x3737] = 0x5FFB, --(忻) + [0x3738] = 0x5FE4, --(忤) + [0x3739] = 0x5FF8, --(忸) + [0x373A] = 0x5FF1, --(忱) + [0x373B] = 0x5FDD, --(忝) + [0x373C] = 0x60B3, --(悳) + [0x373D] = 0x5FFF, --(忿) + [0x373E] = 0x6021, --(怡) + [0x373F] = 0x6060, --(恠) + [0x3740] = 0x6019, --(怙) + [0x3741] = 0x6010, --(怐) + [0x3742] = 0x6029, --(怩) + [0x3743] = 0x600E, --(怎) + [0x3744] = 0x6031, --(怱) + [0x3745] = 0x601B, --(怛) + [0x3746] = 0x6015, --(怕) + [0x3747] = 0x602B, --(怫) + [0x3748] = 0x6026, --(怦) + [0x3749] = 0x600F, --(怏) + [0x374A] = 0x603A, --(怺) + [0x374B] = 0x605A, --(恚) + [0x374C] = 0x6041, --(恁) + [0x374D] = 0x606A, --(恪) + [0x374E] = 0x6077, --(恷) + [0x374F] = 0x605F, --(恟) + [0x3750] = 0x604A, --(恊) + [0x3751] = 0x6046, --(恆) + [0x3752] = 0x604D, --(恍) + [0x3753] = 0x6063, --(恣) + [0x3754] = 0x6043, --(恃) + [0x3755] = 0x6064, --(恤) + [0x3756] = 0x6042, --(恂) + [0x3757] = 0x606C, --(恬) + [0x3758] = 0x606B, --(恫) + [0x3759] = 0x6059, --(恙) + [0x375A] = 0x6081, --(悁) + [0x375B] = 0x608D, --(悍) + [0x375C] = 0x60E7, --(惧) + [0x375D] = 0x6083, --(悃) + [0x375E] = 0x609A, --(悚) + [0x3801] = 0x6084, --(悄) + [0x3802] = 0x609B, --(悛) + [0x3803] = 0x6096, --(悖) + [0x3804] = 0x6097, --(悗) + [0x3805] = 0x6092, --(悒) + [0x3806] = 0x60A7, --(悧) + [0x3807] = 0x608B, --(悋) + [0x3808] = 0x60E1, --(惡) + [0x3809] = 0x60B8, --(悸) + [0x380A] = 0x60E0, --(惠) + [0x380B] = 0x60D3, --(惓) + [0x380C] = 0x60B4, --(悴) + [0x380D] = 0x5FF0, --(忰) + [0x380E] = 0x60BD, --(悽) + [0x380F] = 0x60C6, --(惆) + [0x3810] = 0x60B5, --(悵) + [0x3811] = 0x60D8, --(惘) + [0x3812] = 0x614D, --(慍) + [0x3813] = 0x6115, --(愕) + [0x3814] = 0x6106, --(愆) + [0x3815] = 0x60F6, --(惶) + [0x3816] = 0x60F7, --(惷) + [0x3817] = 0x6100, --(愀) + [0x3818] = 0x60F4, --(惴) + [0x3819] = 0x60FA, --(惺) + [0x381A] = 0x6103, --(愃) + [0x381B] = 0x6121, --(愡) + [0x381C] = 0x60FB, --(惻) + [0x381D] = 0x60F1, --(惱) + [0x381E] = 0x610D, --(愍) + [0x381F] = 0x610E, --(愎) + [0x3820] = 0x6147, --(慇) + [0x3821] = 0x613E, --(愾) + [0x3822] = 0x6128, --(愨) + [0x3823] = 0x6127, --(愧) + [0x3824] = 0x614A, --(慊) + [0x3825] = 0x613F, --(愿) + [0x3826] = 0x613C, --(愼) + [0x3827] = 0x612C, --(愬) + [0x3828] = 0x6134, --(愴) + [0x3829] = 0x613D, --(愽) + [0x382A] = 0x6142, --(慂) + [0x382B] = 0x6144, --(慄) + [0x382C] = 0x6173, --(慳) + [0x382D] = 0x6177, --(慷) + [0x382E] = 0x6158, --(慘) + [0x382F] = 0x6159, --(慙) + [0x3830] = 0x615A, --(慚) + [0x3831] = 0x616B, --(慫) + [0x3832] = 0x6174, --(慴) + [0x3833] = 0x616F, --(慯) + [0x3834] = 0x6165, --(慥) + [0x3835] = 0x6171, --(慱) + [0x3836] = 0x615F, --(慟) + [0x3837] = 0x615D, --(慝) + [0x3838] = 0x6153, --(慓) + [0x3839] = 0x6175, --(慵) + [0x383A] = 0x6199, --(憙) + [0x383B] = 0x6196, --(憖) + [0x383C] = 0x6187, --(憇) + [0x383D] = 0x61AC, --(憬) + [0x383E] = 0x6194, --(憔) + [0x383F] = 0x619A, --(憚) + [0x3840] = 0x618A, --(憊) + [0x3841] = 0x6191, --(憑) + [0x3842] = 0x61AB, --(憫) + [0x3843] = 0x61AE, --(憮) + [0x3844] = 0x61CC, --(懌) + [0x3845] = 0x61CA, --(懊) + [0x3846] = 0x61C9, --(應) + [0x3847] = 0x61F7, --(懷) + [0x3848] = 0x61C8, --(懈) + [0x3849] = 0x61C3, --(懃) + [0x384A] = 0x61C6, --(懆) + [0x384B] = 0x61BA, --(憺) + [0x384C] = 0x61CB, --(懋) + [0x384D] = 0x7F79, --(罹) + [0x384E] = 0x61CD, --(懍) + [0x384F] = 0x61E6, --(懦) + [0x3850] = 0x61E3, --(懣) + [0x3851] = 0x61F6, --(懶) + [0x3852] = 0x61FA, --(懺) + [0x3853] = 0x61F4, --(懴) + [0x3854] = 0x61FF, --(懿) + [0x3855] = 0x61FD, --(懽) + [0x3856] = 0x61FC, --(懼) + [0x3857] = 0x61FE, --(懾) + [0x3858] = 0x6200, --(戀) + [0x3859] = 0x6208, --(戈) + [0x385A] = 0x6209, --(戉) + [0x385B] = 0x620D, --(戍) + [0x385C] = 0x620C, --(戌) + [0x385D] = 0x6214, --(戔) + [0x385E] = 0x621B, --(戛) + [0x3901] = 0x621E, --(戞) + [0x3902] = 0x6221, --(戡) + [0x3903] = 0x622A, --(截) + [0x3904] = 0x622E, --(戮) + [0x3905] = 0x6230, --(戰) + [0x3906] = 0x6232, --(戲) + [0x3907] = 0x6233, --(戳) + [0x3908] = 0x6241, --(扁) + [0x3909] = 0x624E, --(扎) + [0x390A] = 0x625E, --(扞) + [0x390B] = 0x6263, --(扣) + [0x390C] = 0x625B, --(扛) + [0x390D] = 0x6260, --(扠) + [0x390E] = 0x6268, --(扨) + [0x390F] = 0x627C, --(扼) + [0x3910] = 0x6282, --(抂) + [0x3911] = 0x6289, --(抉) + [0x3912] = 0x627E, --(找) + [0x3913] = 0x6292, --(抒) + [0x3914] = 0x6293, --(抓) + [0x3915] = 0x6296, --(抖) + [0x3916] = 0x62D4, --(拔) + [0x3917] = 0x6283, --(抃) + [0x3918] = 0x6294, --(抔) + [0x3919] = 0x62D7, --(拗) + [0x391A] = 0x62D1, --(拑) + [0x391B] = 0x62BB, --(抻) + [0x391C] = 0x62CF, --(拏) + [0x391D] = 0x62FF, --(拿) + [0x391E] = 0x62C6, --(拆) + [0x391F] = 0x64D4, --(擔) + [0x3920] = 0x62C8, --(拈) + [0x3921] = 0x62DC, --(拜) + [0x3922] = 0x62CC, --(拌) + [0x3923] = 0x62CA, --(拊) + [0x3924] = 0x62C2, --(拂) + [0x3925] = 0x62C7, --(拇) + [0x3926] = 0x629B, --(抛) + [0x3927] = 0x62C9, --(拉) + [0x3928] = 0x630C, --(挌) + [0x3929] = 0x62EE, --(拮) + [0x392A] = 0x62F1, --(拱) + [0x392B] = 0x6327, --(挧) + [0x392C] = 0x6302, --(挂) + [0x392D] = 0x6308, --(挈) + [0x392E] = 0x62EF, --(拯) + [0x392F] = 0x62F5, --(拵) + [0x3930] = 0x6350, --(捐) + [0x3931] = 0x633E, --(挾) + [0x3932] = 0x634D, --(捍) + [0x3933] = 0x641C, --(搜) + [0x3934] = 0x634F, --(捏) + [0x3935] = 0x6396, --(掖) + [0x3936] = 0x638E, --(掎) + [0x3937] = 0x6380, --(掀) + [0x3938] = 0x63AB, --(掫) + [0x3939] = 0x6376, --(捶) + [0x393A] = 0x63A3, --(掣) + [0x393B] = 0x638F, --(掏) + [0x393C] = 0x6389, --(掉) + [0x393D] = 0x639F, --(掟) + [0x393E] = 0x63B5, --(掵) + [0x393F] = 0x636B, --(捫) + [0x3940] = 0x6369, --(捩) + [0x3941] = 0x63BE, --(掾) + [0x3942] = 0x63E9, --(揩) + [0x3943] = 0x63C0, --(揀) + [0x3944] = 0x63C6, --(揆) + [0x3945] = 0x63E3, --(揣) + [0x3946] = 0x63C9, --(揉) + [0x3947] = 0x63D2, --(插) + [0x3948] = 0x63F6, --(揶) + [0x3949] = 0x63C4, --(揄) + [0x394A] = 0x6416, --(搖) + [0x394B] = 0x6434, --(搴) + [0x394C] = 0x6406, --(搆) + [0x394D] = 0x6413, --(搓) + [0x394E] = 0x6426, --(搦) + [0x394F] = 0x6436, --(搶) + [0x3950] = 0x651D, --(攝) + [0x3951] = 0x6417, --(搗) + [0x3952] = 0x6428, --(搨) + [0x3953] = 0x640F, --(搏) + [0x3954] = 0x6467, --(摧) + [0x3955] = 0x646F, --(摯) + [0x3956] = 0x6476, --(摶) + [0x3957] = 0x644E, --(摎) + [0x3958] = 0x652A, --(攪) + [0x3959] = 0x6495, --(撕) + [0x395A] = 0x6493, --(撓) + [0x395B] = 0x64A5, --(撥) + [0x395C] = 0x64A9, --(撩) + [0x395D] = 0x6488, --(撈) + [0x395E] = 0x64BC, --(撼) + [0x3A01] = 0x64DA, --(據) + [0x3A02] = 0x64D2, --(擒) + [0x3A03] = 0x64C5, --(擅) + [0x3A04] = 0x64C7, --(擇) + [0x3A05] = 0x64BB, --(撻) + [0x3A06] = 0x64D8, --(擘) + [0x3A07] = 0x64C2, --(擂) + [0x3A08] = 0x64F1, --(擱) + [0x3A09] = 0x64E7, --(擧) + [0x3A0A] = 0x8209, --(舉) + [0x3A0B] = 0x64E0, --(擠) + [0x3A0C] = 0x64E1, --(擡) + [0x3A0D] = 0x62AC, --(抬) + [0x3A0E] = 0x64E3, --(擣) + [0x3A0F] = 0x64EF, --(擯) + [0x3A10] = 0x652C, --(攬) + [0x3A11] = 0x64F6, --(擶) + [0x3A12] = 0x64F4, --(擴) + [0x3A13] = 0x64F2, --(擲) + [0x3A14] = 0x64FA, --(擺) + [0x3A15] = 0x6500, --(攀) + [0x3A16] = 0x64FD, --(擽) + [0x3A17] = 0x6518, --(攘) + [0x3A18] = 0x651C, --(攜) + [0x3A19] = 0x6505, --(攅) + [0x3A1A] = 0x6524, --(攤) + [0x3A1B] = 0x6523, --(攣) + [0x3A1C] = 0x652B, --(攫) + [0x3A1D] = 0x6534, --(攴) + [0x3A1E] = 0x6535, --(攵) + [0x3A1F] = 0x6537, --(攷) + [0x3A20] = 0x6536, --(收) + [0x3A21] = 0x6538, --(攸) + [0x3A22] = 0x754B, --(畋) + [0x3A23] = 0x6548, --(效) + [0x3A24] = 0x6556, --(敖) + [0x3A25] = 0x6555, --(敕) + [0x3A26] = 0x654D, --(敍) + [0x3A27] = 0x6558, --(敘) + [0x3A28] = 0x655E, --(敞) + [0x3A29] = 0x655D, --(敝) + [0x3A2A] = 0x6572, --(敲) + [0x3A2B] = 0x6578, --(數) + [0x3A2C] = 0x6582, --(斂) + [0x3A2D] = 0x6583, --(斃) + [0x3A2E] = 0x8B8A, --(變) + [0x3A2F] = 0x659B, --(斛) + [0x3A30] = 0x659F, --(斟) + [0x3A31] = 0x65AB, --(斫) + [0x3A32] = 0x65B7, --(斷) + [0x3A33] = 0x65C3, --(旃) + [0x3A34] = 0x65C6, --(旆) + [0x3A35] = 0x65C1, --(旁) + [0x3A36] = 0x65C4, --(旄) + [0x3A37] = 0x65CC, --(旌) + [0x3A38] = 0x65D2, --(旒) + [0x3A39] = 0x65DB, --(旛) + [0x3A3A] = 0x65D9, --(旙) + [0x3A3B] = 0x65E0, --(无) + [0x3A3C] = 0x65E1, --(旡) + [0x3A3D] = 0x65F1, --(旱) + [0x3A3E] = 0x6772, --(杲) + [0x3A3F] = 0x660A, --(昊) + [0x3A40] = 0x6603, --(昃) + [0x3A41] = 0x65FB, --(旻) + [0x3A42] = 0x6773, --(杳) + [0x3A43] = 0x6635, --(昵) + [0x3A44] = 0x6636, --(昶) + [0x3A45] = 0x6634, --(昴) + [0x3A46] = 0x661C, --(昜) + [0x3A47] = 0x664F, --(晏) + [0x3A48] = 0x6644, --(晄) + [0x3A49] = 0x6649, --(晉) + [0x3A4A] = 0x6641, --(晁) + [0x3A4B] = 0x665E, --(晞) + [0x3A4C] = 0x665D, --(晝) + [0x3A4D] = 0x6664, --(晤) + [0x3A4E] = 0x6667, --(晧) + [0x3A4F] = 0x6668, --(晨) + [0x3A50] = 0x665F, --(晟) + [0x3A51] = 0x6662, --(晢) + [0x3A52] = 0x6670, --(晰) + [0x3A53] = 0x6683, --(暃) + [0x3A54] = 0x6688, --(暈) + [0x3A55] = 0x668E, --(暎) + [0x3A56] = 0x6689, --(暉) + [0x3A57] = 0x6684, --(暄) + [0x3A58] = 0x6698, --(暘) + [0x3A59] = 0x669D, --(暝) + [0x3A5A] = 0x66C1, --(曁) + [0x3A5B] = 0x66B9, --(暹) + [0x3A5C] = 0x66C9, --(曉) + [0x3A5D] = 0x66BE, --(暾) + [0x3A5E] = 0x66BC, --(暼) + [0x3B01] = 0x66C4, --(曄) + [0x3B02] = 0x66B8, --(暸) + [0x3B03] = 0x66D6, --(曖) + [0x3B04] = 0x66DA, --(曚) + [0x3B05] = 0x66E0, --(曠) + [0x3B06] = 0x663F, --(昿) + [0x3B07] = 0x66E6, --(曦) + [0x3B08] = 0x66E9, --(曩) + [0x3B09] = 0x66F0, --(曰) + [0x3B0A] = 0x66F5, --(曵) + [0x3B0B] = 0x66F7, --(曷) + [0x3B0C] = 0x670F, --(朏) + [0x3B0D] = 0x6716, --(朖) + [0x3B0E] = 0x671E, --(朞) + [0x3B0F] = 0x6726, --(朦) + [0x3B10] = 0x6727, --(朧) + [0x3B11] = 0x9738, --(霸) + [0x3B12] = 0x672E, --(朮) + [0x3B13] = 0x673F, --(朿) + [0x3B14] = 0x6736, --(朶) + [0x3B15] = 0x6741, --(杁) + [0x3B16] = 0x6738, --(朸) + [0x3B17] = 0x6737, --(朷) + [0x3B18] = 0x6746, --(杆) + [0x3B19] = 0x675E, --(杞) + [0x3B1A] = 0x6760, --(杠) + [0x3B1B] = 0x6759, --(杙) + [0x3B1C] = 0x6763, --(杣) + [0x3B1D] = 0x6764, --(杤) + [0x3B1E] = 0x6789, --(枉) + [0x3B1F] = 0x6770, --(杰) + [0x3B20] = 0x67A9, --(枩) + [0x3B21] = 0x677C, --(杼) + [0x3B22] = 0x676A, --(杪) + [0x3B23] = 0x678C, --(枌) + [0x3B24] = 0x678B, --(枋) + [0x3B25] = 0x67A6, --(枦) + [0x3B26] = 0x67A1, --(枡) + [0x3B27] = 0x6785, --(枅) + [0x3B28] = 0x67B7, --(枷) + [0x3B29] = 0x67EF, --(柯) + [0x3B2A] = 0x67B4, --(枴) + [0x3B2B] = 0x67EC, --(柬) + [0x3B2C] = 0x67B3, --(枳) + [0x3B2D] = 0x67E9, --(柩) + [0x3B2E] = 0x67B8, --(枸) + [0x3B2F] = 0x67E4, --(柤) + [0x3B30] = 0x67DE, --(柞) + [0x3B31] = 0x67DD, --(柝) + [0x3B32] = 0x67E2, --(柢) + [0x3B33] = 0x67EE, --(柮) + [0x3B34] = 0x67B9, --(枹) + [0x3B35] = 0x67CE, --(柎) + [0x3B36] = 0x67C6, --(柆) + [0x3B37] = 0x67E7, --(柧) + [0x3B38] = 0x6A9C, --(檜) + [0x3B39] = 0x681E, --(栞) + [0x3B3A] = 0x6846, --(框) + [0x3B3B] = 0x6829, --(栩) + [0x3B3C] = 0x6840, --(桀) + [0x3B3D] = 0x684D, --(桍) + [0x3B3E] = 0x6832, --(栲) + [0x3B3F] = 0x684E, --(桎) + [0x3B40] = 0x68B3, --(梳) + [0x3B41] = 0x682B, --(栫) + [0x3B42] = 0x6859, --(桙) + [0x3B43] = 0x6863, --(档) + [0x3B44] = 0x6877, --(桷) + [0x3B45] = 0x687F, --(桿) + [0x3B46] = 0x689F, --(梟) + [0x3B47] = 0x688F, --(梏) + [0x3B48] = 0x68AD, --(梭) + [0x3B49] = 0x6894, --(梔) + [0x3B4A] = 0x689D, --(條) + [0x3B4B] = 0x689B, --(梛) + [0x3B4C] = 0x6883, --(梃) + [0x3B4D] = 0x6AAE, --(檮) + [0x3B4E] = 0x68B9, --(梹) + [0x3B4F] = 0x6874, --(桴) + [0x3B50] = 0x68B5, --(梵) + [0x3B51] = 0x68A0, --(梠) + [0x3B52] = 0x68BA, --(梺) + [0x3B53] = 0x690F, --(椏) + [0x3B54] = 0x688D, --(梍) + [0x3B55] = 0x687E, --(桾) + [0x3B56] = 0x6901, --(椁) + [0x3B57] = 0x68CA, --(棊) + [0x3B58] = 0x6908, --(椈) + [0x3B59] = 0x68D8, --(棘) + [0x3B5A] = 0x6922, --(椢) + [0x3B5B] = 0x6926, --(椦) + [0x3B5C] = 0x68E1, --(棡) + [0x3B5D] = 0x690C, --(椌) + [0x3B5E] = 0x68CD, --(棍) + [0x3C01] = 0x68D4, --(棔) + [0x3C02] = 0x68E7, --(棧) + [0x3C03] = 0x68D5, --(棕) + [0x3C04] = 0x6936, --(椶) + [0x3C05] = 0x6912, --(椒) + [0x3C06] = 0x6904, --(椄) + [0x3C07] = 0x68D7, --(棗) + [0x3C08] = 0x68E3, --(棣) + [0x3C09] = 0x6925, --(椥) + [0x3C0A] = 0x68F9, --(棹) + [0x3C0B] = 0x68E0, --(棠) + [0x3C0C] = 0x68EF, --(棯) + [0x3C0D] = 0x6928, --(椨) + [0x3C0E] = 0x692A, --(椪) + [0x3C0F] = 0x691A, --(椚) + [0x3C10] = 0x6923, --(椣) + [0x3C11] = 0x6921, --(椡) + [0x3C12] = 0x68C6, --(棆) + [0x3C13] = 0x6979, --(楹) + [0x3C14] = 0x6977, --(楷) + [0x3C15] = 0x695C, --(楜) + [0x3C16] = 0x6978, --(楸) + [0x3C17] = 0x696B, --(楫) + [0x3C18] = 0x6954, --(楔) + [0x3C19] = 0x697E, --(楾) + [0x3C1A] = 0x696E, --(楮) + [0x3C1B] = 0x6939, --(椹) + [0x3C1C] = 0x6974, --(楴) + [0x3C1D] = 0x693D, --(椽) + [0x3C1E] = 0x6959, --(楙) + [0x3C1F] = 0x6930, --(椰) + [0x3C20] = 0x6961, --(楡) + [0x3C21] = 0x695E, --(楞) + [0x3C22] = 0x695D, --(楝) + [0x3C23] = 0x6981, --(榁) + [0x3C24] = 0x696A, --(楪) + [0x3C25] = 0x69B2, --(榲) + [0x3C26] = 0x69AE, --(榮) + [0x3C27] = 0x69D0, --(槐) + [0x3C28] = 0x69BF, --(榿) + [0x3C29] = 0x69C1, --(槁) + [0x3C2A] = 0x69D3, --(槓) + [0x3C2B] = 0x69BE, --(榾) + [0x3C2C] = 0x69CE, --(槎) + [0x3C2D] = 0x5BE8, --(寨) + [0x3C2E] = 0x69CA, --(槊) + [0x3C2F] = 0x69DD, --(槝) + [0x3C30] = 0x69BB, --(榻) + [0x3C31] = 0x69C3, --(槃) + [0x3C32] = 0x69A7, --(榧) + [0x3C33] = 0x6A2E, --(樮) + [0x3C34] = 0x6991, --(榑) + [0x3C35] = 0x69A0, --(榠) + [0x3C36] = 0x699C, --(榜) + [0x3C37] = 0x6995, --(榕) + [0x3C38] = 0x69B4, --(榴) + [0x3C39] = 0x69DE, --(槞) + [0x3C3A] = 0x69E8, --(槨) + [0x3C3B] = 0x6A02, --(樂) + [0x3C3C] = 0x6A1B, --(樛) + [0x3C3D] = 0x69FF, --(槿) + [0x3C3E] = 0x6B0A, --(權) + [0x3C3F] = 0x69F9, --(槹) + [0x3C40] = 0x69F2, --(槲) + [0x3C41] = 0x69E7, --(槧) + [0x3C42] = 0x6A05, --(樅) + [0x3C43] = 0x69B1, --(榱) + [0x3C44] = 0x6A1E, --(樞) + [0x3C45] = 0x69ED, --(槭) + [0x3C46] = 0x6A14, --(樔) + [0x3C47] = 0x69EB, --(槫) + [0x3C48] = 0x6A0A, --(樊) + [0x3C49] = 0x6A12, --(樒) + [0x3C4A] = 0x6AC1, --(櫁) + [0x3C4B] = 0x6A23, --(樣) + [0x3C4C] = 0x6A13, --(樓) + [0x3C4D] = 0x6A44, --(橄) + [0x3C4E] = 0x6A0C, --(樌) + [0x3C4F] = 0x6A72, --(橲) + [0x3C50] = 0x6A36, --(樶) + [0x3C51] = 0x6A78, --(橸) + [0x3C52] = 0x6A47, --(橇) + [0x3C53] = 0x6A62, --(橢) + [0x3C54] = 0x6A59, --(橙) + [0x3C55] = 0x6A66, --(橦) + [0x3C56] = 0x6A48, --(橈) + [0x3C57] = 0x6A38, --(樸) + [0x3C58] = 0x6A22, --(樢) + [0x3C59] = 0x6A90, --(檐) + [0x3C5A] = 0x6A8D, --(檍) + [0x3C5B] = 0x6AA0, --(檠) + [0x3C5C] = 0x6A84, --(檄) + [0x3C5D] = 0x6AA2, --(檢) + [0x3C5E] = 0x6AA3, --(檣) + [0x3D01] = 0x6A97, --(檗) + [0x3D02] = 0x8617, --(蘗) + [0x3D03] = 0x6ABB, --(檻) + [0x3D04] = 0x6AC3, --(櫃) + [0x3D05] = 0x6AC2, --(櫂) + [0x3D06] = 0x6AB8, --(檸) + [0x3D07] = 0x6AB3, --(檳) + [0x3D08] = 0x6AAC, --(檬) + [0x3D09] = 0x6ADE, --(櫞) + [0x3D0A] = 0x6AD1, --(櫑) + [0x3D0B] = 0x6ADF, --(櫟) + [0x3D0C] = 0x6AAA, --(檪) + [0x3D0D] = 0x6ADA, --(櫚) + [0x3D0E] = 0x6AEA, --(櫪) + [0x3D0F] = 0x6AFB, --(櫻) + [0x3D10] = 0x6B05, --(欅) + [0x3D11] = 0x8616, --(蘖) + [0x3D12] = 0x6AFA, --(櫺) + [0x3D13] = 0x6B12, --(欒) + [0x3D14] = 0x6B16, --(欖) + [0x3D15] = 0x9B31, --(鬱) + [0x3D16] = 0x6B1F, --(欟) + [0x3D17] = 0x6B38, --(欸) + [0x3D18] = 0x6B37, --(欷) + [0x3D19] = 0x76DC, --(盜) + [0x3D1A] = 0x6B39, --(欹) + [0x3D1B] = 0x98EE, --(飮) + [0x3D1C] = 0x6B47, --(歇) + [0x3D1D] = 0x6B43, --(歃) + [0x3D1E] = 0x6B49, --(歉) + [0x3D1F] = 0x6B50, --(歐) + [0x3D20] = 0x6B59, --(歙) + [0x3D21] = 0x6B54, --(歔) + [0x3D22] = 0x6B5B, --(歛) + [0x3D23] = 0x6B5F, --(歟) + [0x3D24] = 0x6B61, --(歡) + [0x3D25] = 0x6B78, --(歸) + [0x3D26] = 0x6B79, --(歹) + [0x3D27] = 0x6B7F, --(歿) + [0x3D28] = 0x6B80, --(殀) + [0x3D29] = 0x6B84, --(殄) + [0x3D2A] = 0x6B83, --(殃) + [0x3D2B] = 0x6B8D, --(殍) + [0x3D2C] = 0x6B98, --(殘) + [0x3D2D] = 0x6B95, --(殕) + [0x3D2E] = 0x6B9E, --(殞) + [0x3D2F] = 0x6BA4, --(殤) + [0x3D30] = 0x6BAA, --(殪) + [0x3D31] = 0x6BAB, --(殫) + [0x3D32] = 0x6BAF, --(殯) + [0x3D33] = 0x6BB2, --(殲) + [0x3D34] = 0x6BB1, --(殱) + [0x3D35] = 0x6BB3, --(殳) + [0x3D36] = 0x6BB7, --(殷) + [0x3D37] = 0x6BBC, --(殼) + [0x3D38] = 0x6BC6, --(毆) + [0x3D39] = 0x6BCB, --(毋) + [0x3D3A] = 0x6BD3, --(毓) + [0x3D3B] = 0x6BDF, --(毟) + [0x3D3C] = 0x6BEC, --(毬) + [0x3D3D] = 0x6BEB, --(毫) + [0x3D3E] = 0x6BF3, --(毳) + [0x3D3F] = 0x6BEF, --(毯) + [0x3D40] = 0x9EBE, --(麾) + [0x3D41] = 0x6C08, --(氈) + [0x3D42] = 0x6C13, --(氓) + [0x3D43] = 0x6C14, --(气) + [0x3D44] = 0x6C1B, --(氛) + [0x3D45] = 0x6C24, --(氤) + [0x3D46] = 0x6C23, --(氣) + [0x3D47] = 0x6C5E, --(汞) + [0x3D48] = 0x6C55, --(汕) + [0x3D49] = 0x6C62, --(汢) + [0x3D4A] = 0x6C6A, --(汪) + [0x3D4B] = 0x6C82, --(沂) + [0x3D4C] = 0x6C8D, --(沍) + [0x3D4D] = 0x6C9A, --(沚) + [0x3D4E] = 0x6C81, --(沁) + [0x3D4F] = 0x6C9B, --(沛) + [0x3D50] = 0x6C7E, --(汾) + [0x3D51] = 0x6C68, --(汨) + [0x3D52] = 0x6C73, --(汳) + [0x3D53] = 0x6C92, --(沒) + [0x3D54] = 0x6C90, --(沐) + [0x3D55] = 0x6CC4, --(泄) + [0x3D56] = 0x6CF1, --(泱) + [0x3D57] = 0x6CD3, --(泓) + [0x3D58] = 0x6CBD, --(沽) + [0x3D59] = 0x6CD7, --(泗) + [0x3D5A] = 0x6CC5, --(泅) + [0x3D5B] = 0x6CDD, --(泝) + [0x3D5C] = 0x6CAE, --(沮) + [0x3D5D] = 0x6CB1, --(沱) + [0x3D5E] = 0x6CBE, --(沾) + [0x3E01] = 0x6CBA, --(沺) + [0x3E02] = 0x6CDB, --(泛) + [0x3E03] = 0x6CEF, --(泯) + [0x3E04] = 0x6CD9, --(泙) + [0x3E05] = 0x6CEA, --(泪) + [0x3E06] = 0x6D1F, --(洟) + [0x3E07] = 0x884D, --(衍) + [0x3E08] = 0x6D36, --(洶) + [0x3E09] = 0x6D2B, --(洫) + [0x3E0A] = 0x6D3D, --(洽) + [0x3E0B] = 0x6D38, --(洸) + [0x3E0C] = 0x6D19, --(洙) + [0x3E0D] = 0x6D35, --(洵) + [0x3E0E] = 0x6D33, --(洳) + [0x3E0F] = 0x6D12, --(洒) + [0x3E10] = 0x6D0C, --(洌) + [0x3E11] = 0x6D63, --(浣) + [0x3E12] = 0x6D93, --(涓) + [0x3E13] = 0x6D64, --(浤) + [0x3E14] = 0x6D5A, --(浚) + [0x3E15] = 0x6D79, --(浹) + [0x3E16] = 0x6D59, --(浙) + [0x3E17] = 0x6D8E, --(涎) + [0x3E18] = 0x6D95, --(涕) + [0x3E19] = 0x6FE4, --(濤) + [0x3E1A] = 0x6D85, --(涅) + [0x3E1B] = 0x6DF9, --(淹) + [0x3E1C] = 0x6E15, --(渕) + [0x3E1D] = 0x6E0A, --(渊) + [0x3E1E] = 0x6DB5, --(涵) + [0x3E1F] = 0x6DC7, --(淇) + [0x3E20] = 0x6DE6, --(淦) + [0x3E21] = 0x6DB8, --(涸) + [0x3E22] = 0x6DC6, --(淆) + [0x3E23] = 0x6DEC, --(淬) + [0x3E24] = 0x6DDE, --(淞) + [0x3E25] = 0x6DCC, --(淌) + [0x3E26] = 0x6DE8, --(淨) + [0x3E27] = 0x6DD2, --(淒) + [0x3E28] = 0x6DC5, --(淅) + [0x3E29] = 0x6DFA, --(淺) + [0x3E2A] = 0x6DD9, --(淙) + [0x3E2B] = 0x6DE4, --(淤) + [0x3E2C] = 0x6DD5, --(淕) + [0x3E2D] = 0x6DEA, --(淪) + [0x3E2E] = 0x6DEE, --(淮) + [0x3E2F] = 0x6E2D, --(渭) + [0x3E30] = 0x6E6E, --(湮) + [0x3E31] = 0x6E2E, --(渮) + [0x3E32] = 0x6E19, --(渙) + [0x3E33] = 0x6E72, --(湲) + [0x3E34] = 0x6E5F, --(湟) + [0x3E35] = 0x6E3E, --(渾) + [0x3E36] = 0x6E23, --(渣) + [0x3E37] = 0x6E6B, --(湫) + [0x3E38] = 0x6E2B, --(渫) + [0x3E39] = 0x6E76, --(湶) + [0x3E3A] = 0x6E4D, --(湍) + [0x3E3B] = 0x6E1F, --(渟) + [0x3E3C] = 0x6E43, --(湃) + [0x3E3D] = 0x6E3A, --(渺) + [0x3E3E] = 0x6E4E, --(湎) + [0x3E3F] = 0x6E24, --(渤) + [0x3E40] = 0x6EFF, --(滿) + [0x3E41] = 0x6E1D, --(渝) + [0x3E42] = 0x6E38, --(游) + [0x3E43] = 0x6E82, --(溂) + [0x3E44] = 0x6EAA, --(溪) + [0x3E45] = 0x6E98, --(溘) + [0x3E46] = 0x6EC9, --(滉) + [0x3E47] = 0x6EB7, --(溷) + [0x3E48] = 0x6ED3, --(滓) + [0x3E49] = 0x6EBD, --(溽) + [0x3E4A] = 0x6EAF, --(溯) + [0x3E4B] = 0x6EC4, --(滄) + [0x3E4C] = 0x6EB2, --(溲) + [0x3E4D] = 0x6ED4, --(滔) + [0x3E4E] = 0x6ED5, --(滕) + [0x3E4F] = 0x6E8F, --(溏) + [0x3E50] = 0x6EA5, --(溥) + [0x3E51] = 0x6EC2, --(滂) + [0x3E52] = 0x6E9F, --(溟) + [0x3E53] = 0x6F41, --(潁) + [0x3E54] = 0x6F11, --(漑) + [0x3E55] = 0x704C, --(灌) + [0x3E56] = 0x6EEC, --(滬) + [0x3E57] = 0x6EF8, --(滸) + [0x3E58] = 0x6EFE, --(滾) + [0x3E59] = 0x6F3F, --(漿) + [0x3E5A] = 0x6EF2, --(滲) + [0x3E5B] = 0x6F31, --(漱) + [0x3E5C] = 0x6EEF, --(滯) + [0x3E5D] = 0x6F32, --(漲) + [0x3E5E] = 0x6ECC, --(滌) + [0x3F01] = 0x6F3E, --(漾) + [0x3F02] = 0x6F13, --(漓) + [0x3F03] = 0x6EF7, --(滷) + [0x3F04] = 0x6F86, --(澆) + [0x3F05] = 0x6F7A, --(潺) + [0x3F06] = 0x6F78, --(潸) + [0x3F07] = 0x6F81, --(澁) + [0x3F08] = 0x6F80, --(澀) + [0x3F09] = 0x6F6F, --(潯) + [0x3F0A] = 0x6F5B, --(潛) + [0x3F0B] = 0x6FF3, --(濳) + [0x3F0C] = 0x6F6D, --(潭) + [0x3F0D] = 0x6F82, --(澂) + [0x3F0E] = 0x6F7C, --(潼) + [0x3F0F] = 0x6F58, --(潘) + [0x3F10] = 0x6F8E, --(澎) + [0x3F11] = 0x6F91, --(澑) + [0x3F12] = 0x6FC2, --(濂) + [0x3F13] = 0x6F66, --(潦) + [0x3F14] = 0x6FB3, --(澳) + [0x3F15] = 0x6FA3, --(澣) + [0x3F16] = 0x6FA1, --(澡) + [0x3F17] = 0x6FA4, --(澤) + [0x3F18] = 0x6FB9, --(澹) + [0x3F19] = 0x6FC6, --(濆) + [0x3F1A] = 0x6FAA, --(澪) + [0x3F1B] = 0x6FDF, --(濟) + [0x3F1C] = 0x6FD5, --(濕) + [0x3F1D] = 0x6FEC, --(濬) + [0x3F1E] = 0x6FD4, --(濔) + [0x3F1F] = 0x6FD8, --(濘) + [0x3F20] = 0x6FF1, --(濱) + [0x3F21] = 0x6FEE, --(濮) + [0x3F22] = 0x6FDB, --(濛) + [0x3F23] = 0x7009, --(瀉) + [0x3F24] = 0x700B, --(瀋) + [0x3F25] = 0x6FFA, --(濺) + [0x3F26] = 0x7011, --(瀑) + [0x3F27] = 0x7001, --(瀁) + [0x3F28] = 0x700F, --(瀏) + [0x3F29] = 0x6FFE, --(濾) + [0x3F2A] = 0x701B, --(瀛) + [0x3F2B] = 0x701A, --(瀚) + [0x3F2C] = 0x6F74, --(潴) + [0x3F2D] = 0x701D, --(瀝) + [0x3F2E] = 0x7018, --(瀘) + [0x3F2F] = 0x701F, --(瀟) + [0x3F30] = 0x7030, --(瀰) + [0x3F31] = 0x703E, --(瀾) + [0x3F32] = 0x7032, --(瀲) + [0x3F33] = 0x7051, --(灑) + [0x3F34] = 0x7063, --(灣) + [0x3F35] = 0x7099, --(炙) + [0x3F36] = 0x7092, --(炒) + [0x3F37] = 0x70AF, --(炯) + [0x3F38] = 0x70F1, --(烱) + [0x3F39] = 0x70AC, --(炬) + [0x3F3A] = 0x70B8, --(炸) + [0x3F3B] = 0x70B3, --(炳) + [0x3F3C] = 0x70AE, --(炮) + [0x3F3D] = 0x70DF, --(烟) + [0x3F3E] = 0x70CB, --(烋) + [0x3F3F] = 0x70DD, --(烝) + [0x3F40] = 0x70D9, --(烙) + [0x3F41] = 0x7109, --(焉) + [0x3F42] = 0x70FD, --(烽) + [0x3F43] = 0x711C, --(焜) + [0x3F44] = 0x7119, --(焙) + [0x3F45] = 0x7165, --(煥) + [0x3F46] = 0x7155, --(煕) + [0x3F47] = 0x7188, --(熈) + [0x3F48] = 0x7166, --(煦) + [0x3F49] = 0x7162, --(煢) + [0x3F4A] = 0x714C, --(煌) + [0x3F4B] = 0x7156, --(煖) + [0x3F4C] = 0x716C, --(煬) + [0x3F4D] = 0x718F, --(熏) + [0x3F4E] = 0x71FB, --(燻) + [0x3F4F] = 0x7184, --(熄) + [0x3F50] = 0x7195, --(熕) + [0x3F51] = 0x71A8, --(熨) + [0x3F52] = 0x71AC, --(熬) + [0x3F53] = 0x71D7, --(燗) + [0x3F54] = 0x71B9, --(熹) + [0x3F55] = 0x71BE, --(熾) + [0x3F56] = 0x71D2, --(燒) + [0x3F57] = 0x71C9, --(燉) + [0x3F58] = 0x71D4, --(燔) + [0x3F59] = 0x71CE, --(燎) + [0x3F5A] = 0x71E0, --(燠) + [0x3F5B] = 0x71EC, --(燬) + [0x3F5C] = 0x71E7, --(燧) + [0x3F5D] = 0x71F5, --(燵) + [0x3F5E] = 0x71FC, --(燼) + [0x4001] = 0x71F9, --(燹) + [0x4002] = 0x71FF, --(燿) + [0x4003] = 0x720D, --(爍) + [0x4004] = 0x7210, --(爐) + [0x4005] = 0x721B, --(爛) + [0x4006] = 0x7228, --(爨) + [0x4007] = 0x722D, --(爭) + [0x4008] = 0x722C, --(爬) + [0x4009] = 0x7230, --(爰) + [0x400A] = 0x7232, --(爲) + [0x400B] = 0x723B, --(爻) + [0x400C] = 0x723C, --(爼) + [0x400D] = 0x723F, --(爿) + [0x400E] = 0x7240, --(牀) + [0x400F] = 0x7246, --(牆) + [0x4010] = 0x724B, --(牋) + [0x4011] = 0x7258, --(牘) + [0x4012] = 0x7274, --(牴) + [0x4013] = 0x727E, --(牾) + [0x4014] = 0x7282, --(犂) + [0x4015] = 0x7281, --(犁) + [0x4016] = 0x7287, --(犇) + [0x4017] = 0x7292, --(犒) + [0x4018] = 0x7296, --(犖) + [0x4019] = 0x72A2, --(犢) + [0x401A] = 0x72A7, --(犧) + [0x401B] = 0x72B9, --(犹) + [0x401C] = 0x72B2, --(犲) + [0x401D] = 0x72C3, --(狃) + [0x401E] = 0x72C6, --(狆) + [0x401F] = 0x72C4, --(狄) + [0x4020] = 0x72CE, --(狎) + [0x4021] = 0x72D2, --(狒) + [0x4022] = 0x72E2, --(狢) + [0x4023] = 0x72E0, --(狠) + [0x4024] = 0x72E1, --(狡) + [0x4025] = 0x72F9, --(狹) + [0x4026] = 0x72F7, --(狷) + [0x4027] = 0x500F, --(倏) + [0x4028] = 0x7317, --(猗) + [0x4029] = 0x730A, --(猊) + [0x402A] = 0x731C, --(猜) + [0x402B] = 0x7316, --(猖) + [0x402C] = 0x731D, --(猝) + [0x402D] = 0x7334, --(猴) + [0x402E] = 0x732F, --(猯) + [0x402F] = 0x7329, --(猩) + [0x4030] = 0x7325, --(猥) + [0x4031] = 0x733E, --(猾) + [0x4032] = 0x734E, --(獎) + [0x4033] = 0x734F, --(獏) + [0x4034] = 0x9ED8, --(默) + [0x4035] = 0x7357, --(獗) + [0x4036] = 0x736A, --(獪) + [0x4037] = 0x7368, --(獨) + [0x4038] = 0x7370, --(獰) + [0x4039] = 0x7378, --(獸) + [0x403A] = 0x7375, --(獵) + [0x403B] = 0x737B, --(獻) + [0x403C] = 0x737A, --(獺) + [0x403D] = 0x73C8, --(珈) + [0x403E] = 0x73B3, --(玳) + [0x403F] = 0x73CE, --(珎) + [0x4040] = 0x73BB, --(玻) + [0x4041] = 0x73C0, --(珀) + [0x4042] = 0x73E5, --(珥) + [0x4043] = 0x73EE, --(珮) + [0x4044] = 0x73DE, --(珞) + [0x4045] = 0x74A2, --(璢) + [0x4046] = 0x7405, --(琅) + [0x4047] = 0x746F, --(瑯) + [0x4048] = 0x7425, --(琥) + [0x4049] = 0x73F8, --(珸) + [0x404A] = 0x7432, --(琲) + [0x404B] = 0x743A, --(琺) + [0x404C] = 0x7455, --(瑕) + [0x404D] = 0x743F, --(琿) + [0x404E] = 0x745F, --(瑟) + [0x404F] = 0x7459, --(瑙) + [0x4050] = 0x7441, --(瑁) + [0x4051] = 0x745C, --(瑜) + [0x4052] = 0x7469, --(瑩) + [0x4053] = 0x7470, --(瑰) + [0x4054] = 0x7463, --(瑣) + [0x4055] = 0x746A, --(瑪) + [0x4056] = 0x7476, --(瑶) + [0x4057] = 0x747E, --(瑾) + [0x4058] = 0x748B, --(璋) + [0x4059] = 0x749E, --(璞) + [0x405A] = 0x74A7, --(璧) + [0x405B] = 0x74CA, --(瓊) + [0x405C] = 0x74CF, --(瓏) + [0x405D] = 0x74D4, --(瓔) + [0x405E] = 0x73F1, --(珱) + [0x4101] = 0x74E0, --(瓠) + [0x4102] = 0x74E3, --(瓣) + [0x4103] = 0x74E7, --(瓧) + [0x4104] = 0x74E9, --(瓩) + [0x4105] = 0x74EE, --(瓮) + [0x4106] = 0x74F2, --(瓲) + [0x4107] = 0x74F0, --(瓰) + [0x4108] = 0x74F1, --(瓱) + [0x4109] = 0x74F8, --(瓸) + [0x410A] = 0x74F7, --(瓷) + [0x410B] = 0x7504, --(甄) + [0x410C] = 0x7503, --(甃) + [0x410D] = 0x7505, --(甅) + [0x410E] = 0x750C, --(甌) + [0x410F] = 0x750E, --(甎) + [0x4110] = 0x750D, --(甍) + [0x4111] = 0x7515, --(甕) + [0x4112] = 0x7513, --(甓) + [0x4113] = 0x751E, --(甞) + [0x4114] = 0x7526, --(甦) + [0x4115] = 0x752C, --(甬) + [0x4116] = 0x753C, --(甼) + [0x4117] = 0x7544, --(畄) + [0x4118] = 0x754D, --(畍) + [0x4119] = 0x754A, --(畊) + [0x411A] = 0x7549, --(畉) + [0x411B] = 0x755B, --(畛) + [0x411C] = 0x7546, --(畆) + [0x411D] = 0x755A, --(畚) + [0x411E] = 0x7569, --(畩) + [0x411F] = 0x7564, --(畤) + [0x4120] = 0x7567, --(畧) + [0x4121] = 0x756B, --(畫) + [0x4122] = 0x756D, --(畭) + [0x4123] = 0x7578, --(畸) + [0x4124] = 0x7576, --(當) + [0x4125] = 0x7586, --(疆) + [0x4126] = 0x7587, --(疇) + [0x4127] = 0x7574, --(畴) + [0x4128] = 0x758A, --(疊) + [0x4129] = 0x7589, --(疉) + [0x412A] = 0x7582, --(疂) + [0x412B] = 0x7594, --(疔) + [0x412C] = 0x759A, --(疚) + [0x412D] = 0x759D, --(疝) + [0x412E] = 0x75A5, --(疥) + [0x412F] = 0x75A3, --(疣) + [0x4130] = 0x75C2, --(痂) + [0x4131] = 0x75B3, --(疳) + [0x4132] = 0x75C3, --(痃) + [0x4133] = 0x75B5, --(疵) + [0x4134] = 0x75BD, --(疽) + [0x4135] = 0x75B8, --(疸) + [0x4136] = 0x75BC, --(疼) + [0x4137] = 0x75B1, --(疱) + [0x4138] = 0x75CD, --(痍) + [0x4139] = 0x75CA, --(痊) + [0x413A] = 0x75D2, --(痒) + [0x413B] = 0x75D9, --(痙) + [0x413C] = 0x75E3, --(痣) + [0x413D] = 0x75DE, --(痞) + [0x413E] = 0x75FE, --(痾) + [0x413F] = 0x75FF, --(痿) + [0x4140] = 0x75FC, --(痼) + [0x4141] = 0x7601, --(瘁) + [0x4142] = 0x75F0, --(痰) + [0x4143] = 0x75FA, --(痺) + [0x4144] = 0x75F2, --(痲) + [0x4145] = 0x75F3, --(痳) + [0x4146] = 0x760B, --(瘋) + [0x4147] = 0x760D, --(瘍) + [0x4148] = 0x7609, --(瘉) + [0x4149] = 0x761F, --(瘟) + [0x414A] = 0x7627, --(瘧) + [0x414B] = 0x7620, --(瘠) + [0x414C] = 0x7621, --(瘡) + [0x414D] = 0x7622, --(瘢) + [0x414E] = 0x7624, --(瘤) + [0x414F] = 0x7634, --(瘴) + [0x4150] = 0x7630, --(瘰) + [0x4151] = 0x763B, --(瘻) + [0x4152] = 0x7647, --(癇) + [0x4153] = 0x7648, --(癈) + [0x4154] = 0x7646, --(癆) + [0x4155] = 0x765C, --(癜) + [0x4156] = 0x7658, --(癘) + [0x4157] = 0x7661, --(癡) + [0x4158] = 0x7662, --(癢) + [0x4159] = 0x7668, --(癨) + [0x415A] = 0x7669, --(癩) + [0x415B] = 0x766A, --(癪) + [0x415C] = 0x7667, --(癧) + [0x415D] = 0x766C, --(癬) + [0x415E] = 0x7670, --(癰) + [0x4201] = 0x7672, --(癲) + [0x4202] = 0x7676, --(癶) + [0x4203] = 0x7678, --(癸) + [0x4204] = 0x767C, --(發) + [0x4205] = 0x7680, --(皀) + [0x4206] = 0x7683, --(皃) + [0x4207] = 0x7688, --(皈) + [0x4208] = 0x768B, --(皋) + [0x4209] = 0x768E, --(皎) + [0x420A] = 0x7696, --(皖) + [0x420B] = 0x7693, --(皓) + [0x420C] = 0x7699, --(皙) + [0x420D] = 0x769A, --(皚) + [0x420E] = 0x76B0, --(皰) + [0x420F] = 0x76B4, --(皴) + [0x4210] = 0x76B8, --(皸) + [0x4211] = 0x76B9, --(皹) + [0x4212] = 0x76BA, --(皺) + [0x4213] = 0x76C2, --(盂) + [0x4214] = 0x76CD, --(盍) + [0x4215] = 0x76D6, --(盖) + [0x4216] = 0x76D2, --(盒) + [0x4217] = 0x76DE, --(盞) + [0x4218] = 0x76E1, --(盡) + [0x4219] = 0x76E5, --(盥) + [0x421A] = 0x76E7, --(盧) + [0x421B] = 0x76EA, --(盪) + [0x421C] = 0x862F, --(蘯) + [0x421D] = 0x76FB, --(盻) + [0x421E] = 0x7708, --(眈) + [0x421F] = 0x7707, --(眇) + [0x4220] = 0x7704, --(眄) + [0x4221] = 0x7729, --(眩) + [0x4222] = 0x7724, --(眤) + [0x4223] = 0x771E, --(眞) + [0x4224] = 0x7725, --(眥) + [0x4225] = 0x7726, --(眦) + [0x4226] = 0x771B, --(眛) + [0x4227] = 0x7737, --(眷) + [0x4228] = 0x7738, --(眸) + [0x4229] = 0x7747, --(睇) + [0x422A] = 0x775A, --(睚) + [0x422B] = 0x7768, --(睨) + [0x422C] = 0x776B, --(睫) + [0x422D] = 0x775B, --(睛) + [0x422E] = 0x7765, --(睥) + [0x422F] = 0x777F, --(睿) + [0x4230] = 0x777E, --(睾) + [0x4231] = 0x7779, --(睹) + [0x4232] = 0x778E, --(瞎) + [0x4233] = 0x778B, --(瞋) + [0x4234] = 0x7791, --(瞑) + [0x4235] = 0x77A0, --(瞠) + [0x4236] = 0x779E, --(瞞) + [0x4237] = 0x77B0, --(瞰) + [0x4238] = 0x77B6, --(瞶) + [0x4239] = 0x77B9, --(瞹) + [0x423A] = 0x77BF, --(瞿) + [0x423B] = 0x77BC, --(瞼) + [0x423C] = 0x77BD, --(瞽) + [0x423D] = 0x77BB, --(瞻) + [0x423E] = 0x77C7, --(矇) + [0x423F] = 0x77CD, --(矍) + [0x4240] = 0x77D7, --(矗) + [0x4241] = 0x77DA, --(矚) + [0x4242] = 0x77DC, --(矜) + [0x4243] = 0x77E3, --(矣) + [0x4244] = 0x77EE, --(矮) + [0x4245] = 0x77FC, --(矼) + [0x4246] = 0x780C, --(砌) + [0x4247] = 0x7812, --(砒) + [0x4248] = 0x7926, --(礦) + [0x4249] = 0x7820, --(砠) + [0x424A] = 0x792A, --(礪) + [0x424B] = 0x7845, --(硅) + [0x424C] = 0x788E, --(碎) + [0x424D] = 0x7874, --(硴) + [0x424E] = 0x7886, --(碆) + [0x424F] = 0x787C, --(硼) + [0x4250] = 0x789A, --(碚) + [0x4251] = 0x788C, --(碌) + [0x4252] = 0x78A3, --(碣) + [0x4253] = 0x78B5, --(碵) + [0x4254] = 0x78AA, --(碪) + [0x4255] = 0x78AF, --(碯) + [0x4256] = 0x78D1, --(磑) + [0x4257] = 0x78C6, --(磆) + [0x4258] = 0x78CB, --(磋) + [0x4259] = 0x78D4, --(磔) + [0x425A] = 0x78BE, --(碾) + [0x425B] = 0x78BC, --(碼) + [0x425C] = 0x78C5, --(磅) + [0x425D] = 0x78CA, --(磊) + [0x425E] = 0x78EC, --(磬) + [0x4301] = 0x78E7, --(磧) + [0x4302] = 0x78DA, --(磚) + [0x4303] = 0x78FD, --(磽) + [0x4304] = 0x78F4, --(磴) + [0x4305] = 0x7907, --(礇) + [0x4306] = 0x7912, --(礒) + [0x4307] = 0x7911, --(礑) + [0x4308] = 0x7919, --(礙) + [0x4309] = 0x792C, --(礬) + [0x430A] = 0x792B, --(礫) + [0x430B] = 0x7940, --(祀) + [0x430C] = 0x7960, --(祠) + [0x430D] = 0x7957, --(祗) + [0x430E] = 0x795F, --(祟) + [0x430F] = 0x795A, --(祚) + [0x4310] = 0x7955, --(祕) + [0x4311] = 0x7953, --(祓) + [0x4312] = 0x797A, --(祺) + [0x4313] = 0x797F, --(祿) + [0x4314] = 0x798A, --(禊) + [0x4315] = 0x799D, --(禝) + [0x4316] = 0x79A7, --(禧) + [0x4317] = 0x9F4B, --(齋) + [0x4318] = 0x79AA, --(禪) + [0x4319] = 0x79AE, --(禮) + [0x431A] = 0x79B3, --(禳) + [0x431B] = 0x79B9, --(禹) + [0x431C] = 0x79BA, --(禺) + [0x431D] = 0x79C9, --(秉) + [0x431E] = 0x79D5, --(秕) + [0x431F] = 0x79E7, --(秧) + [0x4320] = 0x79EC, --(秬) + [0x4321] = 0x79E1, --(秡) + [0x4322] = 0x79E3, --(秣) + [0x4323] = 0x7A08, --(稈) + [0x4324] = 0x7A0D, --(稍) + [0x4325] = 0x7A18, --(稘) + [0x4326] = 0x7A19, --(稙) + [0x4327] = 0x7A20, --(稠) + [0x4328] = 0x7A1F, --(稟) + [0x4329] = 0x7980, --(禀) + [0x432A] = 0x7A31, --(稱) + [0x432B] = 0x7A3B, --(稻) + [0x432C] = 0x7A3E, --(稾) + [0x432D] = 0x7A37, --(稷) + [0x432E] = 0x7A43, --(穃) + [0x432F] = 0x7A57, --(穗) + [0x4330] = 0x7A49, --(穉) + [0x4331] = 0x7A61, --(穡) + [0x4332] = 0x7A62, --(穢) + [0x4333] = 0x7A69, --(穩) + [0x4334] = 0x9F9D, --(龝) + [0x4335] = 0x7A70, --(穰) + [0x4336] = 0x7A79, --(穹) + [0x4337] = 0x7A7D, --(穽) + [0x4338] = 0x7A88, --(窈) + [0x4339] = 0x7A97, --(窗) + [0x433A] = 0x7A95, --(窕) + [0x433B] = 0x7A98, --(窘) + [0x433C] = 0x7A96, --(窖) + [0x433D] = 0x7AA9, --(窩) + [0x433E] = 0x7AC8, --(竈) + [0x433F] = 0x7AB0, --(窰) + [0x4340] = 0x7AB6, --(窶) + [0x4341] = 0x7AC5, --(竅) + [0x4342] = 0x7AC4, --(竄) + [0x4343] = 0x7ABF, --(窿) + [0x4344] = 0x9083, --(邃) + [0x4345] = 0x7AC7, --(竇) + [0x4346] = 0x7ACA, --(竊) + [0x4347] = 0x7ACD, --(竍) + [0x4348] = 0x7ACF, --(竏) + [0x4349] = 0x7AD5, --(竕) + [0x434A] = 0x7AD3, --(竓) + [0x434B] = 0x7AD9, --(站) + [0x434C] = 0x7ADA, --(竚) + [0x434D] = 0x7ADD, --(竝) + [0x434E] = 0x7AE1, --(竡) + [0x434F] = 0x7AE2, --(竢) + [0x4350] = 0x7AE6, --(竦) + [0x4351] = 0x7AED, --(竭) + [0x4352] = 0x7AF0, --(竰) + [0x4353] = 0x7B02, --(笂) + [0x4354] = 0x7B0F, --(笏) + [0x4355] = 0x7B0A, --(笊) + [0x4356] = 0x7B06, --(笆) + [0x4357] = 0x7B33, --(笳) + [0x4358] = 0x7B18, --(笘) + [0x4359] = 0x7B19, --(笙) + [0x435A] = 0x7B1E, --(笞) + [0x435B] = 0x7B35, --(笵) + [0x435C] = 0x7B28, --(笨) + [0x435D] = 0x7B36, --(笶) + [0x435E] = 0x7B50, --(筐) + [0x4401] = 0x7B7A, --(筺) + [0x4402] = 0x7B04, --(笄) + [0x4403] = 0x7B4D, --(筍) + [0x4404] = 0x7B0B, --(笋) + [0x4405] = 0x7B4C, --(筌) + [0x4406] = 0x7B45, --(筅) + [0x4407] = 0x7B75, --(筵) + [0x4408] = 0x7B65, --(筥) + [0x4409] = 0x7B74, --(筴) + [0x440A] = 0x7B67, --(筧) + [0x440B] = 0x7B70, --(筰) + [0x440C] = 0x7B71, --(筱) + [0x440D] = 0x7B6C, --(筬) + [0x440E] = 0x7B6E, --(筮) + [0x440F] = 0x7B9D, --(箝) + [0x4410] = 0x7B98, --(箘) + [0x4411] = 0x7B9F, --(箟) + [0x4412] = 0x7B8D, --(箍) + [0x4413] = 0x7B9C, --(箜) + [0x4414] = 0x7B9A, --(箚) + [0x4415] = 0x7B8B, --(箋) + [0x4416] = 0x7B92, --(箒) + [0x4417] = 0x7B8F, --(箏) + [0x4418] = 0x7B5D, --(筝) + [0x4419] = 0x7B99, --(箙) + [0x441A] = 0x7BCB, --(篋) + [0x441B] = 0x7BC1, --(篁) + [0x441C] = 0x7BCC, --(篌) + [0x441D] = 0x7BCF, --(篏) + [0x441E] = 0x7BB4, --(箴) + [0x441F] = 0x7BC6, --(篆) + [0x4420] = 0x7BDD, --(篝) + [0x4421] = 0x7BE9, --(篩) + [0x4422] = 0x7C11, --(簑) + [0x4423] = 0x7C14, --(簔) + [0x4424] = 0x7BE6, --(篦) + [0x4425] = 0x7BE5, --(篥) + [0x4426] = 0x7C60, --(籠) + [0x4427] = 0x7C00, --(簀) + [0x4428] = 0x7C07, --(簇) + [0x4429] = 0x7C13, --(簓) + [0x442A] = 0x7BF3, --(篳) + [0x442B] = 0x7BF7, --(篷) + [0x442C] = 0x7C17, --(簗) + [0x442D] = 0x7C0D, --(簍) + [0x442E] = 0x7BF6, --(篶) + [0x442F] = 0x7C23, --(簣) + [0x4430] = 0x7C27, --(簧) + [0x4431] = 0x7C2A, --(簪) + [0x4432] = 0x7C1F, --(簟) + [0x4433] = 0x7C37, --(簷) + [0x4434] = 0x7C2B, --(簫) + [0x4435] = 0x7C3D, --(簽) + [0x4436] = 0x7C4C, --(籌) + [0x4437] = 0x7C43, --(籃) + [0x4438] = 0x7C54, --(籔) + [0x4439] = 0x7C4F, --(籏) + [0x443A] = 0x7C40, --(籀) + [0x443B] = 0x7C50, --(籐) + [0x443C] = 0x7C58, --(籘) + [0x443D] = 0x7C5F, --(籟) + [0x443E] = 0x7C64, --(籤) + [0x443F] = 0x7C56, --(籖) + [0x4440] = 0x7C65, --(籥) + [0x4441] = 0x7C6C, --(籬) + [0x4442] = 0x7C75, --(籵) + [0x4443] = 0x7C83, --(粃) + [0x4444] = 0x7C90, --(粐) + [0x4445] = 0x7CA4, --(粤) + [0x4446] = 0x7CAD, --(粭) + [0x4447] = 0x7CA2, --(粢) + [0x4448] = 0x7CAB, --(粫) + [0x4449] = 0x7CA1, --(粡) + [0x444A] = 0x7CA8, --(粨) + [0x444B] = 0x7CB3, --(粳) + [0x444C] = 0x7CB2, --(粲) + [0x444D] = 0x7CB1, --(粱) + [0x444E] = 0x7CAE, --(粮) + [0x444F] = 0x7CB9, --(粹) + [0x4450] = 0x7CBD, --(粽) + [0x4451] = 0x7CC0, --(糀) + [0x4452] = 0x7CC5, --(糅) + [0x4453] = 0x7CC2, --(糂) + [0x4454] = 0x7CD8, --(糘) + [0x4455] = 0x7CD2, --(糒) + [0x4456] = 0x7CDC, --(糜) + [0x4457] = 0x7CE2, --(糢) + [0x4458] = 0x9B3B, --(鬻) + [0x4459] = 0x7CEF, --(糯) + [0x445A] = 0x7CF2, --(糲) + [0x445B] = 0x7CF4, --(糴) + [0x445C] = 0x7CF6, --(糶) + [0x445D] = 0x7CFA, --(糺) + [0x445E] = 0x7D06, --(紆) + [0x4501] = 0x7D02, --(紂) + [0x4502] = 0x7D1C, --(紜) + [0x4503] = 0x7D15, --(紕) + [0x4504] = 0x7D0A, --(紊) + [0x4505] = 0x7D45, --(絅) + [0x4506] = 0x7D4B, --(絋) + [0x4507] = 0x7D2E, --(紮) + [0x4508] = 0x7D32, --(紲) + [0x4509] = 0x7D3F, --(紿) + [0x450A] = 0x7D35, --(紵) + [0x450B] = 0x7D46, --(絆) + [0x450C] = 0x7D73, --(絳) + [0x450D] = 0x7D56, --(絖) + [0x450E] = 0x7D4E, --(絎) + [0x450F] = 0x7D72, --(絲) + [0x4510] = 0x7D68, --(絨) + [0x4511] = 0x7D6E, --(絮) + [0x4512] = 0x7D4F, --(絏) + [0x4513] = 0x7D63, --(絣) + [0x4514] = 0x7D93, --(經) + [0x4515] = 0x7D89, --(綉) + [0x4516] = 0x7D5B, --(絛) + [0x4517] = 0x7D8F, --(綏) + [0x4518] = 0x7D7D, --(絽) + [0x4519] = 0x7D9B, --(綛) + [0x451A] = 0x7DBA, --(綺) + [0x451B] = 0x7DAE, --(綮) + [0x451C] = 0x7DA3, --(綣) + [0x451D] = 0x7DB5, --(綵) + [0x451E] = 0x7DC7, --(緇) + [0x451F] = 0x7DBD, --(綽) + [0x4520] = 0x7DAB, --(綫) + [0x4521] = 0x7E3D, --(總) + [0x4522] = 0x7DA2, --(綢) + [0x4523] = 0x7DAF, --(綯) + [0x4524] = 0x7DDC, --(緜) + [0x4525] = 0x7DB8, --(綸) + [0x4526] = 0x7D9F, --(綟) + [0x4527] = 0x7DB0, --(綰) + [0x4528] = 0x7DD8, --(緘) + [0x4529] = 0x7DDD, --(緝) + [0x452A] = 0x7DE4, --(緤) + [0x452B] = 0x7DDE, --(緞) + [0x452C] = 0x7DFB, --(緻) + [0x452D] = 0x7DF2, --(緲) + [0x452E] = 0x7DE1, --(緡) + [0x452F] = 0x7E05, --(縅) + [0x4530] = 0x7E0A, --(縊) + [0x4531] = 0x7E23, --(縣) + [0x4532] = 0x7E21, --(縡) + [0x4533] = 0x7E12, --(縒) + [0x4534] = 0x7E31, --(縱) + [0x4535] = 0x7E1F, --(縟) + [0x4536] = 0x7E09, --(縉) + [0x4537] = 0x7E0B, --(縋) + [0x4538] = 0x7E22, --(縢) + [0x4539] = 0x7E46, --(繆) + [0x453A] = 0x7E66, --(繦) + [0x453B] = 0x7E3B, --(縻) + [0x453C] = 0x7E35, --(縵) + [0x453D] = 0x7E39, --(縹) + [0x453E] = 0x7E43, --(繃) + [0x453F] = 0x7E37, --(縷) + [0x4540] = 0x7E32, --(縲) + [0x4541] = 0x7E3A, --(縺) + [0x4542] = 0x7E67, --(繧) + [0x4543] = 0x7E5D, --(繝) + [0x4544] = 0x7E56, --(繖) + [0x4545] = 0x7E5E, --(繞) + [0x4546] = 0x7E59, --(繙) + [0x4547] = 0x7E5A, --(繚) + [0x4548] = 0x7E79, --(繹) + [0x4549] = 0x7E6A, --(繪) + [0x454A] = 0x7E69, --(繩) + [0x454B] = 0x7E7C, --(繼) + [0x454C] = 0x7E7B, --(繻) + [0x454D] = 0x7E83, --(纃) + [0x454E] = 0x7DD5, --(緕) + [0x454F] = 0x7E7D, --(繽) + [0x4550] = 0x8FAE, --(辮) + [0x4551] = 0x7E7F, --(繿) + [0x4552] = 0x7E88, --(纈) + [0x4553] = 0x7E89, --(纉) + [0x4554] = 0x7E8C, --(續) + [0x4555] = 0x7E92, --(纒) + [0x4556] = 0x7E90, --(纐) + [0x4557] = 0x7E93, --(纓) + [0x4558] = 0x7E94, --(纔) + [0x4559] = 0x7E96, --(纖) + [0x455A] = 0x7E8E, --(纎) + [0x455B] = 0x7E9B, --(纛) + [0x455C] = 0x7E9C, --(纜) + [0x455D] = 0x7F38, --(缸) + [0x455E] = 0x7F3A, --(缺) + [0x4601] = 0x7F45, --(罅) + [0x4602] = 0x7F4C, --(罌) + [0x4603] = 0x7F4D, --(罍) + [0x4604] = 0x7F4E, --(罎) + [0x4605] = 0x7F50, --(罐) + [0x4606] = 0x7F51, --(网) + [0x4607] = 0x7F55, --(罕) + [0x4608] = 0x7F54, --(罔) + [0x4609] = 0x7F58, --(罘) + [0x460A] = 0x7F5F, --(罟) + [0x460B] = 0x7F60, --(罠) + [0x460C] = 0x7F68, --(罨) + [0x460D] = 0x7F69, --(罩) + [0x460E] = 0x7F67, --(罧) + [0x460F] = 0x7F78, --(罸) + [0x4610] = 0x7F82, --(羂) + [0x4611] = 0x7F86, --(羆) + [0x4612] = 0x7F83, --(羃) + [0x4613] = 0x7F88, --(羈) + [0x4614] = 0x7F87, --(羇) + [0x4615] = 0x7F8C, --(羌) + [0x4616] = 0x7F94, --(羔) + [0x4617] = 0x7F9E, --(羞) + [0x4618] = 0x7F9D, --(羝) + [0x4619] = 0x7F9A, --(羚) + [0x461A] = 0x7FA3, --(羣) + [0x461B] = 0x7FAF, --(羯) + [0x461C] = 0x7FB2, --(羲) + [0x461D] = 0x7FB9, --(羹) + [0x461E] = 0x7FAE, --(羮) + [0x461F] = 0x7FB6, --(羶) + [0x4620] = 0x7FB8, --(羸) + [0x4621] = 0x8B71, --(譱) + [0x4622] = 0x7FC5, --(翅) + [0x4623] = 0x7FC6, --(翆) + [0x4624] = 0x7FCA, --(翊) + [0x4625] = 0x7FD5, --(翕) + [0x4626] = 0x7FD4, --(翔) + [0x4627] = 0x7FE1, --(翡) + [0x4628] = 0x7FE6, --(翦) + [0x4629] = 0x7FE9, --(翩) + [0x462A] = 0x7FF3, --(翳) + [0x462B] = 0x7FF9, --(翹) + [0x462C] = 0x98DC, --(飜) + [0x462D] = 0x8006, --(耆) + [0x462E] = 0x8004, --(耄) + [0x462F] = 0x800B, --(耋) + [0x4630] = 0x8012, --(耒) + [0x4631] = 0x8018, --(耘) + [0x4632] = 0x8019, --(耙) + [0x4633] = 0x801C, --(耜) + [0x4634] = 0x8021, --(耡) + [0x4635] = 0x8028, --(耨) + [0x4636] = 0x803F, --(耿) + [0x4637] = 0x803B, --(耻) + [0x4638] = 0x804A, --(聊) + [0x4639] = 0x8046, --(聆) + [0x463A] = 0x8052, --(聒) + [0x463B] = 0x8058, --(聘) + [0x463C] = 0x805A, --(聚) + [0x463D] = 0x805F, --(聟) + [0x463E] = 0x8062, --(聢) + [0x463F] = 0x8068, --(聨) + [0x4640] = 0x8073, --(聳) + [0x4641] = 0x8072, --(聲) + [0x4642] = 0x8070, --(聰) + [0x4643] = 0x8076, --(聶) + [0x4644] = 0x8079, --(聹) + [0x4645] = 0x807D, --(聽) + [0x4646] = 0x807F, --(聿) + [0x4647] = 0x8084, --(肄) + [0x4648] = 0x8086, --(肆) + [0x4649] = 0x8085, --(肅) + [0x464A] = 0x809B, --(肛) + [0x464B] = 0x8093, --(肓) + [0x464C] = 0x809A, --(肚) + [0x464D] = 0x80AD, --(肭) + [0x464E] = 0x5190, --(冐) + [0x464F] = 0x80AC, --(肬) + [0x4650] = 0x80DB, --(胛) + [0x4651] = 0x80E5, --(胥) + [0x4652] = 0x80D9, --(胙) + [0x4653] = 0x80DD, --(胝) + [0x4654] = 0x80C4, --(胄) + [0x4655] = 0x80DA, --(胚) + [0x4656] = 0x80D6, --(胖) + [0x4657] = 0x8109, --(脉) + [0x4658] = 0x80EF, --(胯) + [0x4659] = 0x80F1, --(胱) + [0x465A] = 0x811B, --(脛) + [0x465B] = 0x8129, --(脩) + [0x465C] = 0x8123, --(脣) + [0x465D] = 0x812F, --(脯) + [0x465E] = 0x814B, --(腋) + [0x4701] = 0x968B, --(隋) + [0x4702] = 0x8146, --(腆) + [0x4703] = 0x813E, --(脾) + [0x4704] = 0x8153, --(腓) + [0x4705] = 0x8151, --(腑) + [0x4706] = 0x80FC, --(胼) + [0x4707] = 0x8171, --(腱) + [0x4708] = 0x816E, --(腮) + [0x4709] = 0x8165, --(腥) + [0x470A] = 0x8166, --(腦) + [0x470B] = 0x8174, --(腴) + [0x470C] = 0x8183, --(膃) + [0x470D] = 0x8188, --(膈) + [0x470E] = 0x818A, --(膊) + [0x470F] = 0x8180, --(膀) + [0x4710] = 0x8182, --(膂) + [0x4711] = 0x81A0, --(膠) + [0x4712] = 0x8195, --(膕) + [0x4713] = 0x81A4, --(膤) + [0x4714] = 0x81A3, --(膣) + [0x4715] = 0x815F, --(腟) + [0x4716] = 0x8193, --(膓) + [0x4717] = 0x81A9, --(膩) + [0x4718] = 0x81B0, --(膰) + [0x4719] = 0x81B5, --(膵) + [0x471A] = 0x81BE, --(膾) + [0x471B] = 0x81B8, --(膸) + [0x471C] = 0x81BD, --(膽) + [0x471D] = 0x81C0, --(臀) + [0x471E] = 0x81C2, --(臂) + [0x471F] = 0x81BA, --(膺) + [0x4720] = 0x81C9, --(臉) + [0x4721] = 0x81CD, --(臍) + [0x4722] = 0x81D1, --(臑) + [0x4723] = 0x81D9, --(臙) + [0x4724] = 0x81D8, --(臘) + [0x4725] = 0x81C8, --(臈) + [0x4726] = 0x81DA, --(臚) + [0x4727] = 0x81DF, --(臟) + [0x4728] = 0x81E0, --(臠) + [0x4729] = 0x81E7, --(臧) + [0x472A] = 0x81FA, --(臺) + [0x472B] = 0x81FB, --(臻) + [0x472C] = 0x81FE, --(臾) + [0x472D] = 0x8201, --(舁) + [0x472E] = 0x8202, --(舂) + [0x472F] = 0x8205, --(舅) + [0x4730] = 0x8207, --(與) + [0x4731] = 0x820A, --(舊) + [0x4732] = 0x820D, --(舍) + [0x4733] = 0x8210, --(舐) + [0x4734] = 0x8216, --(舖) + [0x4735] = 0x8229, --(舩) + [0x4736] = 0x822B, --(舫) + [0x4737] = 0x8238, --(舸) + [0x4738] = 0x8233, --(舳) + [0x4739] = 0x8240, --(艀) + [0x473A] = 0x8259, --(艙) + [0x473B] = 0x8258, --(艘) + [0x473C] = 0x825D, --(艝) + [0x473D] = 0x825A, --(艚) + [0x473E] = 0x825F, --(艟) + [0x473F] = 0x8264, --(艤) + [0x4740] = 0x8262, --(艢) + [0x4741] = 0x8268, --(艨) + [0x4742] = 0x826A, --(艪) + [0x4743] = 0x826B, --(艫) + [0x4744] = 0x822E, --(舮) + [0x4745] = 0x8271, --(艱) + [0x4746] = 0x8277, --(艷) + [0x4747] = 0x8278, --(艸) + [0x4748] = 0x827E, --(艾) + [0x4749] = 0x828D, --(芍) + [0x474A] = 0x8292, --(芒) + [0x474B] = 0x82AB, --(芫) + [0x474C] = 0x829F, --(芟) + [0x474D] = 0x82BB, --(芻) + [0x474E] = 0x82AC, --(芬) + [0x474F] = 0x82E1, --(苡) + [0x4750] = 0x82E3, --(苣) + [0x4751] = 0x82DF, --(苟) + [0x4752] = 0x82D2, --(苒) + [0x4753] = 0x82F4, --(苴) + [0x4754] = 0x82F3, --(苳) + [0x4755] = 0x82FA, --(苺) + [0x4756] = 0x8393, --(莓) + [0x4757] = 0x8303, --(范) + [0x4758] = 0x82FB, --(苻) + [0x4759] = 0x82F9, --(苹) + [0x475A] = 0x82DE, --(苞) + [0x475B] = 0x8306, --(茆) + [0x475C] = 0x82DC, --(苜) + [0x475D] = 0x8309, --(茉) + [0x475E] = 0x82D9, --(苙) + [0x4801] = 0x8335, --(茵) + [0x4802] = 0x8334, --(茴) + [0x4803] = 0x8316, --(茖) + [0x4804] = 0x8332, --(茲) + [0x4805] = 0x8331, --(茱) + [0x4806] = 0x8340, --(荀) + [0x4807] = 0x8339, --(茹) + [0x4808] = 0x8350, --(荐) + [0x4809] = 0x8345, --(荅) + [0x480A] = 0x832F, --(茯) + [0x480B] = 0x832B, --(茫) + [0x480C] = 0x8317, --(茗) + [0x480D] = 0x8318, --(茘) + [0x480E] = 0x8385, --(莅) + [0x480F] = 0x839A, --(莚) + [0x4810] = 0x83AA, --(莪) + [0x4811] = 0x839F, --(莟) + [0x4812] = 0x83A2, --(莢) + [0x4813] = 0x8396, --(莖) + [0x4814] = 0x8323, --(茣) + [0x4815] = 0x838E, --(莎) + [0x4816] = 0x8387, --(莇) + [0x4817] = 0x838A, --(莊) + [0x4818] = 0x837C, --(荼) + [0x4819] = 0x83B5, --(莵) + [0x481A] = 0x8373, --(荳) + [0x481B] = 0x8375, --(荵) + [0x481C] = 0x83A0, --(莠) + [0x481D] = 0x8389, --(莉) + [0x481E] = 0x83A8, --(莨) + [0x481F] = 0x83F4, --(菴) + [0x4820] = 0x8413, --(萓) + [0x4821] = 0x83EB, --(菫) + [0x4822] = 0x83CE, --(菎) + [0x4823] = 0x83FD, --(菽) + [0x4824] = 0x8403, --(萃) + [0x4825] = 0x83D8, --(菘) + [0x4826] = 0x840B, --(萋) + [0x4827] = 0x83C1, --(菁) + [0x4828] = 0x83F7, --(菷) + [0x4829] = 0x8407, --(萇) + [0x482A] = 0x83E0, --(菠) + [0x482B] = 0x83F2, --(菲) + [0x482C] = 0x840D, --(萍) + [0x482D] = 0x8422, --(萢) + [0x482E] = 0x8420, --(萠) + [0x482F] = 0x83BD, --(莽) + [0x4830] = 0x8438, --(萸) + [0x4831] = 0x8506, --(蔆) + [0x4832] = 0x83FB, --(菻) + [0x4833] = 0x846D, --(葭) + [0x4834] = 0x842A, --(萪) + [0x4835] = 0x843C, --(萼) + [0x4836] = 0x855A, --(蕚) + [0x4837] = 0x8484, --(蒄) + [0x4838] = 0x8477, --(葷) + [0x4839] = 0x846B, --(葫) + [0x483A] = 0x84AD, --(蒭) + [0x483B] = 0x846E, --(葮) + [0x483C] = 0x8482, --(蒂) + [0x483D] = 0x8469, --(葩) + [0x483E] = 0x8446, --(葆) + [0x483F] = 0x842C, --(萬) + [0x4840] = 0x846F, --(葯) + [0x4841] = 0x8479, --(葹) + [0x4842] = 0x8435, --(萵) + [0x4843] = 0x84CA, --(蓊) + [0x4844] = 0x8462, --(葢) + [0x4845] = 0x84B9, --(蒹) + [0x4846] = 0x84BF, --(蒿) + [0x4847] = 0x849F, --(蒟) + [0x4848] = 0x84D9, --(蓙) + [0x4849] = 0x84CD, --(蓍) + [0x484A] = 0x84BB, --(蒻) + [0x484B] = 0x84DA, --(蓚) + [0x484C] = 0x84D0, --(蓐) + [0x484D] = 0x84C1, --(蓁) + [0x484E] = 0x84C6, --(蓆) + [0x484F] = 0x84D6, --(蓖) + [0x4850] = 0x84A1, --(蒡) + [0x4851] = 0x8521, --(蔡) + [0x4852] = 0x84FF, --(蓿) + [0x4853] = 0x84F4, --(蓴) + [0x4854] = 0x8517, --(蔗) + [0x4855] = 0x8518, --(蔘) + [0x4856] = 0x852C, --(蔬) + [0x4857] = 0x851F, --(蔟) + [0x4858] = 0x8515, --(蔕) + [0x4859] = 0x8514, --(蔔) + [0x485A] = 0x84FC, --(蓼) + [0x485B] = 0x8540, --(蕀) + [0x485C] = 0x8563, --(蕣) + [0x485D] = 0x8558, --(蕘) + [0x485E] = 0x8548, --(蕈) + [0x4901] = 0x8541, --(蕁) + [0x4902] = 0x8602, --(蘂) + [0x4903] = 0x854B, --(蕋) + [0x4904] = 0x8555, --(蕕) + [0x4905] = 0x8580, --(薀) + [0x4906] = 0x85A4, --(薤) + [0x4907] = 0x8588, --(薈) + [0x4908] = 0x8591, --(薑) + [0x4909] = 0x858A, --(薊) + [0x490A] = 0x85A8, --(薨) + [0x490B] = 0x856D, --(蕭) + [0x490C] = 0x8594, --(薔) + [0x490D] = 0x859B, --(薛) + [0x490E] = 0x85EA, --(藪) + [0x490F] = 0x8587, --(薇) + [0x4910] = 0x859C, --(薜) + [0x4911] = 0x8577, --(蕷) + [0x4912] = 0x857E, --(蕾) + [0x4913] = 0x8590, --(薐) + [0x4914] = 0x85C9, --(藉) + [0x4915] = 0x85BA, --(薺) + [0x4916] = 0x85CF, --(藏) + [0x4917] = 0x85B9, --(薹) + [0x4918] = 0x85D0, --(藐) + [0x4919] = 0x85D5, --(藕) + [0x491A] = 0x85DD, --(藝) + [0x491B] = 0x85E5, --(藥) + [0x491C] = 0x85DC, --(藜) + [0x491D] = 0x85F9, --(藹) + [0x491E] = 0x860A, --(蘊) + [0x491F] = 0x8613, --(蘓) + [0x4920] = 0x860B, --(蘋) + [0x4921] = 0x85FE, --(藾) + [0x4922] = 0x85FA, --(藺) + [0x4923] = 0x8606, --(蘆) + [0x4924] = 0x8622, --(蘢) + [0x4925] = 0x861A, --(蘚) + [0x4926] = 0x8630, --(蘰) + [0x4927] = 0x863F, --(蘿) + [0x4928] = 0x864D, --(虍) + [0x4929] = 0x4E55, --(乕) + [0x492A] = 0x8654, --(虔) + [0x492B] = 0x865F, --(號) + [0x492C] = 0x8667, --(虧) + [0x492D] = 0x8671, --(虱) + [0x492E] = 0x8693, --(蚓) + [0x492F] = 0x86A3, --(蚣) + [0x4930] = 0x86A9, --(蚩) + [0x4931] = 0x86AA, --(蚪) + [0x4932] = 0x868B, --(蚋) + [0x4933] = 0x868C, --(蚌) + [0x4934] = 0x86B6, --(蚶) + [0x4935] = 0x86AF, --(蚯) + [0x4936] = 0x86C4, --(蛄) + [0x4937] = 0x86C6, --(蛆) + [0x4938] = 0x86B0, --(蚰) + [0x4939] = 0x86C9, --(蛉) + [0x493A] = 0x8823, --(蠣) + [0x493B] = 0x86AB, --(蚫) + [0x493C] = 0x86D4, --(蛔) + [0x493D] = 0x86DE, --(蛞) + [0x493E] = 0x86E9, --(蛩) + [0x493F] = 0x86EC, --(蛬) + [0x4940] = 0x86DF, --(蛟) + [0x4941] = 0x86DB, --(蛛) + [0x4942] = 0x86EF, --(蛯) + [0x4943] = 0x8712, --(蜒) + [0x4944] = 0x8706, --(蜆) + [0x4945] = 0x8708, --(蜈) + [0x4946] = 0x8700, --(蜀) + [0x4947] = 0x8703, --(蜃) + [0x4948] = 0x86FB, --(蛻) + [0x4949] = 0x8711, --(蜑) + [0x494A] = 0x8709, --(蜉) + [0x494B] = 0x870D, --(蜍) + [0x494C] = 0x86F9, --(蛹) + [0x494D] = 0x870A, --(蜊) + [0x494E] = 0x8734, --(蜴) + [0x494F] = 0x873F, --(蜿) + [0x4950] = 0x8737, --(蜷) + [0x4951] = 0x873B, --(蜻) + [0x4952] = 0x8725, --(蜥) + [0x4953] = 0x8729, --(蜩) + [0x4954] = 0x871A, --(蜚) + [0x4955] = 0x8760, --(蝠) + [0x4956] = 0x875F, --(蝟) + [0x4957] = 0x8778, --(蝸) + [0x4958] = 0x874C, --(蝌) + [0x4959] = 0x874E, --(蝎) + [0x495A] = 0x8774, --(蝴) + [0x495B] = 0x8757, --(蝗) + [0x495C] = 0x8768, --(蝨) + [0x495D] = 0x876E, --(蝮) + [0x495E] = 0x8759, --(蝙) + [0x4A01] = 0x8753, --(蝓) + [0x4A02] = 0x8763, --(蝣) + [0x4A03] = 0x876A, --(蝪) + [0x4A04] = 0x8805, --(蠅) + [0x4A05] = 0x87A2, --(螢) + [0x4A06] = 0x879F, --(螟) + [0x4A07] = 0x8782, --(螂) + [0x4A08] = 0x87AF, --(螯) + [0x4A09] = 0x87CB, --(蟋) + [0x4A0A] = 0x87BD, --(螽) + [0x4A0B] = 0x87C0, --(蟀) + [0x4A0C] = 0x87D0, --(蟐) + [0x4A0D] = 0x96D6, --(雖) + [0x4A0E] = 0x87AB, --(螫) + [0x4A0F] = 0x87C4, --(蟄) + [0x4A10] = 0x87B3, --(螳) + [0x4A11] = 0x87C7, --(蟇) + [0x4A12] = 0x87C6, --(蟆) + [0x4A13] = 0x87BB, --(螻) + [0x4A14] = 0x87EF, --(蟯) + [0x4A15] = 0x87F2, --(蟲) + [0x4A16] = 0x87E0, --(蟠) + [0x4A17] = 0x880F, --(蠏) + [0x4A18] = 0x880D, --(蠍) + [0x4A19] = 0x87FE, --(蟾) + [0x4A1A] = 0x87F6, --(蟶) + [0x4A1B] = 0x87F7, --(蟷) + [0x4A1C] = 0x880E, --(蠎) + [0x4A1D] = 0x87D2, --(蟒) + [0x4A1E] = 0x8811, --(蠑) + [0x4A1F] = 0x8816, --(蠖) + [0x4A20] = 0x8815, --(蠕) + [0x4A21] = 0x8822, --(蠢) + [0x4A22] = 0x8821, --(蠡) + [0x4A23] = 0x8831, --(蠱) + [0x4A24] = 0x8836, --(蠶) + [0x4A25] = 0x8839, --(蠹) + [0x4A26] = 0x8827, --(蠧) + [0x4A27] = 0x883B, --(蠻) + [0x4A28] = 0x8844, --(衄) + [0x4A29] = 0x8842, --(衂) + [0x4A2A] = 0x8852, --(衒) + [0x4A2B] = 0x8859, --(衙) + [0x4A2C] = 0x885E, --(衞) + [0x4A2D] = 0x8862, --(衢) + [0x4A2E] = 0x886B, --(衫) + [0x4A2F] = 0x8881, --(袁) + [0x4A30] = 0x887E, --(衾) + [0x4A31] = 0x889E, --(袞) + [0x4A32] = 0x8875, --(衵) + [0x4A33] = 0x887D, --(衽) + [0x4A34] = 0x88B5, --(袵) + [0x4A35] = 0x8872, --(衲) + [0x4A36] = 0x8882, --(袂) + [0x4A37] = 0x8897, --(袗) + [0x4A38] = 0x8892, --(袒) + [0x4A39] = 0x88AE, --(袮) + [0x4A3A] = 0x8899, --(袙) + [0x4A3B] = 0x88A2, --(袢) + [0x4A3C] = 0x888D, --(袍) + [0x4A3D] = 0x88A4, --(袤) + [0x4A3E] = 0x88B0, --(袰) + [0x4A3F] = 0x88BF, --(袿) + [0x4A40] = 0x88B1, --(袱) + [0x4A41] = 0x88C3, --(裃) + [0x4A42] = 0x88C4, --(裄) + [0x4A43] = 0x88D4, --(裔) + [0x4A44] = 0x88D8, --(裘) + [0x4A45] = 0x88D9, --(裙) + [0x4A46] = 0x88DD, --(裝) + [0x4A47] = 0x88F9, --(裹) + [0x4A48] = 0x8902, --(褂) + [0x4A49] = 0x88FC, --(裼) + [0x4A4A] = 0x88F4, --(裴) + [0x4A4B] = 0x88E8, --(裨) + [0x4A4C] = 0x88F2, --(裲) + [0x4A4D] = 0x8904, --(褄) + [0x4A4E] = 0x890C, --(褌) + [0x4A4F] = 0x890A, --(褊) + [0x4A50] = 0x8913, --(褓) + [0x4A51] = 0x8943, --(襃) + [0x4A52] = 0x891E, --(褞) + [0x4A53] = 0x8925, --(褥) + [0x4A54] = 0x892A, --(褪) + [0x4A55] = 0x892B, --(褫) + [0x4A56] = 0x8941, --(襁) + [0x4A57] = 0x8944, --(襄) + [0x4A58] = 0x893B, --(褻) + [0x4A59] = 0x8936, --(褶) + [0x4A5A] = 0x8938, --(褸) + [0x4A5B] = 0x894C, --(襌) + [0x4A5C] = 0x891D, --(褝) + [0x4A5D] = 0x8960, --(襠) + [0x4A5E] = 0x895E, --(襞) + [0x4B01] = 0x8966, --(襦) + [0x4B02] = 0x8964, --(襤) + [0x4B03] = 0x896D, --(襭) + [0x4B04] = 0x896A, --(襪) + [0x4B05] = 0x896F, --(襯) + [0x4B06] = 0x8974, --(襴) + [0x4B07] = 0x8977, --(襷) + [0x4B08] = 0x897E, --(襾) + [0x4B09] = 0x8983, --(覃) + [0x4B0A] = 0x8988, --(覈) + [0x4B0B] = 0x898A, --(覊) + [0x4B0C] = 0x8993, --(覓) + [0x4B0D] = 0x8998, --(覘) + [0x4B0E] = 0x89A1, --(覡) + [0x4B0F] = 0x89A9, --(覩) + [0x4B10] = 0x89A6, --(覦) + [0x4B11] = 0x89AC, --(覬) + [0x4B12] = 0x89AF, --(覯) + [0x4B13] = 0x89B2, --(覲) + [0x4B14] = 0x89BA, --(覺) + [0x4B15] = 0x89BD, --(覽) + [0x4B16] = 0x89BF, --(覿) + [0x4B17] = 0x89C0, --(觀) + [0x4B18] = 0x89DA, --(觚) + [0x4B19] = 0x89DC, --(觜) + [0x4B1A] = 0x89DD, --(觝) + [0x4B1B] = 0x89E7, --(觧) + [0x4B1C] = 0x89F4, --(觴) + [0x4B1D] = 0x89F8, --(觸) + [0x4B1E] = 0x8A03, --(訃) + [0x4B1F] = 0x8A16, --(訖) + [0x4B20] = 0x8A10, --(訐) + [0x4B21] = 0x8A0C, --(訌) + [0x4B22] = 0x8A1B, --(訛) + [0x4B23] = 0x8A1D, --(訝) + [0x4B24] = 0x8A25, --(訥) + [0x4B25] = 0x8A36, --(訶) + [0x4B26] = 0x8A41, --(詁) + [0x4B27] = 0x8A5B, --(詛) + [0x4B28] = 0x8A52, --(詒) + [0x4B29] = 0x8A46, --(詆) + [0x4B2A] = 0x8A48, --(詈) + [0x4B2B] = 0x8A7C, --(詼) + [0x4B2C] = 0x8A6D, --(詭) + [0x4B2D] = 0x8A6C, --(詬) + [0x4B2E] = 0x8A62, --(詢) + [0x4B2F] = 0x8A85, --(誅) + [0x4B30] = 0x8A82, --(誂) + [0x4B31] = 0x8A84, --(誄) + [0x4B32] = 0x8AA8, --(誨) + [0x4B33] = 0x8AA1, --(誡) + [0x4B34] = 0x8A91, --(誑) + [0x4B35] = 0x8AA5, --(誥) + [0x4B36] = 0x8AA6, --(誦) + [0x4B37] = 0x8A9A, --(誚) + [0x4B38] = 0x8AA3, --(誣) + [0x4B39] = 0x8AC4, --(諄) + [0x4B3A] = 0x8ACD, --(諍) + [0x4B3B] = 0x8AC2, --(諂) + [0x4B3C] = 0x8ADA, --(諚) + [0x4B3D] = 0x8AEB, --(諫) + [0x4B3E] = 0x8AF3, --(諳) + [0x4B3F] = 0x8AE7, --(諧) + [0x4B40] = 0x8AE4, --(諤) + [0x4B41] = 0x8AF1, --(諱) + [0x4B42] = 0x8B14, --(謔) + [0x4B43] = 0x8AE0, --(諠) + [0x4B44] = 0x8AE2, --(諢) + [0x4B45] = 0x8AF7, --(諷) + [0x4B46] = 0x8ADE, --(諞) + [0x4B47] = 0x8ADB, --(諛) + [0x4B48] = 0x8B0C, --(謌) + [0x4B49] = 0x8B07, --(謇) + [0x4B4A] = 0x8B1A, --(謚) + [0x4B4B] = 0x8AE1, --(諡) + [0x4B4C] = 0x8B16, --(謖) + [0x4B4D] = 0x8B10, --(謐) + [0x4B4E] = 0x8B17, --(謗) + [0x4B4F] = 0x8B20, --(謠) + [0x4B50] = 0x8B33, --(謳) + [0x4B51] = 0x97AB, --(鞫) + [0x4B52] = 0x8B26, --(謦) + [0x4B53] = 0x8B2B, --(謫) + [0x4B54] = 0x8B3E, --(謾) + [0x4B55] = 0x8B28, --(謨) + [0x4B56] = 0x8B41, --(譁) + [0x4B57] = 0x8B4C, --(譌) + [0x4B58] = 0x8B4F, --(譏) + [0x4B59] = 0x8B4E, --(譎) + [0x4B5A] = 0x8B49, --(證) + [0x4B5B] = 0x8B56, --(譖) + [0x4B5C] = 0x8B5B, --(譛) + [0x4B5D] = 0x8B5A, --(譚) + [0x4B5E] = 0x8B6B, --(譫) + [0x4C01] = 0x8B5F, --(譟) + [0x4C02] = 0x8B6C, --(譬) + [0x4C03] = 0x8B6F, --(譯) + [0x4C04] = 0x8B74, --(譴) + [0x4C05] = 0x8B7D, --(譽) + [0x4C06] = 0x8B80, --(讀) + [0x4C07] = 0x8B8C, --(讌) + [0x4C08] = 0x8B8E, --(讎) + [0x4C09] = 0x8B92, --(讒) + [0x4C0A] = 0x8B93, --(讓) + [0x4C0B] = 0x8B96, --(讖) + [0x4C0C] = 0x8B99, --(讙) + [0x4C0D] = 0x8B9A, --(讚) + [0x4C0E] = 0x8C3A, --(谺) + [0x4C0F] = 0x8C41, --(豁) + [0x4C10] = 0x8C3F, --(谿) + [0x4C11] = 0x8C48, --(豈) + [0x4C12] = 0x8C4C, --(豌) + [0x4C13] = 0x8C4E, --(豎) + [0x4C14] = 0x8C50, --(豐) + [0x4C15] = 0x8C55, --(豕) + [0x4C16] = 0x8C62, --(豢) + [0x4C17] = 0x8C6C, --(豬) + [0x4C18] = 0x8C78, --(豸) + [0x4C19] = 0x8C7A, --(豺) + [0x4C1A] = 0x8C82, --(貂) + [0x4C1B] = 0x8C89, --(貉) + [0x4C1C] = 0x8C85, --(貅) + [0x4C1D] = 0x8C8A, --(貊) + [0x4C1E] = 0x8C8D, --(貍) + [0x4C1F] = 0x8C8E, --(貎) + [0x4C20] = 0x8C94, --(貔) + [0x4C21] = 0x8C7C, --(豼) + [0x4C22] = 0x8C98, --(貘) + [0x4C23] = 0x621D, --(戝) + [0x4C24] = 0x8CAD, --(貭) + [0x4C25] = 0x8CAA, --(貪) + [0x4C26] = 0x8CBD, --(貽) + [0x4C27] = 0x8CB2, --(貲) + [0x4C28] = 0x8CB3, --(貳) + [0x4C29] = 0x8CAE, --(貮) + [0x4C2A] = 0x8CB6, --(貶) + [0x4C2B] = 0x8CC8, --(賈) + [0x4C2C] = 0x8CC1, --(賁) + [0x4C2D] = 0x8CE4, --(賤) + [0x4C2E] = 0x8CE3, --(賣) + [0x4C2F] = 0x8CDA, --(賚) + [0x4C30] = 0x8CFD, --(賽) + [0x4C31] = 0x8CFA, --(賺) + [0x4C32] = 0x8CFB, --(賻) + [0x4C33] = 0x8D04, --(贄) + [0x4C34] = 0x8D05, --(贅) + [0x4C35] = 0x8D0A, --(贊) + [0x4C36] = 0x8D07, --(贇) + [0x4C37] = 0x8D0F, --(贏) + [0x4C38] = 0x8D0D, --(贍) + [0x4C39] = 0x8D10, --(贐) + [0x4C3A] = 0x9F4E, --(齎) + [0x4C3B] = 0x8D13, --(贓) + [0x4C3C] = 0x8CCD, --(賍) + [0x4C3D] = 0x8D14, --(贔) + [0x4C3E] = 0x8D16, --(贖) + [0x4C3F] = 0x8D67, --(赧) + [0x4C40] = 0x8D6D, --(赭) + [0x4C41] = 0x8D71, --(赱) + [0x4C42] = 0x8D73, --(赳) + [0x4C43] = 0x8D81, --(趁) + [0x4C44] = 0x8D99, --(趙) + [0x4C45] = 0x8DC2, --(跂) + [0x4C46] = 0x8DBE, --(趾) + [0x4C47] = 0x8DBA, --(趺) + [0x4C48] = 0x8DCF, --(跏) + [0x4C49] = 0x8DDA, --(跚) + [0x4C4A] = 0x8DD6, --(跖) + [0x4C4B] = 0x8DCC, --(跌) + [0x4C4C] = 0x8DDB, --(跛) + [0x4C4D] = 0x8DCB, --(跋) + [0x4C4E] = 0x8DEA, --(跪) + [0x4C4F] = 0x8DEB, --(跫) + [0x4C50] = 0x8DDF, --(跟) + [0x4C51] = 0x8DE3, --(跣) + [0x4C52] = 0x8DFC, --(跼) + [0x4C53] = 0x8E08, --(踈) + [0x4C54] = 0x8E09, --(踉) + [0x4C55] = 0x8DFF, --(跿) + [0x4C56] = 0x8E1D, --(踝) + [0x4C57] = 0x8E1E, --(踞) + [0x4C58] = 0x8E10, --(踐) + [0x4C59] = 0x8E1F, --(踟) + [0x4C5A] = 0x8E42, --(蹂) + [0x4C5B] = 0x8E35, --(踵) + [0x4C5C] = 0x8E30, --(踰) + [0x4C5D] = 0x8E34, --(踴) + [0x4C5E] = 0x8E4A, --(蹊) + [0x4D01] = 0x8E47, --(蹇) + [0x4D02] = 0x8E49, --(蹉) + [0x4D03] = 0x8E4C, --(蹌) + [0x4D04] = 0x8E50, --(蹐) + [0x4D05] = 0x8E48, --(蹈) + [0x4D06] = 0x8E59, --(蹙) + [0x4D07] = 0x8E64, --(蹤) + [0x4D08] = 0x8E60, --(蹠) + [0x4D09] = 0x8E2A, --(踪) + [0x4D0A] = 0x8E63, --(蹣) + [0x4D0B] = 0x8E55, --(蹕) + [0x4D0C] = 0x8E76, --(蹶) + [0x4D0D] = 0x8E72, --(蹲) + [0x4D0E] = 0x8E7C, --(蹼) + [0x4D0F] = 0x8E81, --(躁) + [0x4D10] = 0x8E87, --(躇) + [0x4D11] = 0x8E85, --(躅) + [0x4D12] = 0x8E84, --(躄) + [0x4D13] = 0x8E8B, --(躋) + [0x4D14] = 0x8E8A, --(躊) + [0x4D15] = 0x8E93, --(躓) + [0x4D16] = 0x8E91, --(躑) + [0x4D17] = 0x8E94, --(躔) + [0x4D18] = 0x8E99, --(躙) + [0x4D19] = 0x8EAA, --(躪) + [0x4D1A] = 0x8EA1, --(躡) + [0x4D1B] = 0x8EAC, --(躬) + [0x4D1C] = 0x8EB0, --(躰) + [0x4D1D] = 0x8EC6, --(軆) + [0x4D1E] = 0x8EB1, --(躱) + [0x4D1F] = 0x8EBE, --(躾) + [0x4D20] = 0x8EC5, --(軅) + [0x4D21] = 0x8EC8, --(軈) + [0x4D22] = 0x8ECB, --(軋) + [0x4D23] = 0x8EDB, --(軛) + [0x4D24] = 0x8EE3, --(軣) + [0x4D25] = 0x8EFC, --(軼) + [0x4D26] = 0x8EFB, --(軻) + [0x4D27] = 0x8EEB, --(軫) + [0x4D28] = 0x8EFE, --(軾) + [0x4D29] = 0x8F0A, --(輊) + [0x4D2A] = 0x8F05, --(輅) + [0x4D2B] = 0x8F15, --(輕) + [0x4D2C] = 0x8F12, --(輒) + [0x4D2D] = 0x8F19, --(輙) + [0x4D2E] = 0x8F13, --(輓) + [0x4D2F] = 0x8F1C, --(輜) + [0x4D30] = 0x8F1F, --(輟) + [0x4D31] = 0x8F1B, --(輛) + [0x4D32] = 0x8F0C, --(輌) + [0x4D33] = 0x8F26, --(輦) + [0x4D34] = 0x8F33, --(輳) + [0x4D35] = 0x8F3B, --(輻) + [0x4D36] = 0x8F39, --(輹) + [0x4D37] = 0x8F45, --(轅) + [0x4D38] = 0x8F42, --(轂) + [0x4D39] = 0x8F3E, --(輾) + [0x4D3A] = 0x8F4C, --(轌) + [0x4D3B] = 0x8F49, --(轉) + [0x4D3C] = 0x8F46, --(轆) + [0x4D3D] = 0x8F4E, --(轎) + [0x4D3E] = 0x8F57, --(轗) + [0x4D3F] = 0x8F5C, --(轜) + [0x4D40] = 0x8F62, --(轢) + [0x4D41] = 0x8F63, --(轣) + [0x4D42] = 0x8F64, --(轤) + [0x4D43] = 0x8F9C, --(辜) + [0x4D44] = 0x8F9F, --(辟) + [0x4D45] = 0x8FA3, --(辣) + [0x4D46] = 0x8FAD, --(辭) + [0x4D47] = 0x8FAF, --(辯) + [0x4D48] = 0x8FB7, --(辷) + [0x4D49] = 0x8FDA, --(迚) + [0x4D4A] = 0x8FE5, --(迥) + [0x4D4B] = 0x8FE2, --(迢) + [0x4D4C] = 0x8FEA, --(迪) + [0x4D4D] = 0x8FEF, --(迯) + [0x4D4E] = 0x9087, --(邇) + [0x4D4F] = 0x8FF4, --(迴) + [0x4D50] = 0x9005, --(逅) + [0x4D51] = 0x8FF9, --(迹) + [0x4D52] = 0x8FFA, --(迺) + [0x4D53] = 0x9011, --(逑) + [0x4D54] = 0x9015, --(逕) + [0x4D55] = 0x9021, --(逡) + [0x4D56] = 0x900D, --(逍) + [0x4D57] = 0x901E, --(逞) + [0x4D58] = 0x9016, --(逖) + [0x4D59] = 0x900B, --(逋) + [0x4D5A] = 0x9027, --(逧) + [0x4D5B] = 0x9036, --(逶) + [0x4D5C] = 0x9035, --(逵) + [0x4D5D] = 0x9039, --(逹) + [0x4D5E] = 0x8FF8, --(迸) + [0x4E01] = 0x904F, --(遏) + [0x4E02] = 0x9050, --(遐) + [0x4E03] = 0x9051, --(遑) + [0x4E04] = 0x9052, --(遒) + [0x4E05] = 0x900E, --(逎) + [0x4E06] = 0x9049, --(遉) + [0x4E07] = 0x903E, --(逾) + [0x4E08] = 0x9056, --(遖) + [0x4E09] = 0x9058, --(遘) + [0x4E0A] = 0x905E, --(遞) + [0x4E0B] = 0x9068, --(遨) + [0x4E0C] = 0x906F, --(遯) + [0x4E0D] = 0x9076, --(遶) + [0x4E0E] = 0x96A8, --(隨) + [0x4E0F] = 0x9072, --(遲) + [0x4E10] = 0x9082, --(邂) + [0x4E11] = 0x907D, --(遽) + [0x4E12] = 0x9081, --(邁) + [0x4E13] = 0x9080, --(邀) + [0x4E14] = 0x908A, --(邊) + [0x4E15] = 0x9089, --(邉) + [0x4E16] = 0x908F, --(邏) + [0x4E17] = 0x90A8, --(邨) + [0x4E18] = 0x90AF, --(邯) + [0x4E19] = 0x90B1, --(邱) + [0x4E1A] = 0x90B5, --(邵) + [0x4E1B] = 0x90E2, --(郢) + [0x4E1C] = 0x90E4, --(郤) + [0x4E1D] = 0x6248, --(扈) + [0x4E1E] = 0x90DB, --(郛) + [0x4E1F] = 0x9102, --(鄂) + [0x4E20] = 0x9112, --(鄒) + [0x4E21] = 0x9119, --(鄙) + [0x4E22] = 0x9132, --(鄲) + [0x4E23] = 0x9130, --(鄰) + [0x4E24] = 0x914A, --(酊) + [0x4E25] = 0x9156, --(酖) + [0x4E26] = 0x9158, --(酘) + [0x4E27] = 0x9163, --(酣) + [0x4E28] = 0x9165, --(酥) + [0x4E29] = 0x9169, --(酩) + [0x4E2A] = 0x9173, --(酳) + [0x4E2B] = 0x9172, --(酲) + [0x4E2C] = 0x918B, --(醋) + [0x4E2D] = 0x9189, --(醉) + [0x4E2E] = 0x9182, --(醂) + [0x4E2F] = 0x91A2, --(醢) + [0x4E30] = 0x91AB, --(醫) + [0x4E31] = 0x91AF, --(醯) + [0x4E32] = 0x91AA, --(醪) + [0x4E33] = 0x91B5, --(醵) + [0x4E34] = 0x91B4, --(醴) + [0x4E35] = 0x91BA, --(醺) + [0x4E36] = 0x91C0, --(釀) + [0x4E37] = 0x91C1, --(釁) + [0x4E38] = 0x91C9, --(釉) + [0x4E39] = 0x91CB, --(釋) + [0x4E3A] = 0x91D0, --(釐) + [0x4E3B] = 0x91D6, --(釖) + [0x4E3C] = 0x91DF, --(釟) + [0x4E3D] = 0x91E1, --(釡) + [0x4E3E] = 0x91DB, --(釛) + [0x4E3F] = 0x91FC, --(釼) + [0x4E40] = 0x91F5, --(釵) + [0x4E41] = 0x91F6, --(釶) + [0x4E42] = 0x921E, --(鈞) + [0x4E43] = 0x91FF, --(釿) + [0x4E44] = 0x9214, --(鈔) + [0x4E45] = 0x922C, --(鈬) + [0x4E46] = 0x9215, --(鈕) + [0x4E47] = 0x9211, --(鈑) + [0x4E48] = 0x925E, --(鉞) + [0x4E49] = 0x9257, --(鉗) + [0x4E4A] = 0x9245, --(鉅) + [0x4E4B] = 0x9249, --(鉉) + [0x4E4C] = 0x9264, --(鉤) + [0x4E4D] = 0x9248, --(鉈) + [0x4E4E] = 0x9295, --(銕) + [0x4E4F] = 0x923F, --(鈿) + [0x4E50] = 0x924B, --(鉋) + [0x4E51] = 0x9250, --(鉐) + [0x4E52] = 0x929C, --(銜) + [0x4E53] = 0x9296, --(銖) + [0x4E54] = 0x9293, --(銓) + [0x4E55] = 0x929B, --(銛) + [0x4E56] = 0x925A, --(鉚) + [0x4E57] = 0x92CF, --(鋏) + [0x4E58] = 0x92B9, --(銹) + [0x4E59] = 0x92B7, --(銷) + [0x4E5A] = 0x92E9, --(鋩) + [0x4E5B] = 0x930F, --(錏) + [0x4E5C] = 0x92FA, --(鋺) + [0x4E5D] = 0x9344, --(鍄) + [0x4E5E] = 0x932E, --(錮) + [0x4F01] = 0x9319, --(錙) + [0x4F02] = 0x9322, --(錢) + [0x4F03] = 0x931A, --(錚) + [0x4F04] = 0x9323, --(錣) + [0x4F05] = 0x933A, --(錺) + [0x4F06] = 0x9335, --(錵) + [0x4F07] = 0x933B, --(錻) + [0x4F08] = 0x935C, --(鍜) + [0x4F09] = 0x9360, --(鍠) + [0x4F0A] = 0x937C, --(鍼) + [0x4F0B] = 0x936E, --(鍮) + [0x4F0C] = 0x9356, --(鍖) + [0x4F0D] = 0x93B0, --(鎰) + [0x4F0E] = 0x93AC, --(鎬) + [0x4F0F] = 0x93AD, --(鎭) + [0x4F10] = 0x9394, --(鎔) + [0x4F11] = 0x93B9, --(鎹) + [0x4F12] = 0x93D6, --(鏖) + [0x4F13] = 0x93D7, --(鏗) + [0x4F14] = 0x93E8, --(鏨) + [0x4F15] = 0x93E5, --(鏥) + [0x4F16] = 0x93D8, --(鏘) + [0x4F17] = 0x93C3, --(鏃) + [0x4F18] = 0x93DD, --(鏝) + [0x4F19] = 0x93D0, --(鏐) + [0x4F1A] = 0x93C8, --(鏈) + [0x4F1B] = 0x93E4, --(鏤) + [0x4F1C] = 0x941A, --(鐚) + [0x4F1D] = 0x9414, --(鐔) + [0x4F1E] = 0x9413, --(鐓) + [0x4F1F] = 0x9403, --(鐃) + [0x4F20] = 0x9407, --(鐇) + [0x4F21] = 0x9410, --(鐐) + [0x4F22] = 0x9436, --(鐶) + [0x4F23] = 0x942B, --(鐫) + [0x4F24] = 0x9435, --(鐵) + [0x4F25] = 0x9421, --(鐡) + [0x4F26] = 0x943A, --(鐺) + [0x4F27] = 0x9441, --(鑁) + [0x4F28] = 0x9452, --(鑒) + [0x4F29] = 0x9444, --(鑄) + [0x4F2A] = 0x945B, --(鑛) + [0x4F2B] = 0x9460, --(鑠) + [0x4F2C] = 0x9462, --(鑢) + [0x4F2D] = 0x945E, --(鑞) + [0x4F2E] = 0x946A, --(鑪) + [0x4F2F] = 0x9229, --(鈩) + [0x4F30] = 0x9470, --(鑰) + [0x4F31] = 0x9475, --(鑵) + [0x4F32] = 0x9477, --(鑷) + [0x4F33] = 0x947D, --(鑽) + [0x4F34] = 0x945A, --(鑚) + [0x4F35] = 0x947C, --(鑼) + [0x4F36] = 0x947E, --(鑾) + [0x4F37] = 0x9481, --(钁) + [0x4F38] = 0x947F, --(鑿) + [0x4F39] = 0x9582, --(閂) + [0x4F3A] = 0x9587, --(閇) + [0x4F3B] = 0x958A, --(閊) + [0x4F3C] = 0x9594, --(閔) + [0x4F3D] = 0x9596, --(閖) + [0x4F3E] = 0x9598, --(閘) + [0x4F3F] = 0x9599, --(閙) + [0x4F40] = 0x95A0, --(閠) + [0x4F41] = 0x95A8, --(閨) + [0x4F42] = 0x95A7, --(閧) + [0x4F43] = 0x95AD, --(閭) + [0x4F44] = 0x95BC, --(閼) + [0x4F45] = 0x95BB, --(閻) + [0x4F46] = 0x95B9, --(閹) + [0x4F47] = 0x95BE, --(閾) + [0x4F48] = 0x95CA, --(闊) + [0x4F49] = 0x6FF6, --(濶) + [0x4F4A] = 0x95C3, --(闃) + [0x4F4B] = 0x95CD, --(闍) + [0x4F4C] = 0x95CC, --(闌) + [0x4F4D] = 0x95D5, --(闕) + [0x4F4E] = 0x95D4, --(闔) + [0x4F4F] = 0x95D6, --(闖) + [0x4F50] = 0x95DC, --(關) + [0x4F51] = 0x95E1, --(闡) + [0x4F52] = 0x95E5, --(闥) + [0x4F53] = 0x95E2, --(闢) + [0x4F54] = 0x9621, --(阡) + [0x4F55] = 0x9628, --(阨) + [0x4F56] = 0x962E, --(阮) + [0x4F57] = 0x962F, --(阯) + [0x4F58] = 0x9642, --(陂) + [0x4F59] = 0x964C, --(陌) + [0x4F5A] = 0x964F, --(陏) + [0x4F5B] = 0x964B, --(陋) + [0x4F5C] = 0x9677, --(陷) + [0x4F5D] = 0x965C, --(陜) + [0x4F5E] = 0x965E, --(陞) + [0x5001] = 0x965D, --(陝) + [0x5002] = 0x965F, --(陟) + [0x5003] = 0x9666, --(陦) + [0x5004] = 0x9672, --(陲) + [0x5005] = 0x966C, --(陬) + [0x5006] = 0x968D, --(隍) + [0x5007] = 0x9698, --(隘) + [0x5008] = 0x9695, --(隕) + [0x5009] = 0x9697, --(隗) + [0x500A] = 0x96AA, --(險) + [0x500B] = 0x96A7, --(隧) + [0x500C] = 0x96B1, --(隱) + [0x500D] = 0x96B2, --(隲) + [0x500E] = 0x96B0, --(隰) + [0x500F] = 0x96B4, --(隴) + [0x5010] = 0x96B6, --(隶) + [0x5011] = 0x96B8, --(隸) + [0x5012] = 0x96B9, --(隹) + [0x5013] = 0x96CE, --(雎) + [0x5014] = 0x96CB, --(雋) + [0x5015] = 0x96C9, --(雉) + [0x5016] = 0x96CD, --(雍) + [0x5017] = 0x894D, --(襍) + [0x5018] = 0x96DC, --(雜) + [0x5019] = 0x970D, --(霍) + [0x501A] = 0x96D5, --(雕) + [0x501B] = 0x96F9, --(雹) + [0x501C] = 0x9704, --(霄) + [0x501D] = 0x9706, --(霆) + [0x501E] = 0x9708, --(霈) + [0x501F] = 0x9713, --(霓) + [0x5020] = 0x970E, --(霎) + [0x5021] = 0x9711, --(霑) + [0x5022] = 0x970F, --(霏) + [0x5023] = 0x9716, --(霖) + [0x5024] = 0x9719, --(霙) + [0x5025] = 0x9724, --(霤) + [0x5026] = 0x972A, --(霪) + [0x5027] = 0x9730, --(霰) + [0x5028] = 0x9739, --(霹) + [0x5029] = 0x973D, --(霽) + [0x502A] = 0x973E, --(霾) + [0x502B] = 0x9744, --(靄) + [0x502C] = 0x9746, --(靆) + [0x502D] = 0x9748, --(靈) + [0x502E] = 0x9742, --(靂) + [0x502F] = 0x9749, --(靉) + [0x5030] = 0x975C, --(靜) + [0x5031] = 0x9760, --(靠) + [0x5032] = 0x9764, --(靤) + [0x5033] = 0x9766, --(靦) + [0x5034] = 0x9768, --(靨) + [0x5035] = 0x52D2, --(勒) + [0x5036] = 0x976B, --(靫) + [0x5037] = 0x9771, --(靱) + [0x5038] = 0x9779, --(靹) + [0x5039] = 0x9785, --(鞅) + [0x503A] = 0x977C, --(靼) + [0x503B] = 0x9781, --(鞁) + [0x503C] = 0x977A, --(靺) + [0x503D] = 0x9786, --(鞆) + [0x503E] = 0x978B, --(鞋) + [0x503F] = 0x978F, --(鞏) + [0x5040] = 0x9790, --(鞐) + [0x5041] = 0x979C, --(鞜) + [0x5042] = 0x97A8, --(鞨) + [0x5043] = 0x97A6, --(鞦) + [0x5044] = 0x97A3, --(鞣) + [0x5045] = 0x97B3, --(鞳) + [0x5046] = 0x97B4, --(鞴) + [0x5047] = 0x97C3, --(韃) + [0x5048] = 0x97C6, --(韆) + [0x5049] = 0x97C8, --(韈) + [0x504A] = 0x97CB, --(韋) + [0x504B] = 0x97DC, --(韜) + [0x504C] = 0x97ED, --(韭) + [0x504D] = 0x9F4F, --(齏) + [0x504E] = 0x97F2, --(韲) + [0x504F] = 0x7ADF, --(竟) + [0x5050] = 0x97F6, --(韶) + [0x5051] = 0x97F5, --(韵) + [0x5052] = 0x980F, --(頏) + [0x5053] = 0x980C, --(頌) + [0x5054] = 0x9838, --(頸) + [0x5055] = 0x9824, --(頤) + [0x5056] = 0x9821, --(頡) + [0x5057] = 0x9837, --(頷) + [0x5058] = 0x983D, --(頽) + [0x5059] = 0x9846, --(顆) + [0x505A] = 0x984F, --(顏) + [0x505B] = 0x984B, --(顋) + [0x505C] = 0x986B, --(顫) + [0x505D] = 0x986F, --(顯) + [0x505E] = 0x9870, --(顰) + [0x5101] = 0x9871, --(顱) + [0x5102] = 0x9874, --(顴) + [0x5103] = 0x9873, --(顳) + [0x5104] = 0x98AA, --(颪) + [0x5105] = 0x98AF, --(颯) + [0x5106] = 0x98B1, --(颱) + [0x5107] = 0x98B6, --(颶) + [0x5108] = 0x98C4, --(飄) + [0x5109] = 0x98C3, --(飃) + [0x510A] = 0x98C6, --(飆) + [0x510B] = 0x98E9, --(飩) + [0x510C] = 0x98EB, --(飫) + [0x510D] = 0x9903, --(餃) + [0x510E] = 0x9909, --(餉) + [0x510F] = 0x9912, --(餒) + [0x5110] = 0x9914, --(餔) + [0x5111] = 0x9918, --(餘) + [0x5112] = 0x9921, --(餡) + [0x5113] = 0x991D, --(餝) + [0x5114] = 0x991E, --(餞) + [0x5115] = 0x9924, --(餤) + [0x5116] = 0x9920, --(餠) + [0x5117] = 0x992C, --(餬) + [0x5118] = 0x992E, --(餮) + [0x5119] = 0x993D, --(餽) + [0x511A] = 0x993E, --(餾) + [0x511B] = 0x9942, --(饂) + [0x511C] = 0x9949, --(饉) + [0x511D] = 0x9945, --(饅) + [0x511E] = 0x9950, --(饐) + [0x511F] = 0x994B, --(饋) + [0x5120] = 0x9951, --(饑) + [0x5121] = 0x9952, --(饒) + [0x5122] = 0x994C, --(饌) + [0x5123] = 0x9955, --(饕) + [0x5124] = 0x9997, --(馗) + [0x5125] = 0x9998, --(馘) + [0x5126] = 0x99A5, --(馥) + [0x5127] = 0x99AD, --(馭) + [0x5128] = 0x99AE, --(馮) + [0x5129] = 0x99BC, --(馼) + [0x512A] = 0x99DF, --(駟) + [0x512B] = 0x99DB, --(駛) + [0x512C] = 0x99DD, --(駝) + [0x512D] = 0x99D8, --(駘) + [0x512E] = 0x99D1, --(駑) + [0x512F] = 0x99ED, --(駭) + [0x5130] = 0x99EE, --(駮) + [0x5131] = 0x99F1, --(駱) + [0x5132] = 0x99F2, --(駲) + [0x5133] = 0x99FB, --(駻) + [0x5134] = 0x99F8, --(駸) + [0x5135] = 0x9A01, --(騁) + [0x5136] = 0x9A0F, --(騏) + [0x5137] = 0x9A05, --(騅) + [0x5138] = 0x99E2, --(駢) + [0x5139] = 0x9A19, --(騙) + [0x513A] = 0x9A2B, --(騫) + [0x513B] = 0x9A37, --(騷) + [0x513C] = 0x9A45, --(驅) + [0x513D] = 0x9A42, --(驂) + [0x513E] = 0x9A40, --(驀) + [0x513F] = 0x9A43, --(驃) + [0x5140] = 0x9A3E, --(騾) + [0x5141] = 0x9A55, --(驕) + [0x5142] = 0x9A4D, --(驍) + [0x5143] = 0x9A5B, --(驛) + [0x5144] = 0x9A57, --(驗) + [0x5145] = 0x9A5F, --(驟) + [0x5146] = 0x9A62, --(驢) + [0x5147] = 0x9A65, --(驥) + [0x5148] = 0x9A64, --(驤) + [0x5149] = 0x9A69, --(驩) + [0x514A] = 0x9A6B, --(驫) + [0x514B] = 0x9A6A, --(驪) + [0x514C] = 0x9AAD, --(骭) + [0x514D] = 0x9AB0, --(骰) + [0x514E] = 0x9ABC, --(骼) + [0x514F] = 0x9AC0, --(髀) + [0x5150] = 0x9ACF, --(髏) + [0x5151] = 0x9AD1, --(髑) + [0x5152] = 0x9AD3, --(髓) + [0x5153] = 0x9AD4, --(體) + [0x5154] = 0x9ADE, --(髞) + [0x5155] = 0x9ADF, --(髟) + [0x5156] = 0x9AE2, --(髢) + [0x5157] = 0x9AE3, --(髣) + [0x5158] = 0x9AE6, --(髦) + [0x5159] = 0x9AEF, --(髯) + [0x515A] = 0x9AEB, --(髫) + [0x515B] = 0x9AEE, --(髮) + [0x515C] = 0x9AF4, --(髴) + [0x515D] = 0x9AF1, --(髱) + [0x515E] = 0x9AF7, --(髷) + [0x5201] = 0x9AFB, --(髻) + [0x5202] = 0x9B06, --(鬆) + [0x5203] = 0x9B18, --(鬘) + [0x5204] = 0x9B1A, --(鬚) + [0x5205] = 0x9B1F, --(鬟) + [0x5206] = 0x9B22, --(鬢) + [0x5207] = 0x9B23, --(鬣) + [0x5208] = 0x9B25, --(鬥) + [0x5209] = 0x9B27, --(鬧) + [0x520A] = 0x9B28, --(鬨) + [0x520B] = 0x9B29, --(鬩) + [0x520C] = 0x9B2A, --(鬪) + [0x520D] = 0x9B2E, --(鬮) + [0x520E] = 0x9B2F, --(鬯) + [0x520F] = 0x9B32, --(鬲) + [0x5210] = 0x9B44, --(魄) + [0x5211] = 0x9B43, --(魃) + [0x5212] = 0x9B4F, --(魏) + [0x5213] = 0x9B4D, --(魍) + [0x5214] = 0x9B4E, --(魎) + [0x5215] = 0x9B51, --(魑) + [0x5216] = 0x9B58, --(魘) + [0x5217] = 0x9B74, --(魴) + [0x5218] = 0x9B93, --(鮓) + [0x5219] = 0x9B83, --(鮃) + [0x521A] = 0x9B91, --(鮑) + [0x521B] = 0x9B96, --(鮖) + [0x521C] = 0x9B97, --(鮗) + [0x521D] = 0x9B9F, --(鮟) + [0x521E] = 0x9BA0, --(鮠) + [0x521F] = 0x9BA8, --(鮨) + [0x5220] = 0x9BB4, --(鮴) + [0x5221] = 0x9BC0, --(鯀) + [0x5222] = 0x9BCA, --(鯊) + [0x5223] = 0x9BB9, --(鮹) + [0x5224] = 0x9BC6, --(鯆) + [0x5225] = 0x9BCF, --(鯏) + [0x5226] = 0x9BD1, --(鯑) + [0x5227] = 0x9BD2, --(鯒) + [0x5228] = 0x9BE3, --(鯣) + [0x5229] = 0x9BE2, --(鯢) + [0x522A] = 0x9BE4, --(鯤) + [0x522B] = 0x9BD4, --(鯔) + [0x522C] = 0x9BE1, --(鯡) + [0x522D] = 0x9C3A, --(鰺) + [0x522E] = 0x9BF2, --(鯲) + [0x522F] = 0x9BF1, --(鯱) + [0x5230] = 0x9BF0, --(鯰) + [0x5231] = 0x9C15, --(鰕) + [0x5232] = 0x9C14, --(鰔) + [0x5233] = 0x9C09, --(鰉) + [0x5234] = 0x9C13, --(鰓) + [0x5235] = 0x9C0C, --(鰌) + [0x5236] = 0x9C06, --(鰆) + [0x5237] = 0x9C08, --(鰈) + [0x5238] = 0x9C12, --(鰒) + [0x5239] = 0x9C0A, --(鰊) + [0x523A] = 0x9C04, --(鰄) + [0x523B] = 0x9C2E, --(鰮) + [0x523C] = 0x9C1B, --(鰛) + [0x523D] = 0x9C25, --(鰥) + [0x523E] = 0x9C24, --(鰤) + [0x523F] = 0x9C21, --(鰡) + [0x5240] = 0x9C30, --(鰰) + [0x5241] = 0x9C47, --(鱇) + [0x5242] = 0x9C32, --(鰲) + [0x5243] = 0x9C46, --(鱆) + [0x5244] = 0x9C3E, --(鰾) + [0x5245] = 0x9C5A, --(鱚) + [0x5246] = 0x9C60, --(鱠) + [0x5247] = 0x9C67, --(鱧) + [0x5248] = 0x9C76, --(鱶) + [0x5249] = 0x9C78, --(鱸) + [0x524A] = 0x9CE7, --(鳧) + [0x524B] = 0x9CEC, --(鳬) + [0x524C] = 0x9CF0, --(鳰) + [0x524D] = 0x9D09, --(鴉) + [0x524E] = 0x9D08, --(鴈) + [0x524F] = 0x9CEB, --(鳫) + [0x5250] = 0x9D03, --(鴃) + [0x5251] = 0x9D06, --(鴆) + [0x5252] = 0x9D2A, --(鴪) + [0x5253] = 0x9D26, --(鴦) + [0x5254] = 0x9DAF, --(鶯) + [0x5255] = 0x9D23, --(鴣) + [0x5256] = 0x9D1F, --(鴟) + [0x5257] = 0x9D44, --(鵄) + [0x5258] = 0x9D15, --(鴕) + [0x5259] = 0x9D12, --(鴒) + [0x525A] = 0x9D41, --(鵁) + [0x525B] = 0x9D3F, --(鴿) + [0x525C] = 0x9D3E, --(鴾) + [0x525D] = 0x9D46, --(鵆) + [0x525E] = 0x9D48, --(鵈) + [0x5301] = 0x9D5D, --(鵝) + [0x5302] = 0x9D5E, --(鵞) + [0x5303] = 0x9D64, --(鵤) + [0x5304] = 0x9D51, --(鵑) + [0x5305] = 0x9D50, --(鵐) + [0x5306] = 0x9D59, --(鵙) + [0x5307] = 0x9D72, --(鵲) + [0x5308] = 0x9D89, --(鶉) + [0x5309] = 0x9D87, --(鶇) + [0x530A] = 0x9DAB, --(鶫) + [0x530B] = 0x9D6F, --(鵯) + [0x530C] = 0x9D7A, --(鵺) + [0x530D] = 0x9D9A, --(鶚) + [0x530E] = 0x9DA4, --(鶤) + [0x530F] = 0x9DA9, --(鶩) + [0x5310] = 0x9DB2, --(鶲) + [0x5311] = 0x9DC4, --(鷄) + [0x5312] = 0x9DC1, --(鷁) + [0x5313] = 0x9DBB, --(鶻) + [0x5314] = 0x9DB8, --(鶸) + [0x5315] = 0x9DBA, --(鶺) + [0x5316] = 0x9DC6, --(鷆) + [0x5317] = 0x9DCF, --(鷏) + [0x5318] = 0x9DC2, --(鷂) + [0x5319] = 0x9DD9, --(鷙) + [0x531A] = 0x9DD3, --(鷓) + [0x531B] = 0x9DF8, --(鷸) + [0x531C] = 0x9DE6, --(鷦) + [0x531D] = 0x9DED, --(鷭) + [0x531E] = 0x9DEF, --(鷯) + [0x531F] = 0x9DFD, --(鷽) + [0x5320] = 0x9E1A, --(鸚) + [0x5321] = 0x9E1B, --(鸛) + [0x5322] = 0x9E1E, --(鸞) + [0x5323] = 0x9E75, --(鹵) + [0x5324] = 0x9E79, --(鹹) + [0x5325] = 0x9E7D, --(鹽) + [0x5326] = 0x9E81, --(麁) + [0x5327] = 0x9E88, --(麈) + [0x5328] = 0x9E8B, --(麋) + [0x5329] = 0x9E8C, --(麌) + [0x532A] = 0x9E92, --(麒) + [0x532B] = 0x9E95, --(麕) + [0x532C] = 0x9E91, --(麑) + [0x532D] = 0x9E9D, --(麝) + [0x532E] = 0x9EA5, --(麥) + [0x532F] = 0x9EA9, --(麩) + [0x5330] = 0x9EB8, --(麸) + [0x5331] = 0x9EAA, --(麪) + [0x5332] = 0x9EAD, --(麭) + [0x5333] = 0x9761, --(靡) + [0x5334] = 0x9ECC, --(黌) + [0x5335] = 0x9ECE, --(黎) + [0x5336] = 0x9ECF, --(黏) + [0x5337] = 0x9ED0, --(黐) + [0x5338] = 0x9ED4, --(黔) + [0x5339] = 0x9EDC, --(黜) + [0x533A] = 0x9EDE, --(點) + [0x533B] = 0x9EDD, --(黝) + [0x533C] = 0x9EE0, --(黠) + [0x533D] = 0x9EE5, --(黥) + [0x533E] = 0x9EE8, --(黨) + [0x533F] = 0x9EEF, --(黯) + [0x5340] = 0x9EF4, --(黴) + [0x5341] = 0x9EF6, --(黶) + [0x5342] = 0x9EF7, --(黷) + [0x5343] = 0x9EF9, --(黹) + [0x5344] = 0x9EFB, --(黻) + [0x5345] = 0x9EFC, --(黼) + [0x5346] = 0x9EFD, --(黽) + [0x5347] = 0x9F07, --(鼇) + [0x5348] = 0x9F08, --(鼈) + [0x5349] = 0x76B7, --(皷) + [0x534A] = 0x9F15, --(鼕) + [0x534B] = 0x9F21, --(鼡) + [0x534C] = 0x9F2C, --(鼬) + [0x534D] = 0x9F3E, --(鼾) + [0x534E] = 0x9F4A, --(齊) + [0x534F] = 0x9F52, --(齒) + [0x5350] = 0x9F54, --(齔) + [0x5351] = 0x9F63, --(齣) + [0x5352] = 0x9F5F, --(齟) + [0x5353] = 0x9F60, --(齠) + [0x5354] = 0x9F61, --(齡) + [0x5355] = 0x9F66, --(齦) + [0x5356] = 0x9F67, --(齧) + [0x5357] = 0x9F6C, --(齬) + [0x5358] = 0x9F6A, --(齪) + [0x5359] = 0x9F77, --(齷) + [0x535A] = 0x9F72, --(齲) + [0x535B] = 0x9F76, --(齶) + [0x535C] = 0x9F95, --(龕) + [0x535D] = 0x9F9C, --(龜) + [0x535E] = 0x9FA0, --(龠) + [0x5401] = 0x582F, --(堯) + [0x5402] = 0x69C7, --(槇) + [0x5403] = 0x9059, --(遙) + [0x5404] = 0x7464, --(瑤) + [0x5405] = 0x51DC, --(凜) + [0x5406] = 0x7199, --(熙) +}} diff --git a/macros/luatex/generic/luatexja/src/ltj-kinsoku_make.tex b/macros/luatex/generic/luatexja/src/ltj-kinsoku_make.tex new file mode 100644 index 0000000000..5d25ff0f11 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-kinsoku_make.tex @@ -0,0 +1,456 @@ +%#!luatex ltj-kinsoku_make.tex +%\tracingall +\input luatexja.sty + +\catcode`\@=11 +\ltj@tempcnta="0%" +\loop\ifnum\ltj@tempcnta<"100%" + \ltjsetparameter{alxspmode={\ltj@tempcnta,0}}% + \advance\ltj@tempcnta by1 +\repeat + +\ltj@tempcnta=`\0%" +\loop\ifnum\ltj@tempcnta<`\:%" + \ltjsetparameter{alxspmode={\ltj@tempcnta,3}}% + \advance\ltj@tempcnta by1 +\repeat + +\ltj@tempcnta=`\A%" +\loop\ifnum\ltj@tempcnta<`\[%" + \ltjsetparameter{alxspmode={\ltj@tempcnta,3}}% + \advance\ltj@tempcnta by1 +\repeat + +\ltj@tempcnta=`\a%" +\loop\ifnum\ltj@tempcnta<`\{%" + \ltjsetparameter{alxspmode={\ltj@tempcnta,3}}% + \advance\ltj@tempcnta by1 +\repeat + +\ltj@tempcnta="2000%" General Punctuation +\loop\ifnum\ltj@tempcnta<"2070%" + \ltjsetparameter{kcatcode={\ltj@tempcnta,1}}% + \advance\ltj@tempcnta by1 +\repeat + +\ltj@tempcnta="2500%" 罫線 +\loop\ifnum\ltj@tempcnta<"2580%" + \ltjsetparameter{alxspmode={\ltj@tempcnta,0}}% + \advance\ltj@tempcnta by1 +\repeat + +\ltj@tempcnta="3000%" CJK Symbols and Punctuation +\loop\ifnum\ltj@tempcnta<"3040%" + \ltjsetparameter{kcatcode={\ltj@tempcnta,1}}% + \advance\ltj@tempcnta by1 +\repeat + +\ltj@tempcnta="FF00%" 半角・全角形 +\loop\ifnum\ltj@tempcnta<"FFF0%" + \ltjsetparameter{kcatcode={\ltj@tempcnta,1}}% + \advance\ltj@tempcnta by1 +\repeat + +% +% 行頭、行末禁則パラメータ +% +% 1byte characters +\ltjsetparameter{prebreakpenalty={`!,10000}} +\ltjsetparameter{prebreakpenalty={`",10000}} +\ltjsetparameter{postbreakpenalty={`\#,500}} +\ltjsetparameter{postbreakpenalty={`\$,500}} +\ltjsetparameter{prebreakpenalty={`\%,500}} +\ltjsetparameter{prebreakpenalty={`\&,500}} +\ltjsetparameter{postbreakpenalty={`\`,10000}} +\ltjsetparameter{prebreakpenalty={`',10000}} +\ltjsetparameter{prebreakpenalty={`),10000}} +\ltjsetparameter{postbreakpenalty={`(,10000}} +\ltjsetparameter{prebreakpenalty={`*,500}} +\ltjsetparameter{prebreakpenalty={`+,500}} +\ltjsetparameter{prebreakpenalty={`-,10000}} +\ltjsetparameter{prebreakpenalty={`.,10000}} +\ltjsetparameter{prebreakpenalty={44,10000}} +\ltjsetparameter{prebreakpenalty={`/,500}} +\ltjsetparameter{prebreakpenalty={`;,10000}} +\ltjsetparameter{prebreakpenalty={`?,10000}} +\ltjsetparameter{prebreakpenalty={`:,10000}} +\ltjsetparameter{prebreakpenalty={`],10000}} +\ltjsetparameter{postbreakpenalty={`[,10000}} +%全角文字 +\ltjsetparameter{prebreakpenalty={`、,10000}} +\ltjsetparameter{prebreakpenalty={`。,10000}} +\ltjsetparameter{prebreakpenalty={`,,10000}} +\ltjsetparameter{prebreakpenalty={`.,10000}} +\ltjsetparameter{prebreakpenalty={`・,10000}} +\ltjsetparameter{prebreakpenalty={`:,10000}} +\ltjsetparameter{prebreakpenalty={`;,10000}} +\ltjsetparameter{prebreakpenalty={`?,10000}} +\ltjsetparameter{prebreakpenalty={`!,10000}} +\ltjsetparameter{prebreakpenalty={`゛,10000}}%\jis"212B +\ltjsetparameter{prebreakpenalty={`゜,10000}}%\jis"212C +\ltjsetparameter{prebreakpenalty={`´,10000}}%\jis"212D +\ltjsetparameter{postbreakpenalty={``,10000}}%\jis"212E +\ltjsetparameter{prebreakpenalty={`々,10000}}%\jis"2139 +\ltjsetparameter{prebreakpenalty={`…,250}}%\jis"2144 +\ltjsetparameter{prebreakpenalty={`‥,250}}%\jis"2145 +\ltjsetparameter{postbreakpenalty={`‘,10000}}%\jis"2146 +\ltjsetparameter{prebreakpenalty={`’,10000}}%\jis"2147 +\ltjsetparameter{postbreakpenalty={`“,10000}}%\jis"2148 +\ltjsetparameter{prebreakpenalty={`”,10000}}%\jis"2149 +\ltjsetparameter{prebreakpenalty={`),10000}} +\ltjsetparameter{postbreakpenalty={`(,10000}} +\ltjsetparameter{prebreakpenalty={`},10000}} +\ltjsetparameter{postbreakpenalty={`{,10000}} +\ltjsetparameter{prebreakpenalty={`],10000}} +\ltjsetparameter{postbreakpenalty={`[,10000}} +%\ltjsetparameter{postbreakpenalty={`‘,10000}} +%\ltjsetparameter{prebreakpenalty={`’,10000}} +\ltjsetparameter{postbreakpenalty={`〔,10000}}%\jis"214C +\ltjsetparameter{prebreakpenalty={`〕,10000}}%\jis"214D +\ltjsetparameter{postbreakpenalty={`〈,10000}}%\jis"2152 +\ltjsetparameter{prebreakpenalty={`〉,10000}}%\jis"2153 +\ltjsetparameter{postbreakpenalty={`《,10000}}%\jis"2154 +\ltjsetparameter{prebreakpenalty={`》,10000}}%\jis"2155 +\ltjsetparameter{postbreakpenalty={`「,10000}}%\jis"2156 +\ltjsetparameter{prebreakpenalty={`」,10000}}%\jis"2157 +\ltjsetparameter{postbreakpenalty={`『,10000}}%\jis"2158 +\ltjsetparameter{prebreakpenalty={`』,10000}}%\jis"2159 +\ltjsetparameter{postbreakpenalty={`【,10000}}%\jis"215A +\ltjsetparameter{prebreakpenalty={`】,10000}}%\jis"215B +\ltjsetparameter{prebreakpenalty={`ー,10000}} +\ltjsetparameter{prebreakpenalty={`+,200}} +\ltjsetparameter{prebreakpenalty={`−,200}}% U+2212 MINUS SIGN +\ltjsetparameter{prebreakpenalty={`-,200}}% U+FF0D FULLWIDTH HYPHEN-MINUS +\ltjsetparameter{prebreakpenalty={`=,200}} +\ltjsetparameter{postbreakpenalty={`#,200}} +\ltjsetparameter{postbreakpenalty={`$,200}} +\ltjsetparameter{prebreakpenalty={`%,200}} +\ltjsetparameter{prebreakpenalty={`&,200}} +\ltjsetparameter{prebreakpenalty={`ぁ,150}} +\ltjsetparameter{prebreakpenalty={`ぃ,150}} +\ltjsetparameter{prebreakpenalty={`ぅ,150}} +\ltjsetparameter{prebreakpenalty={`ぇ,150}} +\ltjsetparameter{prebreakpenalty={`ぉ,150}} +\ltjsetparameter{prebreakpenalty={`っ,150}} +\ltjsetparameter{prebreakpenalty={`ゃ,150}} +\ltjsetparameter{prebreakpenalty={`ゅ,150}} +\ltjsetparameter{prebreakpenalty={`ょ,150}} +\ltjsetparameter{prebreakpenalty={`ゎ,150}}%\jis"246E +\ltjsetparameter{prebreakpenalty={`ァ,150}} +\ltjsetparameter{prebreakpenalty={`ィ,150}} +\ltjsetparameter{prebreakpenalty={`ゥ,150}} +\ltjsetparameter{prebreakpenalty={`ェ,150}} +\ltjsetparameter{prebreakpenalty={`ォ,150}} +\ltjsetparameter{prebreakpenalty={`ッ,150}} +\ltjsetparameter{prebreakpenalty={`ャ,150}} +\ltjsetparameter{prebreakpenalty={`ュ,150}} +\ltjsetparameter{prebreakpenalty={`ョ,150}} +\ltjsetparameter{prebreakpenalty={`ヮ,150}}%\jis"256E +\ltjsetparameter{prebreakpenalty={`ヵ,150}}%\jis"2575 +\ltjsetparameter{prebreakpenalty={`ヶ,150}}%\jis"2576 +% kinsoku JIS X 0208 additional +\ltjsetparameter{prebreakpenalty={`ヽ,10000}} +\ltjsetparameter{prebreakpenalty={`ヾ,10000}} +\ltjsetparameter{prebreakpenalty={`ゝ,10000}} +\ltjsetparameter{prebreakpenalty={`ゞ,10000}} + +% +% kinsoku JIS X 0213 +% +\ltjsetparameter{prebreakpenalty={`〳,10000}} +\ltjsetparameter{prebreakpenalty={`〴,10000}} +\ltjsetparameter{prebreakpenalty={`〵,10000}} +\ltjsetparameter{prebreakpenalty={`〻,10000}} +\ltjsetparameter{postbreakpenalty={`⦅,10000}} +\ltjsetparameter{prebreakpenalty={`⦆,10000}} +\ltjsetparameter{postbreakpenalty={`⦅,10000}} +\ltjsetparameter{prebreakpenalty={`⦆,10000}} +\ltjsetparameter{postbreakpenalty={`〘,10000}} +\ltjsetparameter{prebreakpenalty={`〙,10000}} +\ltjsetparameter{postbreakpenalty={`〖,10000}} +\ltjsetparameter{prebreakpenalty={`〗,10000}} +\ltjsetparameter{postbreakpenalty={`«,10000}} +\ltjsetparameter{prebreakpenalty={`»,10000}} +\ltjsetparameter{postbreakpenalty={`〝,10000}} +\ltjsetparameter{prebreakpenalty={`〟,10000}} +\ltjsetparameter{prebreakpenalty={`‼,10000}} +\ltjsetparameter{prebreakpenalty={`⁇,10000}} +\ltjsetparameter{prebreakpenalty={`⁈,10000}} +\ltjsetparameter{prebreakpenalty={`⁉,10000}} +\ltjsetparameter{postbreakpenalty={`¡,10000}} +\ltjsetparameter{postbreakpenalty={`¿,10000}} +\ltjsetparameter{prebreakpenalty={`ː,10000}} +\ltjsetparameter{prebreakpenalty={`·,10000}} +\ltjsetparameter{prebreakpenalty={`ª,10000}} +\ltjsetparameter{prebreakpenalty={`º,10000}} +\ltjsetparameter{prebreakpenalty={`¹,10000}} +\ltjsetparameter{prebreakpenalty={`²,10000}} +\ltjsetparameter{prebreakpenalty={`³,10000}} +\ltjsetparameter{postbreakpenalty={`€,10000}} +\ltjsetparameter{prebreakpenalty={`ゕ,150}} +\ltjsetparameter{prebreakpenalty={`ゖ,150}} +\ltjsetparameter{prebreakpenalty={`ㇰ,150}} +\ltjsetparameter{prebreakpenalty={`ㇱ,150}} +\ltjsetparameter{prebreakpenalty={`ㇲ,150}} +\ltjsetparameter{prebreakpenalty={`ㇳ,150}} +\ltjsetparameter{prebreakpenalty={`ㇴ,150}} +\ltjsetparameter{prebreakpenalty={`ㇵ,150}} +\ltjsetparameter{prebreakpenalty={`ㇶ,150}} +\ltjsetparameter{prebreakpenalty={`ㇷ,150}} +\ltjsetparameter{prebreakpenalty={`ㇸ,150}} +\ltjsetparameter{prebreakpenalty={`ㇹ,150}} +%\ltjsetparameter{prebreakpenalty={`ㇷ゚,150}} +\ltjsetparameter{prebreakpenalty={`ㇺ,150}} +\ltjsetparameter{prebreakpenalty={`ㇻ,150}} +\ltjsetparameter{prebreakpenalty={`ㇼ,150}} +\ltjsetparameter{prebreakpenalty={`ㇽ,150}} +\ltjsetparameter{prebreakpenalty={`ㇾ,150}} +\ltjsetparameter{prebreakpenalty={`ㇿ,150}} +% +% kinsoku JIS X 0212 +% +%\ltjsetparameter{postbreakpenalty={`¡,10000}} +%\ltjsetparameter{postbreakpenalty={`¿,10000}} +%\ltjsetparameter{prebreakpenalty={`º,10000}} +%\ltjsetparameter{prebreakpenalty={`ª,10000}} +\ltjsetparameter{prebreakpenalty={`™,10000}} +% +% kinsoku 半角片仮名 +% +\ltjsetparameter{prebreakpenalty={`。,10000}} +\ltjsetparameter{prebreakpenalty={`、,10000}} +\ltjsetparameter{prebreakpenalty={`゙,10000}} +\ltjsetparameter{prebreakpenalty={`゚,10000}} +\ltjsetparameter{prebreakpenalty={`」,10000}} +\ltjsetparameter{postbreakpenalty={`「,10000}} +% +% xspcode +\ltjsetparameter{alxspmode={`(,preonly}} +\ltjsetparameter{alxspmode={`),postonly}} +\ltjsetparameter{alxspmode={`[,preonly}} +\ltjsetparameter{alxspmode={`],postonly}} +\ltjsetparameter{alxspmode={``,preonly}} +\ltjsetparameter{alxspmode={`',postonly}} +\ltjsetparameter{alxspmode={`;,postonly}} +\ltjsetparameter{alxspmode={44,postonly}} +\ltjsetparameter{alxspmode={`.,postonly}} +% for 8bit Latin +\ltjsetparameter{alxspmode={"80,allow}} +\ltjsetparameter{alxspmode={"81,allow}} +\ltjsetparameter{alxspmode={"82,allow}} +\ltjsetparameter{alxspmode={"83,allow}} +\ltjsetparameter{alxspmode={"84,allow}} +\ltjsetparameter{alxspmode={"85,allow}} +\ltjsetparameter{alxspmode={"86,allow}} +\ltjsetparameter{alxspmode={"87,allow}} +\ltjsetparameter{alxspmode={"88,allow}} +\ltjsetparameter{alxspmode={"89,allow}} +\ltjsetparameter{alxspmode={"8A,allow}} +\ltjsetparameter{alxspmode={"8B,allow}} +\ltjsetparameter{alxspmode={"8C,allow}} +\ltjsetparameter{alxspmode={"8D,allow}} +\ltjsetparameter{alxspmode={"8E,allow}} +\ltjsetparameter{alxspmode={"8F,allow}} +\ltjsetparameter{alxspmode={"90,allow}} +\ltjsetparameter{alxspmode={"91,allow}} +\ltjsetparameter{alxspmode={"92,allow}} +\ltjsetparameter{alxspmode={"93,allow}} +\ltjsetparameter{alxspmode={"94,allow}} +\ltjsetparameter{alxspmode={"95,allow}} +\ltjsetparameter{alxspmode={"96,allow}} +\ltjsetparameter{alxspmode={"97,allow}} +\ltjsetparameter{alxspmode={"98,allow}} +\ltjsetparameter{alxspmode={"99,allow}} +\ltjsetparameter{alxspmode={"9A,allow}} +\ltjsetparameter{alxspmode={"9B,allow}} +\ltjsetparameter{alxspmode={"9C,allow}} +\ltjsetparameter{alxspmode={"9D,allow}} +\ltjsetparameter{alxspmode={"9E,allow}} +\ltjsetparameter{alxspmode={"9F,allow}} +\ltjsetparameter{alxspmode={"A0,allow}} +\ltjsetparameter{alxspmode={"A1,allow}} +\ltjsetparameter{alxspmode={"A2,allow}} +\ltjsetparameter{alxspmode={"A3,allow}} +\ltjsetparameter{alxspmode={"A4,allow}} +\ltjsetparameter{alxspmode={"A5,allow}} +\ltjsetparameter{alxspmode={"A6,allow}} +\ltjsetparameter{alxspmode={"A7,allow}} +\ltjsetparameter{alxspmode={"A8,allow}} +\ltjsetparameter{alxspmode={"A9,allow}} +\ltjsetparameter{alxspmode={"AA,allow}} +\ltjsetparameter{alxspmode={"AB,allow}} +\ltjsetparameter{alxspmode={"AC,allow}} +\ltjsetparameter{alxspmode={"AD,allow}} +\ltjsetparameter{alxspmode={"AE,allow}} +\ltjsetparameter{alxspmode={"AF,allow}} +\ltjsetparameter{alxspmode={"B0,allow}} +\ltjsetparameter{alxspmode={"B1,allow}} +\ltjsetparameter{alxspmode={"B2,allow}} +\ltjsetparameter{alxspmode={"B3,allow}} +\ltjsetparameter{alxspmode={"B4,allow}} +\ltjsetparameter{alxspmode={"B5,allow}} +\ltjsetparameter{alxspmode={"B6,allow}} +\ltjsetparameter{alxspmode={"B7,allow}} +\ltjsetparameter{alxspmode={"B8,allow}} +\ltjsetparameter{alxspmode={"B9,allow}} +\ltjsetparameter{alxspmode={"BA,allow}} +\ltjsetparameter{alxspmode={"BB,allow}} +\ltjsetparameter{alxspmode={"BC,allow}} +\ltjsetparameter{alxspmode={"BD,allow}} +\ltjsetparameter{alxspmode={"BE,allow}} +\ltjsetparameter{alxspmode={"BF,allow}} +\ltjsetparameter{alxspmode={"C0,allow}} +\ltjsetparameter{alxspmode={"C1,allow}} +\ltjsetparameter{alxspmode={"C2,allow}} +\ltjsetparameter{alxspmode={"C3,allow}} +\ltjsetparameter{alxspmode={"C4,allow}} +\ltjsetparameter{alxspmode={"C5,allow}} +\ltjsetparameter{alxspmode={"C6,allow}} +\ltjsetparameter{alxspmode={"C7,allow}} +\ltjsetparameter{alxspmode={"C8,allow}} +\ltjsetparameter{alxspmode={"C9,allow}} +\ltjsetparameter{alxspmode={"CA,allow}} +\ltjsetparameter{alxspmode={"CB,allow}} +\ltjsetparameter{alxspmode={"CC,allow}} +\ltjsetparameter{alxspmode={"CD,allow}} +\ltjsetparameter{alxspmode={"CE,allow}} +\ltjsetparameter{alxspmode={"CF,allow}} +\ltjsetparameter{alxspmode={"D0,allow}} +\ltjsetparameter{alxspmode={"D1,allow}} +\ltjsetparameter{alxspmode={"D2,allow}} +\ltjsetparameter{alxspmode={"D3,allow}} +\ltjsetparameter{alxspmode={"D4,allow}} +\ltjsetparameter{alxspmode={"D5,allow}} +\ltjsetparameter{alxspmode={"D6,allow}} +\ltjsetparameter{alxspmode={"D7,allow}} +\ltjsetparameter{alxspmode={"D8,allow}} +\ltjsetparameter{alxspmode={"D9,allow}} +\ltjsetparameter{alxspmode={"DA,allow}} +\ltjsetparameter{alxspmode={"DB,allow}} +\ltjsetparameter{alxspmode={"DC,allow}} +\ltjsetparameter{alxspmode={"DD,allow}} +\ltjsetparameter{alxspmode={"DE,allow}} +\ltjsetparameter{alxspmode={"DF,allow}} +\ltjsetparameter{alxspmode={"E0,allow}} +\ltjsetparameter{alxspmode={"E1,allow}} +\ltjsetparameter{alxspmode={"E2,allow}} +\ltjsetparameter{alxspmode={"E3,allow}} +\ltjsetparameter{alxspmode={"E4,allow}} +\ltjsetparameter{alxspmode={"E5,allow}} +\ltjsetparameter{alxspmode={"E6,allow}} +\ltjsetparameter{alxspmode={"E7,allow}} +\ltjsetparameter{alxspmode={"E8,allow}} +\ltjsetparameter{alxspmode={"E9,allow}} +\ltjsetparameter{alxspmode={"EA,allow}} +\ltjsetparameter{alxspmode={"EB,allow}} +\ltjsetparameter{alxspmode={"EC,allow}} +\ltjsetparameter{alxspmode={"ED,allow}} +\ltjsetparameter{alxspmode={"EE,allow}} +\ltjsetparameter{alxspmode={"EF,allow}} +\ltjsetparameter{alxspmode={"F0,allow}} +\ltjsetparameter{alxspmode={"F1,allow}} +\ltjsetparameter{alxspmode={"F2,allow}} +\ltjsetparameter{alxspmode={"F3,allow}} +\ltjsetparameter{alxspmode={"F4,allow}} +\ltjsetparameter{alxspmode={"F5,allow}} +\ltjsetparameter{alxspmode={"F6,allow}} +\ltjsetparameter{alxspmode={"F7,allow}} +\ltjsetparameter{alxspmode={"F8,allow}} +\ltjsetparameter{alxspmode={"F9,allow}} +\ltjsetparameter{alxspmode={"FA,allow}} +\ltjsetparameter{alxspmode={"FB,allow}} +\ltjsetparameter{alxspmode={"FC,allow}} +\ltjsetparameter{alxspmode={"FD,allow}} +\ltjsetparameter{alxspmode={"FE,allow}} +\ltjsetparameter{alxspmode={"FF,allow}} +% +% inhibitxspcode +\ltjsetparameter{jaxspmode={`、,postonly}} +\ltjsetparameter{jaxspmode={`。,postonly}} +\ltjsetparameter{jaxspmode={`,,postonly}} +\ltjsetparameter{jaxspmode={`.,postonly}} +\ltjsetparameter{jaxspmode={`;,postonly}} +\ltjsetparameter{jaxspmode={`?,postonly}} +\ltjsetparameter{jaxspmode={`),postonly}} +\ltjsetparameter{jaxspmode={`(,preonly}} +\ltjsetparameter{jaxspmode={`],postonly}} +\ltjsetparameter{jaxspmode={`[,preonly}} +\ltjsetparameter{jaxspmode={`},postonly}} +\ltjsetparameter{jaxspmode={`{,preonly}} +\ltjsetparameter{jaxspmode={`‘,preonly}} +\ltjsetparameter{jaxspmode={`’,postonly}} +\ltjsetparameter{jaxspmode={`“,preonly}} +\ltjsetparameter{jaxspmode={`”,postonly}} +\ltjsetparameter{jaxspmode={`〔,preonly}} +\ltjsetparameter{jaxspmode={`〕,postonly}} +\ltjsetparameter{jaxspmode={`〈,preonly}} +\ltjsetparameter{jaxspmode={`〉,postonly}} +\ltjsetparameter{jaxspmode={`《,preonly}} +\ltjsetparameter{jaxspmode={`》,postonly}} +\ltjsetparameter{jaxspmode={`「,preonly}} +\ltjsetparameter{jaxspmode={`」,postonly}} +\ltjsetparameter{jaxspmode={`『,preonly}} +\ltjsetparameter{jaxspmode={`』,postonly}} +\ltjsetparameter{jaxspmode={`【,preonly}} +\ltjsetparameter{jaxspmode={`】,postonly}} +\ltjsetparameter{jaxspmode={`—,inhibit}}% U+2014 EM DASH +\ltjsetparameter{jaxspmode={`―,inhibit}}% U+2015 HORIZONTAL BAR +\ltjsetparameter{jaxspmode={`〜,inhibit}}% U+301C WAVE DASH +\ltjsetparameter{jaxspmode={`~,inhibit}}% U+FF5E FULLWIDTH TILDE +\ltjsetparameter{jaxspmode={`…,inhibit}} +\ltjsetparameter{jaxspmode={`¥,inhibit}}% U+00A5 YEN SIGN +\ltjsetparameter{jaxspmode={`¥,inhibit}}% U+FFE5 FULLWIDTH YEN SIGN +\ltjsetparameter{jaxspmode={`°,postonly}} +\ltjsetparameter{jaxspmode={`′,postonly}} +\ltjsetparameter{jaxspmode={`″,postonly}} +% +% inhibitxspcode JIS X 0213 +% +\ltjsetparameter{jaxspmode={`⦅,preonly}} +\ltjsetparameter{jaxspmode={`⦆,postonly}} +\ltjsetparameter{jaxspmode={`⦅,preonly}} +\ltjsetparameter{jaxspmode={`⦆,postonly}} +\ltjsetparameter{jaxspmode={`〘,preonly}} +\ltjsetparameter{jaxspmode={`〙,postonly}} +\ltjsetparameter{jaxspmode={`〖,preonly}} +\ltjsetparameter{jaxspmode={`〗,postonly}} +\ltjsetparameter{jaxspmode={`«,preonly}} +\ltjsetparameter{jaxspmode={`»,postonly}} +\ltjsetparameter{jaxspmode={`〝,preonly}} +\ltjsetparameter{jaxspmode={`〟,postonly}} +\ltjsetparameter{jaxspmode={`‼,postonly}} +\ltjsetparameter{jaxspmode={`⁇,postonly}} +\ltjsetparameter{jaxspmode={`⁈,postonly}} +\ltjsetparameter{jaxspmode={`⁉,postonly}} +\ltjsetparameter{jaxspmode={`¡,preonly}} +\ltjsetparameter{jaxspmode={`¿,preonly}} +\ltjsetparameter{jaxspmode={`ª,postonly}} +\ltjsetparameter{jaxspmode={`º,postonly}} +\ltjsetparameter{jaxspmode={`¹,postonly}} +\ltjsetparameter{jaxspmode={`²,postonly}} +\ltjsetparameter{jaxspmode={`³,postonly}} +\ltjsetparameter{jaxspmode={`€,preonly}} +% +% inhibitxspcode JIS X 0212 +% +%\ltjsetparameter{jaxspmode={`¡,preonly}} +%\ltjsetparameter{jaxspmode={`¿,preonly}} +%\ltjsetparameter{jaxspmode={`º,postonly}} +%\ltjsetparameter{jaxspmode={`ª,postonly}} +\ltjsetparameter{jaxspmode={`™,postonly}} +% +% inhibitxspcode 半角片仮名 +% +\ltjsetparameter{jaxspmode={`。,postonly}} +\ltjsetparameter{jaxspmode={`、,postonly}} +\ltjsetparameter{jaxspmode={`「,preonly}} +\ltjsetparameter{jaxspmode={`」,postonly}} + +\catcode`\_=12 +\directlua{ + s = table.copy(luatexja.stack.charprop_stack_table[0]) + s.kanjiskip = nil; s.xkanjiskip = nil + table.tofile('ltj-kinsoku.lua', s, 'return', false, true, false) +} + +\bye diff --git a/macros/luatex/generic/luatexja/src/ltj-latex.sty b/macros/luatex/generic/luatexja/src/ltj-latex.sty new file mode 100644 index 0000000000..446707bd69 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-latex.sty @@ -0,0 +1,91 @@ +% +% ltj-latex.sty +% + +%! これは外から読まれない +%% Avoid multiple loading. +\csname luatexjalatexLoaded\endcsname +\edef\ltj@latex@AtEnd{% +\endlinechar=\the\endlinechar +\relax} +\endlinechar\m@ne% +\def\luatexjalatexLoaded{\endinput} + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ltj-latex}[2018/08/24 LaTeX support of LuaTeX-ja] + +% cleanup at end of the document +%\let\ltj@@orig@end=\@@end +%\protected\def\@@end{% +% \directlua{luatexja.ext_cleanup()}\ltj@@orig@end} + +\endlinechar=13 + +%%% patch for LaTeX +\usepackage{lltjfont} +\usepackage{lltjdefs} +\usepackage{lltjcore} + +%%% patching commands +\RequirePackage{filehook} + +\def\ltj@pkgpatch@im#1{% + \@ifnextchar[{\ltj@pkgpatch@im@{#1}}{\ltj@pkgpatch@im@{#1}[lltjp-#1]}}%] +\def\ltj@pkgpatch@im@#1[#2]{% + \AtEndOfPackageFile*{#1}{% + \@ifpackageloaded{#2}{}{% + \@namedef{ver@#2.\@pkgextension}{0000/00/00}%dummy + \if\catcode`@=11\let\ltj@temp\relax\else + \edef\ltj@temp{\noexpand\catcode`@=\the\catcode`@\relax}\makeatletter + \fi + \@@input{#2.\@pkgextension}\ltj@temp + }% + }% +} + +\def\ltj@pkgpatch#1{% + \@ifnextchar[{\ltj@pkgpatch@@{#1}}{\ltj@pkgpatch@@{#1}[lltjp-#1]}}%] +\def\ltj@pkgpatch@@#1[#2]{% + \gpreto\@begindocumenthook{% + \@ifpackageloaded{#1}{% + \@ifpackageloaded{#2}{}{\RequirePackage{#2}}% + }{}% + }% +} + +%%% default parameters +\directlua{ + local s = kpse.find_file('ltj-kinsoku.lua', 'tex') + luatexja.stack.charprop_stack_table[0] = s and dofile(s) or {} +} + +\ltjsetparameter{kanjiskip=\z@ plus .4pt minus .5pt, + xkanjiskip=.25\zw plus 1pt minus 1pt, + autospacing, autoxspacing, jacharrange={-1}, + yalbaselineshift=\z@, yjabaselineshift=\z@, + jcharwidowpenalty=500, differentjfm=paverage +} + +\expandafter\let\csname JY3/mc/m/n/10\endcsname\relax + +%%% patch for packages +\ltj@pkgpatch@im{listings} +\ltj@pkgpatch{xunicode} %% at \begin{document} +\ltj@pkgpatch@im{fontspec} +\ltj@pkgpatch{footmisc} %% at \begin{document} +\ltj@pkgpatch{tascmac} +\ltj@pkgpatch{ascmac}[lltjp-tascmac] +\ltj@pkgpatch@im{stfloats} +\ltj@pkgpatch{preview} %% at \begin{document} + % (preview package has delayed option) +\ltj@pkgpatch{array} %% at \begin{document} +\ltj@pkgpatch@im{unicode-math} +\ltj@pkgpatch@im{siunitx} +\ltj@pkgpatch@im{microtype} + +\RequirePackage{lltjp-geometry} + +%%------------------ all done +\ltj@latex@AtEnd +\endinput +%% EOF diff --git a/macros/luatex/generic/luatexja/src/ltj-lineskip.lua b/macros/luatex/generic/luatexja/src/ltj-lineskip.lua new file mode 100644 index 0000000000..f5c439e559 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-lineskip.lua @@ -0,0 +1,116 @@ +-- +-- ltj-lineskip.lua +-- +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('direction'); local ltjd = luatexja.direction +luatexja.lineskip = luatexja.lineskip or {} + +local to_direct = node.direct.todirect +local ltjl = luatexja.lineskip +local id_glue = node.id('glue') +local id_penalty = node.id('penalty') +local id_hlist = node.id('hlist') +local setfield = node.direct.setfield +local getfield = node.direct.getfield +local getlist = node.direct.getlist +local node_new = node.direct.new +local node_prev = node.direct.getprev +local node_next = node.direct.getnext +local getid = node.direct.getid +local getsubtype = node.direct.getsubtype + +local node_getglue = node.getglue +local setglue = node.direct.setglue +local function copy_glue (new_glue, old_glue, subtype, new_w) + setfield(new_glue, 'subtype', subtype) + local w,st,sp,sto,spo = node_getglue(old_glue) + setglue(new_glue, new_w or w, st, sp, sto, spo) +end +ltjl.copy_glue = copy_glue + +function ltjl.p_dummy(before, after) + return nil, 0 +end +function ltjl.l_dummy(dist, g, adj, normal, bw, loc) + if dist < tex.lineskiplimit then + copy_glue(g, tex.lineskip, 1, tex.lineskip.width + adj) + else + copy_glue(g, tex.baselineskip, 2, normal) + end +end + +local ltj_profiler, ltj_skip = ltjl.p_dummy, ltjl.l_dummy +function ltjl.setting(profiler, skip_method) + ltj_profiler = ltjl['p_'..tostring(profiler)] or ltjl.p_dummy + ltj_skip = ltjl['l_'..tostring(skip_method)] or ltjl.l_dummy +end + +do + local traverse_id = node.direct.traverse_id + local function adjust_glue(nh) + local h = to_direct(nh) + local bw = tex.baselineskip.width + for x in traverse_id(id_glue, h) do + local xs = getsubtype(x) + if (xs==1) or (xs==2) then + local p, n = node_prev(x), node_next(x) + if p then + local pid = getid(p) + while (id_glue<=pid) and (pid<=id_penalty) and node_prev(p) do + p = node_prev(p); pid = getid(p) + end + if pid==id_hlist and getid(n)==id_hlist then + local normal = bw - getfield(p, 'depth') - getfield(n, 'height') + local lmin, adj = ltj_profiler(p, n, false, bw) + ltj_skip(lmin or normal, x, adj, normal, bw) + end + end + end + end + return true + end + ltjb.add_to_callback('post_linebreak_filter', + adjust_glue, 'ltj.lineskip', 10000) +end + +do + local p_dummy = ltjl.p_dummy + local make_dir_whatsit = luatexja.direction.make_dir_whatsit + local get_dir_count = luatexja.direction.get_dir_count + local node_write = node.direct.write + + local function dir_adjust_append_vlist(b, loc, prev, mirrored) + local old_b = to_direct(b) + local new_b = loc=='box' and + make_dir_whatsit(old_b, old_b, get_dir_count(), 'append_vlist') or old_b + if prev > -65536000 then + local bw = tex.baselineskip.width + local normal = bw - prev + - getfield(new_b, mirrored and 'depth' or 'height') + local lmin, adj = nil, 0 + local tail = to_direct(tex.nest[tex.nest.ptr].tail) + if p_dummy~=ltj_profiler then + while tail and (id_glue<=getid(tail)) and (getid(tail)<=id_penalty) do + tail = node_prev(tail) + end + end + if tail then + if getid(tail)==id_hlist and getid(new_b)==id_hlist then + if getfield(tail, 'depth')==prev then + lmin, adj = ltj_profiler(tail, new_b, mirrored, bw) + end + end + end + local g = node_new(id_glue) + ltj_skip(lmin or normal, g, adj, normal, bw, loc) + node_write(g) + end + node_write(new_b) + tex.prevdepth = getfield(new_b, mirrored and 'height' or 'depth') + return nil -- do nothing on tex side + end + ltjb.add_to_callback('append_to_vlist_filter', + dir_adjust_append_vlist, + 'ltj.lineskip', 10000) +end + diff --git a/macros/luatex/generic/luatexja/src/ltj-math.lua b/macros/luatex/generic/luatexja/src/ltj-math.lua new file mode 100644 index 0000000000..53bcdb340f --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-math.lua @@ -0,0 +1,181 @@ +-- +-- luatexja/ltj-math.lua +-- + +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('direction'); local ltjd = luatexja.direction +luatexja.load_module('charrange'); local ltjc = luatexja.charrange +luatexja.load_module('jfont'); local ltjf = luatexja.jfont +luatexja.load_module('stack'); local ltjs = luatexja.stack +luatexja.load_module('setwidth'); local ltjw = luatexja.setwidth + +local setfield = node.direct.setfield +local getfield = node.direct.getfield +local getid = node.direct.getid +local getsubtype = node.direct.getsubtype +local getlist = node.direct.getlist +-- getlist cannot be used for sub_box nodes. Use instead λp. getfield(p, 'head') +local getchar = node.direct.getchar + +local to_node = node.direct.tonode +local to_direct = node.direct.todirect + +local node_traverse = node.direct.traverse +local node_new = node.direct.new +local node_next = node.direct.getnext +local node_remove = node.direct.remove +local node_free = node.direct.free +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local tex_getcount = tex.getcount + +local attr_jchar_class = luatexbase.attributes['ltj@charclass'] +local attr_dir = luatexbase.attributes['ltj@dir'] +local attr_icflag = luatexbase.attributes['ltj@icflag'] +local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] +local attr_jfam = luatexbase.attributes['jfam'] +local attr_yablshift = luatexbase.attributes['ltj@yablshift'] + +local id_glyph = node.id('glyph') +local id_hlist = node.id('hlist') +local id_vlist = node.id('vlist') +local id_mchar = node.id('math_char') +local id_sub_box = node.id('sub_box') +local id_radical = node.id('radical') +local id_choice = node.id('choice') +local id_accent = node.id('accent') +local id_style = node.id('style') +local id_frac = node.id('fraction') +local id_simple = node.id('noad') +local id_sub_mlist = node.id('sub_mlist') +local id_whatsit = node.id('whatsit') +local sid_user = node.subtype('user_defined') +local DIR = luatexja.userid_table.DIR +local dir_node_auto = luatexja.dir_table.dir_node_auto + +local PROCESSED = luatexja.icflag_table.PROCESSED + +local ltjf_font_metric_table = ltjf.font_metric_table +local ltjf_find_char_class = ltjf.find_char_class +local ltjd_get_dir_count = ltjd.get_dir_count +local ltjd_make_dir_whatsit = ltjd.make_dir_whatsit + +-- table of mathematical characters +local is_math_letters = {} +local list_dir + +-- vcenter noad は軸に揃えるため,欧文ベースライン補正がかかる +local function conv_vcenter(sb) + local h = getfield(sb, 'head');local hd = getlist(h) + if getid(hd)==id_whatsit and + getsubtype(hd)==sid_user and getfield(hd, 'user_id')==DIR then + local d = node_next(hd) + if getid(d)==id_vlist and has_attr(d, attr_dir)>=dir_node_auto then + node_free(hd); setfield(h, 'head', nil); node_free(h) + setfield(sb, 'head', d); set_attr(d, attr_icflag, 0) + end + end + return sb +end + +local conv_jchar_to_hbox_A + +-- sty : 0 (display or text), 1 (script), >=2 (scriptscript) +local function conv_jchar_to_hbox(head, sty) + for p in node_traverse(head) do + local pid = getid(p) + if pid == id_simple or pid == id_accent then + if getsubtype(p)==12 then + conv_vcenter(getfield(p, 'nucleus')) + else + setfield(p, 'nucleus', conv_jchar_to_hbox_A(getfield(p, 'nucleus'), sty)) + end + setfield(p, 'sub', conv_jchar_to_hbox_A(getfield(p, 'sub'), sty+1)) + setfield(p, 'sup', conv_jchar_to_hbox_A(getfield(p, 'sup'), sty+1)) + elseif pid == id_choice then + setfield(p, 'display', conv_jchar_to_hbox_A(getfield(p, 'display'), 0)) + setfield(p, 'text', conv_jchar_to_hbox_A(getfield(p, 'text'), 0)) + setfield(p, 'script', conv_jchar_to_hbox_A(getfield(p, 'script'), 1)) + setfield(p, 'scriptscript', conv_jchar_to_hbox_A(getfield(p, 'scriptscript'), 2)) + elseif pid == id_frac then + setfield(p, 'num', conv_jchar_to_hbox_A(getfield(p, 'num'), sty+1)) + setfield(p, 'denom', conv_jchar_to_hbox_A(getfield(p, 'denom'), sty+1)) + elseif pid == id_radical then + setfield(p, 'nucleus', conv_jchar_to_hbox_A(getfield(p, 'nucleus'), sty)) + setfield(p, 'sub', conv_jchar_to_hbox_A(getfield(p, 'sub'), sty+1)) + setfield(p, 'sup', conv_jchar_to_hbox_A(getfield(p, 'sup'), sty+1)) + if getfield(p, 'degree') then + setfield(p, 'degree', conv_jchar_to_hbox_A(getfield(p, 'degree'), sty + 1)) + end + elseif pid == id_style then + local ps = getfield(p, 'style') + if ps == "display'" or ps == 'display' + or ps == "text'" or ps == 'text' then + sty = 0 + elseif ps == "script'" or ps == 'script' then + sty = 1 + else sty = 2 + end + end + end + return head +end + +local MJT = luatexja.stack_table_index.MJT +local MJS = luatexja.stack_table_index.MJS +local MJSS = luatexja.stack_table_index.MJSS +local capsule_glyph_math = ltjw.capsule_glyph_math +local is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char_direct + +conv_jchar_to_hbox_A = +function (p, sty) + if not p then return nil + else + local pid = getid(p) + if pid == id_sub_mlist then + if getfield(p, 'head') then + setfield(p, 'head', conv_jchar_to_hbox(getfield(p, 'head'), sty)) + end + elseif pid == id_mchar then + local fam = has_attr(p, attr_jfam) or -1 + local pc = getchar(p) + if (not is_math_letters[pc]) and is_ucs_in_japanese_char(p) and fam>=0 then + local f = ltjs.get_stack_table(MJT + 0x100 * sty + fam, -1, tex_getcount('ltj@@stack')) + if f ~= -1 then + local q = node_new(id_sub_box) + local r = node_new(id_glyph); setfield(r, 'next', nil) + setfield(r, 'char', pc); setfield(r, 'font', f); setfield(r, 'subtype', 256) + local k = has_attr(r,attr_ykblshift) or 0 + set_attr(r, attr_ykblshift, 0) + -- ltj-setwidth 内で実際の位置補正はおこなうので,補正量を退避 + local met = ltjf_font_metric_table[f] + r = capsule_glyph_math(r, met, met.char_type[ltjf_find_char_class(pc, met)]); + setfield(q, 'head', r); node_free(p); p=q; + set_attr(r, attr_yablshift, k) + end + end + elseif pid == id_sub_box and getfield(p, 'head') then + -- \hbox で直に与えられた内容は上下位置を補正する必要はない + local h = getfield(p, 'head') + h = ltjd_make_dir_whatsit(h, h, list_dir, 'math') + setfield(p, 'head', h) + set_attr(h, attr_icflag, PROCESSED) + end + end + return p +end + +luatexbase.add_to_callback('mlist_to_hlist', + function (n, display_type, penalties) + n = to_direct(n); list_dir = ltjd_get_dir_count() + if getid(n)==id_whatsit and getsubtype(n)==sid_user and + getfield(n, 'user_id') == DIR then + local old_n = n; n = node_remove(n, n) + node_free(old_n); if not n then return nil end + end + return node.mlist_to_hlist( + to_node(conv_jchar_to_hbox(n, 0)), + display_type, penalties) + end,'ltj.mlist_to_hlist', 1) + +luatexja.math = { is_math_letters = is_math_letters } diff --git a/macros/luatex/generic/luatexja/src/ltj-otf.lua b/macros/luatex/generic/luatexja/src/ltj-otf.lua new file mode 100644 index 0000000000..0e54210227 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-otf.lua @@ -0,0 +1,296 @@ +-- +-- luatexja/ltj-otf.lua +-- +require('unicode') +require('lualibs') + +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('jfont'); local ltjf = luatexja.jfont +luatexja.load_module('rmlgbm'); local ltjr = luatexja.rmlgbm +luatexja.load_module('charrange'); local ltjc = luatexja.charrange +luatexja.load_module('direction'); local ltjd = luatexja.direction +luatexja.load_module('stack'); local ltjs = luatexja.stack + +local id_glyph = node.id('glyph') +local id_whatsit = node.id('whatsit') +local sid_user = node.subtype('user_defined') + +local setfield = node.direct.setfield +local getfield = node.direct.getfield +local getid = node.direct.getid +local getfont = node.direct.getfont +local getchar = node.direct.getchar +local getsubtype = node.direct.getsubtype + +local to_node = node.direct.tonode +local to_direct = node.direct.todirect + +local node_new = node.direct.new +local node_remove = node.direct.remove +local node_next = node.direct.getnext +local node_free = node.direct.free +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local unset_attr = node.direct.unset_attribute +local node_insert_after = node.direct.insert_after +local node_write = node.direct.write +local node_traverse_id = node.direct.traverse_id + + +local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] +local attr_curtfnt = luatexbase.attributes['ltj@curtfnt'] +local attr_yablshift = luatexbase.attributes['ltj@yablshift'] +local attr_ykblshift = luatexbase.attributes['ltj@ykblshift'] +local attr_tablshift = luatexbase.attributes['ltj@tablshift'] +local attr_tkblshift = luatexbase.attributes['ltj@tkblshift'] +local lang_ja = luatexja.lang_ja +local identifiers = fonts.hashes.identifiers + +local ltjf_font_metric_table = ltjf.font_metric_table +local ltjf_font_extra_info = ltjf.font_extra_info +local ltjf_find_char_class = ltjf.find_char_class +local ltjr_cidfont_data = ltjr.cidfont_data +local ltjc_is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char +local ltjd_get_dir_count = ltjd.get_dir_count +local dir_tate = luatexja.dir_table.dir_tate + +luatexja.userid_table.OTF = luatexbase.newuserwhatsitid('char_by_cid', 'luatexja') +local OTF = luatexja.userid_table.OTF +local tex_get_attr = tex.getattribute + +local cache_var = 2 +local cache_outdate_fn = function (t) return t.version~=cache_ver end +local ivd_aj1 = ltjb.load_cache('ltj-ivd_aj1',cache_outdate_fn) +if not ivd_aj1 then -- make cache + ivd_aj1 = require('ltj-ivd_aj1.lua') + ltjb.save_cache_luc('ltj-ivd_aj1', ivd_aj1) +end + + +local function get_ucs_from_rmlgbm(c) + local v = (ivd_aj1 and ivd_aj1.table_ivd_aj1[c] + or ltjr_cidfont_data["Adobe-Japan1"].resources.unicodes["Japan1." .. tostring(c)]) + or 0 + if v>=0x200000 then -- table + local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate) + and attr_curtfnt or attr_curjfnt) + local curjfnt = identifiers[curjfnt_num].resources + local base, ivs = v % 0x200000, 0xE00FF + math.floor(v/0x200000) + curjfnt = curjfnt and curjfnt.variants + curjfnt = curjfnt and curjfnt[ivs] + return curjfnt and curjfnt[base] or base + elseif v<0xF0000 then -- 素直に Unicode にマップ可能 + return v + else -- privete use area + local r, aj = nil, ltjr_cidfont_data["Adobe-Japan1"] + -- 先に ltj_vert_table を見る + for i,w in pairs(aj.shared.ltj_vert_table) do + if w==v then r=i; break end + end + if not r then + -- なければ ToUnicode から引く + local w = aj.characters[v].tounicode -- must be non-nil! + local i = string.len(w) + if i==4 then -- UCS2 + r = tonumber(w,16) + elseif i==8 then + i,w = tonumber(string.sub(w,1,4),16), tonumber(string.sub(w,-4),16) + if (w>=0xD800) and (w<=0xDB7F) and (i>=0xDC00) and (i<=0xDFFF) then -- Surrogate pair + r = (w-0xD800)*0x400 + (i-0xDC00) + else + r = 0 + end + end + end + if aj.shared.ltj_vert_table[r] then + -- CID が縦組用字形だった場合 + local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate) + and attr_curtfnt or attr_curjfnt) + local t = identifiers[curjfnt_num] + if t.resources.sequences then + for _,i in pairs(t.resources.sequences) do + if (i.order[1]=='vert' or i.order[1]=='vrt2') + and i.type == 'gsub_single' and i.steps then + for _,j in pairs(i.steps) do + if type(j)=='table' then + if type(j.coverage)=='table' then + for i,k in pairs(j.coverage) do + if i==r then return k end + end + end + end + end + end + end + end + end + return r + end +end + +-- Append a whatsit node to the list. +-- This whatsit node will be extracted to a glyph_node +local function append_jglyph(char) + local p = node_new(id_whatsit,sid_user) + setfield(p, 'user_id', OTF) + setfield(p, 'type', 100) + setfield(p, 'value', char) + node_write(p) +end + +local utf +do + utf = function (ucs) + local char = ucs + if ltjd_get_dir_count()==dir_tate then + local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate) + and attr_curtfnt or attr_curjfnt) + local t = identifiers[curjfnt_num] + if t.resources.sequences then + for _,i in pairs(t.resources.sequences) do + if (i.order[1]=='vert' or i.order[1]=='vrt2') + and i.type == 'gsub_single' and i.steps then + for _,j in pairs(i.steps) do + if type(j)=='table' then + if type(j.coverage)=='table' then + for i,k in pairs(j.coverage) do + if i==char then return append_jglyph(k) end + end + end + end + end + end + end + end + end + return append_jglyph(char) + end +end + +local cid +do + cid = function (key) + if key==0 then return append_jglyph(0) end + local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate) + and attr_curtfnt or attr_curjfnt) + local curjfnt = identifiers[curjfnt_num] + local cidinfo = curjfnt.resources.cidinfo + if not cidinfo or + cidinfo.ordering ~= "Japan1" and + cidinfo.ordering ~= "GB1" and + cidinfo.ordering ~= "CNS1" and + cidinfo.ordering ~= "Korea1" and + cidinfo.ordering ~= "KR" then + -- ltjb.package_warning('luatexja-otf', + -- 'Current Japanese font (or other CJK font) "' + -- ..curjfnt.psname..'" is not a CID-Keyed font (Adobe-Japan1 etc.)') + return append_jglyph(get_ucs_from_rmlgbm(key)) + else + local char = ltjf_font_extra_info[curjfnt_num].ind_to_uni[key] + if not char then +-- ltjb.package_warning('luatexja-otf', +-- '"' ..curjfnt.psname..'" does not have CID character ' +-- ..tostring(key), +-- 'Use a font including the specified CID character.') + char = 0 + end + return append_jglyph(char) + end + end +end + +local function extract(head) + head = to_direct(head) + local p = head + local is_dir_tate = ltjs.list_dir == dir_tate + local attr_ablshift = is_dir_tate and attr_tablshift or attr_yablshift + local attr_kblshift = is_dir_tate and attr_tkblshift or attr_ykblshift + local attr_curfnt = is_dir_tate and attr_curtfnt or attr_curjfnt + while p do + if getid(p)==id_whatsit then + if getsubtype(p)==sid_user then + local puid = getfield(p, 'user_id') + if puid==OTF then + --if puid==OTF or puid==VSR then + local g = node_new(id_glyph) + setfield(g, 'subtype', 0) + setfield(g, 'char', getfield(p, 'value')) + local v = has_attr(p, attr_curfnt); setfield(g, 'font',v) + --if puid==OTF then + setfield(g, 'lang', lang_ja) + set_attr(g, attr_kblshift, has_attr(p, attr_kblshift)) + --else + -- set_attr(g, attr_ablshift, has_attr(p, attr_ablshift)) + --end + head = node_insert_after(head, p, g) + head = node_remove(head, p) + node_free(p); p = g + end + end + end + p = node_next(p) + end + return to_node(head) +end + +ltjb.add_to_callback('hpack_filter', extract,'ltj.otf', + luatexbase.priority_in_callback('hpack_filter', 'ltj.main')) +ltjb.add_to_callback('pre_linebreak_filter', extract,'ltj.otf', + luatexbase.priority_in_callback('pre_linebreak_filter', 'ltj.main')) +-- additional callbacks +-- 以下は,LuaTeX-ja に用意された callback のサンプルになっている. +-- JFM の文字クラスの指定の所で,"AJ1-xxx" 形式での指定を可能とした. + +-- 和文フォント読み込み時に,ind -> unicode 対応をとっておく. +local function ind_to_uni(fmtable, fn) + local fi = identifiers[fn] + local t = ltjf_font_extra_info[fn].ind_to_uni + if t and fi.resources and fi.resources.cidinfo + and fi.resources.cidinfo.ordering == "Japan1" then + for i, v in pairs(fmtable.chars) do + local j = string.match(i, "^AJ1%-([0-9]*)") + if j then + j = t[i] + if j then + fmtable.cid_char_type = fmtable.cid_char_type or {} + fmtable.cid_char_type[j] = v + end + end + end + end + return fmtable +end +luatexbase.add_to_callback("luatexja.define_jfont", + ind_to_uni, "ltj.otf.define_jfont", 1) +-- 既に読み込まれているフォントに対しても,同じことをやらないといけない +for fn, v in pairs(ltjf_font_metric_table) do + ltjf_font_metric_table[fn] = ind_to_uni(v, fn) +end + + +local function cid_set_char_class(arg, fmtable, char) + if arg~=0 then return arg + elseif fmtable.cid_char_type then + return fmtable.cid_char_type[char] or 0 + else return 0 + end +end +luatexbase.add_to_callback("luatexja.find_char_class", + cid_set_char_class, "ltj.otf.find_char_class", 1) + +--IVS +local function enable_ivs() + ltjb.package_warning('luatexja-otf', + 'luatexja.otf.enable_ivs() has now no effect.') +end +local disable_ivs = enable_ivs + +luatexja.otf = { + append_jglyph = append_jglyph, + enable_ivs = enable_ivs, -- 隠し機能: IVS + disable_ivs = disable_ivs, -- 隠し機能: IVS + cid = cid, utf = utf, +} + + +-- EOF diff --git a/macros/luatex/generic/luatexja/src/ltj-plain.sty b/macros/luatex/generic/luatexja/src/ltj-plain.sty new file mode 100644 index 0000000000..4277998e9d --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-plain.sty @@ -0,0 +1,110 @@ +% +% ltj-plain.sty +% + +%! これは外から読まれない +%% Avoid multiple loading. +\csname luatexjaplainLoaded\endcsname +\edef\ltj@plain@AtEnd{% +\endlinechar=\the\endlinechar +\relax} +\endlinechar=-1 % +\def\luatexjaplainLoaded{\endinput} + +\ifltj@in@latex %<*LaTeX> + \NeedsTeXFormat{LaTeX2e} + \PackageWarning{ltj-plain}{Don't load this package directly; load luatexja.sty instead.} + \ProvidesPackage{ltj-plain}[2019/05/01] +\fi %</LaTeX> + +%%------------------ + +\endlinechar=13 +%! ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ +% LuaTeX-ja macros against plain TeX + +\ifdefined\ltj@stdmcfont\else\def\ltj@stdmcfont{IPAExMincho}\fi +\ifdefined\ltj@stdgtfont\else\def\ltj@stdgtfont{IPAExGothic}\fi +\ifdefined\ltj@stdyokojfm\else\def\ltj@stdyokojfm{ujis}\fi +\ifdefined\ltj@stdtatejfm\else\def\ltj@stdtatejfm{ujisv}\fi +\newread\ltj@@cfgread +\openin\ltj@@cfgread{luatexja.cfg}% +\ifeof\ltj@@cfgread + \@PackageInfoNoLine{ltj-plain}{Cannot find file `luatexja.cfg'}% +\else + \closein\ltj@@cfgread + \input luatexja.cfg +\fi +\let\ltj@@cfgread\relax\advance\count16\m@ne\relax + +\jfont\tenmin=\ltj@stdmcfont:jfm=\ltj@stdyokojfm\space at 9.62216pt +\jfont\sevenmin=\ltj@stdmcfont:jfm=\ltj@stdyokojfm\space at 6.73551pt +\jfont\fivemin=\ltj@stdmcfont:jfm=\ltj@stdyokojfm\space at 4.81108pt +\jfont\tengt=\ltj@stdgtfont:jfm=\ltj@stdyokojfm\space at 9.62216pt +\jfont\sevengt=\ltj@stdgtfont:jfm=\ltj@stdyokojfm\space at 6.73551pt +\jfont\fivegt=\ltj@stdgtfont:jfm=\ltj@stdyokojfm\space at 4.81108pt + +\tfont\tentmin=\ltj@stdmcfont:jfm=\ltj@stdtatejfm\space at 9.62216pt +\tfont\seventmin=\ltj@stdmcfont:jfm=\ltj@stdtatejfm\space at 6.73551pt +\tfont\fivetmin=\ltj@stdmcfont:jfm=\ltj@stdtatejfm\space at 4.81108pt +\tfont\tentgt=\ltj@stdgtfont:jfm=\ltj@stdtatejfm\space at 9.62216pt +\tfont\seventgt=\ltj@stdgtfont:jfm=\ltj@stdtatejfm\space at 6.73551pt +\tfont\fivetgt=\ltj@stdgtfont:jfm=\ltj@stdtatejfm\space at 4.81108pt + +\def\mc{\tenmin\tentmin} +\def\gt{\tengt\tentgt} +\mc + +\directlua{ + local s = kpse.find_file('ltj-kinsoku.lua', 'tex') + luatexja.stack.charprop_stack_table[0] = s and dofile(s) or {} +} + +\ltjsetparameter{kanjiskip=\z@ plus .4pt minus .4pt, + xkanjiskip=.25\zw plus 1pt minus 1pt, + autospacing, autoxspacing, jacharrange={-1}, + yalbaselineshift=\z@, yjabaselineshift=\z@, + jcharwidowpenalty=500, differentjfm=paverage, + jatextfont={0, \tenmin}, jascriptfont={0, \sevenmin}, + jascriptscriptfont={0, \fivemin}, +} +\setbox\z@=\hbox{M} +\jfam\z@ +\ltjsetparameter{talbaselineshift=.5\ht0, tjabaselineshift=\z@} + +\ltjdefcharrange{1}{"80-"36F, "1E00-"1EFF} +\ltjdefcharrange{2}{"370-"4FF, "1F00-"1FFF} +\ltjdefcharrange{3}{% + "2000-"243F, "2500-"27BF, "2900-"29FF, "2B00-"2BFF} +\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 +\ltjdefcharrange{5}{"D800-"DFFF, "E0000-"E00FF, "E01F0-"10FFFF} +\ltjdefcharrange{6}{% + "2460-"24FF, "2E80-"2EFF, "3000-"30FF, "3190-"319F, "31F0-"4DBF, + "4E00-"9FFF, "F900-"FAFF, "FE10-"FE1F, "FE30-"FE6F, "FF00-"FFEF, + "1B000-"1B16F, "1F100-"1F2FF, "20000-"2FFFF, "E0100-"E01EF +} +\ltjdefcharrange{7}{% + "1100-"11FF, "2F00-"2FFF, "3100-"318F, "31A0-"31EF, "A000-"A4CF, + "A960-"A97F, "AC00-"D7FF +} +\ltjdefcharrange{8}{"A7, "A8, "B0, "B1, "B4, "B6, "D7, "F7} +\ltjsetparameter{jacharrange={-1, +2, +3, -4, -5, +6, +7, -8}} + +\directlua{for x=128,255 do luatexja.math.is_math_letters[x] = true end} +\let\ltj@@orig@end=\@@end +\protected\def\@@end{% + \directlua{luatexja.ext_cleanup()}\ltj@@orig@end} + +\directlua{luatexja.jfont.register_vert_replace{ + [',']='、', ['.']='。', ['“']=0x301D, ['”']=0x301F, +}} + +%%------------------ all done +\ltj@plain@AtEnd +\endinput +%% EOF diff --git a/macros/luatex/generic/luatexja/src/ltj-pretreat.lua b/macros/luatex/generic/luatexja/src/ltj-pretreat.lua new file mode 100644 index 0000000000..3f37278e54 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-pretreat.lua @@ -0,0 +1,188 @@ +-- +-- luatexja/ltj-pretreat.lua +-- + +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('charrange'); local ltjc = luatexja.charrange +luatexja.load_module('stack'); local ltjs = luatexja.stack +luatexja.load_module('jfont'); local ltjf = luatexja.jfont +luatexja.load_module('direction'); local ltjd = luatexja.direction + +local to_node = node.direct.tonode +local to_direct = node.direct.todirect + +local setfield = node.direct.setfield +local getid = node.direct.getid +local getfont = node.direct.getfont +local getchar = node.direct.getchar +local getfield = node.direct.getfield +local getsubtype = node.direct.getsubtype +local getlang = node.direct.getlang or function (n) return getfield(n,'lang') end + +local pairs = pairs +local floor = math.floor +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local node_traverse = node.direct.traverse +local node_remove = node.direct.remove +local node_next = node.direct.getnext +local node_free = node.direct.free +local node_end_of_math = node.direct.end_of_math +local tex_getcount = tex.getcount + +local id_glyph = node.id('glyph') +local id_math = node.id('math') +local id_whatsit = node.id('whatsit') +local sid_user = node.subtype('user_defined') + +local attr_dir = luatexbase.attributes['ltj@dir'] +local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] +local attr_curtfnt = luatexbase.attributes['ltj@curtfnt'] +local attr_icflag = luatexbase.attributes['ltj@icflag'] + +local is_ucs_in_japanese_char = ltjc.is_ucs_in_japanese_char_direct +local ltjs_orig_char_table = ltjs.orig_char_table +local ltjf_replace_altfont = ltjf.replace_altfont +local STCK = luatexja.userid_table.STCK +local DIR = luatexja.userid_table.DIR +local JA_AL_BDD = luatexja.userid_table.JA_AL_BDD +local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG + +local dir_tate = luatexja.dir_table.dir_tate +local lang_ja = luatexja.lang_ja + +local setlang = node.direct.setlang or function(n,l) setfield(n,'lang',l) end +local setfont = node.direct.setfont or function(n,l) setfield(n,'font',l) end +local setchar = node.direct.setchar or function(n,l) setfield(n,'char',l) end + +------------------------------------------------------------------------ +-- MAIN PROCESS STEP 1: replace fonts +------------------------------------------------------------------------ +local wt, wtd = {}, {} +do + local ltjd_get_dir_count = ltjd.get_dir_count + local start_time_measure, stop_time_measure + = ltjb.start_time_measure, ltjb.stop_time_measure + local head + local suppress_hyphenate_ja_aux = { + [id_math] = function(p) return node_next(node_end_of_math(node_next(p))) end, + [id_whatsit] = function(p) + if getsubtype(p)==sid_user then + local uid = getfield(p, 'user_id') + if uid==STCK then + wt[#wt+1] = p; node_remove(head, p) + elseif uid==DIR then + if has_attr(p, attr_icflag)<PROCESSED_BEGIN_FLAG then + ltjs.list_dir = has_attr(p, attr_dir) + else -- こっちのケースは通常使用では起こらない + wtd[#wtd+1] = p; node_remove(head, p) + end + end + end + return node_next(p) + end, + } + setmetatable(suppress_hyphenate_ja_aux, + { + __index = function() return node_next end, + }) + local id_boundary = node.id('boundary') + local node_new, insert_before = node.direct.new, node.direct.insert_before + local setsubtype = node.direct.setsubtype or function(n,l) setfield(n,'subtype',l) end + local function suppress_hyphenate_ja (h) + start_time_measure('ltj_hyphenate') + head = to_direct(h) + for i = 1,#wt do wt[i]=nil end + for i = 1,#wtd do wtd[i]=nil end + for i,_ in pairs(ltjs_orig_char_table) do + ltjs_orig_char_table[i] = nil + end + ltjs.list_dir=ltjd_get_dir_count() + do + local p = head + while p do + local pid, prev_chartype = getid(p), 0 + -- prev_chartype: 0: not char 1: ALchar 2: JAchar + while pid==id_glyph do + local pc = getchar(p) + if has_attr(p, attr_icflag, 0) and is_ucs_in_japanese_char(p, pc) then + if prev_chartype==1 then + local b = node_new(id_whatsit,sid_user); + setfield(b, 'type', 100); setfield(b, 'user_id', JA_AL_BDD); + insert_before(head, p, b) + end + local pf = has_attr(p, attr_curjfnt) + pf = (pf and pf>0 and pf) or getfont(p) + setfont(p, ltjf_replace_altfont(pf, pc)) + setlang(p, lang_ja) + ltjs_orig_char_table[p], prev_chartype = pc, 2 + elseif prev_chartype==2 then + local b = node_new(id_whatsit,sid_user); + setfield(b, 'type', 100); setfield(b, 'user_id', JA_AL_BDD); + insert_before(head, p, b); prev_chartype = 1 + else prev_chartype = 1 + end + p = node_next(p); pid = getid(p) + end + p = (suppress_hyphenate_ja_aux[pid])(p) + end + end + stop_time_measure('ltj_hyphenate'); start_time_measure('tex_hyphenate') + lang.hyphenate(h, nil) + stop_time_measure('tex_hyphenate') + return h + end + + ltjb.add_to_callback('hyphenate', + function (head,tail) + return suppress_hyphenate_ja(head) + end,'ltj.hyphenate') +end + +-- mode: true iff this function is called from hpack_filter +local ltjs_report_stack_level = ltjs.report_stack_level +local ltjf_font_metric_table = ltjf.font_metric_table +local font_getfont = font.getfont +local function set_box_stack_level(head, mode) + local box_set, cl = 0, tex.currentgrouplevel + 1 + if mode then + for _,p in pairs(wt) do + if getfield(p, 'value')==cl then box_set = 1 end; node_free(p) + end + else + for _,p in pairs(wt) do node_free(p) end + end + ltjs_report_stack_level(tex_getcount('ltj@@stack') + box_set) + for _,p in pairs(wtd) do + node_free(p) + end + if ltjs.list_dir == dir_tate then + for p in node.direct.traverse_id(id_glyph,to_direct(head)) do + if has_attr(p, attr_icflag, 0) and getlang(p)==lang_ja then + local nf = ltjf_replace_altfont( has_attr(p, attr_curtfnt) or getfont(p) , ltjs_orig_char_table[p]) + setfont(p, nf) + if ltjf_font_metric_table[nf].vert_activated then + local pc = getchar(p) + pc = ltjf_font_metric_table[nf].vform[pc] + if pc then setchar(p, pc) end + end + end + end + end + return head +end + +-- CALLBACKS +ltjb.add_to_callback('hpack_filter', + function (head) + return set_box_stack_level(head, true) + end,'ltj.set_stack_level',1) +ltjb.add_to_callback('pre_linebreak_filter', + function (head) + return set_box_stack_level(head, false) + end,'ltj.set_stack_level',1) + +luatexja.pretreat = { + set_box_stack_level = set_box_stack_level, + orig_char_table = orig_char_table, +} diff --git a/macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua b/macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua new file mode 100644 index 0000000000..357560c4bf --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua @@ -0,0 +1,416 @@ +-- +-- luatexja/ltj-rmlgbm.lua +-- +luatexja.load_module('base'); local ltjb = luatexja.base + +local cidfont_data = {} +local cache_chars = {} +local cache_ver = 8 +local identifiers = fonts.hashes.identifiers + +local cid_reg, cid_order, cid_supp, cid_name +local cid_replace = { + ["Adobe-Japan1"] = {"UniJIS2004-UTF32", 23059, 7, + function (i) + if (231<=i and i<=632) or (8718<=i and i<=8719) + or (12063<=i and i<=12087) then + return 327680 -- 655360/2 + elseif 9758<=i and i<=9778 then + return 218453 -- 655360/3 + elseif 9738<=i and i<=9757 then + return 163840 -- 655360/4 + end + end}, + -- 基本的には JIS X 0213:2004 に沿ったマッピング + ["Adobe-Korea1"] = {"UniKS-UTF32", 18351, 2, + function (i) + if 8094<=i and i<=8100 then + return 327680 -- 655360/2 + end + end}, + ["Adobe-GB1"] = {"UniGB-UTF32", 30283, 5, + function (i) + if (814<=i and i<=939) or (i==7716) + or (22355<=i and i<=22357) then + return 327680 -- 655360/2 + end + end}, + ["Adobe-CNS1"] = {"UniCNS-UTF32", 19178, 7, + function (i) + if (13648<=i and i<=13742) or (i==17603) then + return 327680 -- 655360/2 + end + end}, + ["Adobe-KR"] = {"UniAKR-UTF32", 22896, 9, + function (i) + if i==3057 then + return 655360*2 + elseif i==3058 then + return 655360*3 + elseif i==12235 or i==12236 then + return 163840 -- 655360/4 + end + end}, +} + +-- reading CID maps +local make_cid_font +do + local line, fh -- line, file handler + local tt,cidm -- characters, cid->(Unicode) + + local function load_cid_char(cid_dec, mke) + local cid, ucs, ucsa + line = fh:read("*l") + while line do + if string.find(line, "end...?char") then + line = fh:read("*l"); return + else -- WMA l is in the form "<%x+>%s%d+" + ucs, cid = string.match(line, "<(%x+)>%s+<?(%x+)>?") + cid = cid_dec(cid); ucs = tonumber(ucs, 16); + if not tt[ucs] then + tt[ucs] = mke(cid); cidm[cid]=ucs + end + end + line = fh:read("*l") + end + end + + local function load_cid_range(inc, cid_dec, mke) + local bucs, eucs, cid + line = fh:read("*l") + while line do + if string.find(line, "end...?range") then + line = fh:read("*l"); return + else -- WMA l is in the form "<%x+>%s+<%x+>" + bucs, eucs, cid = string.match(line, "<(%x+)>%s+<(%x+)>%s+<?(%x+)>?") + cid = cid_dec(cid); + bucs = tonumber(bucs, 16); eucs = tonumber(eucs, 16) + for ucs = bucs, eucs do + if not tt[ucs] then + tt[ucs] = mke(cid); cidm[cid]=ucs + end + cid = inc(cid) + end + end + line = fh:read("*l") + end + end + + local function open_cmap_file(name, inc, cid_dec, mke) + local fn = kpse.find_file(name, 'cmap files') + if fn then + fh = io.open(fn, "r") + line = fh:read("*l") + while line do + if string.find(line, "%x+%s+begin...?char") then + load_cid_char(cid_dec, mke) + elseif string.find(line, "%x+%s+begin...?range") then + load_cid_range(inc, cid_dec, mke) + else + line = fh:read("*l") + end + end + fh:close(); + end + end + + local function increment(a) return a+1 end + local function entry(a) + return {index = a} + end + local feat_dummy_vert = { gsub={vert={dflt={dflt=true}}} } + local seq_dummy_vert={{ + features={vert={dflt={dflt=true}}}, + --flags={false,false,false,false}, + --index=1, name="s_s_0", skiphash=false, steps={coverage={},index=1}, + ["type"]="gsub_single", order='vert', + }} + make_cid_font = function () + local kx = cid_replace[cid_name] + if not kx then return end + local k = { + cidinfo = { ordering=cid_order, registry=cid_reg, supplement=kx[3] }, + encodingbytes = 2, extend=1000, format = 'opentype', + direction = 0, characters = {}, parameters = { + ascender = 655360*0.88, + descender = 655360*0.12, + }, + embedding = "no", cache = "yes", factor = 0, hfactor = 0, vfactor = 0, + tounicode = 1, + properties = { language = "dflt", script = "dflt" }, + } + cidfont_data[cid_name] = k + + -- CID => Unicode 符号空間 + local tth, cidmo = {}, {} + tt, cidm = tth, cidmo + for i = 0,kx[2] do cidm[i] = -1 end + open_cmap_file(kx[1] .. "-H", increment, tonumber, entry) + k.characters = tth + + -- Unicode にマップされなかった文字の処理 + -- これらは TrueType フォントを使って表示するときはおかしくなる + local ttu, pricode = {}, 0xF0000 + for i,v in ipairs(cidmo) do + if v==-1 then + tth[pricode], cidmo[i], pricode + = { index = i }, pricode, pricode+1; + end + ttu[cid_order .. '.' .. i] = cidmo[i] + end + + -- shared + k.shared = { + otfdata = { + cidinfo= k.cidinfo, verbose = false, + shared = { featuredata = {}, }, + }, + dynamics = {}, processes = {}, + rawdata = {}, features={}, + } + k.resources = { + unicodes = ttu, + features = feat_dummy_vert, + sequences = seq_dummy_vert, + } + k.descriptions = {} + k.shared.rawdata.resources=k.resources + k.shared.rawdata.descriptions=k.descriptions + cache_chars[cid_name] = { [655360] = k.characters } + + -- 縦書用字形 + tt, cidm = {}, {} + local ttv = {}; k.shared.ltj_vert_table = ttv + for i = 0,kx[2] do cidm[i] = -1 end + open_cmap_file(kx[1] .. "-V", increment, tonumber, entry) + for i,v in pairs(tt) do + ttv[i] = cidmo[v.index] -- "unicode" of vertical variant + end + + -- tounicode エントリ + local cidp = {nil, nil}; tt, ttu, cidm = {}, {}, {} + open_cmap_file(cid_name .. "-UCS2", + function(a) + a[2] = a[2] +1 ; return a + end, + function(a) + cidp[1] = string.upper(string.sub(a,1,string.len(a)-4)) + cidp[2] = tonumber(string.sub(a,-4),16) + return cidp + end, + function(a) return a[1] ..string.format('%04X',a[2]) end) + -- tt は cid -> tounicode になっているので cidm -> tounicode に変換 + local kxf = kx[4] + for i,v in ipairs(cidmo) do + k.characters[v].width = kxf(i) + if v>=0xF0000 then + k.characters[v].tounicode = tt[i] + end + end + + -- Save + k.characters[46].width = math.floor(655360/14); + ltjb.save_cache( "ltj-cid-auto-" .. string.lower(cid_name), + { + version = cache_ver, + k, + }) + end +end + +-- +local cidf_vert_processor +do + local traverse_id, is_node = node.direct.traverse_id, node.is_node + local to_direct = node.direct.todirect + local id_glyph = node.id('glyph') + local getfont = node.direct.getfont + local getchar = node.direct.getchar + local setchar = node.direct.setchar + cidf_vert_processor = { + function (head, fnum) + local fontdata = identifiers[fnum] + if head and luatexja.jfont.font_metric_table[fnum].vert_activated then + local vt = fontdata.shared.ltj_vert_table + local nh = is_node(head) and to_direct(head) or head + for n in traverse_id(id_glyph, head) do + if getfont(n)==fnum then + local c = getchar(n); setchar(n, vt[c] or c) + end + end + return head, false + end + end + } +end + +local function cid_cache_outdated(t) return t.version~=cache_ver end +local function read_cid_font() + local dat = ltjb.load_cache("ltj-cid-auto-" .. string.lower(cid_name), + cid_cache_outdated ) + if dat then + cidfont_data[cid_name] = dat[1] + cache_chars[cid_name] = { [655360] = cidfont_data[cid_name].characters } + else + -- Now we must create the virtual metrics from CMap. + make_cid_font() + end + if cidfont_data[cid_name] then + cidfont_data[cid_name].shared.processes = cidf_vert_processor + for i,v in pairs(cidfont_data[cid_name].characters) do + if not v.width then v.width = 655360 end + v.height, v.depth = 576716.8, 78643.2 -- optimized for jfm-ujis.lua + end + return cidfont_data[cid_name] + else + return nil + end +end + +-- High-level +local function prepare_cid_font(reg, ord) + cid_reg, cid_order, cid_name, cid_supp = reg, ord, reg .. '-' .. ord + return cidfont_data[cid_name] or read_cid_font() +end + + +local definers = fonts.definers +local function mk_rml(name, size, id) + local specification = definers.analyze(name,size) + --specification = definers.resolve(specification) (not needed) + specification.detail = specification.detail or '' + do + local n = specification.name + if n:sub(1,1)=="{" then n=n:sub(2) end + if n:sub(-1)=="}" then n=n:sub(1,-2) end + specification.name=n + end + local fontdata = {} + local cachedata = {} + local s = cidfont_data[cid_name] + luatexja.rmlgbm.vert_addfunc(id) + for k, v in pairs(s) do + fontdata[k] = v + cachedata[k] = v + end + fontdata.characters = nil + cachedata.characters = nil + fontdata.shared = nil + cachedata.shared = nil + if s.shared then + cachedata.shared = {} + local shared = cachedata.shared + for k, v in pairs(s.shared) do + shared[k] = v + end + end + + -- characters & scaling + if size < 0 then size = -size * 655.36 end + local scale = size / 655360 + + do + local def_height = 0.88 * size + -- character's default height (optimized for jfm-ujis.lua) + local def_depth = 0.12 * size -- and depth. + if not cache_chars[cid_name][size] then + cache_chars[cid_name][size] = {} + for k, v in pairs(cache_chars[cid_name][655360]) do + cache_chars[cid_name][size][k] = { + index = v.index, width = v.width * scale, + height = def_height, depth = def_depth, tounicode = v.tounicode, + } + end + end + fontdata.characters = cache_chars[cid_name][size] + cachedata.characters = cache_chars[cid_name][size] + end + + -- other parameters + do + local parameters = {} + for k, v in pairs(s.parameters) do + parameters[k] = v * scale + end + fontdata.parameters = parameters + fontdata.size = size + fontdata.resources = s.resources + cachedata.parameters = parameters + cachedata.size = size + cachedata.resources = s.resources + end + + -- no embedding + local var = '' + local s = string.match(specification.detail, 'slant=([+-]*%d*%.?%d)') + if s and e~=0 then + s = s * 1000 + var, fontdata.slant = var .. 's' .. tostring(s), s + end + local e = string.match(specification.detail, 'extend=([+-]*%d*%.?%d)') + if e and e~=1 then + e = e * 1000 + var, fontdata.extend = var .. 'x' .. tostring(e), e + end + fontdata.name = specification.name .. size .. var; cachedata.name = fontdata.name + fontdata.fullname = specification.name .. var; cachedata.fullname = fontdata.fullname + fontdata.psname = specification.name; cachedata.psname = fontdata.psname + identifiers[id] = cachedata + + return fontdata +end + +local function font_callback(name, size, id, fallback) + if name:sub(1,1)=="{" and name:sub(-1)=="}" then name = name:sub(2,-2) end + local p = name:find(":") or 0 + if name:sub(1, p-1) == 'psft' then + local s = "Adobe-Japan1-7" + local basename = name:sub(p+1) + local p = basename:find(":") + local q = basename:find("/[BI][BI]?") + if q and p and q<=p then + basename = basename:gsub('/[BI][BI]?', '', 1) + p = basename:find(":") + end + if p then + local xname = basename:sub(p+1) + p = 1 + while p do + local q = xname:find(";", p+1) or xname:len()+1 + if xname:sub(p, p+3)=='cid=' and q>p+4 then + s = xname:sub(p+4, q-1) + end + if xname:len()+1==q then p = nil else p = q + 1 end + end + end + cid_reg, cid_order = string.match(s, "^(.-)%-(.-)%-(%d-)$") + if not cid_reg then + cid_reg, cid_order = string.match(s, "^(.-)%-(.-)$") + end + if not prepare_cid_font(cid_reg, cid_order) then + ltjb.package_error('luatexja', + "bad cid key `" .. s .. "'", + "I couldn't find any non-embedded font information for the CID\n" .. + '`' .. s .. "'. For now, I'll use `Adobe-Japan1-6'.\n".. + 'Please contact the LuaTeX-ja project team.') + cid_name = "Adobe-Japan1" + end + return mk_rml(basename, size, id) + else + local tfmdata=fallback(name, size, id) + if type (tfmdata) == "table" and tfmdata.shared then + luatexbase.call_callback("luaotfload.patch_font", tfmdata, name) + end + return tfmdata + end +end + +luatexja.rmlgbm = { + prepare_cid_font = prepare_cid_font, + cidfont_data = cidfont_data, + font_callback = font_callback, + vert_addfunc = function () end, -- dummy, set in ltj-direction.lua +} + +prepare_cid_font('Adobe', 'Japan1') diff --git a/macros/luatex/generic/luatexja/src/ltj-ruby.lua b/macros/luatex/generic/luatexja/src/ltj-ruby.lua new file mode 100644 index 0000000000..060b3226ad --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-ruby.lua @@ -0,0 +1,782 @@ +-- +-- ltj-ruby.lua +-- +luatexbase.provides_module({ + name = 'luatexja.ruby', + date = '2018/09/29', + description = 'Ruby annotation', +}) +luatexja.ruby = {} +luatexja.load_module('stack'); local ltjs = luatexja.stack +luatexja.load_module('base'); local ltjb = luatexja.base + +local to_node = node.direct.tonode +local to_direct = node.direct.todirect + +local setfield = node.direct.setfield +local setglue = luatexja.setglue +local getfield = node.direct.getfield +local getid = node.direct.getid +local getfont = node.direct.getfont +local getlist = node.direct.getlist +local getchar = node.direct.getchar +local getsubtype = node.direct.getsubtype + +local node_new = node.direct.new +local node_remove = node.direct.remove +local node_next = node.direct.getnext +local node_copy, node_free, node_tail = node.direct.copy, node.direct.free, node.direct.tail +local has_attr, set_attr = node.direct.has_attribute, node.direct.set_attribute +local insert_before, insert_after = node.direct.insert_before, node.direct.insert_after + +local id_hlist = node.id('hlist') +local id_vlist = node.id('vlist') +local id_rule = node.id('rule') +local id_whatsit = node.id('whatsit') +local id_glue = node.id('glue') +local id_kern = node.id('kern') +local id_penalty = node.id('penalty') +local sid_user = node.subtype('user_defined') +local ltjs_get_stack_table = luatexja.stack.get_stack_table +local id_pbox_w = 258 -- cluster which consists of a whatsit + +local attr_icflag = luatexbase.attributes['ltj@icflag'] +-- ルビ処理用の attribute は他のやつの流用なので注意! +-- 進入許容量 (sp) +local attr_ruby_maxprep = luatexbase.attributes['ltj@charclass'] +local attr_ruby_maxpostp = luatexbase.attributes['ltj@kcat0'] +local attr_ruby_maxmargin = luatexbase.attributes['ltj@kcat1'] +local attr_ruby_stretch = luatexbase.attributes['ltj@kcat2'] +local attr_ruby_mode = luatexbase.attributes['ltj@kcat3'] +local attr_ruby_id = luatexbase.attributes['ltj@kcat4'] -- uniq id +local attr_ruby_intergap = luatexbase.attributes['ltj@kcat5'] +local attr_ruby = luatexbase.attributes['ltj@rubyattr'] +-- ルビ内部処理用,以下のようにノードによって使われ方が異なる +-- * (whatsit) では JAglue 処理時に, +-- 「2つ前のクラスタもルビ」 ==> そのルビクラスタの id +-- otherwise ==> unset +-- * (whatsit).value node ではルビ全角の値(sp単位) +-- * 行分割で whatsit の前後に並ぶノードでは,「何番目のルビ関連ノード」か +-- * (whatsit).value に続く整形済み vbox たちでは post_intrusion の値 +local cat_lp = luatexbase.catcodetables['latex-package'] + +local round, floor = tex.round, math.floor +local min, max = math.min, math.max + +luatexja.userid_table.RUBY_PRE = luatexbase.newuserwhatsitid('ruby_pre', 'luatexja') +luatexja.userid_table.RUBY_POST = luatexbase.newuserwhatsitid('ruby_post', 'luatexja') +local RUBY_PRE = luatexja.userid_table.RUBY_PRE +local RUBY_POST = luatexja.userid_table.RUBY_POST +local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG + +---------------------------------------------------------------- +-- TeX interface 0 +---------------------------------------------------------------- +do + local getbox = node.direct.getbox + function luatexja.ruby.cpbox() return node_copy(getbox(0)) end +end + +---------------------------------------------------------------- +-- 補助関数群 1 +---------------------------------------------------------------- + +local function gauss(coef) + -- #coef 式,#coef 変数の連立1次方程式系を掃きだし法で解く. + local deg = #coef + for i = 1, deg do + if coef[i][i]==0 then + for j = i+1, deg do + if coef[j][i]~=0 then + coef[i], coef[j] = coef[j], coef[i]; break + end + end + end + for j = 1,deg do + local d = coef[i][i]; + if j~=i then + local e = coef[j][i] + for k = 1, deg+1 do coef[j][k] = coef[j][k] - e*coef[i][k]/d end + else + for k = 1, deg+1 do coef[i][k] = coef[i][k]/d end + end + end + end +end + +local function solve_1(coef) + local a, b, c = coef[1][4], coef[2][4], coef[3][4] + coef[1][4], coef[2][4], coef[3][4] = c-b, a+b-c, c-a + return coef +end + +local function solve_2(coef) + local a, b, c, d, e = coef[1][6], coef[2][6], coef[3][6], coef[4][6], coef[5][6] + coef[1][6], coef[2][6], coef[3][6], coef[4][6], coef[5][6] + = e-c, a+c-e, e-a-d, b+d-e, e-b + return coef +end + + +-- 実行回数 + ルビ中身 から uniq_id を作る関数 +luatexja.ruby.old_break_info = {} -- public, 前 run 時の分割情報 +local old_break_info = luatexja.ruby.old_break_info +local cache_handle +function luatexja.ruby.read_old_break_info() + if tex.jobname then + local fname = tex.jobname .. '.ltjruby' + local real_file = kpse.find_file(fname) + if real_file then dofile(real_file) end + cache_handle = io.open(fname, 'w') + end +end +local make_uniq_id +do + local exec_count = 0 + make_uniq_id = function (w) + exec_count = exec_count + 1 + return exec_count + end +end + +-- concatenation of boxes: reusing nodes +-- ルビ組版が行われている段落/hboxでの設定が使われる. +-- ルビ文字を格納しているボックスでの設定ではない! +local concat +do + local node_prev = node.direct.getprev + local function get_attr_icflag(p) + return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG + end + function concat(f, b) + if f then + if b then + local h, nh = getlist(f), getlist(b) + if getid(nh)==id_whatsit and getsubtype(nh)==sid_user then + nh=node_next(nh); node_free(node_prev(nh)) + end + set_attr(nh, attr_icflag, + get_attr_icflag(nh) + PROCESSED_BEGIN_FLAG) + setfield(node_tail(h), 'next', nh) + setfield(f, 'head', nil); node_free(f) + setfield(b, 'head', nil); node_free(b) + local g = luatexja.jfmglue.main(h,false) + return node.direct.hpack(g) + else + return f + end + elseif b then + return b + else + local h = node_new(id_hlist) + setfield(h, 'subtype', 0) + setfield(h, 'width', 0) + setfield(h, 'height', 0) + setfield(h, 'depth', 0) + setfield(h, 'glue_set', 0) + setfield(h, 'glue_order', 0) + setfield(h, 'head', nil) + return h + end + end +end + +local function expand_3bits(num) + local t = {}; local a = num + for i = 1, 10 do + t[i] = a%8; a = floor(a/8) + end + return t +end +---------------------------------------------------------------- +-- 補助関数群 2 +---------------------------------------------------------------- + +-- box の中身のノードは再利用される +local enlarge +do + local FROM_JFM = luatexja.icflag_table.FROM_JFM + local PROCESSED = luatexja.icflag_table.PROCESSED + local KANJI_SKIP = luatexja.icflag_table.KANJI_SKIP + local KANJI_SKIP_JFM = luatexja.icflag_table.KANJI_SKIP_JFM + local XKANJI_SKIP = luatexja.icflag_table.XKANJI_SKIP + local XKANJI_SKIP_JFM= luatexja.icflag_table.XKANJI_SKIP_JFM + enlarge = function (box, new_width, pre, middle, post, prenw, postnw) + -- pre, middle, post: 伸縮比率 + -- prenw, postnw: 前後の自然長 (sp) + local h = getlist(box); + local hh, hd = getfield(box, 'height'), getfield(box, 'depth') + local hx = h + while hx do + local hic = has_attr(hx, attr_icflag) or 0 + if (hic == KANJI_SKIP) or (hic == KANJI_SKIP_JFM) + or (hic == XKANJI_SKIP) or (hic == XKANJI_SKIP_JFM) + or ((hic<=FROM_JFM+63) and (hic>=FROM_JFM)) then + -- この 5 種類の空白をのばす + if getid(hx) == id_kern then + local k = node_new(id_glue) + setglue(k, getfield(hx, 'kern'), round(middle*65536), 0, + 2, 0) + setfield(k, 'subtype', 0); + h = insert_after(h, hx, k); + h = node_remove(h, hx); node_free(hx); hx = k + else -- glue + setglue(hx, getfield(hx, 'width'), round(middle*65536), 0, + 2, 0) + end + end + hx = node_next(hx) + end + -- 先頭の空白を挿入 + local k = node_new(id_glue); + setglue(k, prenw, round(pre*65536), 0, 2, 0) + h = insert_before(h, h, k); + -- 末尾の空白を挿入 + local k = node_new(id_glue); + setglue(k, postnw, round(post*65536), 0, 2, 0) + insert_after(h, node_tail(h), k); + -- hpack + setfield(box, 'head', nil); node_free(box) + box = node.direct.hpack(h, new_width, 'exactly') + setfield(box, 'height', hh) + setfield(box, 'depth', hd) + return box + end +end + + +---------------------------------------------------------------- +-- TeX interface +---------------------------------------------------------------- + +-- rtlr: ルビ部分のボックスたち r1, r2, ... +-- rtlp: 親文字 のボックスたち p1, p2, ... +local function texiface_low(rst, rtlr, rtlp) + local w = node_new(id_whatsit, sid_user) + setfield(w, 'type', 110); setfield(w, 'user_id', RUBY_PRE) + local wv = node_new(id_whatsit, sid_user) + setfield(w, 'value', to_node(wv)) + setfield(wv, 'type', 100) + setfield(wv, 'value', floor(#rtlr)) + setfield(wv, 'user_id', RUBY_PRE) -- dummy + set_attr(wv, attr_ruby, rst.rubyzw) + set_attr(wv, attr_ruby_maxmargin, rst.maxmargin) + set_attr(wv, attr_ruby_maxprep, rst.pre) + set_attr(wv, attr_ruby_maxpostp, rst.post) + set_attr(wv, attr_ruby_intergap, rst.intergap) + set_attr(wv, attr_ruby_stretch, rst.stretch) + set_attr(wv, attr_ruby_mode, rst.mode) + local n = wv + for i = 1, #rtlr do + _, n = insert_after(wv, n, rtlr[i]) + _, n = insert_after(wv, n, rtlp[i]) + end + -- w.value: (whatsit) .. r1 .. p1 .. r2 .. p2 + node.direct.write(w); return w,wv +end + +-- rst: table +function luatexja.ruby.texiface(rst, rtlr, rtlp) + if #rtlr ~= #rtlp then + for i=1, #rtlr do node_free(rtlr[i]) end + for i=1, #rtlp do node_free(rtlp[i]) end + ltjb.package_error('luatexja-ruby', + 'Group count mismatch between the ruby and\n' .. + 'the body (' .. #rtlr .. ' != ' .. #rtlp .. ').', + '') + else + local f = true + for i = 1,#rtlr do + if getfield(rtlr[i], 'width') > getfield(rtlp[i], 'width') then + f = false; break + end + end + if f then -- モノルビ * n + local r,p = {true}, {true} + for i = 1,#rtlr do + r[1] = rtlr[i]; p[1] = rtlp[i]; texiface_low(rst, r, p) + end + else + local w, wv = texiface_low(rst, rtlr, rtlp) + local id = make_uniq_id(w) + set_attr(wv, attr_ruby_id, id) + end + end +end + +---------------------------------------------------------------- +-- pre_line_break +---------------------------------------------------------------- + +-- r, p の中身のノードは再利用される +local function enlarge_parent(r, p, ppre, pmid, ppost, mapre, mapost, intmode) + -- r: ルビ部分の格納された box,p: 同,親文字 + local rwidth = getfield(r, 'width') + local sumprot = rwidth - getfield(p, 'width') -- >0 + local pre_intrusion, post_intrusion + if intmode == 0 then -- とりあえず組んでから決める + p = enlarge(p, rwidth, ppre, pmid, ppost, 0, 0) + pre_intrusion = min(mapre, round(ppre*getfield(p, 'glue_set')*65536)) + post_intrusion = min(mapost, round(ppost*getfield(p, 'glue_set')*65536)) + elseif intmode == 1 then + pre_intrusion = min(mapre, sumprot); + post_intrusion = min(mapost, max(sumprot-pre_intrusion, 0)) + p = enlarge(p, rwidth, ppre, pmid, ppost, pre_intrusion, post_intrusion) + elseif intmode == 2 then + post_intrusion = min(mapost, sumprot); + pre_intrusion = min(mapre, max(sumprot-post_intrusion, 0)) + p = enlarge(p, rwidth, ppre, pmid, ppost, pre_intrusion, post_intrusion) + else -- intmode == 3 + local n = min(mapre, mapost)*2 + if n < sumprot then + pre_intrusion = n/2; post_intrusion = n/2 + else + pre_intrusion = floor(sumprot/2); post_intrusion = sumprot - pre_intrusion + end + p = enlarge(p, rwidth, ppre, pmid, ppost, pre_intrusion, post_intrusion) + pre_intrusion = min(mapre, pre_intrusion + round(ppre*getfield(p, 'glue_set')*65536)) + post_intrusion = min(mapost, post_intrusion + round(ppost*getfield(p, 'glue_set')*65536)) + end + setfield(r, 'shift', -pre_intrusion) + local rwidth = rwidth - pre_intrusion - post_intrusion + setfield(r, 'width', rwidth) + setfield(p, 'width', rwidth) + local ps = getlist(p) + setfield(ps, 'width', getfield(ps, 'width') - pre_intrusion) + return r, p, post_intrusion +end + +-- ルビボックスの生成(単一グループ) +-- returned value: <new box>, <ruby width>, <post_intrusion> +local max_margin +local function new_ruby_box(r, p, ppre, pmid, ppost, + mapre, mapost, imode, rgap) + local post_intrusion = 0 + local intmode = imode%4 + local rpre, rmid, rpost, rsmash + imode = floor(imode/262144); rsmash = (imode%2 ==1) + imode = floor(imode/2); rpost = imode%8; + imode = (imode-rpost)/8; rmid = imode%8; + imode = (imode-rmid)/8; rpre = imode%8 + if getfield(r, 'width') > getfield(p, 'width') then -- change the width of p + r, p, post_intrusion = enlarge_parent(r, p, ppre, pmid, ppost, mapre, mapost, intmode) + elseif getfield(r, 'width') < getfield(p, 'width') then -- change the width of r + r = enlarge(r, getfield(p, 'width'), rpre, rmid, rpost, 0, 0) + post_intrusion = 0 + local need_repack = false + -- margin が大きくなりすぎた時の処理 + if round(rpre*getfield(r, 'glue_set')*65536) > max_margin then + local ps = getlist(r); need_repack = true + setfield(ps, 'width', max_margin) + setfield(ps, 'stretch', 1) -- 全く伸縮しないのも困る + end + if round(rpost*getfield(r, 'glue_set')*65536) > max_margin then + local ps = node_tail(getlist(r)); need_repack = true + setfield(ps, 'width', max_margin) + setfield(ps, 'stretch', 1) -- 全く伸縮しないのも困る + end + if need_repack then + local rt = r + r = node.direct.hpack(getlist(r), getfield(r, 'width'), 'exactly') + setfield(rt, 'head', nil); node_free(rt); + end + end + local a, k = node_new(id_rule), node_new(id_kern, 1) + setfield(a, 'width', 0); setfield(a, 'height', 0) + setfield(a, 'depth', 0); setfield(k, 'kern', rgap) + insert_after(r, r, a); insert_after(r, a, k); + insert_after(r, k, p); setfield(p, 'next', nil) + a = node.direct.vpack(r); setfield(a, 'shift', 0) + set_attr(a, attr_ruby, post_intrusion) + if rsmash or getfield(a, 'height')<getfield(p, 'height') then + local k = node_new(id_kern, 1) + setfield(k, 'kern', -getfield(a, 'height')+getfield(p, 'height')) + setfield(a, 'head', k); insert_before(r, r, k) + setfield(a, 'height', getfield(p, 'height')) + end + + return a, getfield(r, 'width'), post_intrusion +end + + +-- High-level routine in pre_linebreak_filter +local post_intrusion_backup +local max_allow_pre, max_allow_post + + +-- 中付き熟語ルビ,cmp containers +-- 「文字の構成を考えた」やつはどうしよう +local function pre_low_cal_box(w, cmp) + local rb = {} + local pb = {} + local kf = {} + -- kf[i] : container 1--i からなる行末形 + -- kf[cmp+i] : container i--cmp からなる行頭形 + -- kf[2cmp+1] : 行中形 + local wv = getfield(w, 'value') + local mdt -- nt*: node temp + local coef = {} -- 連立一次方程式の拡大係数行列 + local rtb = expand_3bits(has_attr(wv, attr_ruby_stretch)) + local rgap = has_attr(wv, attr_ruby_intergap) + local intmode = floor(has_attr(wv, attr_ruby_mode)/4) + + -- node list 展開・行末形の計算 + local nt, nta, ntb = wv, nil, nil -- nt*: node temp + for i = 1, cmp do + nt = node_next(nt); rb[i] = nt; nta = concat(nta, node_copy(nt)) + nt = node_next(nt); pb[i] = nt; ntb = concat(ntb, node_copy(nt)) + coef[i] = {} + for j = 1, 2*i do coef[i][j] = 1 end + for j = 2*i+1, 2*cmp+1 do coef[i][j] = 0 end + kf[i], coef[i][2*cmp+2] + = new_ruby_box(node_copy(nta), node_copy(ntb), + rtb[6], rtb[5], rtb[4], max_allow_pre, 0, intmode, rgap) + end + node_free(nta); node_free(ntb) + + -- 行頭形の計算 + local nta, ntb = nil, nil + for i = cmp,1,-1 do + coef[cmp+i] = {} + for j = 1, 2*i-1 do coef[cmp+i][j] = 0 end + for j = 2*i, 2*cmp+1 do coef[cmp+i][j] = 1 end + nta = concat(node_copy(rb[i]), nta); ntb = concat(node_copy(pb[i]), ntb) + kf[cmp+i], coef[cmp+i][2*cmp+2] + = new_ruby_box(node_copy(nta), node_copy(ntb), + rtb[9], rtb[8], rtb[7], 0, max_allow_post, intmode, rgap) + end + + -- ここで,nta, ntb には全 container を連結した box が入っているので + -- それを使って行中形を計算する. + coef[2*cmp+1] = {} + for j = 1, 2*cmp+1 do coef[2*cmp+1][j] = 1 end + kf[2*cmp+1], coef[2*cmp+1][2*cmp+2], post_intrusion_backup + = new_ruby_box(nta, ntb, rtb[3], rtb[2], rtb[1], + max_allow_pre, max_allow_post, intmode, rgap) + + -- w.value の node list 更新. + local nt = wv + node.direct.flush_list(node_next(wv)) + for i = 1, 2*cmp+1 do setfield(nt, 'next', kf[i]); nt = kf[i] end + + if cmp==1 then solve_1(coef) + elseif cmp==2 then solve_2(coef) + else + gauss(coef) -- 掃きだし法で連立方程式形 coef を解く + end + return coef +end + +local first_whatsit +do + local traverse_id = node.direct.traverse_id + function first_whatsit(n) -- n 以後で最初の whatsit + for h in traverse_id(id_whatsit, n) do + return h + end + return nil + end +end + +local next_cluster_array = {} +-- ノード追加 +local function pre_low_app_node(head, w, cmp, coef, ht, dp) + -- メインの node list 更新 + local nt = node_new(id_glue) + setglue(nt, coef[1][2*cmp+2], 0, 0, 0, 0) + set_attr(nt, attr_ruby, 1); set_attr(w, attr_ruby, 2) + head = insert_before(head, w, nt) + nt = w + for i = 1, cmp do + -- rule + local nta = node_new(id_rule); + setfield(nta, 'width', coef[i*2][2*cmp+2]) + setfield(nta, 'height', ht); setfield(nta, 'depth', dp) + setfield(nta, 'subtype', 0) + insert_after(head, nt, nta) + set_attr(nta, attr_ruby, 2*i+1) + -- glue + if i~=cmp or not next_cluster_array[w] then + nt = node_new(id_glue); insert_after(head, nta, nt) + else + nt = next_cluster_array[w] + end + setglue(nt, coef[i*2+1][2*cmp+2], 0, 0, 0, 0) + set_attr(nt, attr_ruby, 2*i+2) + end + tex.setattribute('global', attr_ruby, -0x7FFFFFFF) + setfield(w, 'user_id', RUBY_POST) + next_cluster_array[w]=nil + return head, first_whatsit(node_next(nt)) +end + +local function pre_high(ahead) + if not ahead then return ahead end + local head = to_direct(ahead) + post_intrusion_backup = 0 + local n = first_whatsit(head) + while n do + if getsubtype(n) == sid_user and getfield(n, 'user_id') == RUBY_PRE then + local nv = getfield(n, 'value') + max_allow_pre = has_attr(nv, attr_ruby_maxprep) or 0 + local atr = has_attr(n, attr_ruby) or 0 + if max_allow_pre < 0 then + if atr>0 then + -- 直前のルビで intrusion がおこる可能性あり. + -- 前 run のデータが残っていればそれを使用, + -- そうでなければ行中形のデータを利用する + local op = old_break_info[atr] or post_intrusion_backup + max_allow_pre = max(0, -max_allow_pre - op) + else + max_allow_pre = -max_allow_pre + end + end + post_intrusion_backup = 0 + max_allow_post = has_attr(nv, attr_ruby_maxpostp) or 0 + max_margin = has_attr(nv, attr_ruby_maxmargin) or 0 + local coef = pre_low_cal_box(n, getfield(nv, 'value')) + local s = node_tail(nv) --ルビ文字 + head, n = pre_low_app_node( + head, n, getfield(nv, 'value'), coef, + getfield(s, 'height'), getfield(s, 'depth') + ) + else + n = first_whatsit(node_next(n)) + end + end + return to_node(head) +end +luatexbase.add_to_callback('pre_linebreak_filter', pre_high, 'ltj.ruby.pre', 100) +luatexbase.add_to_callback('hpack_filter', pre_high, 'ltj.ruby.pre', 100) + +---------------------------------------------------------------- +-- post_line_break +---------------------------------------------------------------- +local post_lown +do + local function write_aux(wv, num) + local id = has_attr(wv, attr_ruby_id) + if id>0 and cache_handle then + cache_handle:write( + 'luatexja.ruby.old_break_info[' + .. tostring(id) .. ']=' .. num + .. '\n') + end + end + + post_lown = function (rs, rw, cmp, ch) + -- ch: the head of `current' hlist + if #rs ==0 or not rw then return ch end + local hn = has_attr(rs[1], attr_ruby) + local fn = has_attr(rs[#rs], attr_ruby) + local wv = getfield(rw, 'value') + if hn==1 then + if fn==2*cmp+2 then + local hn = node_tail(wv) + node_remove(wv, hn) + insert_after(ch, rs[1], hn) + set_attr(hn, attr_icflag, PROCESSED) + write_aux(wv, has_attr(hn, attr_ruby))-- 行中形 + else + local deg, hn = (fn-1)/2, wv + for i = 1, deg do hn = node_next(hn) end; + node_remove(wv, hn) + setfield(hn, 'next', nil) + insert_after(ch, rs[1], hn) + set_attr(hn, attr_icflag, PROCESSED) + write_aux(wv, has_attr(hn, attr_ruby)) + end + else + local deg, hn = max((hn-1)/2,2), wv + for i = 1, cmp+deg-1 do hn = node_next(hn) end + -- -1 is needed except the case hn = 3, + -- because a ending-line form is removed already from the list + node_remove(wv, hn); setfield(hn, 'next', nil) + insert_after(ch, rs[1], hn) + set_attr(hn, attr_icflag, PROCESSED) + if fn == 2*cmp-1 then + write_aux(wv, has_attr(hn, attr_ruby)) + end + end + for i = 1,#rs do + local ri = rs[i] + ch = node_remove(ch, ri); node_free(ri); + end + -- cleanup + if fn >= 2*cmp+1 then node_free(rw) end + return ch; + end +end + +local function post_high_break(head) + local rs = {} -- rs: sequence of ruby_nodes, + local rw = nil -- rw: main whatsit + local cmp = -2 -- dummy + for h in node.direct.traverse_id(id_hlist, to_direct(head)) do + for i = 1, #rs do rs[i] = nil end + local ha = getlist(h) + while ha do + local hai = getid(ha) + local i = ((hai == id_glue and getsubtype(ha)==0) + or (hai == id_rule and getsubtype(ha)==0) + or (hai == id_whatsit and getsubtype(ha)==sid_user + and getfield(ha, 'user_id', RUBY_POST))) + and has_attr(ha, attr_ruby) or 0 + if i==0 then + ha = node_next(ha) + elseif i==1 then + setfield(h, 'head', post_lown(rs, rw, cmp, getlist(h))) + for i = 2, #rs do rs[i] = nil end -- rs[1] is set by the next statement + rs[1], rw = ha, nil; ha = node_next(ha) + elseif i==2 then + rw = ha + cmp = getfield(getfield(rw, 'value'), 'value') + local hb, hc = node_remove(getlist(h), rw) + setfield(h, 'head', hb); ha = hc + else -- i>=3 + rs[#rs+1] = ha; ha = node_next(ha) + end + end + setfield(h, 'head', post_lown(rs, rw, cmp, getlist(h))) + end + return head +end + +local function post_high_hbox(ahead) + local ha = to_direct(ahead); local head = ha + local rs = {}; -- rs: sequence of ruby_nodes, + local rw = nil; -- rw: main whatsit + local cmp + while ha do + local hai = getid(ha) + local i = ((hai == id_glue and getsubtype(ha)==0) + or (hai == id_rule and getsubtype(ha)==0) + or (hai == id_whatsit and getsubtype(ha)==sid_user + and getfield(ha, 'user_id', RUBY_POST))) + and has_attr(ha, attr_ruby) or 0 + if i==0 then + ha = node_next(ha) + elseif i==1 then + head = post_lown(rs, rw, cmp, head) + for i = 2, #rs do rs[i] = nil end -- rs[1] is set by the next statement + rs[1], rw = ha, nil; ha = node_next(ha) + elseif i==2 then + rw = ha + cmp = getfield(getfield(rw, 'value'), 'value') + head, ha = node_remove(head, rw) + else -- i >= 3 + rs[#rs+1] = ha; ha = node_next(ha) + end + end + return to_node(post_lown(rs, rw, cmp, head)) +end + +luatexbase.add_to_callback('post_linebreak_filter', post_high_break, 'ltj.ruby.post_break', 100) +luatexbase.add_to_callback('hpack_filter', post_high_hbox, 'ltj.ruby.post_hbox', 101) + + +---------------------------------------------------------------- +-- for jfmglue callbacks +---------------------------------------------------------------- +do + local RIPRE = luatexja.stack_table_index.RIPRE + local function whatsit_callback(Np, lp, Nq) + if Np.nuc then return Np + elseif getfield(lp, 'user_id') == RUBY_PRE then + Np.first, Np.nuc, Np.last = lp, lp, lp + local lpv = getfield(lp, 'value') + local x = node_next(node_next(lpv)) + Np.last_char = luatexja.jfmglue.check_box_high(Np, getlist(x), nil) + if Nq.id ~=id_pbox_w then + if type(Nq.char)=='number' then + -- Nq is a JAchar + if has_attr(lpv, attr_ruby_maxprep) < 0 then -- auto + local p = round((ltjs.table_current_stack[RIPRE + Nq.char] or 0) + *has_attr(lpv, attr_ruby)) + if has_attr(lpv, attr_ruby_mode)%2 == 0 then -- intrusion 無効 + p = 0 + end + set_attr(lpv, attr_ruby_maxprep, -p) + end + if Nq.prev_ruby then + set_attr(lp, attr_ruby, Nq.prev_ruby) + end + elseif has_attr(lpv, attr_ruby_maxprep) < 0 then -- auto + if Nq.char == 'parbdd' then + local p = round((ltjs.table_current_stack[RIPRE-1] or 0) + *has_attr(lpv, attr_ruby)) + p = min(p, Nq.width) + if has_attr(lpv, attr_ruby_mode)%2 == 0 then -- intrusion 無効 + p = 0 + end + set_attr(lpv, attr_ruby_maxprep, p) + else + set_attr(lpv, attr_ruby_maxprep, 0) + end + end + elseif has_attr(lpv, attr_ruby_maxprep) < 0 then -- auto + set_attr(lpv, attr_ruby_maxprep, 0) + end + return Np + else + return Np + end + end + luatexbase.add_to_callback("luatexja.jfmglue.whatsit_getinfo", whatsit_callback, + "luatexja.ruby.np_info", 1) +end + +do + local RIPOST = luatexja.stack_table_index.RIPOST + local function whatsit_after_callback(s, Nq, Np) + if not s and getfield(Nq.nuc, 'user_id') == RUBY_PRE then + if Np then + local last_glue = node_new(id_glue) + set_attr(last_glue, attr_icflag, 0) + insert_before(Nq.nuc, Np.first, last_glue) + Np.first = last_glue + next_cluster_array[Nq.nuc] = last_glue -- ルビ処理用のグルー + end + local nqnv = getfield(Nq.nuc, 'value') + local x = node_next(node_next(nqnv)) + for i = 2, getfield(nqnv, 'value') do x = node_next(node_next(x)) end + Nq.last_char = luatexja.jfmglue.check_box_high(Nq, getlist(x), nil) + luatexja.jfmglue.after_hlist(Nq) + if Np and Np.id ~=id_pbox_w and type(Np.char)=='number' then + -- Np is a JAchar + local rm = has_attr(nqnv, attr_ruby_mode) + if has_attr(nqnv, attr_ruby_maxpostp) < 0 then -- auto + local p = round((ltjs.table_current_stack[RIPOST + Np.char] or 0) + *has_attr(nqnv, attr_ruby)) + if rm%2 == 0 then -- intrusion 無効 + p = 0 + end + if rm%4 >= 2 then + local q = has_attr(nqnv, attr_ruby_maxprep) + if q < p then p = q + elseif q > p then + set_attr(nqnv, attr_ruby_maxprep, p) + end + end + set_attr(nqnv, attr_ruby_maxpostp, p) + end + Np.prev_ruby = has_attr(getfield(Nq.nuc, 'value'), attr_ruby_id) + -- 前のクラスタがルビであったことのフラグ + else -- 直前が文字以外 + local nqnv = getfield(Nq.nuc, 'value') + if has_attr(nqnv, attr_ruby_maxpostp) < 0 then -- auto + set_attr(nqnv, attr_ruby_maxpostp, 0) + if has_attr(nqnv, attr_ruby_mode)%4 >= 2 then + set_attr(nqnv, attr_ruby_maxprep, 0) + end + end + end + return true + else + return s + end + end + luatexbase.add_to_callback("luatexja.jfmglue.whatsit_after", whatsit_after_callback, + "luatexja.ruby.np_info_after", 1) +end + diff --git a/macros/luatex/generic/luatexja/src/ltj-setwidth.lua b/macros/luatex/generic/luatexja/src/ltj-setwidth.lua new file mode 100644 index 0000000000..9f13c97c61 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-setwidth.lua @@ -0,0 +1,311 @@ +-- +-- src/ltj-setwidth.lua +-- + +luatexja.load_module('base'); local ltjb = luatexja.base +luatexja.load_module('stack'); local ltjs = luatexja.stack +luatexja.load_module('jfont'); local ltjf = luatexja.jfont +luatexja.load_module('direction'); local ltjd = luatexja.direction + +local setfield = node.direct.setfield +local getfield = node.direct.getfield +local getid = node.direct.getid +local getfont = node.direct.getfont +local getlist = node.direct.getlist +local getchar = node.direct.getchar +local getsubtype = node.direct.getsubtype +local getwidth = node.direct.getwidth or function(n) return getfield(n,'width') end +local getdepth = node.direct.getdepth or function(n) return getfield(n,'depth') end +local getwhd = node.direct.getwhd or function(n) + return getfield(n,'width'), getfield(n,'height'),getfield(n,'depth') end + +local setwhd = node.direct.setwhd or function(n,w,h,d) + setfield(n,'width',w); setfield(n,'height',h); setfield(n,'depth',d) end +local setchar = node.direct.setchar or function(n,c) setfield(n,'char',c) end +local setnext = node.direct.setnext or function(n,c) setfield(n,'next',c) end +local setdir = node.direct.setdir or function(n,c) setfield(n,'dir',c) end +local setkern = node.direct.setkern or function(n,c) setfield(n,'kern',c) end +local setoffsets = node.direct.setoffsets or function(n,x,y) + setfield(n,'xoffset',x); setfield(n,'yoffset',y) end +local getoffsets = node.direct.getoffsets or function(n) + return getfield(n,'xoffset'), getfield(n,'yoffset') end + +local node_traverse_id = node.direct.traverse_id +local node_traverse = node.direct.traverse +local node_new = node.direct.new +local node_copy = node.direct.copy +local node_remove = node.direct.remove +local node_tail = node.direct.tail +local node_next = node.direct.getnext +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local node_insert_before = node.direct.insert_before +local node_insert_after = node.direct.insert_after +local round = tex.round + +local id_glyph = node.id('glyph') +local id_kern = node.id('kern') +local id_hlist = node.id('hlist') +local id_vlist = node.id('vlist') +local id_rule = node.id('rule') +local id_math = node.id('math') +local id_whatsit = node.id('whatsit') +local sid_save = node.subtype('pdf_save') +local sid_restore = node.subtype('pdf_restore') +local sid_matrix = node.subtype('pdf_setmatrix') +local dir_tate = luatexja.dir_table.dir_tate + +local attr_ykblshift = luatexbase.attributes['ltj@ykblshift'] +local attr_tkblshift = luatexbase.attributes['ltj@tkblshift'] +local attr_icflag = luatexbase.attributes['ltj@icflag'] +local attr_vert_ori = luatexbase.attributes['ltj@vert@ori'] + +local ltjf_font_extra_info = ltjf.font_extra_info + +local PACKED = luatexja.icflag_table.PACKED +local PROCESSED = luatexja.icflag_table.PROCESSED + +local get_pr_begin_flag +do + local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG + local floor = math.floor + get_pr_begin_flag = function (p) + local i = has_attr(p, attr_icflag) or 0 + return i - i%PROCESSED_BEGIN_FLAG + end +end + +local ltjw = {} --export +luatexja.setwidth = ltjw + +luatexbase.create_callback("luatexja.set_width", "data", + function (fstable, fmtable, char_data) + return fstable + end) +local call_callback = luatexbase.call_callback + +local fshift = { down = 0, left = 0 } + +local min, max = math.min, math.max + +local rule_subtype = (status.luatex_version>=85) and 3 or 0 + +-- 和文文字の位置補正(横) +local function capsule_glyph_yoko(p, met, char_data, head, dir) + if not char_data then return node_next(p), head, p end + fshift.down = char_data.down; fshift.left = char_data.left + fshift = call_callback("luatexja.set_width", fshift, met, char_data) + local kbl = has_attr(p, attr_ykblshift) or 0 + -- + -- f*: whd specified in JFM + local pwidth, pheight,pdepth = getwhd(p) + local fwidth = char_data.width or pwidth + local fheight= char_data.height or pheight + local fdepth = char_data.depth or pdepth + if pwidth==fwidth then + -- 補正後glyph node は ht: p.height - kbl - down, dp: p.depth + min(0, kbl+down) を持つ + -- 設定されるべき寸法: ht: fheight - kbl, dp: fdepth + kbl + local ht_diff = fheight + fshift.down - pheight + local dp_diff = fdepth + kbl - pdepth - min(kbl + fshift.down, 0) + if ht_diff == 0 and dp_diff ==0 then -- offset only + set_attr(p, attr_icflag, PROCESSED) + local xo, yo = getoffsets(p) + setoffsets(p, xo - fshift.left, yo - kbl - fshift.down) + return node_next(p), head, p + elseif ht_diff >= 0 and dp_diff >=0 then -- rule + local box = node_new(id_rule,rule_subtype) + local xo, yo = getoffsets(p) + setoffsets(p, xo, yo - kbl - fshift.down) + setwhd(box, 0, fheight - kbl, fdepth + kbl) + setdir(box, dir) + set_attr(box, attr_icflag, PACKED) + set_attr(p, attr_icflag, PROCESSED) + head = p and node_insert_before(head, p, box) + or node_insert_after(head, node_tail(head), box) + return node_next(p), head, p, box + end + end + + local q + head, q = node_remove(head, p) + local xo, yo = getoffsets(p) + setoffsets(p, xo + char_data.align*(fwidth-pwidth) - fshift.left, + yo - fshift.down); + setnext(p, nil) + local box = node_new(id_hlist) + setwhd(box, fwidth, fheight, fdepth) + setfield(box, 'head', p) + setfield(box, 'shift', kbl) + setdir(box, dir) + set_attr(box, attr_icflag, PACKED) + head = q and node_insert_before(head, q, box) + or node_insert_after(head, node_tail(head), box) + return q, head, box +end + +luatexja.setwidth.capsule_glyph_yoko = capsule_glyph_yoko + +-- 和文文字の位置補正(縦) +-- UTR#50 で R もしくは Tr と指定されているが,縦組用グリフがないもの +local function capsule_glyph_tate_rot(p, met, char_data, head, dir, asc) + fshift.down = char_data.down; fshift.left = char_data.left + fshift = call_callback("luatexja.set_width", fshift, met, char_data) + local kbl = has_attr(p, attr_tkblshift) or 0 + -- f*: whd specified in JFM + local pwidth, pheight,pdepth = getwhd(p) + local fwidth = char_data.width or pwidth + local fheight= char_data.height or pheight + local fdepth = char_data.depth or pdepth + local q + head, q = node_remove(head, p) + local xo, yo = getoffsets(p) + setoffsets(p, xo + char_data.align*(fwidth-pwidth) - fshift.left, + yo - fshift.down - asc); + setnext(p, nil) + local box = node_new(id_hlist) + setwhd(box, fwidth, fheight, fdepth) + setfield(box, 'head', p) + setfield(box, 'shift', kbl) + setdir(box, dir) + set_attr(box, attr_icflag, PACKED) + head = q and node_insert_before(head, q, box) + or node_insert_after(head, node_tail(head), box) + return q, head, box +end + +local function capsule_glyph_tate(p, met, char_data, head, dir) + if not char_data then return node_next(p), head end + local ascent, descent = met.ascent, met.descent + local fwidth, pwidth = char_data.width + do + local pf, pc = getfont(p), getchar(p) + local feir = ltjf_font_extra_info[pf] + if feir and feir.rotation and met.vert_activated then + if feir.rotation[pc] and (has_attr(p, attr_vert_ori) or 0)<=0 then + return capsule_glyph_tate_rot(p, met, char_data, head, dir, 0.5*(ascent-descent)) + end + end + local ident = fonts.hashes.identifiers[pf] + pwidth = (ident.descriptions and ident.descriptions[pc] + and ident.descriptions[pc].vheight + and ident.descriptions[pc].vheight / ident.units * met.size) + or (ident.metadata and ident.metadata.defaultvheight) or (ascent+descent) + ascent = feir.vorigin[pc] and (feir.vorigin[pc] / ident.units * met.size) or ascent + end + fwidth = fwidth or pwidth + fshift.down = char_data.down; fshift.left = char_data.left + fshift = call_callback("luatexja.set_width", fshift, met, char_data) + local fheight = char_data.height or 0 + local fdepth = char_data.depth or 0 + local xo, yo = getoffsets(p) + local y_shift = xo + (has_attr(p,attr_tkblshift) or 0) + local q + head, q = node_remove(head, p) + local box = node_new(id_hlist) + setwhd(box, fwidth, fheight, fdepth) + setfield(box, 'shift', y_shift) + setdir(box, dir) + + setoffsets(p, -fshift.down, + yo -(ascent + char_data.align*(fwidth-pwidth) - fshift.left) ) + local ws = node_new(id_whatsit, sid_save) + local wm = node_new(id_whatsit, sid_matrix) + setfield(wm, 'data', '0 1 -1 0') + local pwnh = -round(0.5*getwidth(p)) + local k2 = node_new(id_kern, 1); setkern(k2, pwnh) + local k3 = node_new(id_kern, 1); setkern(k3, -getwidth(p)-pwnh) + local wr = node_new(id_whatsit, sid_restore) + setfield(box, 'head', ws) + setnext(ws, wm); setnext(wm, k2); + setnext(k2, p); setnext(p, k3); + setnext(k3, wr); + + set_attr(box, attr_icflag, PACKED) + head = q and node_insert_before(head, q, box) + or node_insert_after(head, node_tail(head), box) + return q, head, box +end +luatexja.setwidth.capsule_glyph_tate = capsule_glyph_tate + +local function capsule_glyph_math(p, met, char_data) + if not char_data then return nil end + local fwidth, pwidth = char_data.width, getwidth(p) + fwidth = fwidth or pwidth + fshift.down = char_data.down; fshift.left = char_data.left + fshift = call_callback("luatexja.set_width", fshift, met, char_data) + local fheight, fdepth = char_data.height, char_data.depth + local y_shift + = - getfield(p, 'yoffset') + (has_attr(p,attr_ykblshift) or 0) + setfield(p, 'yoffset', -fshift.down) + setfield(p, 'xoffset', getfield(p, 'xoffset') + char_data.align*(fwidth-pwidth) - fshift.left) + local box = node_new(id_hlist); + setwhd(box, fwidth, fheight, fdepth) + setfield(box, 'head', p) + setfield(box, 'shift', y_shift) + setdir(box, tex.mathdir) + set_attr(box, attr_icflag, PACKED) + return box +end +luatexja.setwidth.capsule_glyph_math = capsule_glyph_math + +-- 数式の位置補正 +function luatexja.setwidth.apply_ashift_math(head, last, attr_ablshift) + for p in node_traverse(head) do + local pid = getid(p) + if p==last then + return + elseif (has_attr(p, attr_icflag) or 0) ~= PROCESSED then + if pid==id_hlist or pid==id_vlist then + setfield(p, 'shift', getfield(p, 'shift') + (has_attr(p,attr_ablshift) or 0)) + elseif pid==id_rule then + local v = has_attr(p,attr_ablshift) or 0 + setfield(p, 'height', getfield(p, 'height')-v) + setfield(p, 'depth', getdepth(p)+v) + set_attr(p, attr_icflag, PROCESSED) + elseif pid==id_glyph then + -- 欧文文字; 和文文字は pid == id_hlist の場合で処理される + -- (see conv_jchar_to_hbox_A in ltj-math.lua) + setfield(p, 'yoffset', + getfield(p, 'yoffset') - (has_attr(p,attr_ablshift) or 0)) + end + set_attr(p, attr_icflag, PROCESSED) + end + end +end + +-- discretionary の位置補正 +do + local attr_yablshift = luatexbase.attributes['ltj@yablshift'] + local attr_tablshift = luatexbase.attributes['ltj@tablshift'] + local attr_ablshift + local disc, tex_dir + local function ashift_disc_inner(field) + local head = getfield(disc, field) + if not head then return end + local y_adjust, node_depth, adj_depth = 0, 0, 0 + for lp in node_traverse_id(id_glyph, head) do + y_adjust = has_attr(lp,attr_ablshift) or 0 + local ld = getdepth(lp) + node_depth = max(ld + min(y_adjust, 0), node_depth) + adj_depth = (y_adjust>0) and max(ld + y_adjust, adj_depth) or adj_depth + setfield(lp, 'yoffset', getfield(lp, 'yoffset') - y_adjust) + end + if adj_depth>node_depth then + local r = node_new(id_rule,rule_subtype) + setwhd(r, 0, 0, adj_depth); setdir(r, tex_dir) + set_attr(r, attr_icflag, PROCESSED) + if field=='post' then + node_insert_after(head, head, r) + else + setfield(disc, field, (node_insert_before(head, head, r))) + end + end + end + function luatexja.setwidth.apply_ashift_disc(d, is_dir_tate, dir) + attr_ablshift = is_dir_tate and attr_tablshift or attr_yablshift + disc, tex_dir = d, dir + ashift_disc_inner('pre') + ashift_disc_inner('post') + ashift_disc_inner('replace') + end +end diff --git a/macros/luatex/generic/luatexja/src/ltj-stack.lua b/macros/luatex/generic/luatexja/src/ltj-stack.lua new file mode 100644 index 0000000000..121804d20c --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-stack.lua @@ -0,0 +1,143 @@ +-- +-- luatexja/stack.lua +-- +luatexbase.provides_module({ + name = 'luatexja.stack', + date = '2018/02/18', + description = 'LuaTeX-ja stack system', +}) +luatexja.stack = {} +local ltjs=luatexja.stack +luatexja.load_module('base'); local ltjb = luatexja.base + +-------------------------------------------------------------------------------- +-- stack table (obeys TeX's grouping) +-------------------------------------------------------------------------------- +local node_new = node.new +local id_whatsit = node.id('whatsit') +local sid_user = node.subtype('user_defined') +local STCK = luatexja.userid_table.STCK +local fastcopy = table.fastcopy +local setcount = tex.setcount +local scan_int, scan_keyword = token.scan_int, token.scan_keyword +ltjs.hmode = 0 -- dummy + +local charprop_stack_table={}; +ltjs.charprop_stack_table = charprop_stack_table +charprop_stack_table[0]={} + + +local function get_stack_level() + local i = tex.getcount('ltj@@stack') + local j = tex.currentgrouplevel + if j > tex.getcount('ltj@@group@level') then + i = i+1 -- new stack level + local gd = tex.globaldefs + if gd~=0 then tex.globaldefs = 0 end + -- 'tex.globaldefs = 0' is local even if \globaldefs > 0. + setcount('ltj@@group@level', j) + for k,v in pairs(charprop_stack_table) do -- clear the stack above i + if k>=i then charprop_stack_table[k]=nil end + end + charprop_stack_table[i] = fastcopy(charprop_stack_table[i-1]) + setcount('ltj@@stack', i) + if gd~=0 then tex.globaldefs = gd end + if tex.nest[tex.nest.ptr].mode == -ltjs.hmode then -- rest. hmode のみ + local g = node_new(id_whatsit, sid_user) + g.user_id=STCK; g.type=100; g.value=j; node.write(g) + end + end + return i +end +ltjs.get_stack_level = get_stack_level + +local function set_stack_table(m, p) + local i = get_stack_level() + charprop_stack_table[i][m] = p + if luatexja.isglobal=='global' then + for j,v in pairs(charprop_stack_table) do + charprop_stack_table[j][m] = p + end + end +end +ltjs.set_stack_table = set_stack_table + +-- EXT +function ltjs.set_stack_perchar(m,lb,ub, getter) + local c = scan_int() + scan_keyword(',') + local p = tonumber((getter or scan_int)()) + if p<lb or p>ub then + ltjb.package_error('luatexja', + "invalid code (".. tostring(p) .. ")", + "The code should in the range "..tostring(lb) .. '..' .. + tostring(ub) .. ".\n" .. + "I'm going to use 0 instead of that illegal code value.") + p=0 + end + set_stack_table(m+ltjb.in_unicode(c, true), p) +end + +-- EXT +function ltjs.set_stack_font(m,c,p) + if type(c)~='number' or c<0 or c>255 then + ltjb.package_error('luatexja', + "invalid family number (".. tostring(c) .. ")", + "The family number should in the range 0 .. 255.\n" .. + "I'm going to use 0 instead of that illegal family number.") + c=0 + end + set_stack_table(m+c, p) +end + +-- EXT: sp: glue_spec +function ltjs.set_stack_skip(m,sp) + local i = get_stack_level() + if not sp then return end + if not charprop_stack_table[i][m] then + charprop_stack_table[i][m] = {} + end + charprop_stack_table[i][m].width = sp.width + charprop_stack_table[i][m].stretch = sp.stretch + charprop_stack_table[i][m].shrink = sp.shrink + charprop_stack_table[i][m].stretch_order = sp.stretch_order + charprop_stack_table[i][m].shrink_order = sp.shrink_order + if luatexja.isglobal=='global' then + for j,v in pairs(charprop_stack_table) do + if not charprop_stack_table[j][m] then charprop_stack_table[j][m] = {} end + charprop_stack_table[j][m].width = sp.width + charprop_stack_table[j][m].stretch = sp.stretch + charprop_stack_table[j][m].shrink = sp.shrink + charprop_stack_table[j][m].stretch_order = sp.stretch_order + charprop_stack_table[j][m].shrink_order = sp.shrink_order + end + end +end + +-- These three functions are used in ltj-jfmglue.lua. +-- list_dir and orig_char_table are used in other lua files. +local orig_char_table = {} +ltjs.orig_char_table = orig_char_table +ltjs.list_dir = nil -- dummy +ltjs.table_current_stack = nil -- dummy +function ltjs.report_stack_level(bsl) + ltjs.table_current_stack = charprop_stack_table[bsl] + return bsl +end +function ltjs.fast_get_stack_skip(m) + return ltjs.table_current_stack[m] + or { width = 0, stretch = 0, shrink = 0, stretch_order = 0, shrink_order = 0 } +end + +-- For other situations, use the following instead: +function ltjs.get_stack_skip(m, idx) + return charprop_stack_table[idx][m] + or { width = 0, stretch = 0, shrink = 0, stretch_order = 0, shrink_order = 0 } +end +function ltjs.get_stack_table(mc, d, idx) + local i = charprop_stack_table[idx][mc] + return i or d +end + + +-- EOF diff --git a/macros/luatex/generic/luatexja/src/ltj-unicode-ccfix.lua b/macros/luatex/generic/luatexja/src/ltj-unicode-ccfix.lua new file mode 100644 index 0000000000..47f41f359e --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltj-unicode-ccfix.lua @@ -0,0 +1,276 @@ +-- Do not edit this file! +-- Created from LineBreak.txt by ltj-unicode-ccfix_make.pl on 2019年 7月 8日 月曜日 06:15:17 JST. +-- In case of errors, fix the Perl script instead. +local tex_catcode = tex.setcatcode +local tex_getcc = tex.getcatcode +local function set_letter(b,e) + if tex_getcc(b)~=11 then + for i=b,e do tex_catcode('global', i, 11) end + end +end +set_letter(0x231A,0x231B) +set_letter(0x23F0,0x23F3) +set_letter(0x2600,0x2603) +set_letter(0x2614,0x2615) +set_letter(0x2618,0x2618) +set_letter(0x261A,0x261C) +set_letter(0x261E,0x261F) +set_letter(0x2639,0x263B) +set_letter(0x2668,0x2668) +set_letter(0x267F,0x267F) +set_letter(0x26BD,0x26C8) +set_letter(0x26CD,0x26CD) +set_letter(0x26CF,0x26D1) +set_letter(0x26D3,0x26D4) +set_letter(0x26D8,0x26D9) +set_letter(0x26DC,0x26DC) +set_letter(0x26DF,0x26E1) +set_letter(0x26EA,0x26EA) +set_letter(0x26F1,0x26F5) +set_letter(0x26F7,0x26F8) +set_letter(0x26FA,0x26FA) +set_letter(0x26FD,0x26FF) +set_letter(0x2700,0x2704) +set_letter(0x2708,0x2709) +set_letter(0x2764,0x2764) +set_letter(0x2E80,0x2E99) +set_letter(0x2E9B,0x2EF3) +set_letter(0x2F00,0x2FD5) +set_letter(0x2FF0,0x2FFB) +set_letter(0x3003,0x3003) +set_letter(0x3004,0x3004) +set_letter(0x3006,0x3006) +set_letter(0x3007,0x3007) +set_letter(0x3012,0x3013) +set_letter(0x3020,0x3020) +set_letter(0x3021,0x3029) +set_letter(0x3030,0x3030) +set_letter(0x3031,0x3034) +set_letter(0x3036,0x3037) +set_letter(0x3038,0x303A) +set_letter(0x303D,0x303D) +set_letter(0x303E,0x303F) +set_letter(0x3042,0x3042) +set_letter(0x3044,0x3044) +set_letter(0x3046,0x3046) +set_letter(0x3048,0x3048) +set_letter(0x304A,0x3062) +set_letter(0x3064,0x3082) +set_letter(0x3084,0x3084) +set_letter(0x3086,0x3086) +set_letter(0x3088,0x308D) +set_letter(0x308F,0x3094) +set_letter(0x309F,0x309F) +set_letter(0x30A2,0x30A2) +set_letter(0x30A4,0x30A4) +set_letter(0x30A6,0x30A6) +set_letter(0x30A8,0x30A8) +set_letter(0x30AA,0x30C2) +set_letter(0x30C4,0x30E2) +set_letter(0x30E4,0x30E4) +set_letter(0x30E6,0x30E6) +set_letter(0x30E8,0x30ED) +set_letter(0x30EF,0x30F4) +set_letter(0x30F7,0x30FA) +set_letter(0x30FF,0x30FF) +set_letter(0x3105,0x312F) +set_letter(0x3131,0x318E) +set_letter(0x3190,0x3191) +set_letter(0x3192,0x3195) +set_letter(0x3196,0x319F) +set_letter(0x31A0,0x31BA) +set_letter(0x31C0,0x31E3) +set_letter(0x3200,0x321E) +set_letter(0x3220,0x3229) +set_letter(0x322A,0x3247) +set_letter(0x3250,0x3250) +set_letter(0x3251,0x325F) +set_letter(0x3260,0x327F) +set_letter(0x3280,0x3289) +set_letter(0x328A,0x32B0) +set_letter(0x32B1,0x32BF) +set_letter(0x32C0,0x32FF) +set_letter(0x3300,0x33FF) +set_letter(0x3400,0x4DB5) +set_letter(0x4DB6,0x4DBF) +set_letter(0x4E00,0x9FEF) +set_letter(0x9FF0,0x9FFF) +set_letter(0xA000,0xA014) +set_letter(0xA016,0xA48C) +set_letter(0xA490,0xA4C6) +set_letter(0xF900,0xFA6D) +set_letter(0xFA6E,0xFA6F) +set_letter(0xFA70,0xFAD9) +set_letter(0xFADA,0xFAFF) +set_letter(0xFE30,0xFE30) +set_letter(0xFE31,0xFE32) +set_letter(0xFE33,0xFE34) +set_letter(0xFE45,0xFE46) +set_letter(0xFE49,0xFE4C) +set_letter(0xFE4D,0xFE4F) +set_letter(0xFE51,0xFE51) +set_letter(0xFE58,0xFE58) +set_letter(0xFE5F,0xFE61) +set_letter(0xFE62,0xFE62) +set_letter(0xFE63,0xFE63) +set_letter(0xFE64,0xFE66) +set_letter(0xFE68,0xFE68) +set_letter(0xFE6B,0xFE6B) +set_letter(0xFF02,0xFF03) +set_letter(0xFF06,0xFF07) +set_letter(0xFF0A,0xFF0A) +set_letter(0xFF0B,0xFF0B) +set_letter(0xFF0D,0xFF0D) +set_letter(0xFF0F,0xFF0F) +set_letter(0xFF10,0xFF19) +set_letter(0xFF1C,0xFF1E) +set_letter(0xFF20,0xFF20) +set_letter(0xFF21,0xFF3A) +set_letter(0xFF3C,0xFF3C) +set_letter(0xFF3E,0xFF3E) +set_letter(0xFF3F,0xFF3F) +set_letter(0xFF40,0xFF40) +set_letter(0xFF41,0xFF5A) +set_letter(0xFF5C,0xFF5C) +set_letter(0xFF5E,0xFF5E) +set_letter(0xFF66,0xFF66) +set_letter(0xFF71,0xFF9D) +set_letter(0xFFA0,0xFFBE) +set_letter(0xFFC2,0xFFC7) +set_letter(0xFFCA,0xFFCF) +set_letter(0xFFD2,0xFFD7) +set_letter(0xFFDA,0xFFDC) +set_letter(0xFFE2,0xFFE2) +set_letter(0xFFE3,0xFFE3) +set_letter(0xFFE4,0xFFE4) +set_letter(0x17000,0x187F7) +set_letter(0x18800,0x18AF2) +set_letter(0x1B000,0x1B0FF) +set_letter(0x1B100,0x1B11E) +set_letter(0x1B170,0x1B2FB) +set_letter(0x1F000,0x1F02B) +set_letter(0x1F02C,0x1F02F) +set_letter(0x1F030,0x1F093) +set_letter(0x1F094,0x1F09F) +set_letter(0x1F0A0,0x1F0AE) +set_letter(0x1F0AF,0x1F0B0) +set_letter(0x1F0B1,0x1F0BF) +set_letter(0x1F0C0,0x1F0C0) +set_letter(0x1F0C1,0x1F0CF) +set_letter(0x1F0D0,0x1F0D0) +set_letter(0x1F0D1,0x1F0F5) +set_letter(0x1F0F6,0x1F0FF) +set_letter(0x1F10D,0x1F10F) +set_letter(0x1F16D,0x1F16F) +set_letter(0x1F1AD,0x1F1E5) +set_letter(0x1F200,0x1F202) +set_letter(0x1F203,0x1F20F) +set_letter(0x1F210,0x1F23B) +set_letter(0x1F23C,0x1F23F) +set_letter(0x1F240,0x1F248) +set_letter(0x1F249,0x1F24F) +set_letter(0x1F250,0x1F251) +set_letter(0x1F252,0x1F25F) +set_letter(0x1F260,0x1F265) +set_letter(0x1F266,0x1F2FF) +set_letter(0x1F300,0x1F384) +set_letter(0x1F386,0x1F39B) +set_letter(0x1F39E,0x1F3B4) +set_letter(0x1F3B7,0x1F3BB) +set_letter(0x1F3BD,0x1F3C1) +set_letter(0x1F3C5,0x1F3C6) +set_letter(0x1F3C8,0x1F3C9) +set_letter(0x1F3CD,0x1F3FA) +set_letter(0x1F400,0x1F441) +set_letter(0x1F444,0x1F445) +set_letter(0x1F451,0x1F465) +set_letter(0x1F479,0x1F47B) +set_letter(0x1F47D,0x1F480) +set_letter(0x1F484,0x1F484) +set_letter(0x1F488,0x1F48E) +set_letter(0x1F490,0x1F490) +set_letter(0x1F492,0x1F49F) +set_letter(0x1F4A1,0x1F4A1) +set_letter(0x1F4A3,0x1F4A3) +set_letter(0x1F4A5,0x1F4A9) +set_letter(0x1F4AB,0x1F4AE) +set_letter(0x1F4B0,0x1F4B0) +set_letter(0x1F4B3,0x1F4FF) +set_letter(0x1F507,0x1F516) +set_letter(0x1F525,0x1F531) +set_letter(0x1F54A,0x1F573) +set_letter(0x1F576,0x1F579) +set_letter(0x1F57B,0x1F58F) +set_letter(0x1F591,0x1F594) +set_letter(0x1F597,0x1F5D3) +set_letter(0x1F5DC,0x1F5F3) +set_letter(0x1F5FA,0x1F5FF) +set_letter(0x1F600,0x1F644) +set_letter(0x1F648,0x1F64A) +set_letter(0x1F680,0x1F6A2) +set_letter(0x1F6A4,0x1F6B3) +set_letter(0x1F6B7,0x1F6BF) +set_letter(0x1F6C1,0x1F6CB) +set_letter(0x1F6CD,0x1F6D5) +set_letter(0x1F6D6,0x1F6DF) +set_letter(0x1F6E0,0x1F6EC) +set_letter(0x1F6ED,0x1F6EF) +set_letter(0x1F6F0,0x1F6FA) +set_letter(0x1F6FB,0x1F6FF) +set_letter(0x1F774,0x1F77F) +set_letter(0x1F7D5,0x1F7D8) +set_letter(0x1F7D9,0x1F7DF) +set_letter(0x1F7E0,0x1F7EB) +set_letter(0x1F7EC,0x1F7FF) +set_letter(0x1F80C,0x1F80F) +set_letter(0x1F848,0x1F84F) +set_letter(0x1F85A,0x1F85F) +set_letter(0x1F888,0x1F88F) +set_letter(0x1F8AE,0x1F8FF) +set_letter(0x1F90C,0x1F90C) +set_letter(0x1F90D,0x1F90E) +set_letter(0x1F910,0x1F917) +set_letter(0x1F920,0x1F925) +set_letter(0x1F927,0x1F92F) +set_letter(0x1F93A,0x1F93B) +set_letter(0x1F93F,0x1F971) +set_letter(0x1F972,0x1F972) +set_letter(0x1F973,0x1F976) +set_letter(0x1F977,0x1F979) +set_letter(0x1F97A,0x1F9A2) +set_letter(0x1F9A3,0x1F9A4) +set_letter(0x1F9A5,0x1F9AA) +set_letter(0x1F9AB,0x1F9AD) +set_letter(0x1F9AE,0x1F9B4) +set_letter(0x1F9B7,0x1F9B7) +set_letter(0x1F9BA,0x1F9BA) +set_letter(0x1F9BC,0x1F9CA) +set_letter(0x1F9CB,0x1F9CC) +set_letter(0x1F9D0,0x1F9D0) +set_letter(0x1F9DE,0x1F9FF) +set_letter(0x1FA54,0x1FA5F) +set_letter(0x1FA60,0x1FA6D) +set_letter(0x1FA6E,0x1FA6F) +set_letter(0x1FA70,0x1FA73) +set_letter(0x1FA74,0x1FA77) +set_letter(0x1FA78,0x1FA7A) +set_letter(0x1FA7B,0x1FA7F) +set_letter(0x1FA80,0x1FA82) +set_letter(0x1FA83,0x1FA8F) +set_letter(0x1FA90,0x1FA95) +set_letter(0x1FA96,0x1FAFF) +set_letter(0x1FB00,0x1FFFD) +set_letter(0x20000,0x2A6D6) +set_letter(0x2A6D7,0x2A6FF) +set_letter(0x2A700,0x2B734) +set_letter(0x2B735,0x2B73F) +set_letter(0x2B740,0x2B81D) +set_letter(0x2B81E,0x2B81F) +set_letter(0x2B820,0x2CEA1) +set_letter(0x2CEA2,0x2CEAF) +set_letter(0x2CEB0,0x2EBE0) +set_letter(0x2EBE1,0x2F7FF) +set_letter(0x2F800,0x2FA1D) +set_letter(0x2FA1E,0x2FA1F) +set_letter(0x2FA20,0x2FFFD) +set_letter(0x30000,0x3FFFD) diff --git a/macros/luatex/generic/luatexja/src/ltjclasses.dtx b/macros/luatex/generic/luatexja/src/ltjclasses.dtx new file mode 100644 index 0000000000..3112fd1c22 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltjclasses.dtx @@ -0,0 +1,4676 @@ +% \iffalse meta-comment +%% File: ltjclasses.dtx +% ----------------------------------------- +% Original: jclasses.dtx +% +% Copyright 1995-2001 ASCII Corporation. +% Copyright (c) 2010 ASCII MEDIA WORKS +% Copyright (c) 2016-2018 Japanese TeX Development Community +% +% This file is part of the pLaTeX2e system (community edition). +% ------------------------------------------------------------- +% +% \fi +% +% +% \setcounter{StandardModuleDepth}{1} +% \StopEventually{} +% +% \iffalse +% \changes{v1.0}{1995/04/19}{first edition} +% \changes{v1.0a}{1995/08/30}{ページスタイル部分の調整} +% \changes{v1.0b}{1995/11/08}{ページスタイル部分の調整} +% \changes{v1.0c}{1996/01/30}{\LaTeX\ \texttt{!<1995/12/01!>}での修正を反映} +% \changes{v1.0d}{1996/02/29}{デフォルトページスタイルの修正} +% \changes{v1.0e}{1996/03/14}{itemize, enumerate環境の修正} +% \changes{v1.0f}{1996/07/10}{面付けオプションを追加} +% \changes{v1.0g}{1996/09/03}{トンボの横に作成日時を出力するようにした} +% \changes{v1.1}{1997/01/16}{\LaTeX\ \texttt{!<1996/06/01!>}版に対応} +% \changes{v1.1a}{1997/01/23}{\LaTeX\ \texttt{!<1996/12/01!>}版に対応} +% \changes{v1.1a}{1997/01/25}{互換モードでp\LaTeX~2.09のa4jなどの +% 用紙オプションに対応} +% \changes{v1.1b}{1997/01/28}{日本語ファミリの宣言を再度、実装} +% \changes{v1.1d}{1997/01/29}{2eモードでa4jなどのオプションに対応} +% \changes{v1.1e}{1997/04/08}{トップマージンの値を修正} +% \changes{v1.1f}{1997/07/08}{縦組クラスでベースラインがおかしいのを修正} +% \changes{v1.1g}{1997/08/25}{片面印刷のとき、sectionレベルが出力されない +% のを修正} +% \changes{v1.1h}{1997/09/03}{landscape指定時の値を修正} +% \changes{v1.1i}{1997/12/12}{report, bookクラスで片面印刷時に、 +% bothstyleスタイルにすると、コンパイルエラーになるのを修正} +% \changes{v1.1j}{1998/02/03}{互換モード時のa5pのトップマージンを0.7in増加} +% \changes{v1.1k}{1998/03/23}{reportとbookクラスで番号を付けない見出しの +% ペナルティが\cs{M@}だったのを\cs{@M}に修正} +% \changes{v1.1m}{1998/04/07}{\cs{today}の計算手順を変更} +% \changes{v1.1n}{1998/10/13}{report,bookクラスの表番号が +% 見出しレベルに関係なくchapter番号が出力されてしまうのを修正} +% \changes{v1.1n}{1998/10/13}{mentukeオプションがエラーになっていたのを修正} +% \changes{v1.1o}{1998/12/24}{secnumdepthカウンタを$-1$以下にすると、 +% 見出し文字列も消えてしまうのを修正} +% \changes{v1.1p}{1999/1/6}{\cs{oddsidemargin}のポイントへの変換を後ろに} +% \changes{v1.1q}{1999/05/18}{縦組時のみに設定するようにした} +% \changes{v1.1r}{1999/08/09}{トップマージンの計算式を修正} +% \changes{v1.2}{2001/09/04}{\cs{chapter}の出力位置がアスタリスク形式と +% そうでないときと違うのを修正(ありがとう、鈴木@津さん)} +% \changes{v1.3}{2001/10/04}{目次のページ番号の書体を\cs{rmfamily}から +% \cs{normalfont}に変更(ありがとう、鈴木た@MILNさん)} +% \changes{v1.4}{2002/04/09}{縦組スタイルで\cs{flushbottom}しないようにした} +% \changes{v1.5}{2004/01/15}{\cs{part},\cs{chapter}の\cs{@afterindentfalse}を +% \cs{@afterindenttrue}に変更。 +% \cs{section},\cs{subsection},\cs{subsubsection}の前後空きの伸縮幅を修正。 +% (ありがとうございます、鈴木た@MILNさん)} +% \changes{v1.6}{2006/06/27}{フォントコマンドを修正。ありがとう、ymtさん。} +% \changes{v1.6-ltj}{2011/09/27}{jclasses.dtx v1.6 をベースにLua\LaTeX-ja用に修正。} +% \changes{v1.6-ltj-2}{2013/06/06}{luatexja.cfgに対応.} +% \changes{v1.6-ltj-3}{2014/06/08}{縦組クラスの時のgeometry.styに対応.} +% \changes{v1.6-ltj-4}{2014/06/30}{組方向の変更箇所を現行のLua\TeX-jaの仕様に合うように修正.} +% \changes{v1.6-ltj-5}{2014/07/02}{\cs{ifydir}, \cs{iftdir}を使わないように修正.} +% \changes{v1.6-ltj-6}{2014/07/28}{縦組クラスでlltjext.styを読み込むように修正.} +% \changes{v1.6-ltj-7}{2014/11/15}{縦組クラスとeveryshi.styとの相性が悪い問題を修正.} +% \changes{v1.6-ltj-8}{2014/11/22}{縦組時のgeometry.styへの対応を別ファイル(lltjp-geometry.sty)に分離.それに伴いv1.6-ltj-3での変更を削除.} +% \changes{v1.6-ltj-9}{2015/01/01}{縦組クラスの日付出力でエラーになることなどを修正.} +% \changes{v1.6-ltj-10}{2015/10/18}{Lua\TeX\ 0.81.0に伴うプリミティブ名の変更に対応.} +% \changes{v1.6-ltj-11}{2016/07/19}{トンボ使用時の用紙サイズの設定方法を変更(aminophenさん,ありがとうございます).} +% \changes{v1.7}{2016/11/12}{ドキュメントに反して\cs{@maketitle}が +% 空になっていなかったのを修正} +% \changes{v1.7}{2016/11/12}{use \cs{@width} (sync with classes.dtx v1.3a)} +% \changes{v1.7}{2016/11/12}{Replaced all \cs{hbox to} by +% \cs{hb@xt@} (sync with classes.dtx v1.3a)} +% \changes{v1.7}{2016/11/12}{Moved \cs{@mkboth} out of heading +% arg (sync with classes.dtx v1.4c)} +% \changes{v1.7}{2016/11/12}{\cs{columnsep}と\cs{columnseprule}の +% 変更を後ろに移動(sync with classes.dtx v1.4f)} +% \changes{v1.7a}{2016/11/16}{Check \texttt{@noskipsec} switch and +% possibly force horizontal mode (sync with classes.dtx v1.4a)} +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \changes{v1.7a}{2016/11/16}{Added \cs{nobreak} for +% latex/2343 (sync with ltsect.dtx v1.0z)} +% \changes{v1.7a}{2016/11/16}{Use \cs{expandafter} +% (sync with ltlists.dtx v1.0j)} +% \changes{v1.7b}{2016/11/22}{補足ドキュメントを追加} +% \changes{v1.7c}{2016/12/18}{Only add empty page after part if +% twoside and openright (sync with classes.dtx v1.4b)} +% \changes{v1.7c-ltj-12}{2017/01/17}{|\stockwidth|,~|\stockheight|をトンボオプション指定時にのみ定義 +% (aminophenさん,ありがとうございます).} +% \changes{v1.7c}{2016/12/18}{奇妙なarticleガードとコードを削除して +% ドキュメントを追加} +% \changes{v1.7d}{2017/02/15}{\cs{if@openleft}スイッチ追加} +% \changes{v1.7d}{2017/02/15}{openleftオプション追加} +% \changes{v1.7d}{2017/02/15}{\cs{cleardoublepage}の代用となる命令群を追加} +% \changes{v1.7d}{2017/02/15}{bookクラスでtitlepageを必ず奇数ページ +% に送るように変更} +% \changes{v1.7d}{2017/02/15}{titlepageのページ番号を奇数ならば1に、 +% 偶数ならば0にリセットするように変更} +% \changes{v1.7d}{2017/02/15}{縦組クラスの所属表示の番号を直立にした} +% \changes{v1.7d-ltj-13}{2017/02/19}{縦組時クラスで|ftnright|パッケージを使うと +% 脚注番号が上書きされ横に寝てしまう問題を修正(aminophenさん,ありがとうございます).} +% \changes{v1.7d-ltj-14}{2017/02/20}{openleftオプションの処理で\cs{iftdir}, \cs{ifydir}を +% 誤って使っている問題を修正(aminophenさん,ありがとうございます).} +% \changes{v1.7e}{2017/03/05}{トンボに表示するジョブ情報の書式を変更} +% \changes{v1.7e}{2017/03/05}{\cs{frontmatter}と\cs{mainmatter}を +% 奇数ページに送るように変更} +% \changes{v1.7e-ltj-15}{2017/08/31}{本ドキュメントのタイプセットで,小塚フォントが存在するときには +% それを用いるように変更(PDFサイズ削減のため).} +% \changes{v1.7f}{2017/08/31}{和文書体の基準を全角空白から「漢」に変更} +% \changes{v1.7g}{2017/09/19}{内部処理で使ったボックス0を空にした} +% \changes{v1.7h}{2018/02/04}{和文スケール値\cs{Cjascale}を定義} +% \changes{v1.8}{2018/07/03}{\cs{today}のデフォルトを和暦から西暦に変更} +% \changes{v1.8-ltj-16}{2018/10/08}{Lua\TeX-jaが|disablejfam|オプションをサポートしたことによる変更} +% \changes{v1.8a}{2018/10/25}{ファイル書き出し時の行末文字対策 +% (sync with ltsect.dtx 2018/09/26 v1.1c)} +% \changes{v1.8b}{2019/04/02}{新元号対応} +% \changes{v1.8b-ltj-17}{2019/08/12}{disablejfamの``Unused global option(s)''警告を出さないようにした} + +% \fi +% +% \iffalse +\NeedsTeXFormat{LaTeX2e} +%<*driver> +\ProvidesFile{ltjclasses.dtx} +%</driver> +%<*yoko> +%<article>\ProvidesClass{ltjarticle} +%<report>\ProvidesClass{ltjreport} +%<book>\ProvidesClass{ltjbook} +%<10pt&!bk>\ProvidesFile{ltjsize10.clo} +%<11pt&!bk>\ProvidesFile{ltjsize11.clo} +%<12pt&!bk>\ProvidesFile{ltjsize12.clo} +%<10pt&bk>\ProvidesFile{ltjbk10.clo} +%<11pt&bk>\ProvidesFile{ltjbk11.clo} +%<12pt&bk>\ProvidesFile{ltjbk12.clo} +%</yoko> +%<*tate> +%<article>\ProvidesClass{ltjtarticle} +%<report>\ProvidesClass{ltjtreport} +%<book>\ProvidesClass{ltjtbook} +%<10pt&!bk>\ProvidesFile{ltjtsize10.clo} +%<11pt&!bk>\ProvidesFile{ltjtsize11.clo} +%<12pt&!bk>\ProvidesFile{ltjtsize12.clo} +%<10pt&bk>\ProvidesFile{ltjtbk10.clo} +%<11pt&bk>\ProvidesFile{ltjtbk11.clo} +%<12pt&bk>\ProvidesFile{ltjtbk12.clo} +%</tate> + [2019/08/12 v1.8b-ltj-17 +%<article|report|book> Standard LuaLaTeX-ja class] +%<10pt|11pt|12pt> Standard LuaLaTeX-ja file (size option)] +%<*driver> +] +\documentclass{ltjltxdoc} +\GetFileInfo{ltjclasses.dtx} +\begingroup + \suppressfontnotfounderror=1 + \global\font\testfont=file:KozMinPr6N-Regular.otf +\endgroup +\ifx\testfont\nullfont + \usepackage[ipaex,nfssonly]{luatexja-preset} +\else + \usepackage[kozuka-pr6n,nfssonly]{luatexja-preset} +\fi +\def\pLaTeX{p\kern-.05em\LaTeX} +\usepackage[unicode]{hyperref} +\title{Lua\LaTeX-ja用\texttt{jclasses}互換クラス} +\author{Lua\TeX-jaプロジェクト} +\date{\filedate} +\begin{document} + \maketitle + \tableofcontents + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% \section{はじめに} +% このファイルは、Lua\LaTeX-ja用の|jclasses|互換クラスファイルです。 +% コミュニティ版をベースに作成しています。 +% \dst{}プログラムによって、横組用のクラスファイルと縦組用のクラスファイル +% を作成することができます。 +% +% 次に\dst{}プログラムのためのオプションを示します。 +% +% \DeleteShortVerb{\|} +% \begin{center} +% \begin{tabular}{l|l} +% \emph{オプション} & \emph{意味}\\\hline +% article & articleクラスを生成\\ +% report & reportクラスを生成\\ +% book & bookクラスを生成\\ +% 10pt & 10ptサイズの設定を生成\\ +% 11pt & 11ptサイズの設定を生成\\ +% 12pt & 12ptサイズの設定を生成\\ +% bk & bookクラス用のサイズの設定を生成\\ +% tate & 縦組用の設定を生成\\ +% yoko & 横組用の設定を生成\\ +% \end{tabular} +% \end{center} +% \MakeShortVerb{\|} +% +% \subsection{\texttt{jclasses.dtx} からの主な変更点} +% 全ての変更点を知りたい場合は、|jclasses.dtx|と|ltjclasses.dtx|で|diff|を +% とって下さい。 +% \begin{itemize} +% \item もし +% \begin{quotation} +% |! LaTeX Error: Too many math alphabets used in version ****.| +% \end{quotation} +% のエラーが起こった場合は、|lualatex-math|パッケージを読み込んでみて下さい。 +% \item 出力PDFの用紙サイズが自動的に設定されるようにしてあります。 +% %%%\item 縦組みクラスにおいて、|geometry|パッケージを読み込んだときに意図通りにならない問題に対応しました。% +% \end{itemize} +% +% \section{Lua\TeX-ja の読み込み} +% 最初に|luatexja|を読み込みます。 +% \begin{macrocode} +%<*article|report|book> +\RequirePackage{luatexja} +% \end{macrocode} +% +% \section{オプションスイッチ} +% ここでは、後ほど使用するいくつかのコマンドやスイッチを定義しています。 +% +% \begin{macro}{\c@@paper} +% 用紙サイズを示すために使います。 +% A4, A5, B4, B5用紙はそれぞれ、1, 2, 3, 4として表されます。 +% \begin{macrocode} +\newcounter{@paper} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@landscape} +% 用紙を横向きにするかどうかのスイッチです。デフォルトは、縦向きです。 +% \begin{macrocode} +\newif\if@landscape \@landscapefalse +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ptsize} +% 組版をするポイント数の一の位を保存するために使います。 +% 0, 1, 2のいずれかです。 +% \begin{macrocode} +\newcommand{\@ptsize}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@restonecol} +% 二段組時に用いるテンポラリスイッチです。 +% \begin{macrocode} +\newif\if@restonecol +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@titlepage} +% タイトルページやアブストラクト(概要)を +% 独立したページにするかどうかのスイッチです。 +% reportとbookスタイルのデフォルトでは、独立したページになります。 +% \begin{macrocode} +\newif\if@titlepage +%<article>\@titlepagefalse +%<report|book>\@titlepagetrue +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@openright} +% chapterレベルを右ページからはじめるかどうかのスイッチです。 +% 横組では奇数ページ、縦組では偶数ページから始まることになります。 +% reportクラスのデフォルトは、``no''です。 +% bookクラスのデフォルトは、``yes''です。 +% \begin{macrocode} +%<!article>\newif\if@openright +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@openleft} +% chapterレベルを左ページからはじめるかどうかのスイッチです。 +% 日本語\TeX{}開発コミュニティ版で新たに追加されました。 +% 横組では偶数ページ、縦組では奇数ページから始まることになります。 +% reportクラスとbookクラスの両方で、デフォルトは``no''です。 +% \changes{v1.7d}{2017/02/15}{\cs{if@openleft}スイッチ追加} +% \begin{macrocode} +%<!article>\newif\if@openleft +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0c}{1995/12/25}{Macro \cs{if@openbib} removed} +% +% \begin{macro}{\if@mainmatter} +% スイッチ|\@mainmatter|が真の場合、本文を処理しています。 +% このスイッチが偽の場合は、|\chapter|コマンドは見出し番号を出力しません。 +% \begin{macrocode} +%<book>\newif\if@mainmatter \@mainmattertrue +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\hour} +% \begin{macro}{\minute} +% \begin{macrocode} +\hour\time \divide\hour by 60\relax +\@tempcnta\hour \multiply\@tempcnta 60\relax +\minute\time \advance\minute-\@tempcnta +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\if@stysize} +% \changes{v1.1a}{1997/01/25}{Add \cs{if@stysize}.} +% \LaTeXe~2.09互換モードで、スタイルオプションにa4j, a5pなどが指定された +% ときの動作をエミュレートするためのフラグです。 +% \begin{macrocode} +\newif\if@stysize \@stysizefalse +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@mathrmmc} +% 和欧文両対応の数式文字コマンドを有効にするときに用いるフラグです。 +% マクロの展開順序が複雑になるのを避けるため、 +% デフォルトではfalseとしてあります。 +% \begin{macrocode} +\newif\if@mathrmmc \@mathrmmcfalse +% \end{macrocode} +% \end{macro} +% +% \section{オプションの宣言} +% ここでは、クラスオプションの宣言を行なっています。 +% +% \subsection{用紙オプション} +% 用紙サイズを指定するオプションです。 +% \begin{macrocode} +\DeclareOption{a4paper}{\setcounter{@paper}{1}% + \setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{a5paper}{\setcounter{@paper}{2}% + \setlength\paperheight {210mm} + \setlength\paperwidth {148mm}} +\DeclareOption{b4paper}{\setcounter{@paper}{3}% + \setlength\paperheight {364mm} + \setlength\paperwidth {257mm}} +\DeclareOption{b5paper}{\setcounter{@paper}{4}% + \setlength\paperheight {257mm} + \setlength\paperwidth {182mm}} +% \end{macrocode} +% \changes{v1.0a}{1995/09/26}{Change b4paper width/height 352x250 to 364x257} +% \changes{v1.0a}{1995/09/26}{Change b5paper width/height 250x176 to 257x182} +% ドキュメントクラスに、以下のオプションを指定すると、通常よりもテキストを +% 組み立てる領域の広いスタイルとすることができます。 +% \begin{macrocode} +% +\DeclareOption{a4j}{\setcounter{@paper}{1}\@stysizetrue + \setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{a5j}{\setcounter{@paper}{2}\@stysizetrue + \setlength\paperheight {210mm} + \setlength\paperwidth {148mm}} +\DeclareOption{b4j}{\setcounter{@paper}{3}\@stysizetrue + \setlength\paperheight {364mm} + \setlength\paperwidth {257mm}} +\DeclareOption{b5j}{\setcounter{@paper}{4}\@stysizetrue + \setlength\paperheight {257mm} + \setlength\paperwidth {182mm}} +% +\DeclareOption{a4p}{\setcounter{@paper}{1}\@stysizetrue + \setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{a5p}{\setcounter{@paper}{2}\@stysizetrue + \setlength\paperheight {210mm} + \setlength\paperwidth {148mm}} +\DeclareOption{b4p}{\setcounter{@paper}{3}\@stysizetrue + \setlength\paperheight {364mm} + \setlength\paperwidth {257mm}} +\DeclareOption{b5p}{\setcounter{@paper}{4}\@stysizetrue + \setlength\paperheight {257mm} + \setlength\paperwidth {182mm}} +% \end{macrocode} +% +% \subsection{サイズオプション} +% 基準となるフォントの大きさを指定するオプションです。 +% \begin{macrocode} +\if@compatibility + \renewcommand{\@ptsize}{0} +\else + \DeclareOption{10pt}{\renewcommand{\@ptsize}{0}} +\fi +\DeclareOption{11pt}{\renewcommand{\@ptsize}{1}} +\DeclareOption{12pt}{\renewcommand{\@ptsize}{2}} +% \end{macrocode} +% +% \subsection{横置きオプション} +% このオプションが指定されると、用紙の縦と横の長さを入れ換えます。 +% \changes{v1.1h}{1997/09/03}{オプションの処理時に縦横の値を交換} +% \changes{v1.1h}{1997/09/03}{landscapeオプションを互換モードでも有効に} +% \begin{macrocode} +\DeclareOption{landscape}{\@landscapetrue + \setlength\@tempdima{\paperheight}% + \setlength\paperheight{\paperwidth}% + \setlength\paperwidth{\@tempdima}} +% \end{macrocode} +% +% \subsection{トンボオプション} +% |tombow|オプションが指定されると、用紙サイズに合わせてトンボを出力します。 +% このとき、トンボの脇にPDFを作成した日付が出力されます。 +% 作成日付の出力を抑制するには、|tombow|ではなく、|tombo|と指定をします。 +% +% ジョブ情報の書式は元々|filename : 2017/3/5(13:3)|のような書式でしたが、 +% jsclassesにあわせて桁数固定の|filename (2017-03-05 13:03)|に直しました。 +% \changes{v1.0g}{1996/09/03}{Add to \cs{@bannertoken}.} +% \changes{v1.1a}{1997/01/23}{日付出力オプション} +% \changes{v1.7e}{2017/03/05}{トンボに表示するジョブ情報の書式を変更} +% \begin{macrocode} +\DeclareOption{tombow}{% + \tombowtrue \tombowdatetrue + \setlength{\@tombowwidth}{.1\p@}% + \@bannertoken{% + \jobname\space(\number\year-\two@digits\month-\two@digits\day + \space\two@digits\hour:\two@digits\minute)}% + \maketombowbox} +\DeclareOption{tombo}{% + \tombowtrue \tombowdatefalse + \setlength{\@tombowwidth}{.1\p@}% + \maketombowbox} +% \end{macrocode} +% +% \subsection{面付けオプション} +% このオプションが指定されると、トンボオプションを指定したときと同じ +% 位置に文章を出力します。作成したPDFをフィルムに面付け出力する場合など +% に指定をします。 +% \changes{v1.0f}{1996/07/10}{面付けオプションを追加} +% \changes{v1.1n}{1998/10/13} +% {動作していなかったのを修正。ありがとう、刀祢さん} +% \begin{macrocode} +\DeclareOption{mentuke}{% + \tombowtrue \tombowdatefalse + \setlength{\@tombowwidth}{\z@}% + \maketombowbox} +% \end{macrocode} +% +% \subsection{組方向オプション} +% このオプションが指定されると、縦組で組版をします。 +% \changes{v1.0g}{1997/01/25}{Insert \cs{hbox}, to switch tate-mode.} +% \changes{v1.1d}{1997/02/05}{開始ページがおかしくなるのを修正} +% \changes{v1.1f}{1997/07/08}{縦組時にベースラインがおかしくなるのを修正} +% +% \changes{v1.6-ltj-4}{2014/06/30}{本文の組方向を \cs{AtBeginDocument} で +% 変更することができなくなったことに対応} +% \begin{macrocode} +\DeclareOption{tate}{% + \tate\AtBeginDocument{\message{《縦組モード》}\adjustbaseline}% +} +% \end{macrocode} +% +% 縦組クラスと|everyshi|パッケージの相性が悪い問題に対処します。 +% この処理は、ZRさんの|pxeveryshi|パッケージと実質的に同じ内容です。 +% \begin{macrocode} +%<*tate> +\AtEndOfPackageFile{everyshi}{% + \def\@EveryShipout@Output{% + \setbox8\vbox{% + \yoko + \@EveryShipout@Hook + \@EveryShipout@AtNextHook + \global\setbox\luatexoutputbox=\box\luatexoutputbox + }% + \gdef\@EveryShipout@AtNextHook{}% + \@EveryShipout@Org@Shipout\box\luatexoutputbox + }} +%</tate> +% \end{macrocode} +% +% \subsection{両面、片面オプション} +% twosideオプションが指定されると、両面印字出力に適した整形を行ないます。 +% \begin{macrocode} +\DeclareOption{oneside}{\@twosidefalse} +\DeclareOption{twoside}{\@twosidetrue} +% \end{macrocode} +% +% \subsection{二段組オプション} +% 二段組にするかどうかのオプションです。 +% \begin{macrocode} +\DeclareOption{onecolumn}{\@twocolumnfalse} +\DeclareOption{twocolumn}{\@twocolumntrue} +% \end{macrocode} +% +% \subsection{表題ページオプション} +% |@titlepage|が真の場合、表題を独立したページに出力します。 +% \begin{macrocode} +\DeclareOption{titlepage}{\@titlepagetrue} +\DeclareOption{notitlepage}{\@titlepagefalse} +% \end{macrocode} +% +% \subsection{右左起こしオプション} +% chapterを右ページあるいは左ページから +% はじめるかどうかを指定するオプションです。 +% |openleft|オプションは日本語\TeX{}開発コミュニティによって追加されました。 +% \changes{v1.7d}{2017/02/15}{openleftオプション追加} +% \begin{macrocode} +%<!article>\if@compatibility +%<book>\@openrighttrue +%<!article>\else +%<!article>\DeclareOption{openright}{\@openrighttrue\@openleftfalse} +%<!article>\DeclareOption{openleft}{\@openlefttrue\@openrightfalse} +%<!article>\DeclareOption{openany}{\@openrightfalse\@openleftfalse} +%<!article>\fi +% \end{macrocode} +% +% \subsection{数式のオプション} +% \Lopt{leqno}を指定すると、数式番号を数式の左側に出力します。 +% \Lopt{fleqn}を指定するとディスプレイ数式を左揃えで出力します。 +% \begin{macrocode} +\DeclareOption{leqno}{\input{leqno.clo}} +\DeclareOption{fleqn}{\input{fleqn.clo}} +% \end{macrocode} +% +% \subsection{参考文献のオプション} +% 参考文献一覧を``オープンスタイル''の書式で出力します。 +% これは各ブロックが改行で区切られ、|\bibindent|のインデントが付く書式です。 +% \changes{v1.0c}{1995/12/25}{openbibオプションを再実装} +% \begin{macrocode} +\DeclareOption{openbib}{% +% \end{macrocode} +% 参考文献環境内の最初のいくつかのフックを満たします。 +% \begin{macrocode} + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% +% \end{macrocode} +% そして、|\newblock|を再定義します。 +% \begin{macrocode} + \renewcommand\newblock{\par}}} +% \end{macrocode} +% +% \subsection{日本語ファミリ宣言の抑制、和欧文両対応の数式文字} +% p\TeX では数式ファミリの数が16個だったので日本語ファミリ宣言を抑制する +% |disablejfam|オプションが用意されていましたが、Lua\TeX ではOmega拡張が +% 取り込まれて数式ファミリは256個まで使用できるため、このオプションは必要ありません。 +% ただし、\LaTeXe カーネルでは未だに数式ファミリの数は16個に制限されているので、 +% 実際に使用可能な数式ファミリの数を増やすためには|lualatex-math|パッケージを +% 読み込む必要があることに注意が必要です。 +% +% |mathrmmc|オプションは、 +% |\mathrm|と|\mathbf|を和欧文両対応にするためのクラスオプションです。 +% \changes{v1.1d}{1992/02/04}{disablejfamの判断を間違えてたのを修正} +% \changes{v1.8-ltj-16}{2018/10/08}{Lua\TeX-ja本体が,主にメモリ消費を抑える目的で +% |disablejfam|オプションをサポートしました。そのため以前出していた警告は削除します。} +% \begin{macrocode} +\if@compatibility + \@mathrmmctrue +\else + \DeclareOption{mathrmmc}{\@mathrmmctrue} +\fi +% \end{macrocode} +% +% +% \subsection{ドラフトオプション} +% |draft|オプションを指定すると、オーバフルボックスの起きた箇所に、 +% 5ptの罫線が引かれます。 +% \begin{macrocode} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +%</article|report|book> +% \end{macrocode} +% +% \subsection{フォントメトリックの変更} +% +% Lua\LaTeX-jaの標準では、OTFパッケージ由来のメトリックが使われるようになっています。 +% 本クラスでは、「p\TeX の組版と互換性をできるだけ持たせる」例を提示するため、 +% \begin{itemize} +% \item メトリックを\texttt{min10.tfm}ベースの\texttt{jfm-min.lua}に変更。 +% \item 明朝とゴシックは両方とも\texttt{jfm-min.lua}を用いるが、 +% 和文処理用グルー挿入時には「違うメトリックを使用」として思わせる。 +% \item p\TeX と同様に、「異なるメトリックの2つの和文文字」の間には、両者から定める +% グルーを両方挿入する。 +% \item calllbackを利用し、標準で用いる\texttt{jfm-min.lua}を、段落始めの括弧が全角二分下がりになるように内部で変更している。 +% +% \end{itemize} +% +% |\ltj@stdmcfont|,~|\ltj@stdgtfont| による、デフォルトで使われ明朝・ゴシックのフォントの +% 設定に対応しました。この2つの命令の値はユーザが日々の利用でその都度指定するものではなく、 +% 何らかの理由で非埋め込みフォントが正しく利用できない場合にのみ |luatexja.cfg| によって +% セットされるものです。 +% +% \changes{v1.6-ltj-9}{2015/01/01}{サイズクラスのロード前にメトリックの変更を行わないと, +% \cs{Cht}等の値が反映されないのでこの場所に移動させました.} +% +% \begin{macrocode} +%<*article|report|book> +\directlua{luatexbase.add_to_callback('luatexja.load_jfm', + function (ji, jn) ji.chars['parbdd'] = 0; return ji end, + 'ltj.jclasses_load_jfm', 1)} +{\jfont\g=\ltj@stdmcfont:jfm=min } % loading jfm-min.lua +\expandafter\let\csname JY3/mc/m/n/10\endcsname\relax +\DeclareFontShape{JY3}{mc}{m}{n}{<-> s * [0.962216] \ltj@stdmcfont:jfm=min}{} +\DeclareFontShape{JY3}{gt}{m}{n}{<-> s * [0.962216] \ltj@stdgtfont:jfm=min;jfmvar=goth}{} +\ltjglobalsetparameter{differentjfm=both} +\directlua{luatexbase.remove_from_callback('luatexja.load_jfm', 'ltj.jclasses_load_jfm')} +%</article|report|book> +% \end{macrocode} +% +% \subsection{disablejfamオプション} +% \changes{v1.8b-ltj-17}{2019/08/12}{disablejfamの``Unused global option(s)''警告を出さないようにした} +% disablejfamオプションはLua\TeX-ja本体で処理しますが, +% もうLua\TeX-jaは読み込んでいるため,このままでは``Unused global option(s): [disablejfam]''警告が +% 出てしまいます.そのため,「何もしない」disablejfamオプションをクラス内で定義しておきます. +% +% \begin{macrocode} +%<*article|report|book> +\DeclareOption{disablejfam}{} +%</article|report|book> +% \end{macrocode} +% +% \subsection{オプションの実行} +% オプションの実行、およびサイズクラスのロードを行ないます。 +% \begin{macrocode} +%<*article|report|book> +%<*article> +%<tate>\ExecuteOptions{a4paper,10pt,oneside,onecolumn,final,tate} +%<yoko>\ExecuteOptions{a4paper,10pt,oneside,onecolumn,final} +%</article> +%<*report> +%<tate>\ExecuteOptions{a4paper,10pt,oneside,onecolumn,final,openany,tate} +%<yoko>\ExecuteOptions{a4paper,10pt,oneside,onecolumn,final,openany} +%</report> +%<*book> +%<tate>\ExecuteOptions{a4paper,10pt,twoside,onecolumn,final,openright,tate} +%<yoko>\ExecuteOptions{a4paper,10pt,twoside,onecolumn,final,openright} +%</book> +\ProcessOptions\relax +%<book&tate>\input{ltjtbk1\@ptsize.clo} +%<!book&tate>\input{ltjtsize1\@ptsize.clo} +%<book&yoko>\input{ltjbk1\@ptsize.clo} +%<!book&yoko>\input{ltjsize1\@ptsize.clo} +% \end{macrocode} +% 縦組用クラスファイルの場合は、ここで\file{plext.sty}も読み込みます。 +% \changes{v1.0e}{1996/03/21}{\cs{usepackage} to \cs{RequirePackage}} +% \changes{v1.6-ltj-6}{2014/07/28}{Lua\TeX-jaでは,代わりに\file{lltjext.sty}を読み込みま +% す.これは\file{plext.sty}をLua\TeX-ja用に書きなおしたものです.} +% \begin{macrocode} +%<tate>\RequirePackage{lltjext} +%</article|report|book> +% \end{macrocode} +% +% \section{フォント} +% +% ここでは、\LaTeX{}のフォントサイズコマンドの定義をしています。 +% フォントサイズコマンドの定義は、次のコマンドを用います。 +% +% |\@setfontsize||\size|\meta{font-size}\meta{baselineskip} +% +% \begin{description} +% \item[\meta{font-size}] これから使用する、フォントの実際の大きさです。 +% \item[\meta{baselineskip}] 選択されるフォントサイズ用の通常の +% |\baselineskip|の値です(実際は、|\baselinestretch| * \meta{baselineskip} +% の値です)。 +% \end{description} +% +% 数値コマンドは、次のように\LaTeX{}カーネルで定義されています。 +% \begin{center} +% \begin{tabular}{ll@{\qquad}ll@{\qquad}ll} +% \verb=\@vpt= & 5 & \verb=\@vipt= & 6 & \verb=\@viipt= & 7 \\ +% \verb=\@viiipt= & 8 & \verb=\@ixpt= & 9 & \verb=\@xpt= & 10 \\ +% \verb=\@xipt= & 10.95 & \verb=\@xiipt= & 12 & \verb=\@xivpt= & 14.4\\ +% ... +% \end{tabular} +% \end{center} +% +% \begin{macro}{\normalsize} +% \begin{macro}{\@normalsize} +% 基本サイズとするユーザレベルのコマンドは|\normalsize|です。 +% \LaTeX{}の内部では|\@normalsize|を使用します。 +% +% |\normalsize|マクロは、|\abovedisplayskip|と +% |\abovedisplayshortskip|、および|\belowdisplayshortskip|の値も設定をします。 +% |\belowdisplayskip|は、つねに|\abovedisplayskip|と同値です。 +% +% また、リスト環境のトップレベルのパラメータは、つねに|\@listI|で与えられます。 +% \begin{macrocode} +%<*10pt|11pt|12pt> +\renewcommand{\normalsize}{% +%<10pt&yoko> \@setfontsize\normalsize\@xpt{15}% +%<11pt&yoko> \@setfontsize\normalsize\@xipt{15.5}% +%<12pt&yoko> \@setfontsize\normalsize\@xiipt{16.5}% +%<10pt&tate> \@setfontsize\normalsize\@xpt{17}% +%<11pt&tate> \@setfontsize\normalsize\@xipt{17}% +%<12pt&tate> \@setfontsize\normalsize\@xiipt{18}% +%<*10pt> + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ +%</10pt> +%<*11pt> + \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ +%</11pt> +%<*12pt> + \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ +%</12pt> + \belowdisplayskip \abovedisplayskip + \let\@listi\@listI} +% \end{macrocode} +% +% ここで、ノーマルフォントを選択し、初期化をします。 +% このとき、縦組モードならば、デフォルトのエンコードを変更します。 +% \begin{macrocode} +%<tate>\def\kanjiencodingdefault{JT3}% +%<tate>\kanjiencoding{\kanjiencodingdefault}% +\normalsize +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Cht} +% \begin{macro}{\Cdp} +% \begin{macro}{\Cwd} +% \begin{macro}{\Cvs} +% \begin{macro}{\Chs} +% 基準となる長さの設定をします。これらのパラメータは\file{lltjfont.sty}で定義 +% されています。基準とする文字を「全角空白」(EUCコード\texttt{0xA1A1})から +% 「漢」(JISコード\texttt{0x3441})へ変更しました。 +% \changes{v1.7f}{2017/08/31}{和文書体の基準を全角空白から「漢」に変更} +% \changes{v1.7g}{2017/09/19}{内部処理で使ったボックス0を空にした} +% \begin{macrocode} +\setbox0\hbox{漢} +\setlength\Cht{\ht0} +\setlength\Cdp{\dp0} +\setlength\Cwd{\wd0} +\setlength\Cvs{\baselineskip} +\setlength\Chs{\wd0} +\setbox0=\box\voidb@x +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\small} +% |\small|コマンドの定義は、|\normalsize|に似ています。 +% \begin{macrocode} +\newcommand{\small}{% +%<*10pt> + \@setfontsize\small\@ixpt{11}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 4\p@ \@plus2\p@ \@minus2\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep}% +%</10pt> +%<*11pt> + \@setfontsize\small\@xpt\@xiipt + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 6\p@ \@plus2\p@ \@minus2\p@ + \parsep 3\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep}% +%</11pt> +%<*12pt> + \@setfontsize\small\@xipt{13.6}% + \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 9\p@ \@plus3\p@ \@minus5\p@ + \parsep 4.5\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep}% +%</12pt> + \belowdisplayskip \abovedisplayskip} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footnotesize} +% |\footnotesize|コマンドの定義は、|\normalsize|に似ています。 +% \begin{macrocode} +\newcommand{\footnotesize}{% +%<*10pt> + \@setfontsize\footnotesize\@viiipt{9.5}% + \abovedisplayskip 6\p@ \@plus2\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus\p@ + \belowdisplayshortskip 3\p@ \@plus\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 3\p@ \@plus\p@ \@minus\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep}% +%</10pt> +%<*11pt> + \@setfontsize\footnotesize\@ixpt{11}% + \abovedisplayskip 8\p@ \@plus2\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 4\p@ \@plus2\p@ \@minus2\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep}% +%</11pt> +%<*12pt> + \@setfontsize\footnotesize\@xpt\@xiipt + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 6\p@ \@plus2\p@ \@minus2\p@ + \parsep 3\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep}% +%</12pt> + \belowdisplayskip \abovedisplayskip} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\scriptsize} +% \begin{macro}{\tiny} +% \begin{macro}{\large} +% \begin{macro}{\Large} +% \begin{macro}{\LARGE} +% \begin{macro}{\huge} +% \begin{macro}{\Huge} +% これらは先ほどのマクロよりも簡単です。これらはフォントサイズを変更する +% だけで、リスト環境とディスプレイ数式のパラメータは変更しません。 +% \begin{macrocode} +%<*10pt> +\newcommand{\scriptsize}{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand{\tiny}{\@setfontsize\tiny\@vpt\@vipt} +\newcommand{\large}{\@setfontsize\large\@xiipt{17}} +\newcommand{\Large}{\@setfontsize\Large\@xivpt{21}} +\newcommand{\LARGE}{\@setfontsize\LARGE\@xviipt{25}} +\newcommand{\huge}{\@setfontsize\huge\@xxpt{28}} +\newcommand{\Huge}{\@setfontsize\Huge\@xxvpt{33}} +%</10pt> +%<*11pt> +\newcommand{\scriptsize}{\@setfontsize\scriptsize\@viiipt{9.5}} +\newcommand{\tiny}{\@setfontsize\tiny\@vipt\@viipt} +\newcommand{\large}{\@setfontsize\large\@xiipt{17}} +\newcommand{\Large}{\@setfontsize\Large\@xivpt{21}} +\newcommand{\LARGE}{\@setfontsize\LARGE\@xviipt{25}} +\newcommand{\huge}{\@setfontsize\huge\@xxpt{28}} +\newcommand{\Huge}{\@setfontsize\Huge\@xxvpt{33}} +%</11pt> +%<*12pt> +\newcommand{\scriptsize}{\@setfontsize\scriptsize\@viiipt{9.5}} +\newcommand{\tiny}{\@setfontsize\tiny\@vipt\@viipt} +\newcommand{\large}{\@setfontsize\large\@xivpt{21}} +\newcommand{\Large}{\@setfontsize\Large\@xviipt{25}} +\newcommand{\LARGE}{\@setfontsize\LARGE\@xxpt{28}} +\newcommand{\huge}{\@setfontsize\huge\@xxvpt{33}} +\let\Huge=\huge +%</12pt> +%</10pt|11pt|12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Cjascale} +% このクラスファイルが意図する和文スケール値 +% ($1\,\mathrm{zw} \div \textmc{要求サイズ}$)を +% 表す実数値マクロ|\Cjascale|を定義します。 +% この\texttt{jclasses}互換クラスでは、Lua\TeX-ja読み込み時の和文スケール値がそのまま +% 使用され、その値は0.962216です。 +% \changes{v1.7h}{2018/02/04}{和文スケール値\cs{Cjascale}を定義} +% \begin{macrocode} +%<*article|report|book> +\def\Cjascale{0.962216} +%</article|report|book> +% \end{macrocode} +% \end{macro} +% +% +% +% \section{レイアウト} +% +% \subsection{用紙サイズの決定} +% +% \begin{macro}{\columnsep} +% \begin{macro}{\columnseprule} +% |\columnsep|は、二段組のときの、左右(あるいは上下)の段間の幅です。 +% このスペースの中央に|\columnseprule|の幅の罫線が引かれます。 +% \changes{v1.0g}{1997/01/25}{\cs{columnsep}: 10pt to 3\cs{Cwd} or 2\cs{Cwd}.} +% \begin{macrocode} +%<*article|report|book> +\if@stysize +%<tate> \setlength\columnsep{3\Cwd} +%<yoko> \setlength\columnsep{2\Cwd} +\else + \setlength\columnsep{10\p@} +\fi +\setlength\columnseprule{0\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\pagewidth} +% \begin{macro}{\pageheight} +% \begin{macro}{\stockwidth} +% \begin{macro}{\stockheight} +% 出力のPDFの用紙サイズをここで設定しておきます。 +% |tombow|が真のときは2インチ足しておきます。 +% +% [2015-10-18 LTJ] Lua\TeX\ 0.81.0ではプリミティブの名称変更がされたので, +% それに合わせておきます. +% +% [2016-07-19 LTJ] luatex.defが新しくなったことに対応するaminophenさんのパッチを取り込みました。 +% +% [2017-01-17 LTJ] [lt]jsclassesに合わせ,トンボオプションが指定されているとき「だけ」|\stockwidth|, +% |\stockheight|を定義するようにしました。aminophenさん,ありがとうございます. +% +% \begin{macrocode} +\iftombow + \newlength{\stockwidth} + \newlength{\stockheight} + \setlength{\stockwidth}{\paperwidth} + \setlength{\stockheight}{\paperheight} + \advance \stockwidth 2in + \advance \stockheight 2in + \ifdefined\pdfpagewidth + \setlength{\pdfpagewidth}{\stockwidth} + \setlength{\pdfpageheight}{\stockheight} + \else + \setlength{\pagewidth}{\stockwidth} + \setlength{\pageheight}{\stockheight} + \fi +\else + \ifdefined\pdfpagewidth + \setlength{\pdfpagewidth}{\paperwidth} + \setlength{\pdfpageheight}{\paperheight} + \else + \setlength{\pagewidth}{\paperwidth} + \setlength{\pageheight}{\paperheight} + \fi +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{段落の形} +% +% \begin{macro}{\lineskip} +% \begin{macro}{\normallineskip} +% これらの値は、行が近付き過ぎたときの\TeX の動作を制御します。 +% \begin{macrocode} +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\baselinestretch} +% これは、|\baselineskip|の倍率を示すために使います。 +% デフォルトでは、\emph{何もしません}。このコマンドが``empty''でない場合、 +% |\baselineskip|の指定の\texttt{plus}や\texttt{minus}部分は無視される +% ことに注意してください。 +% \begin{macrocode} +\renewcommand{\baselinestretch}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parskip} +% \begin{macro}{\parindent} +% |\parskip|は段落間に挿入される、縦方向の追加スペースです。 +% |\parindent|は段落の先頭の字下げ幅です。 +% \begin{macrocode} +\setlength\parskip{0\p@ \@plus \p@} +\setlength\parindent{1\Cwd} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\smallskipamount} +% \begin{macro}{\medskipamount} +% \begin{macro}{\bigskipamount} +% これら3つのパラメータの値は、\LaTeX{}カーネルの中で設定されています。 +% これらはおそらく、サイズオプションの指定によって変えるべきです。 +% しかし、\LaTeX~2.09や\LaTeXe{}の以前のリリースの両方との互換性を保つために、 +% これらはまだ同じ値としています。 +% \begin{macrocode} +%<*10pt|11pt|12pt> +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +%</10pt|11pt|12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@lowpenalty} +% \begin{macro}{\@medpenalty} +% \begin{macro}{\@highpenalty} +% |\nopagebreak|と|\nolinebreak|コマンドは、これらのコマンドが置かれた場所に、 +% ペナルティを起いて、分割を制御します。 +% 置かれるペナルティは、コマンドの引数によって、 +% |\@lowpenalty|, |\@medpenalty|, |\@highpenalty|のいずれかが使われます。 +% \begin{macrocode} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +%</article|report|book> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{ページレイアウト} +% +% \subsubsection{縦方向のスペース} +% +% \begin{macro}{\headheight} +% \begin{macro}{\headsep} +% \begin{macro}{\topskip} +% |\headheight|は、ヘッダが入るボックスの高さです。 +% |\headsep|は、ヘッダの下端と本文領域との間の距離です。 +% |\topskip|は、本文領域の上端と1行目のテキストのベースラインとの距離です。 +% \begin{macrocode} +%<*10pt|11pt|12pt> +\setlength\headheight{12\p@} +%<*tate> +\if@stysize + \ifnum\c@@paper=2 % A5 + \setlength\headsep{6mm} + \else % A4, B4, B5 and other + \setlength\headsep{8mm} + \fi +\else + \setlength\headsep{8mm} +\fi +%</tate> +%<*yoko> +%<!bk>\setlength\headsep{25\p@} +%<10pt&bk>\setlength\headsep{.25in} +%<11pt&bk>\setlength\headsep{.275in} +%<12pt&bk>\setlength\headsep{.275in} +%</yoko> +\setlength\topskip{1\Cht} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\footskip} +% |\footskip|は、本文領域の下端とフッタの下端との距離です。 +% フッタのボックスの高さを示す、|\footheight|は削除されました。 +% \begin{macrocode} +%<tate>\setlength\footskip{14mm} +%<*yoko> +%<!bk>\setlength\footskip{30\p@} +%<10pt&bk>\setlength\footskip{.35in} +%<11pt&bk>\setlength\footskip{.38in} +%<12pt&bk>\setlength\footskip{30\p@} +%</yoko> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maxdepth} +% \changes{v1.1c}{1995/12/25}{\cs{@maxdepth}の設定を除外した} +% \TeX のプリミティブレジスタ|\maxdepth|は、|\topskip|と同じような +% 働きをします。|\@maxdepth|レジスタは、つねに|\maxdepth|のコピーでなくては +% いけません。これは|\begin{document}|の内部で設定されます。 +% \TeX{}と\LaTeX~2.09では、|\maxdepth|は\texttt{4pt}に固定です。 +% \LaTeXe{}では、|\maxdepth|$+$|\topskip|を基本サイズの1.5倍にしたいので、 +% |\maxdepth|を|\topskip|の半分の値で設定します。 +% \begin{macrocode} +\if@compatibility + \setlength\maxdepth{4\p@} +\else + \setlength\maxdepth{.5\topskip} +\fi +% \end{macrocode} +% \end{macro} +% +% \subsubsection{本文領域} +% |\textheight|と|\textwidth|は、本文領域の通常の高さと幅を示します。 +% 縦組でも横組でも、``高さ''は行数を、``幅''は字詰めを意味します。 +% 後ほど、これらの長さに|\topskip|の値が加えられます。 +% +% \begin{macro}{\textwidth} +% 基本組の字詰めです。 +% +% 互換モードの場合: +% \begin{macrocode} +\if@compatibility +% \end{macrocode} +% \changes{v1.1a}{1997/01/25}{Add paper option with compatibility mode.} +% \changes{v1.1h}{1997/09/03}{landscapeでの指定を追加} +% 互換モード:|a4j|や|b5j|のクラスオプションが指定された場合の設定: +% \begin{macrocode} + \if@stysize + \ifnum\c@@paper=2 % A5 + \if@landscape +%<10pt&yoko> \setlength\textwidth{47\Cwd} +%<11pt&yoko> \setlength\textwidth{42\Cwd} +%<12pt&yoko> \setlength\textwidth{40\Cwd} +%<10pt&tate> \setlength\textwidth{27\Cwd} +%<11pt&tate> \setlength\textwidth{25\Cwd} +%<12pt&tate> \setlength\textwidth{23\Cwd} + \else +%<10pt&yoko> \setlength\textwidth{28\Cwd} +%<11pt&yoko> \setlength\textwidth{25\Cwd} +%<12pt&yoko> \setlength\textwidth{24\Cwd} +%<10pt&tate> \setlength\textwidth{46\Cwd} +%<11pt&tate> \setlength\textwidth{42\Cwd} +%<12pt&tate> \setlength\textwidth{38\Cwd} + \fi + \else\ifnum\c@@paper=3 % B4 + \if@landscape +%<10pt&yoko> \setlength\textwidth{75\Cwd} +%<11pt&yoko> \setlength\textwidth{69\Cwd} +%<12pt&yoko> \setlength\textwidth{63\Cwd} +%<10pt&tate> \setlength\textwidth{53\Cwd} +%<11pt&tate> \setlength\textwidth{49\Cwd} +%<12pt&tate> \setlength\textwidth{44\Cwd} + \else +%<10pt&yoko> \setlength\textwidth{60\Cwd} +%<11pt&yoko> \setlength\textwidth{55\Cwd} +%<12pt&yoko> \setlength\textwidth{50\Cwd} +%<10pt&tate> \setlength\textwidth{85\Cwd} +%<11pt&tate> \setlength\textwidth{76\Cwd} +%<12pt&tate> \setlength\textwidth{69\Cwd} + \fi + \else\ifnum\c@@paper=4 % B5 + \if@landscape +%<10pt&yoko> \setlength\textwidth{60\Cwd} +%<11pt&yoko> \setlength\textwidth{55\Cwd} +%<12pt&yoko> \setlength\textwidth{50\Cwd} +%<10pt&tate> \setlength\textwidth{34\Cwd} +%<11pt&tate> \setlength\textwidth{31\Cwd} +%<12pt&tate> \setlength\textwidth{28\Cwd} + \else +%<10pt&yoko> \setlength\textwidth{37\Cwd} +%<11pt&yoko> \setlength\textwidth{34\Cwd} +%<12pt&yoko> \setlength\textwidth{31\Cwd} +%<10pt&tate> \setlength\textwidth{55\Cwd} +%<11pt&tate> \setlength\textwidth{51\Cwd} +%<12pt&tate> \setlength\textwidth{47\Cwd} + \fi + \else % A4 ant other + \if@landscape +%<10pt&yoko> \setlength\textwidth{73\Cwd} +%<11pt&yoko> \setlength\textwidth{68\Cwd} +%<12pt&yoko> \setlength\textwidth{61\Cwd} +%<10pt&tate> \setlength\textwidth{41\Cwd} +%<11pt&tate> \setlength\textwidth{38\Cwd} +%<12pt&tate> \setlength\textwidth{35\Cwd} + \else +%<10pt&yoko> \setlength\textwidth{47\Cwd} +%<11pt&yoko> \setlength\textwidth{43\Cwd} +%<12pt&yoko> \setlength\textwidth{40\Cwd} +%<10pt&tate> \setlength\textwidth{67\Cwd} +%<11pt&tate> \setlength\textwidth{61\Cwd} +%<12pt&tate> \setlength\textwidth{57\Cwd} + \fi + \fi\fi\fi + \else +% \end{macrocode} +% 互換モード:デフォルト設定 +% \begin{macrocode} + \if@twocolumn + \setlength\textwidth{52\Cwd} + \else +%<10pt&!bk&yoko> \setlength\textwidth{327\p@} +%<11pt&!bk&yoko> \setlength\textwidth{342\p@} +%<12pt&!bk&yoko> \setlength\textwidth{372\p@} +%<10pt&bk&yoko> \setlength\textwidth{4.3in} +%<11pt&bk&yoko> \setlength\textwidth{4.8in} +%<12pt&bk&yoko> \setlength\textwidth{4.8in} +%<10pt&tate> \setlength\textwidth{67\Cwd} +%<11pt&tate> \setlength\textwidth{61\Cwd} +%<12pt&tate> \setlength\textwidth{57\Cwd} + \fi + \fi +% \end{macrocode} +% 2eモードの場合: +% \begin{macrocode} +\else +% \end{macrocode} +% 2eモード:|a4j|や|b5j|のクラスオプションが指定された場合の設定: +% 二段組では用紙サイズの8割、一段組では用紙サイズの7割を版面の幅として +% 設定します。 +% \begin{macrocode} + \if@stysize + \if@twocolumn +%<yoko> \setlength\textwidth{.8\paperwidth} +%<tate> \setlength\textwidth{.8\paperheight} + \else +%<yoko> \setlength\textwidth{.7\paperwidth} +%<tate> \setlength\textwidth{.7\paperheight} + \fi + \else +% \end{macrocode} +% 2eモード:デフォルト設定 +% \begin{macrocode} +%<tate> \setlength\@tempdima{\paperheight} +%<yoko> \setlength\@tempdima{\paperwidth} + \addtolength\@tempdima{-2in} +%<tate> \addtolength\@tempdima{-1.3in} +%<yoko&10pt> \setlength\@tempdimb{327\p@} +%<yoko&11pt> \setlength\@tempdimb{342\p@} +%<yoko&12pt> \setlength\@tempdimb{372\p@} +%<tate&10pt> \setlength\@tempdimb{67\Cwd} +%<tate&11pt> \setlength\@tempdimb{61\Cwd} +%<tate&12pt> \setlength\@tempdimb{57\Cwd} + \if@twocolumn + \ifdim\@tempdima>2\@tempdimb\relax + \setlength\textwidth{2\@tempdimb} + \else + \setlength\textwidth{\@tempdima} + \fi + \else + \ifdim\@tempdima>\@tempdimb\relax + \setlength\textwidth{\@tempdimb} + \else + \setlength\textwidth{\@tempdima} + \fi + \fi + \fi +\fi +\@settopoint\textwidth +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textheight} +% 基本組の行数です。 +% +% 互換モードの場合: +% \begin{macrocode} +\if@compatibility +% \end{macrocode} +% \changes{v1.1a}{1997/01/25}{Add paper option with compatibility mode.} +% \changes{v1.1f}{1997/09/03}{landscapeでの指定を追加} +% 互換モード:|a4j|や|b5j|のクラスオプションが指定された場合の設定: +% \begin{macrocode} + \if@stysize + \ifnum\c@@paper=2 % A5 + \if@landscape +%<10pt&yoko> \setlength\textheight{17\Cvs} +%<11pt&yoko> \setlength\textheight{17\Cvs} +%<12pt&yoko> \setlength\textheight{16\Cvs} +%<10pt&tate> \setlength\textheight{26\Cvs} +%<11pt&tate> \setlength\textheight{26\Cvs} +%<12pt&tate> \setlength\textheight{25\Cvs} + \else +%<10pt&yoko> \setlength\textheight{28\Cvs} +%<11pt&yoko> \setlength\textheight{25\Cvs} +%<12pt&yoko> \setlength\textheight{24\Cvs} +%<10pt&tate> \setlength\textheight{16\Cvs} +%<11pt&tate> \setlength\textheight{16\Cvs} +%<12pt&tate> \setlength\textheight{15\Cvs} + \fi + \else\ifnum\c@@paper=3 % B4 + \if@landscape +%<10pt&yoko> \setlength\textheight{38\Cvs} +%<11pt&yoko> \setlength\textheight{36\Cvs} +%<12pt&yoko> \setlength\textheight{34\Cvs} +%<10pt&tate> \setlength\textheight{48\Cvs} +%<11pt&tate> \setlength\textheight{48\Cvs} +%<12pt&tate> \setlength\textheight{45\Cvs} + \else +%<10pt&yoko> \setlength\textheight{57\Cvs} +%<11pt&yoko> \setlength\textheight{55\Cvs} +%<12pt&yoko> \setlength\textheight{52\Cvs} +%<10pt&tate> \setlength\textheight{33\Cvs} +%<11pt&tate> \setlength\textheight{33\Cvs} +%<12pt&tate> \setlength\textheight{31\Cvs} + \fi + \else\ifnum\c@@paper=4 % B5 + \if@landscape +%<10pt&yoko> \setlength\textheight{22\Cvs} +%<11pt&yoko> \setlength\textheight{21\Cvs} +%<12pt&yoko> \setlength\textheight{20\Cvs} +%<10pt&tate> \setlength\textheight{34\Cvs} +%<11pt&tate> \setlength\textheight{34\Cvs} +%<12pt&tate> \setlength\textheight{32\Cvs} + \else +%<10pt&yoko> \setlength\textheight{35\Cvs} +%<11pt&yoko> \setlength\textheight{34\Cvs} +%<12pt&yoko> \setlength\textheight{32\Cvs} +%<10pt&tate> \setlength\textheight{21\Cvs} +%<11pt&tate> \setlength\textheight{21\Cvs} +%<12pt&tate> \setlength\textheight{20\Cvs} + \fi + \else % A4 and other + \if@landscape +%<10pt&yoko> \setlength\textheight{27\Cvs} +%<11pt&yoko> \setlength\textheight{26\Cvs} +%<12pt&yoko> \setlength\textheight{25\Cvs} +%<10pt&tate> \setlength\textheight{41\Cvs} +%<11pt&tate> \setlength\textheight{41\Cvs} +%<12pt&tate> \setlength\textheight{38\Cvs} + \else +%<10pt&yoko> \setlength\textheight{43\Cvs} +%<11pt&yoko> \setlength\textheight{42\Cvs} +%<12pt&yoko> \setlength\textheight{39\Cvs} +%<10pt&tate> \setlength\textheight{26\Cvs} +%<11pt&tate> \setlength\textheight{26\Cvs} +%<12pt&tate> \setlength\textheight{22\Cvs} + \fi + \fi\fi\fi +%<yoko> \addtolength\textheight{\topskip} +%<bk&yoko> \addtolength\textheight{\baselineskip} +%<tate> \addtolength\textheight{\Cht} +%<tate> \addtolength\textheight{\Cdp} +% \end{macrocode} +% 互換モード:デフォルト設定 +% \begin{macrocode} + \else +%<10pt&!bk&yoko> \setlength\textheight{578\p@} +%<10pt&bk&yoko> \setlength\textheight{554\p@} +%<11pt&yoko> \setlength\textheight{580.4\p@} +%<12pt&yoko> \setlength\textheight{586.5\p@} +%<10pt&tate> \setlength\textheight{26\Cvs} +%<11pt&tate> \setlength\textheight{25\Cvs} +%<12pt&tate> \setlength\textheight{24\Cvs} + \fi +% \end{macrocode} +% 2eモードの場合: +% \begin{macrocode} +\else +% \end{macrocode} +% 2eモード:|a4j|や|b5j|のクラスオプションが指定された場合の設定: +% 縦組では用紙サイズの70\%(book)か78\%(ariticle,report)、 +% 横組では70\%(book)か75\%(article,report)を版面の高さに設定します。 +% \begin{macrocode} + \if@stysize +%<tate&bk> \setlength\textheight{.75\paperwidth} +%<tate&!bk> \setlength\textheight{.78\paperwidth} +%<yoko&bk> \setlength\textheight{.70\paperheight} +%<yoko&!bk> \setlength\textheight{.75\paperheight} +% \end{macrocode} +% 2eモード:デフォルト値 +% \begin{macrocode} + \else +%<tate> \setlength\@tempdima{\paperwidth} +%<yoko> \setlength\@tempdima{\paperheight} + \addtolength\@tempdima{-2in} +%<yoko> \addtolength\@tempdima{-1.5in} + \divide\@tempdima\baselineskip + \@tempcnta\@tempdima + \setlength\textheight{\@tempcnta\baselineskip} + \fi +\fi +% \end{macrocode} +% 最後に、|\textheight|に|\topskip|の値を加えます。 +% \begin{macrocode} +\addtolength\textheight{\topskip} +\@settopoint\textheight +% \end{macrocode} +% \end{macro} +% +% \subsubsection{マージン} +% +% \begin{macro}{\topmargin} +% |\topmargin|は、``印字可能領域''---用紙の上端から1インチ内側---% +% の上端からヘッダ部分の上端までの距離です。 +% +% 2.09互換モードの場合: +% \begin{macrocode} +\if@compatibility +%<*yoko> + \if@stysize + \setlength\topmargin{-.3in} + \else +%<!bk> \setlength\topmargin{27\p@} +%<10pt&bk> \setlength\topmargin{.75in} +%<11pt&bk> \setlength\topmargin{.73in} +%<12pt&bk> \setlength\topmargin{.73in} + \fi +%</yoko> +%<*tate> + \if@stysize + \ifnum\c@@paper=2 % A5 + \setlength\topmargin{.8in} + \else % A4, B4, B5 and other + \setlength\topmargin{32mm} + \fi + \else + \setlength\topmargin{32mm} + \fi + \addtolength\topmargin{-1in} + \addtolength\topmargin{-\headheight} + \addtolength\topmargin{-\headsep} +%</tate> +% \end{macrocode} +% 2eモードの場合: +% \begin{macrocode} +\else + \setlength\topmargin{\paperheight} + \addtolength\topmargin{-\headheight} + \addtolength\topmargin{-\headsep} +%<tate> \addtolength\topmargin{-\textwidth} +%<yoko> \addtolength\topmargin{-\textheight} + \addtolength\topmargin{-\footskip} +% \end{macrocode} +% \changes{v1.1e}{1997/04/08}{横組クラスでの調整量を +% -2.4インチから-2.0インチにした。} +% \changes{v1.1j}{1998/02/03}{互換モード時のa5pのトップマージンを0.7in増加} +% \begin{macrocode} + \if@stysize + \ifnum\c@@paper=2 % A5 + \addtolength\topmargin{-1.3in} + \else + \addtolength\topmargin{-2.0in} + \fi + \else +%<yoko> \addtolength\topmargin{-2.0in} +%<tate> \addtolength\topmargin{-2.8in} + \fi +% \end{macrocode} +% \changes{v1.1d}{1997/02/05}{\cs{tompargin}を半分にするのはアキ領域の計算後} +% \changes{v1.1r}{1999/08/09}{\cs{if@stysize}フラグに限らず半分にする} +% \begin{macrocode} + \addtolength\topmargin{-.5\topmargin} +\fi +\@settopoint\topmargin +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\marginparsep} +% \begin{macro}{\marginparpush} +% |\marginparsep|は、本文と傍注の間にあけるスペースの幅です。 +% 横組では本文の左(右)端と傍注、 +% 縦組では本文の下(上)端と傍注の間になります。 +% |\marginparpush|は、傍注と傍注との間のスペースの幅です。 +% \begin{macrocode} +\if@twocolumn + \setlength\marginparsep{10\p@} +\else +%<tate> \setlength\marginparsep{15\p@} +%<yoko> \setlength\marginparsep{10\p@} +\fi +%<tate>\setlength\marginparpush{7\p@} +%<*yoko> +%<10pt>\setlength\marginparpush{5\p@} +%<11pt>\setlength\marginparpush{5\p@} +%<12pt>\setlength\marginparpush{7\p@} +%</yoko> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\oddsidemargin} +% \begin{macro}{\evensidemargin} +% \begin{macro}{\marginparwidth} +% まず、互換モードでの長さを示します。 +% +% 互換モード、縦組の場合: +% \begin{macrocode} +\if@compatibility +%<tate> \setlength\oddsidemargin{0\p@} +%<tate> \setlength\evensidemargin{0\p@} +% \end{macrocode} +% 互換モード、横組、bookクラスの場合: +% \begin{macrocode} +%<*yoko> +%<*bk> +%<10pt> \setlength\oddsidemargin {.5in} +%<11pt> \setlength\oddsidemargin {.25in} +%<12pt> \setlength\oddsidemargin {.25in} +%<10pt> \setlength\evensidemargin {1.5in} +%<11pt> \setlength\evensidemargin {1.25in} +%<12pt> \setlength\evensidemargin {1.25in} +%<10pt> \setlength\marginparwidth {.75in} +%<11pt> \setlength\marginparwidth {1in} +%<12pt> \setlength\marginparwidth {1in} +%</bk> +% \end{macrocode} +% 互換モード、横組、reportとarticleクラスの場合: +% \begin{macrocode} +%<*!bk> + \if@twoside +%<10pt> \setlength\oddsidemargin {44\p@} +%<11pt> \setlength\oddsidemargin {36\p@} +%<12pt> \setlength\oddsidemargin {21\p@} +%<10pt> \setlength\evensidemargin {82\p@} +%<11pt> \setlength\evensidemargin {74\p@} +%<12pt> \setlength\evensidemargin {59\p@} +%<10pt> \setlength\marginparwidth {107\p@} +%<11pt> \setlength\marginparwidth {100\p@} +%<12pt> \setlength\marginparwidth {85\p@} + \else +%<10pt> \setlength\oddsidemargin {60\p@} +%<11pt> \setlength\oddsidemargin {54\p@} +%<12pt> \setlength\oddsidemargin {39.5\p@} +%<10pt> \setlength\evensidemargin {60\p@} +%<11pt> \setlength\evensidemargin {54\p@} +%<12pt> \setlength\evensidemargin {39.5\p@} +%<10pt> \setlength\marginparwidth {90\p@} +%<11pt> \setlength\marginparwidth {83\p@} +%<12pt> \setlength\marginparwidth {68\p@} + \fi +%</!bk> +% \end{macrocode} +% 互換モード、横組、二段組の場合: +% \begin{macrocode} + \if@twocolumn + \setlength\oddsidemargin {30\p@} + \setlength\evensidemargin {30\p@} + \setlength\marginparwidth {48\p@} + \fi +%</yoko> +% \end{macrocode} +% 縦組、横組にかかわらず、スタイルオプション設定ではゼロです。 +% \changes{v1.0g}{1997/01/25}{\cs{oddsidemargin}, \cs{evensidemagin}: +% 0pt if specified papersize at \cs{documentstyle} option.} +% \begin{macrocode} + \if@stysize + \if@twocolumn\else + \setlength\oddsidemargin{0\p@} + \setlength\evensidemargin{0\p@} + \fi + \fi +% \end{macrocode} +% +% 互換モードでない場合: +% \begin{macrocode} +\else + \setlength\@tempdima{\paperwidth} +%<tate> \addtolength\@tempdima{-\textheight} +%<yoko> \addtolength\@tempdima{-\textwidth} +% \end{macrocode} +% +% |\oddsidemargin|を計算します。 +% \begin{macrocode} + \if@twoside +%<tate> \setlength\oddsidemargin{.6\@tempdima} +%<yoko> \setlength\oddsidemargin{.4\@tempdima} + \else + \setlength\oddsidemargin{.5\@tempdima} + \fi + \addtolength\oddsidemargin{-1in} +% \end{macrocode} +% \changes{v1.1p}{1999/1/6}{\cs{oddsidemargin}のポイントへの変換を後ろに} +% |\evensidemargin|を計算します。 +% \begin{macrocode} + \setlength\evensidemargin{\paperwidth} + \addtolength\evensidemargin{-2in} +%<tate> \addtolength\evensidemargin{-\textheight} +%<yoko> \addtolength\evensidemargin{-\textwidth} + \addtolength\evensidemargin{-\oddsidemargin} + \@settopoint\oddsidemargin % 1999.1.6 + \@settopoint\evensidemargin +% \end{macrocode} +% |\marginparwidth|を計算します。 +% ここで、|\@tempdima|の値は、\linebreak +% |\paperwidth| $-$ |\textwidth|です。 +% \changes{v1.1d}{1995/11/24}{\break typo: \cs{marginmarwidth} to \cs{marginparwidth}} +% \begin{macrocode} +%<*yoko> + \if@twoside + \setlength\marginparwidth{.6\@tempdima} + \addtolength\marginparwidth{-.4in} + \else + \setlength\marginparwidth{.5\@tempdima} + \addtolength\marginparwidth{-.4in} + \fi + \ifdim \marginparwidth >2in + \setlength\marginparwidth{2in} + \fi +%</yoko> +% \end{macrocode} +% +% 縦組の場合は、少し複雑です。 +% \begin{macrocode} +%<*tate> + \setlength\@tempdima{\paperheight} + \addtolength\@tempdima{-\textwidth} + \addtolength\@tempdima{-\topmargin} + \addtolength\@tempdima{-\headheight} + \addtolength\@tempdima{-\headsep} + \addtolength\@tempdima{-\footskip} + \setlength\marginparwidth{.5\@tempdima} +%</tate> + \@settopoint\marginparwidth +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{脚注} +% +% \begin{macro}{\footnotesep} +% |\footnotesep|は、それぞれの脚注の先頭に置かれる``支柱''の高さです。 +% このクラスでは、通常の|\footnotesize|の支柱と同じ長さですので、 +% 脚注間に余計な空白は入りません。 +% \begin{macrocode} +%<10pt>\setlength\footnotesep{6.65\p@} +%<11pt>\setlength\footnotesep{7.7\p@} +%<12pt>\setlength\footnotesep{8.4\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footins} +% |\skip\footins|は、本文の最終行と最初の脚注との間の距離です。 +% \begin{macrocode} +%<10pt>\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +%<11pt>\setlength{\skip\footins}{10\p@ \@plus 4\p@ \@minus 2\p@} +%<12pt>\setlength{\skip\footins}{10.8\p@ \@plus 4\p@ \@minus 2\p@} +% \end{macrocode} +% \end{macro} +% +% \subsection{フロート} +% すべてのフロートパラメータは、\LaTeX{}のカーネルでデフォルトが定義 +% されています。そのため、カウンタ以外のパラメータは|\renewcommand|で +% 設定する必要があります。 +% +% \subsubsection{フロートパラメータ} +% +% \begin{macro}{\floatsep} +% \begin{macro}{\textfloatsep} +% \begin{macro}{\intextsep} +% フロートオブジェクトが本文のあるページに置かれるとき、 +% フロートとそのページにある別のオブジェクトの距離は、 +% これらのパラメータで制御されます。これらのパラメータは、一段組モードと +% 二段組モードの段抜きでないフロートの両方で使われます。 +% +% |\floatsep|は、ページ上部あるいは下部のフロート間の距離です。 +% +% |\textfloatsep|は、ページ上部あるいは下部のフロートと本文との距離です。 +% +% |\intextsep|は、本文の途中に出力されるフロートと本文との距離です。 +% \begin{macrocode} +%<*10pt> +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {12\p@ \@plus 2\p@ \@minus 2\p@} +%</10pt> +%<*11pt> +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {12\p@ \@plus 2\p@ \@minus 2\p@} +%</11pt> +%<*12pt> +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {14\p@ \@plus 4\p@ \@minus 4\p@} +%</12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dblfloatsep} +% \begin{macro}{\dbltextfloatsep} +% 二段組モードで、|\textwidth|の幅を持つ、段抜きのフロートオブジェクトが +% 本文と同じページに置かれるとき、本文とフロートとの距離は、 +% |\dblfloatsep|と|\dbltextfloatsep|によって制御されます。 +% +% |\dblfloatsep|は、ページ上部あるいは下部のフロートと本文との距離です。 +% +% |\dbltextfloatsep|は、ページ上部あるいは下部のフロート間の距離です。 +% \begin{macrocode} +%<*10pt> +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +%</10pt> +%<*11pt> +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +%</11pt> +%<*12pt> +\setlength\dblfloatsep {14\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +%</12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@fptop} +% \begin{macro}{\@fpsep} +% \begin{macro}{\@fpbot} +% フロートオブジェクトが、独立したページに置かれるとき、 +% このページのレイアウトは、次のパラメータで制御されます。 +% これらのパラメータは、一段組モードか、二段組モードでの一段出力の +% フロートオブジェクトに対して使われます。 +% +% ページ上部では、|\@fptop|の伸縮長が挿入されます。 +% ページ下部では、|\@fpbot|の伸縮長が挿入されます。 +% フロート間には|\@fpsep|が挿入されます。 +% +% なお、そのページを空白で満たすために、|\@fptop|と|\@fpbot|の +% 少なくともどちらか一方に、|plus ...fil|を含めてください。 +% \begin{macrocode} +%<*10pt> +\setlength\@fptop{0\p@ \@plus 1fil} +\setlength\@fpsep{8\p@ \@plus 2fil} +\setlength\@fpbot{0\p@ \@plus 1fil} +%</10pt> +%<*11pt> +\setlength\@fptop{0\p@ \@plus 1fil} +\setlength\@fpsep{8\p@ \@plus 2fil} +\setlength\@fpbot{0\p@ \@plus 1fil} +%</11pt> +%<*12pt> +\setlength\@fptop{0\p@ \@plus 1fil} +\setlength\@fpsep{10\p@ \@plus 2fil} +\setlength\@fpbot{0\p@ \@plus 1fil} +%</12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@dblfptop} +% \begin{macro}{\@dblfpsep} +% \begin{macro}{\@dblfpbot} +% 二段組モードでの二段抜きのフロートに対しては、 +% これらのパラメータが使われます。 +% \begin{macrocode} +%<*10pt> +\setlength\@dblfptop{0\p@ \@plus 1fil} +\setlength\@dblfpsep{8\p@ \@plus 2fil} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +%</10pt> +%<*11pt> +\setlength\@dblfptop{0\p@ \@plus 1fil} +\setlength\@dblfpsep{8\p@ \@plus 2fil} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +%</11pt> +%<*12pt> +\setlength\@dblfptop{0\p@ \@plus 1fil} +\setlength\@dblfpsep{10\p@ \@plus 2fil} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +%</12pt> +%</10pt|11pt|12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{フロートオブジェクトの上限値} +% +% \begin{macro}{\c@topnumber} +% \Lcount{topnumber}は、本文ページの上部に出力できるフロートの最大数です。 +% \begin{macrocode} +%<*article|report|book> +\setcounter{topnumber}{2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@bottomnumber} +% \Lcount{bottomnumber}は、本文ページの下部に出力できるフロートの最大数です。 +% \begin{macrocode} +\setcounter{bottomnumber}{1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@totalnumber} +% \Lcount{totalnumber}は、本文ページに出力できるフロートの最大数です。 +% \begin{macrocode} +\setcounter{totalnumber}{3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@dbltopnumber} +% \Lcount{dbltopnumber}は、二段組時における、本文ページの上部に出力できる +% 段抜きのフロートの最大数です。 +% \begin{macrocode} +\setcounter{dbltopnumber}{2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\topfraction} +% これは、本文ページの上部に出力されるフロートが占有できる最大の割り合いです。 +% \begin{macrocode} +\renewcommand{\topfraction}{.7} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bottomfraction} +% これは、本文ページの下部に出力されるフロートが占有できる最大の割り合いです。 +% \begin{macrocode} +\renewcommand{\bottomfraction}{.3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textfraction} +% これは、本文ページに最低限、入らなくてはならない本文の割り合いです。 +% \begin{macrocode} +\renewcommand{\textfraction}{.2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\floatpagefraction} +% これは、フロートだけのページで最低限、入らなくてはならない +% フロートの割り合いです。 +% \begin{macrocode} +\renewcommand{\floatpagefraction}{.5} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dbltopfraction} +% これは、2段組時における本文ページに、 +% 2段抜きのフロートが占めることができる最大の割り合いです。 +% \begin{macrocode} +\renewcommand{\dbltopfraction}{.7} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dblfloatpagefraction} +% これは、2段組時におけるフロートだけのページに最低限、 +% 入らなくてはならない2段抜きのフロートの割り合いです。 +% \begin{macrocode} +\renewcommand{\dblfloatpagefraction}{.5} +% \end{macrocode} +% \end{macro} +% +% +% \section{改ページ(日本語\TeX{}開発コミュニティ版のみ)}\label{sec:cleardoublepage} +% +% \begin{macro}{\pltx@cleartorightpage} +% \begin{macro}{\pltx@cleartoleftpage} +% \begin{macro}{\pltx@cleartooddpage} +% \begin{macro}{\pltx@cleartoevenpage} +% |\cleardoublepage|命令は、\LaTeX{}カーネルでは「奇数ページになるまでページを +% 繰る命令」として定義されています。しかしp\LaTeX{}カーネルでは、アスキーの方針 +% により「横組では奇数ページになるまで、縦組では偶数ページになるまでページを +% 繰る命令」に再定義されています。すなわち、p\LaTeX{}では縦組でも横組でも +% 右ページになるまでページを繰ることになります。 +% +% p\LaTeX{}標準クラスのbookは、横組も縦組も|openright|がデフォルトになっていて、 +% これは従来p\LaTeX{}カーネルで定義された|\cleardoublepage|を利用していました。 +% しかし、縦組で奇数ページ始まりの文書を作りたい場合もあるでしょうから、 +% コミュニティ版クラスでは以下の(非ユーザ向け)命令を追加します。 +% \begin{enumerate} +% \item|\pltx@cleartorightpage|:右ページになるまでページを繰る命令 +% \item|\pltx@cleartoleftpage|:左ページになるまでページを繰る命令 +% \item|\pltx@cleartooddpage|:奇数ページになるまでページを繰る命令 +% \item|\pltx@cleartoevenpage|:偶数ページになるまでページを繰る命令 +% \end{enumerate} +% \changes{v1.7d}{2017/02/15}{\cs{cleardoublepage}の代用となる命令群を追加} +% \changes{v1.7d-ltj-14}{2017/02/20}{\cs{iftdir}, \cs{ifydir}を使わないように修正} +% \begin{macrocode} +\def\pltx@cleartorightpage{\clearpage\if@twoside + \unless\ifodd\numexpr\c@page+\ltjgetparameter{direction}\relax + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi\fi} +\def\pltx@cleartoleftpage{\clearpage\if@twoside + \ifodd\numexpr\c@page+\ltjgetparameter{direction}\relax + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi\fi} +% \end{macrocode} +% +% |\pltx@cleartooddpage|は\LaTeX{}の|\cleardoublepage|に似ていますが、 +% 上の2つに合わせるため|\thispagestyle{empty}|を追加してあります。 +% \begin{macrocode} +\def\pltx@cleartooddpage{\clearpage\if@twoside + \ifodd\c@page\else + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi\fi} +\def\pltx@cleartoevenpage{\clearpage\if@twoside + \ifodd\c@page + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\cleardoublepage} +% そしてreportとbookクラスの場合は、ユーザ向け命令である|\cleardoublepage|を、 +% |openright|オプションが指定されている場合は|\pltx@cleartorightpage|に、 +% |openleft|オプションが指定されている場合は|\pltx@cleartoleftpage|に、 +% それぞれ|\let|します。|openany|の場合はp\LaTeX{}カーネルの定義のままです。 +% \begin{macrocode} +%<*!article> +\if@openleft + \let\cleardoublepage\pltx@cleartoleftpage +\else\if@openright + \let\cleardoublepage\pltx@cleartorightpage +\fi\fi +%</!article> +% \end{macrocode} +% \end{macro} +% +% +% +% \section{ページスタイル}\label{sec:pagestyle} +% つぎの6種類のページスタイルを使用できます。 +% \pstyle{empty}は\file{ltpage.dtx}で定義されています。 +% +% \begin{tabular}{ll} +% empty & ヘッダにもフッタにも出力しない\\ +% plain & フッタにページ番号のみを出力する\\ +% headnombre & ヘッダにページ番号のみを出力する\\ +% footnombre & フッタにページ番号のみを出力する\\ +% headings & ヘッダに見出しとページ番号を出力する\\ +% bothstyle & ヘッダに見出し、フッタにページ番号を出力する\\ +% \end{tabular} +% +% ページスタイル\pstyle{foo}は、|\ps@foo|コマンドとして定義されます。 +% +% \begin{macro}{\@evenhead} +% \begin{macro}{\@oddhead} +% \begin{macro}{\@evenfoot} +% \begin{macro}{\@oddfoot} +% これらは|\ps@...|から呼び出され、ヘッダとフッタを出力するマクロです。 +% +% \DeleteShortVerb{\|} +% \begin{tabular}{ll} +% \cs{@oddhead} & 奇数ページのヘッダを出力\\ +% \cs{@oddfoot} & 奇数ページのフッタを出力\\ +% \cs{@evenhead} & 偶数ページのヘッダを出力\\ +% \cs{@evenfoot} & 偶数ページのフッタを出力\\ +% \end{tabular} +% \MakeShortVerb{\|} +% +% これらの内容は、横組の場合は|\textwidth|の幅を持つ|\hbox|に入れられ、 +% 縦組の場合は|\textheight|の幅を持つ|\hbox|に入れられます。 +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{マークについて} +% ヘッダに入る章番号や章見出しは、見出しコマンドで実行されるマークコマンドで +% 決定されます。ここでは、実行されるマークコマンドの定義を行なっています。 +% これらのマークコマンドは、\TeX{}の|\mark|機能を用いて、 +% `left'と`right'の2種類のマークを生成するように定義しています。 +% +% \begin{flushleft} +% |\markboth{|\meta{LEFT}|}{|\meta{RIGHT}|}|: 両方のマークに追加します。 +% +% |\markright{|\meta{RIGHT}|}|: `右'マークに追加します。 +% +% |\leftmark|: |\@oddhead|, |\@oddfoot|, |\@evenhead|, |\@evenfoot|マクロで +% 使われ、現在の``左''マークを出力します。 +% |\leftmark|は\TeX{}の|\botmark|コマンドのような働きをします。 +% 初期値は空でなくてはいけません。 +% +% |\rightmark|: |\@oddhead|, |\@oddfoot|, |\@evenhead|, |\@evenfoot|マクロで +% 使われ、現在の``右''マークを出力します。 +% |\rightmark|は\TeX{}の|\firstmark|コマンドのような働きをします。 +% 初期値は空でなくてはいけません。 +% \end{flushleft} +% +% マークコマンドの動作は、左マークの`範囲内の'右マークのために +% 合理的になっています。たとえば、左マークは|\chapter|コマンドによって +% 変更されます。そして右マークは|\section|コマンドによって変更されます。 +% しかし、同一ページに複数の|\markboth|コマンドが現れたとき、 +% おかしな結果となることがあります。 +% +% |\tableofcontents|のようなコマンドは、|\@mkboth|コマンドを用いて、 +% あるページスタイルの中でマークを設定しなくてはなりません。 +% |\@mkboth|は、|\ps@...|コマンドによって、|\markboth|(ヘッダを設定する)か、 +% |\@gobbletwo|(何もしない)に|\let|されます。 +% +% \changes{v1.0a}{1995/08/30}{柱の書体がノンブルに影響するバグの修正} +% +% \subsection{plainページスタイル} +% +% \begin{macro}{\ps@plain} +% \pstyle{jpl@in}に|\let|するために、ここで定義をします。 +% \begin{macrocode} +\def\ps@plain{\let\@mkboth\@gobbletwo + \let\ps@jpl@in\ps@plain + \let\@oddhead\@empty + \def\@oddfoot{\reset@font\hfil\thepage\hfil}% + \let\@evenhead\@empty + \let\@evenfoot\@oddfoot} +% \end{macrocode} +% \end{macro} +% +% \subsection{jpl@inページスタイル} +% +% \begin{macro}{\ps@jpl@in} +% \changes{v1.0d}{1996/02/29}{\pstyle{jpl@in}の初期値を定義} +% +% \pstyle{jpl@in}スタイルは、クラスファイル内部で使用するものです。 +% \LaTeX{}では、bookクラスを\pstyle{headings}としています。 +% しかし、\cs{tableofcontents}コマンドの内部では\pstyle{plain}として +% 設定されるため、一つの文書でのページ番号の位置が上下に出力される +% ことになります。 +% +% そこで、ここでは\cs{tableofcontents}や\cs{theindex}のページスタイル +% を\pstyle{jpl@in}にし、実際に出力される形式は、ほかのページスタイル +% で|\let|をしています。したがって、\pstyle{headings}のとき、目次ページの +% ページ番号はヘッダ位置に出力され、\pstyle{plain}のときには、フッタ位置に +% 出力されます。 +% +% ここで、定義をしているのは、その初期値です。 +% \begin{macrocode} +\let\ps@jpl@in\ps@plain +% \end{macrocode} +% \end{macro} +% +% \subsection{headnombreページスタイル} +% +% \begin{macro}{\ps@headnombre} +% \pstyle{headnombre}スタイルは、ヘッダにページ番号のみを出力します。 +% \begin{macrocode} +\def\ps@headnombre{\let\@mkboth\@gobbletwo + \let\ps@jpl@in\ps@headnombre +%<yoko> \def\@evenhead{\thepage\hfil}% +%<yoko> \def\@oddhead{\hfil\thepage}% +%<tate> \def\@evenhead{\hfil\thepage}% +%<tate> \def\@oddhead{\thepage\hfil}% + \let\@oddfoot\@empty\let\@evenfoot\@empty} +% \end{macrocode} +% \end{macro} +% +% \subsection{footnombreページスタイル} +% +% \begin{macro}{\ps@footnombre} +% \pstyle{footnombre}スタイルは、フッタにページ番号のみを出力します。 +% \begin{macrocode} +\def\ps@footnombre{\let\@mkboth\@gobbletwo + \let\ps@jpl@in\ps@footnombre +%<yoko> \def\@evenfoot{\thepage\hfil}% +%<yoko> \def\@oddfoot{\hfil\thepage}% +%<tate> \def\@evenfoot{\hfil\thepage}% +%<tate> \def\@oddfoot{\thepage\hfil}% + \let\@oddhead\@empty\let\@evenhead\@empty} +% \end{macrocode} +% \end{macro} +% +% \subsection{headingsスタイル} +% \pstyle{headings}スタイルは、ヘッダに見出しとページ番号を出力します。 +% +% \begin{macro}{\ps@headings} +% このスタイルは、両面印刷と片面印刷とで形式が異なります。 +% \begin{macrocode} +\if@twoside +% \end{macrocode} +% 横組の場合は、奇数ページが右に、偶数ページが左にきます。 +% 縦組の場合は、奇数ページが左に、偶数ページが右にきます。 +% \begin{macrocode} + \def\ps@headings{\let\ps@jpl@in\ps@headnombre + \let\@oddfoot\@empty\let\@evenfoot\@empty +%<yoko> \def\@evenhead{\thepage\hfil\leftmark}% +%<yoko> \def\@oddhead{{\rightmark}\hfil\thepage}% +%<tate> \def\@evenhead{{\leftmark}\hfil\thepage}% +%<tate> \def\@oddhead{\thepage\hfil\rightmark}% + \let\@mkboth\markboth +%<*article> + \def\sectionmark##1{\markboth{% + \ifnum \c@secnumdepth >\z@ \thesection.\hskip1\zw\fi + ##1}{}}% + \def\subsectionmark##1{\markright{% + \ifnum \c@secnumdepth >\@ne \thesubsection.\hskip1\zw\fi + ##1}}% +%</article> +%<*report|book> + \def\chaptermark##1{\markboth{% + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \@chapapp\thechapter\@chappos\hskip1\zw +%<book> \fi + \fi + ##1}{}}% + \def\sectionmark##1{\markright{% + \ifnum \c@secnumdepth >\z@ \thesection.\hskip1\zw\fi + ##1}}% +%</report|book> + } +% \end{macrocode} +% 片面印刷の場合: +% \changes{v1.1g}{1997/08/25}{片面印刷のとき、sectionレベルが出力されない +% のを修正} +% \begin{macrocode} +\else % if not twoside + \def\ps@headings{\let\ps@jpl@in\ps@headnombre + \let\@oddfoot\@empty +%<yoko> \def\@oddhead{{\rightmark}\hfil\thepage}% +%<tate> \def\@oddhead{\thepage\hfil\rightmark}% + \let\@mkboth\markboth +%<*article> + \def\sectionmark##1{\markright{% + \ifnum \c@secnumdepth >\m@ne \thesection.\hskip1\zw\fi + ##1}}% +%</article> +%<*report|book> +\def\chaptermark##1{\markright{% + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \@chapapp\thechapter\@chappos\hskip1\zw +%<book> \fi + \fi + ##1}}% +%</report|book> + } +\fi +% \end{macrocode} +% \end{macro} +% +% \subsection{bothstyleスタイル} +% +% \begin{macro}{\ps@bothstyle} +% \pstyle{bothstyle}スタイルは、 +% ヘッダに見出しを、フッタにページ番号を出力します。 +% +% このスタイルは、両面印刷と片面印刷とで形式が異なります。 +% \changes{v1.0d}{1995/08/23}{横組のevenfootが中央揃えになっていたのを修正} +% \changes{v1.0d}{1996/03/05}{横組で偶数ページと奇数ページの設定が逆なのを修正} +% \begin{macrocode} +\if@twoside + \def\ps@bothstyle{\let\ps@jpl@in\ps@footnombre +%<*yoko> + \def\@evenhead{\leftmark\hfil}% right page + \def\@evenfoot{\thepage\hfil}% right page + \def\@oddhead{\hfil\rightmark}% left page + \def\@oddfoot{\hfil\thepage}% left page +%</yoko> +%<*tate> + \def\@evenhead{\hfil\leftmark}% right page + \def\@evenfoot{\hfil\thepage}% right page + \def\@oddhead{\rightmark\hfil}% left page + \def\@oddfoot{\thepage\hfil}% left page +%</tate> + \let\@mkboth\markboth +%<*article> + \def\sectionmark##1{\markboth{% + \ifnum \c@secnumdepth >\z@ \thesection.\hskip1\zw\fi + ##1}{}}% + \def\subsectionmark##1{\markright{% + \ifnum \c@secnumdepth >\@ne \thesubsection.\hskip1\zw\fi + ##1}}% +%</article> +%<*report|book> +\def\chaptermark##1{\markboth{% + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \@chapapp\thechapter\@chappos\hskip1\zw +%<book> \fi + \fi + ##1}{}}% + \def\sectionmark##1{\markright{% + \ifnum \c@secnumdepth >\z@ \thesection.\hskip1\zw\fi + ##1}}% +%</report|book> + } +% \end{macrocode} +% \changes{v1.1g}{1997/08/25}{片面印刷のとき、sectionレベルが出力されない +% のを修正} +% \changes{v1.1i}{1997/12/12}{report, bookクラスで片面印刷時に、 +% bothstyleスタイルにすると、コンパイルエラーになるのを修正} +% \begin{macrocode} +\else % if one column + \def\ps@bothstyle{\let\ps@jpl@in\ps@footnombre +%<yoko> \def\@oddhead{\hfil\rightmark}% +%<yoko> \def\@oddfoot{\hfil\thepage}% +%<tate> \def\@oddhead{\rightmark\hfil}% +%<tate> \def\@oddfoot{\thepage\hfil}% + \let\@mkboth\markboth +%<*article> + \def\sectionmark##1{\markright{% + \ifnum \c@secnumdepth >\m@ne \thesection.\hskip1\zw\fi + ##1}}% +%</article> +%<*report|book> + \def\chaptermark##1{\markright{% + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \@chapapp\thechapter\@chappos\hskip1\zw +%<book> \fi + \fi + ##1}}% +%</report|book> + } +\fi +% \end{macrocode} +% \end{macro} +% +% \subsection{myheadingスタイル} +% +% \begin{macro}{\ps@myheadings} +% \changes{v1.0d}{1995/08/23}{横組モードの左右が逆であったのを修正} +% \pstyle{myheadings}ページスタイルは簡潔に定義されています。 +% ユーザがページスタイルを設計するときのヒナ型として使用することができます。 +% \begin{macrocode} +\def\ps@myheadings{\let\ps@jpl@in\ps@plain% + \let\@oddfoot\@empty\let\@evenfoot\@empty +%<yoko> \def\@evenhead{\thepage\hfil\leftmark}% +%<yoko> \def\@oddhead{{\rightmark}\hfil\thepage}% +%<tate> \def\@evenhead{{\leftmark}\hfil\thepage}% +%<tate> \def\@oddhead{\thepage\hfil\rightmark}% + \let\@mkboth\@gobbletwo +%<!article> \let\chaptermark\@gobble + \let\sectionmark\@gobble +%<article> \let\subsectionmark\@gobble +} +% \end{macrocode} +% \end{macro} +% +% +% \section{文書コマンド} +% +% \subsection{表題} +% +% \begin{macro}{\title} +% \begin{macro}{\author} +% \begin{macro}{\date} +% 文書のタイトル、著者、日付の情報のための、 +% これらの3つのコマンドは\file{ltsect.dtx}で提供されています。 +% これらのコマンドは次のように定義されています。 +% \begin{macrocode} +%\newcommand*{\title}[1]{\gdef\@title{#1}} +%\newcommand*{\author}[1]{\gdef\@author{#1}} +%\newcommand*{\date}[1]{\gdef\@date{#1}} +% \end{macrocode} +% |\date|マクロのデフォルトは、今日の日付です。 +% \begin{macrocode} +%\date{\today} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{titlepage} +% 通常の環境では、ページの最初と最後を除き、タイトルページ環境は何もしません。 +% また、ページ番号の出力を抑制します。レポートスタイルでは、 +% ページ番号を1にリセットし、そして最後で1に戻します。 +% 互換モードでは、ページ番号はゼロに設定されますが、 +% 右起こしページ用のページパラメータでは誤った結果になります。 +% 二段組スタイルでも一段組のページが作られます。 +% +% \noindent\emph{日本語\TeX{}開発コミュニティによる変更}: +% 上にあるのはアスキー版の説明です。改めてアスキー版の挙動を整理すると、 +% 以下のようになります。 +% \begin{enumerate} +% \item アスキー版では、タイトルページの番号を必ず1にリセットしていましたが、 +% これは正しくありません。これは、タイトルページが奇数ページ目か偶数ページ目 +% かにかかわらず、レイアウトだけ奇数ページ用が適用されてしまうからです。 +% さらに、タイトルの次のページも偶数のページ番号を持ってしまうため、両面印刷 +% で奇数ページと偶数ページが交互に出なくなるという問題もあります。 +% \item アスキー版bookクラスは、タイトルページを必ず|\cleardoublepage|で始めて +% いました。p\LaTeX{}カーネルでの|\cleardoublepage|の定義から、縦組の既定では +% タイトルが偶数ページ目に出ることになります。これ自体が正しくないと断定する +% ことはできませんが、タイトルのページ番号を1にリセットすることと合わさって、 +% 偶数ページに送ったタイトルに奇数ページ用レイアウトが適用されてしまうという +% 結果は正しくありません。 +% \end{enumerate} +% そこで、コミュニティ版ではタイトルのレイアウトが必ず奇数ページ用になるという +% 挙動を支持し、bookクラスではタイトルページを奇数ページ目に送ることにしました。 +% これでタイトルページが表紙らしく見えるようになります。また、reportクラスの +% ようなタイトルが成り行きに従って出る場合には +% \begin{itemize} +% \item 奇数ページ目に出る場合、ページ番号を1(奇数)にリセット +% \item 偶数ページ目に出る場合、ページ番号を0(偶数)にリセット +% \end{itemize} +% としました。 +% +% 一つめの例を考えます。 +%\begin{verbatim} +% \documentclass{tbook} +% \title{タイトル}\author{著者} +% \begin{document} +% \maketitle +% \chapter{チャプター} +% \end{document} +%\end{verbatim} +% アスキー版tbookクラスでの結果は +%\begin{verbatim} +% 1ページ目:空白(ページ番号1は非表示) +% 2ページ目:タイトル(奇数レイアウト、ページ番号1は非表示) +% 3ページ目:チャプター(偶数レイアウト、ページ番号2) +%\end{verbatim} +% ですが、仮に最初の空白ページさえなければ +%\begin{verbatim} +% 1ページ目:タイトルすなわち表紙(奇数レイアウト、ページ番号1は非表示) +% 2ページ目:チャプター(偶数レイアウト、ページ番号2) +%\end{verbatim} +% とみなせるため、コミュニティ版では空白ページを発生させないようにしました。 +% +% 二つめの例を考えます。 +%\begin{verbatim} +% \documentclass{tbook} +% \title{タイトル}\author{著者} +% \begin{document} +% テスト文章 +% \maketitle +% \chapter{チャプター} +% \end{document} +%\end{verbatim} +% アスキー版tbookクラスでの結果は +%\begin{verbatim} +% 1ページ目:テスト文章(奇数レイアウト、ページ番号1) +% 2ページ目:タイトル(奇数レイアウト、ページ番号1は非表示) +% 3ページ目:チャプター(偶数レイアウト、ページ番号2) +%\end{verbatim} +% ですが、これでは奇数と偶数のページ番号が交互になっていないので正しく +% ありません。そこで、コミュニティ版では +%\begin{verbatim} +% 1ページ目:テスト文章(奇数レイアウト、ページ番号1) +% 2ページ目:空白ページ(ページ番号2は非表示) +% 3ページ目:タイトル(奇数レイアウト、ページ番号1は非表示) +% 4ページ目:チャプター(偶数レイアウト、ページ番号2) +%\end{verbatim} +% と直しました。 +% +% なお、p\LaTeX~2.09互換モードはアスキー版のまま、すなわち「ページ番号をゼロに +% 設定」としてあります。これは、横組の右起こしの挙動としては誤りですが、縦組の +% 右起こしの挙動としては一応正しくなっているといえます。 +% +% 最初に互換モードの定義を作ります。 +% \begin{macrocode} +\if@compatibility +\newenvironment{titlepage} + {% +%<book> \cleardoublepage + \if@twocolumn\@restonecoltrue\onecolumn + \else\@restonecolfalse\newpage\fi + \thispagestyle{empty}% + \setcounter{page}\z@ + }% + {\if@restonecol\twocolumn\else\newpage\fi + } +% \end{macrocode} +% +% そして、\LaTeX{}ネイティブのための定義です。 +% \changes{v1.7d}{2017/02/15}{bookクラスでtitlepageを必ず奇数ページ +% に送るように変更} +% \changes{v1.7d}{2017/02/15}{titlepageのページ番号を奇数ならば1に、 +% 偶数ならば0にリセットするように変更} +% \begin{macrocode} +\else +\newenvironment{titlepage} + {% +%<book> \pltx@cleartooddpage %% 2017/02/15 + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse\newpage + \fi + \thispagestyle{empty}% + \ifodd\c@page\setcounter{page}\@ne\else\setcounter{page}\z@\fi %% 2017/02/15 + }% + {\if@restonecol\twocolumn \else \newpage \fi +% \end{macrocode} +% 両面モードでなければ、タイトルページの直後のページのページ番号も1に +% します。 +% \begin{macrocode} + \if@twoside\else + \setcounter{page}\@ne + \fi + } +\fi +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\maketitle} +% このコマンドは、表題を作成し、出力します。 +% 表題ページを独立させるかどうかによって定義が異なります。 +% reportとbookクラスのデフォルトは独立した表題です。 +% articleクラスはオプションで独立させることができます。 +% +% \begin{macro}{\p@thanks} +% 縦組のときは、|\thanks|コマンドを|\p@thanks|に|\let|します。 +% このコマンドは|\footnotetext|を使わず、直接、文字を|\@thanks|に格納 +% していきます。 +% +% 著者名の脇に表示される合印は直立した数字、注釈側は横に寝た数字となっていまし +% たが、不自然なので|\hbox{\yoko ...}|を追加し、両方とも直立するようにしました。 +% \changes{v1.7d}{2017/02/15}{縦組クラスの所属表示の番号を直立にした} +% \begin{macrocode} +\def\p@thanks#1{\footnotemark + \protected@xdef\@thanks{\@thanks + \protect{\noindent\hbox{\yoko$\m@th^\thefootnote$}#1\protect\par}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\if@titlepage + \newcommand{\maketitle}{\begin{titlepage}% + \let\footnotesize\small + \let\footnoterule\relax +%<tate> \let\thanks\p@thanks + \let\footnote\thanks +% \end{macrocode} +% \changes{v1.1d}{1997/02/12}{縦組クラスの表紙を縦書きにするようにした} +% \begin{macrocode} +%<tate> \vbox to\textheight\bgroup\tate\hsize\textwidth + \null\vfil + \vskip 60\p@ + \begin{center}% + {\LARGE \@title \par}% + \vskip 3em% + {\Large + \lineskip .75em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1.5em% + {\large \@date \par}% % Set date in \large size. + \end{center}\par +%<tate> \vfil{\centering\@thanks}\vfil\null +%<tate> \egroup +%<yoko> \@thanks\vfil\null + \end{titlepage}% +% \end{macrocode} +% \Lcount{footnote}カウンタをリセットし、|\thanks|と|\maketitle|コマンドを +% 無効にし、いくつかの内部マクロを空にして格納領域を節約します。 +% \begin{macrocode} + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\p@thanks\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty +% \end{macrocode} +% タイトルが組版されたら、|\title|コマンドなどの宣言を無効にできます。 +% |\and|の定義は、|\author|の引数でのみ使用しますので、破棄します。 +% \begin{macrocode} + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax + }% +\else + \newcommand{\maketitle}{\par + \begingroup + \renewcommand{\thefootnote}{\fnsymbol{footnote}}% + \def\@makefnmark{\hbox{\unless\ifnum\ltjgetparameter{direction}=3 $\m@th^{\@thefnmark}$ + \else\hbox{\yoko$\m@th^{\@thefnmark}$}\fi}}% +%<*tate> + \long\def\@makefntext##1{\parindent 1\zw\noindent + \hb@xt@ 2\zw{\hss\@makefnmark}##1}% +%</tate> +%<*yoko> + \long\def\@makefntext##1{\parindent 1em\noindent + \hb@xt@1.8em{\hss$\m@th^{\@thefnmark}$}##1}% +%</yoko> + \if@twocolumn + \ifnum \col@number=\@ne \@maketitle + \else \twocolumn[\@maketitle]% + \fi + \else + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \fi + \thispagestyle{jpl@in}\@thanks +% \end{macrocode} +% ここでグループを閉じ、\Lcount{footnote}カウンタをリセットし、 +% |\thanks|, |\maketitle|, |\@maketitle|を無効にし、 +% いくつかの内部マクロを空にして格納領域を節約します。 +% \changes{v1.7}{2016/11/12}{ドキュメントに反して\cs{@maketitle}が +% 空になっていなかったのを修正} +% \begin{macrocode} + \endgroup + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\p@thanks\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@maketitle} +% 独立した表題ページを作らない場合の、表題の出力形式です。 +% \begin{macrocode} + \def\@maketitle{% + \newpage\null + \vskip 2em% + \begin{center}% +%<yoko> \let\footnote\thanks +%<tate> \let\footnote\p@thanks + {\LARGE \@title \par}% + \vskip 1.5em% + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% + {\large \@date}% + \end{center}% + \par\vskip 1.5em} +\fi +% \end{macrocode} +% \end{macro} +% +% \subsection{概要} +% +% \begin{environment}{abstract} +% 要約文のための環境です。bookクラスでは使えません。 +% reportスタイルと、|titlepage|オプションを指定したarticleスタイルでは、 +% 独立したページに出力されます。 +% \begin{macrocode} +%<*article|report> +\if@titlepage + \newenvironment{abstract}{% + \titlepage + \null\vfil + \@beginparpenalty\@lowpenalty + \begin{center}% + {\bfseries\abstractname}% + \@endparpenalty\@M + \end{center}}% + {\par\vfil\null\endtitlepage} +\else + \newenvironment{abstract}{% + \if@twocolumn + \section*{\abstractname}% + \else + \small + \begin{center}% + {\bfseries\abstractname\vspace{-.5em}\vspace{\z@}}% + \end{center}% + \quotation + \fi}{\if@twocolumn\else\endquotation\fi} +\fi +%</article|report> +% \end{macrocode} +% \end{environment} +% +% +% \subsection{章見出し} +% +% \subsubsection{マークコマンド} +% +% \begin{macro}{\chaptermark} +% \begin{macro}{\sectionmark} +% \begin{macro}{\subsectionmark} +% \begin{macro}{\subsubsectionmark} +% \begin{macro}{\paragraphmark} +% \begin{macro}{\subparagraphmark} +% |\...mark|コマンドを初期化します。これらのコマンドはページスタイルの +% 定義で使われます(第\ref{sec:pagestyle}節参照)。 +% これらのたいていのコマンドは\file{ltsect.dtx}ですでに定義されています。 +% \begin{macrocode} +%<!article>\newcommand*{\chaptermark}[1]{} +%\newcommand*{\sectionmark}[1]{} +%\newcommand*{\subsectionmark}[1]{} +%\newcommand*{\subsubsectionmark}[1]{} +%\newcommand*{\paragraphmark}[1]{} +%\newcommand*{\subparagraphmark}[1]{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{カウンタの定義} +% +% \begin{macro}{\c@secnumdepth} +% \Lcount{secnumdepth}には、番号を付ける、見出しコマンドのレベルを設定します。 +% \begin{macrocode} +%<article>\setcounter{secnumdepth}{3} +%<!article>\setcounter{secnumdepth}{2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@chapter} +% \begin{macro}{\c@section} +% \begin{macro}{\c@subsection} +% \begin{macro}{\c@subsubsection} +% \begin{macro}{\c@paragraph} +% \begin{macro}{\c@subparagraph} +% これらのカウンタは見出し番号に使われます。 +% 最初の引数は、二番目の引数が増加するたびにリセットされます。 +% 二番目のカウンタはすでに定義されているものでなくてはいけません。 +% \begin{macrocode} +\newcounter{part} +%<*book|report> +\newcounter{chapter} +\newcounter{section}[chapter] +%</book|report> +%<article>\newcounter{section} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] +\newcounter{subparagraph}[paragraph] +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\thepart} +% \begin{macro}{\thechapter} +% \begin{macro}{\thesection} +% \begin{macro}{\thesubsection} +% \begin{macro}{\thesubsubsection} +% \begin{macro}{\theparagraph} +% \begin{macro}{\thesubparagraph} +% |\theCTR|が実際に出力される形式の定義です。 +% +% |\arabic{|\Lcount{COUNTER}|}|は、\Lcount{COUNTER}の値を +% 算用数字で出力します。 +% +% |\roman{|\Lcount{COUNTER}|}|は、\Lcount{COUNTER}の値を +% 小文字のローマ数字で出力します。 +% +% |\Roman{|\Lcount{COUNTER}|}|は、\Lcount{COUNTER}の値を +% 大文字のローマ数字で出力します。 +% +% |\alph{|\Lcount{COUNTER}|}|は、\Lcount{COUNTER}の値を +% $1=$~a, $2=$~b のようにして出力します。 +% +% |\Alph{|\Lcount{COUNTER}|}|は、\Lcount{COUNTER}の値を +% $1=$~A, $2=$~B のようにして出力します。 +% +% |\Kanji{|\Lcount{COUNTER}|}|は、\Lcount{COUNTER}の値を +% 漢数字で出力します。 +% +% |\rensuji{|\meta{obj}|}|は、\meta{obj}を横に並べて出力します。 +% したがって、横組のときには、何も影響しません。 +% +% \begin{macrocode} +%<*tate> +\renewcommand{\thepart}{\rensuji{\@Roman\c@part}} +%<article>\renewcommand{\thesection}{\rensuji{\@arabic\c@section}} +%<*report|book> +\renewcommand{\thechapter}{\rensuji{\@arabic\c@chapter}} +\renewcommand{\thesection}{\thechapter・\rensuji{\@arabic\c@section}} +%</report|book> +\renewcommand{\thesubsection}{\thesection・\rensuji{\@arabic\c@subsection}} +\renewcommand{\thesubsubsection}{% + \thesubsection・\rensuji{\@arabic\c@subsubsection}} +\renewcommand{\theparagraph}{% + \thesubsubsection・\rensuji{\@arabic\c@paragraph}} +\renewcommand{\thesubparagraph}{% + \theparagraph・\rensuji{\@arabic\c@subparagraph}} +%</tate> +%<*yoko> +\renewcommand{\thepart}{\@Roman\c@part} +%<article>\renewcommand{\thesection}{\@arabic\c@section} +%<*report|book> +\renewcommand{\thechapter}{\@arabic\c@chapter} +\renewcommand{\thesection}{\thechapter.\@arabic\c@section} +%</report|book> +\renewcommand{\thesubsection}{\thesection.\@arabic\c@subsection} +\renewcommand{\thesubsubsection}{% + \thesubsection.\@arabic\c@subsubsection} +\renewcommand{\theparagraph}{% + \thesubsubsection.\@arabic\c@paragraph} +\renewcommand{\thesubparagraph}{% + \theparagraph.\@arabic\c@subparagraph} +%</yoko> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@chapapp} +% \begin{macro}{\@chappos} +% |\@chapapp|の初期値は`|\prechaptername|'です。 +% +% |\@chappos|の初期値は`|\postchaptername|'です。 +% +% |\appendix|コマンドは|\@chapapp|を`|\appendixname|'に、 +% |\@chappos|を空に再定義します。 +% \begin{macrocode} +%<*report|book> +\newcommand{\@chapapp}{\prechaptername} +\newcommand{\@chappos}{\postchaptername} +%</report|book> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{前付け、本文、後付け} +% +% \begin{macro}{\frontmatter} +% \begin{macro}{\mainmatter} +% \begin{macro}{\backmatter} +% \changes{v1.1}{1997/01/15}{\cs{frontmatter}, \cs{mainmatter}, \cs{backmatter} +% を\LaTeX{}の定義に修正} +% 一冊の本は論理的に3つに分割されます。 +% 表題や目次や「はじめに」あるいは権利などの前付け、 +% そして本文、それから用語集や索引や奥付けなどの後付けです。 +% +% \emph{日本語\TeX{}開発コミュニティによる補足}: +% \LaTeX{}のclasses.dtxは、1996/05/26 (v1.3r)と1998/05/05 (v1.3y)の +% 計2回、|\frontmatter|と|\mainmatter|の定義を修正しています。一回目は +% これらの命令を|openany|オプションに応じて切り替え、二回目はそれを +% 元に戻しています。アスキーによるjclasses.dtxは、1997/01/15に +% 一回目の修正に追随しましたが、二回目の修正には追随していません。 +% コミュニティ版では、一旦はアスキーによる仕様を維持しようと考え +% ました(2016/11/22)が、以下の理由により二回目の修正にも追随する +% ことにしました(2017/03/05)。 +% +% アスキー版での|\frontmatter|と|\mainmatter|の改ページ挙動は +%\begin{quote} +% |openright|なら|\cleardoublepage|、|openany|なら|\clearpage|を実行 +%\end{quote} +% というものでした。しかし、|\frontmatter|及び|\mainmatter|はノンブルを +% 1にリセットしますから、改ページの結果が偶数ページ目になる場合 +% \footnote{縦tbookのデフォルト(openright)が該当するほか、横jbookと +% 縦tbookのopenanyのときには成り行き次第で該当する可能性があります。}に +% ノンブルが偶奇逆転してしまいました。このままでは|openany|の場合に両面 +% 印刷がうまくいかないため、新しいコミュニティ版では +%\begin{quote} +% 必ず|\pltx@cleartooddpage|を実行 +%\end{quote} +% としました。これは両面印刷(twoside)の場合は奇数ページに送り、 +% 片面印刷(oneside)の場合は単に改ページとなります。(参考:latex/2754) +% \changes{v1.7b}{2016/11/22}{補足ドキュメントを追加} +% \changes{v1.7e}{2017/03/05}{\cs{frontmatter}と\cs{mainmatter}を +% 奇数ページに送るように変更} +% \begin{macrocode} +%<*book> +\newcommand{\frontmatter}{% + \pltx@cleartooddpage + \@mainmatterfalse\pagenumbering{roman}} +\newcommand{\mainmatter}{% + \pltx@cleartooddpage + \@mainmattertrue\pagenumbering{arabic}} +\newcommand{\backmatter}{% + \if@openleft \cleardoublepage \else + \if@openright \cleardoublepage \else \clearpage \fi \fi + \@mainmatterfalse} +%</book> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{ボックスの組み立て} +% クラスファイル定義の、この部分では、|\@startsection|と|\secdef|の +% 二つの内部マクロを使います。これらの構文を次に示します。 +% +% |\@startsection|マクロは6つの引数と1つのオプション引数`*'を取ります。 +% +% |\@startsection|\meta{name}\meta{level}\meta{indent}^^A +% \meta{beforeskip}\meta{afterskip}\meta{style} +% optional *\\ +% \null\hphantom{\bslash @startsection}^^A +% |[|\meta{altheading}|]|\meta{heading} +% +% それぞれの引数の意味は、次のとおりです。 +% +% \begin{description} +% \item[\meta{name}] レベルコマンドの名前です(例:section)。 +% \item[\meta{level}] 見出しの深さを示す数値です(chapter=1, section=2, +% $\ldots$)。``\meta{level}$<=$カウンタ\Lcount{secnumdepth}の値''のとき、 +% 見出し番号が出力されます。 +% \item[\meta{indent}] 見出しに対する、左マージンからのインデント量です。 +% \item[\meta{beforeskip}] 見出しの上に置かれる空白の絶対値です。 +% 負の場合は、見出しに続くテキストのインデントを抑制します。 +% \item[\meta{afterskip}] 正のとき、見出しの後の垂直方向のスペースとなります。 +% 負の場合は、見出しの後の水平方向のスペースとなります。 +% \item[\meta{style}] 見出しのスタイルを設定するコマンドです。 +% \item[\meta{$*$}] 見出し番号を付けないとき、対応するカウンタは増加します。 +% \item[\meta{heading}] 新しい見出しの文字列です。 +% \end{description} +% +% 見出しコマンドは通常、|\@startsection|と6つの引数で定義されています。 +% +% |\secdef|マクロは、 +% 見出しコマンドを|\@startsection|を用いないで定義するときに使います。 +% このマクロは、2つの引数を持ちます。 +% +% |\secdef|\meta{unstarcmds}\meta{starcmds} +% +% \begin{description} +% \item[\meta{unstarcmds}] 見出しコマンドの普通の形式で使われます。 +% \item[\meta{starcmds}] $*$形式の見出しコマンドで使われます。 +% \end{description} +% +% |\secdef|は次のようにして使うことができます。 +%\begin{verbatim} +% \def\chapter {... \secdef \CMDA \CMDB } +% \def\CMDA [#1]#2{....} % \chapter[...]{...} の定義 +% \def\CMDB #1{....} % \chapter*{...} の定義 +%\end{verbatim} +% +% +% \subsubsection{partレベル} +% +% \begin{macro}{\part} +% このコマンドは、新しいパート(部)をはじめます。 +% +% articleクラスの場合は、簡単です。 +% +% 新しい段落を開始し、小さな空白を入れ、段落後のインデントを行い、 +% |\secdef|で作成します。(アスキーによる元のドキュメントには +% 「段落後のインデントをしないようにし」と書かれていましたが、 +% 実際のコードでは段落後のインデントを行っていました。そこで +% 日本語\TeX{}開発コミュニティは、ドキュメントをコードに合わせて +% 「段落後のインデントを行い」へと修正しました。) +% \changes{v1.7a}{2016/11/16}{Check \texttt{@noskipsec} switch and +% possibly force horizontal mode (sync with classes.dtx v1.4a)} +% \begin{macrocode} +%<*article> +\newcommand{\part}{% + \if@noskipsec \leavevmode \fi + \par\addvspace{4ex}% + \@afterindenttrue + \secdef\@part\@spart} +%</article> +% \end{macrocode} +% reportとbookスタイルの場合は、少し複雑です。 +% +% まず、右ページからはじまるように改ページをします。 +% そして、部扉のページスタイルを\pstyle{empty}にします。 +% 2段組の場合でも、1段組で作成しますが、後ほど2段組に戻すために、 +% |\@restonecol|スイッチを使います。 +% \changes{v1.1}{1997/01/15}{\cs{part}を\LaTeX\ の定義に修正} +% \begin{macrocode} +%<*report|book> +\newcommand{\part}{% + \if@openleft \cleardoublepage \else + \if@openright \cleardoublepage \else \clearpage \fi \fi + \thispagestyle{empty}% + \if@twocolumn\onecolumn\@tempswatrue\else\@tempswafalse\fi + \null\vfil + \secdef\@part\@spart} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@part} +% このマクロが実際に部レベルの見出しを作成します。 +% このマクロも文書クラスによって定義が異なります。 +% +% articleクラスの場合は、\Lcount{secnumdepth}が$-1$よりも大きいとき、 +% 見出し番号を付けます。このカウンタが$-1$以下の場合には付けません。 +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \begin{macrocode} +%<*article> +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >\m@ne + \refstepcounter{part}% + \addcontentsline{toc}{part}{% + \prepartname\thepart\postpartname\hspace{1\zw}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\parindent\z@\raggedright + \interlinepenalty\@M\normalfont + \ifnum \c@secnumdepth >\m@ne + \Large\bfseries\prepartname\thepart\postpartname + \par\nobreak + \fi + \huge\bfseries#2\par}% + \nobreak\vskip3ex\@afterheading} +%</article> +% \end{macrocode} +% +% reportとbookクラスの場合は、\Lcount{secnumdepth}が$-2$よりも大きいときに、 +% 見出し番号を付けます。$-2$以下では付けません。 +% +% \begin{macrocode} +%<*report|book> +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \addcontentsline{toc}{part}{% + \prepartname\thepart\postpartname\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\centering + \interlinepenalty\@M\normalfont + \ifnum \c@secnumdepth >-2\relax + \huge\bfseries\prepartname\thepart\postpartname + \par\vskip20\p@ + \fi + \Huge\bfseries#2\par}% + \@endpart} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@spart} +% このマクロは、番号を付けないときの体裁です。 +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \begin{macrocode} +%<*article> +\def\@spart#1{{% + \parindent\z@\raggedright + \interlinepenalty\@M\normalfont + \huge\bfseries#1\par}% + \nobreak\vskip3ex\@afterheading} +%</article> +% \end{macrocode} +% \changes{v1.1k}{1998/03/23}{reportとbookクラスで番号を付けない見出しの +% ペナルティが\cs{M@}だったのを\cs{@M}に修正} +% \begin{macrocode} +%<*report|book> +\def\@spart#1{{% + \centering + \interlinepenalty\@M\normalfont + \Huge\bfseries#1\par}% + \@endpart} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@endpart} +% |\@part|と|\@spart|の最後で実行されるマクロです。 +% 両面印刷モードのときは、白ページを追加します。 +% 二段組モードのときには、これ以降のページを二段組に戻します。 +% 2016年12月から、|openany| のときに白ページを追加するのをやめました。 +% このバグは\LaTeX{}ではclasses.dtx v1.4b (2000/05/19)で修正されていました。 +% (参考:latex/3155、texjporg/jsclasses\#48) +% \changes{v1.7c}{2016/12/18}{Only add empty page after part if +% twoside and openright (sync with classes.dtx v1.4b)} +% \begin{macrocode} +%<*report|book> +\def\@endpart{\vfil\newpage + \if@twoside + \if@openleft %% \if@openleft added (2017/02/15) + \null\thispagestyle{empty}\newpage + \else\if@openright %% \if@openright added (2016/12/18) + \null\thispagestyle{empty}\newpage + \fi\fi %% added (2016/12/18, 2017/02/15) + \fi +% \end{macrocode} +% 二段組文書のとき、スイッチを二段組モードに戻す必要があります。 +% \begin{macrocode} + \if@tempswa\twocolumn\fi} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \subsubsection{chapterレベル} +% +% \begin{macro}{chapter} +% 章レベルは、必ずページの先頭から開始します。 +% |openright|オプションが指定されている場合は、右ページからはじまる +% ように|\cleardoublepage|を呼び出します。 +% そうでなければ、|\clearpage|を呼び出します。 +% なお、縦組の場合でも右ページからはじまるように、 +% フォーマットファイルで|\clerdoublepage|が定義されています。 +% +% \emph{日本語\TeX{}開発コミュニティによる補足}:コミュニティ版の実装では、 +% |openright|と|openleft|の場合に|\cleardoublepage|をクラスファイルの中で +% 再々定義しています。\ref{sec:cleardoublepage}を参照してください。 +% +% 章見出しが出力されるページのスタイルは、\pstyle{jpl@in}になります。 +% \pstyle{jpl@in}は、\pstyle{headnomble}か\pstyle{footnomble}のいずれかです。 +% 詳細は、第\ref{sec:pagestyle}節を参照してください。 +% +% また、|\@topnum|をゼロにして、 +% 章見出しの上にトップフロートが置かれないようにしています。 +% \begin{macrocode} +%<*report|book> +\newcommand{\chapter}{% + \if@openleft \cleardoublepage \else + \if@openright \cleardoublepage \else \clearpage \fi \fi + \thispagestyle{jpl@in}% + \global\@topnum\z@ + \@afterindenttrue + \secdef\@chapter\@schapter} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@chapter} +% このマクロは、章見出しに番号を付けるときに呼び出されます。 +% \Lcount{secnumdepth}が$-1$よりも大きく、 +% |\@mainmatter|が真(bookクラスの場合)のときに、番号を出力します。 +% +% \emph{日本語\TeX{}開発コミュニティによる補足}:本家\LaTeX{}の +% \file{classes}では、二段組のときチャプタータイトルは一段組に戻され +% ますが、アスキーによる\file{jclasses}では二段組のままにされています。 +% したがって、チャプタータイトルより高い位置に右カラムの始点が来るという +% 挙動になっていますが、コミュニティ版でもアスキー版の挙動を維持しています。 +% \begin{macrocode} +\def\@chapter[#1]#2{% + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \refstepcounter{chapter}% + \typeout{\@chapapp\space\thechapter\space\@chappos}% + \addcontentsline{toc}{chapter}% + {\protect\numberline{\@chapapp\thechapter\@chappos}#1}% +%<book> \else\addcontentsline{toc}{chapter}{#1}\fi + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% + \@makechapterhead{#2}\@afterheading} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makechapterhead} +% このマクロが実際に章見出しを組み立てます。 +% \changes{v1.1o}{1998/12/24}{secnumdepthカウンタを$-1$以下にすると、 +% 見出し文字列も消えてしまうのを修正} +% \changes{v1.2}{2001/09/04}{\cs{chapter}の出力位置がアスタリスク形式と +% そうでないときと違うのを修正(ありがとう、鈴木@津さん)} +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \begin{macrocode} +\def\@makechapterhead#1{\hbox{}% + \vskip2\Cvs + {\parindent\z@ + \raggedright + \normalfont\huge\bfseries + \leavevmode + \ifnum \c@secnumdepth >\m@ne + \setlength\@tempdima{\linewidth}% +%<book> \if@mainmatter + \setbox\z@\hbox{\@chapapp\thechapter\@chappos\hskip1\zw}% + \addtolength\@tempdima{-\wd\z@}% + \unhbox\z@\nobreak +%<book> \fi + \vtop{\hsize\@tempdima#1}% + \else + #1\relax + \fi}\nobreak\vskip3\Cvs} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@schapter} +% このマクロは、章見出しに番号を付けないときに呼び出されます。 +% +% \emph{日本語\TeX{}開発コミュニティによる補足}:やはり二段組でチャプター +% タイトルより高い位置に右カラムの始点が来るという挙動を維持してあります。 +% \changes{v1.7c}{2016/12/18}{奇妙なarticleガードとコードを削除して +% ドキュメントを追加} +% \begin{macrocode} +\def\@schapter#1{% + \@makeschapterhead{#1}\@afterheading +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makeschapterhead} +% 番号を付けない場合の形式です。 +% \changes{v1.2}{2001/09/04}{\cs{chapter}の出力位置がアスタリスク形式と +% そうでないときと違うのを修正(ありがとう、鈴木@津さん)} +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \begin{macrocode} +\def\@makeschapterhead#1{\hbox{}% + \vskip2\Cvs + {\parindent\z@ + \raggedright + \normalfont\huge\bfseries + \leavevmode + \setlength\@tempdima{\linewidth}% + \vtop{\hsize\@tempdima#1}}\vskip3\Cvs} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \subsubsection{下位レベルの見出し} +% +% \begin{macro}{\section} +% 見出しの前後に空白を付け、|\Large\bfseries|で出力をします。 +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \begin{macrocode} +\newcommand{\section}{\@startsection{section}{1}{\z@}% + {1.5\Cvs \@plus.5\Cvs \@minus.2\Cvs}% + {.5\Cvs \@plus.3\Cvs}% + {\normalfont\Large\bfseries}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\subsection} +% 見出しの前後に空白を付け、|\large\bfseries|で出力をします。 +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \begin{macrocode} +\newcommand{\subsection}{\@startsection{subsection}{2}{\z@}% + {1.5\Cvs \@plus.5\Cvs \@minus.2\Cvs}% + {.5\Cvs \@plus.3\Cvs}% + {\normalfont\large\bfseries}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\subsubsection} +% 見出しの前後に空白を付け、|\normalsize\bfseries|で出力をします。 +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \begin{macrocode} +\newcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}% + {1.5\Cvs \@plus.5\Cvs \@minus.2\Cvs}% + {.5\Cvs \@plus.3\Cvs}% + {\normalfont\normalsize\bfseries}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\paragraph} +% 見出しの前に空白を付け、|\normalsize\bfseries|で出力をします。 +% 見出しの後ろで改行されません。 +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \begin{macrocode} +\newcommand{\paragraph}{\@startsection{paragraph}{4}{\z@}% + {3.25ex \@plus 1ex \@minus .2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\subparagraph} +% 見出しの前に空白を付け、|\normalsize\bfseries|で出力をします。 +% 見出しの後ろで改行されません。 +% \changes{v1.7a}{2016/11/16}{replace \cs{reset@font} with +% \cs{normalfont} (sync with classes.dtx v1.3c)} +% \begin{macrocode} +\newcommand{\subparagraph}{\@startsection{subparagraph}{5}{\z@}% + {3.25ex \@plus 1ex \@minus .2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{付録} +% +% \begin{macro}{\appendix} +% articleクラスの場合、|\appendix|コマンドは次のことを行ないます。 +% +% \begin{itemize} +% \item \Lcount{section}と\Lcount{subsection}カウンタをリセットする。 +% \item |\thesection|を英小文字で出力するように再定義する。 +% \end{itemize} +% +% \begin{macrocode} +%<*article> +\newcommand{\appendix}{\par + \setcounter{section}{0}% + \setcounter{subsection}{0}% +%<tate> \renewcommand{\thesection}{\rensuji{\@Alph\c@section}}} +%<yoko> \renewcommand{\thesection}{\@Alph\c@section}} +%</article> +% \end{macrocode} +% +% reportとbookクラスの場合、|\appendix|コマンドは次のことを行ないます。 +% +% \begin{itemize} +% \item \Lcount{chapter}と\Lcount{section}カウンタをリセットする。 +% \item |\@chapapp|を|\appendixname|に設定する。 +% \item |\@chappos|を空にする。 +% \item |\thechapter|を英小文字で出力するように再定義する。 +% \end{itemize} +% +% \begin{macrocode} +%<*report|book> +\newcommand{\appendix}{\par + \setcounter{chapter}{0}% + \setcounter{section}{0}% + \renewcommand{\@chapapp}{\appendixname}% + \renewcommand{\@chappos}\space% +%<tate> \renewcommand{\thechapter}{\rensuji{\@Alph\c@chapter}}} +%<yoko> \renewcommand{\thechapter}{\@Alph\c@chapter}} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{リスト環境} +% ここではリスト環境について説明をしています。 +% +% リスト環境のデフォルトは次のように設定されます。 +% +% まず、|\rigtmargin|, |\listparindent|, |\itemindent|をゼロにします。 +% そして、K番目のレベルのリストは|\@listK|で示されるマクロが呼び出されます。 +% ここで`K'は小文字のローマ数字で示されます。たとえば、3番目のレベルのリスト +% として|\@listiii|が呼び出されます。 +% |\@listK|は|\leftmargin|を|\leftmarginK|に設定します。 +% +% \begin{macro}{\leftmargin} +% \begin{macro}{\leftmargini} +% \begin{macro}{\leftmarginii} +% \begin{macro}{\leftmarginiii} +% \begin{macro}{\leftmarginiv} +% \begin{macro}{\leftmarginv} +% \begin{macro}{\leftmarginvi} +% 二段組モードのマージンは少しだけ小さく設定してあります。 +% \begin{macrocode} +\if@twocolumn + \setlength\leftmargini {2em} +\else + \setlength\leftmargini {2.5em} +\fi +% \end{macrocode} +% 次の3つの値は、|\labelsep|とデフォルトラベル(`(m)', `vii.', `M.')の +% 幅の合計よりも大きくしてあります。 +% \begin{macrocode} +\setlength\leftmarginii {2.2em} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\if@twocolumn + \setlength\leftmarginv {.5em} + \setlength\leftmarginvi{.5em} +\else + \setlength\leftmarginv {1em} + \setlength\leftmarginvi{1em} +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\labelsep} +% \begin{macro}{\labelwidth} +% |\labelsep|はラベルとテキストの項目の間の距離です。 +% |\labelwidth|はラベルの幅です。 +% \begin{macrocode} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@beginparpenalty} +% \begin{macro}{\@endparpenalty} +% これらのペナルティは、リストや段落環境の前後に挿入されます。 +% \begin{macro}{\@itempenalty} +% このペナルティは、リスト項目の間に挿入されます。 +% \begin{macrocode} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +%</article|report|book> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\partopsep} +% リスト環境の前に空行がある場合、|\parskip|と|\topsep|に|\partopsep|が +% 加えられた値の縦方向の空白が取られます。 +% \begin{macrocode} +%<10pt>\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +%<11pt>\setlength\partopsep{3\p@ \@plus 1\p@ \@minus 1\p@} +%<12pt>\setlength\partopsep{3\p@ \@plus 2\p@ \@minus 2\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@listi} +% \begin{macro}{\@listI} +% |\@listi|は、|\leftmargin|, |\parsep|, |\topsep|, |\itemsep|などの +% トップレベルの定義をします。 +% この定義は、フォントサイズコマンドによって変更されます(たとえば、 +% |\small|の中では``小さい''リストパラメータになります)。 +% +% このため、|\normalsize|がすべてのパラメータを戻せるように、 +% |\@listI|は|\@listi|のコピーを保存するように定義されています。 +% \begin{macrocode} +%<*10pt|11pt|12pt> +\def\@listi{\leftmargin\leftmargini +%<*10pt> + \parsep 4\p@ \@plus2\p@ \@minus\p@ + \topsep 8\p@ \@plus2\p@ \@minus4\p@ + \itemsep4\p@ \@plus2\p@ \@minus\p@} +%</10pt> +%<*11pt> + \parsep 4.5\p@ \@plus2\p@ \@minus\p@ + \topsep 9\p@ \@plus3\p@ \@minus5\p@ + \itemsep4.5\p@ \@plus2\p@ \@minus\p@} +%</11pt> +%<*12pt> + \parsep 5\p@ \@plus2.5\p@ \@minus\p@ + \topsep 10\p@ \@plus4\p@ \@minus6\p@ + \itemsep5\p@ \@plus2.5\p@ \@minus\p@} +%</12pt> +\let\@listI\@listi +% \end{macrocode} +% ここで、パラメータを初期化しますが、厳密には必要ありません。 +% \begin{macrocode} +\@listi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@listii} +% \begin{macro}{\@listiii} +% \begin{macro}{\@listiv} +% \begin{macro}{\@listv} +% \begin{macro}{\@listvi} +% 下位レベルのリスト環境のパラメータの設定です。 +% これらは保存用のバージョンを持たないことと、 +% フォントサイズコマンドによって変更されないことに注意をしてください。 +% 言い換えれば、このクラスは、本文サイズが +% |\normalsize|で現れるリストの入れ子についてだけ考えています。 +% \begin{macrocode} +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii \advance\labelwidth-\labelsep +%<*10pt> + \topsep 4\p@ \@plus2\p@ \@minus\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ +%</10pt> +%<*11pt> + \topsep 4.5\p@ \@plus2\p@ \@minus\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ +%</11pt> +%<*12pt> + \topsep 5\p@ \@plus2.5\p@ \@minus\p@ + \parsep 2.5\p@ \@plus\p@ \@minus\p@ +%</12pt> + \itemsep\parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii \advance\labelwidth-\labelsep +%<10pt> \topsep 2\p@ \@plus\p@\@minus\p@ +%<11pt> \topsep 2\p@ \@plus\p@\@minus\p@ +%<12pt> \topsep 2.5\p@\@plus\p@\@minus\p@ + \parsep\z@ + \partopsep \p@ \@plus\z@ \@minus\p@ + \itemsep\topsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +%</10pt|11pt|12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{enumerate環境} +% enumerate環境は、カウンタ\Lcount{enumi}, \Lcount{enumii}, \Lcount{enumiii}, +% \Lcount{enumiv}を使います。\Lcount{enumN}はN番目のレベルの番号を制御します。 +% +% \begin{macro}{\theenumi} +% \begin{macro}{\theenumii} +% \begin{macro}{\theenumiii} +% \begin{macro}{\theenumiv} +% 出力する番号の書式を設定します。 +% これらは、すでに\file{ltlists.dtx}で定義されています。 +% \begin{macrocode} +%<*article|report|book> +%<*tate> +\renewcommand{\theenumi}{\rensuji{\@arabic\c@enumi}} +\renewcommand{\theenumii}{\rensuji{(\@alph\c@enumii)}} +\renewcommand{\theenumiii}{\rensuji{\@roman\c@enumiii}} +\renewcommand{\theenumiv}{\rensuji{\@Alph\c@enumiv}} +%</tate> +%<*yoko> +\renewcommand{\theenumi}{\@arabic\c@enumi} +\renewcommand{\theenumii}{\@alph\c@enumii} +\renewcommand{\theenumiii}{\@roman\c@enumiii} +\renewcommand{\theenumiv}{\@Alph\c@enumiv} +%</yoko> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\labelenumi} +% \begin{macro}{\labelenumii} +% \begin{macro}{\labelenumiii} +% \begin{macro}{\labelenumiv} +% enumerate環境のそれぞれの項目のラベルは、 +% |\labelenumi| \ldots\ |\labelenumiv|で生成されます。 +% \begin{macrocode} +%<*tate> +\newcommand{\labelenumi}{\theenumi} +\newcommand{\labelenumii}{\theenumii} +\newcommand{\labelenumiii}{\theenumiii} +\newcommand{\labelenumiv}{\theenumiv} +%</tate> +%<*yoko> +\newcommand{\labelenumi}{\theenumi.} +\newcommand{\labelenumii}{(\theenumii)} +\newcommand{\labelenumiii}{\theenumiii.} +\newcommand{\labelenumiv}{\theenumiv.} +%</yoko> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\p@enumii} +% \begin{macro}{\p@enumiii} +% \begin{macro}{\p@enumiv} +% |\ref|コマンドによって、 +% enumerate環境のN番目のリスト項目が参照されるときの書式です。 +% \begin{macrocode} +\renewcommand{\p@enumii}{\theenumi} +\renewcommand{\p@enumiii}{\theenumi(\theenumii)} +\renewcommand{\p@enumiv}{\p@enumiii\theenumiii} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{enumerate} +% \changes{v1.1q}{1999/05/18}{縦組時のみに設定するようにした} +% トップレベルで使われたときに、最初と最後に半行分のスペースを開けるように、 +% 変更します。この環境は、\file{ltlists.dtx}で定義されています。 +% \changes{v1.7a}{2016/11/16}{Use \cs{expandafter} +% (sync with ltlists.dtx v1.0j)} +% +% \begin{macrocode} +\renewenvironment{enumerate} + {\ifnum \@enumdepth >\thr@@\@toodeep\else + \advance\@enumdepth\@ne + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + \expandafter \list \csname label\@enumctr\endcsname{% + \ifnum\ltjgetparameter{direction}=3 + \ifnum \@listdepth=\@ne \topsep.5\normalbaselineskip + \else\topsep\z@\fi + \parskip\z@ \itemsep\z@ \parsep\z@ + \labelwidth1\zw \labelsep.3\zw + \ifnum \@enumdepth=\@ne \leftmargin1\zw\relax + \else\leftmargin\leftskip\fi + \advance\leftmargin 1\zw + \fi + \usecounter{\@enumctr}% + \def\makelabel##1{\hss\llap{##1}}}% + \fi}{\endlist} +% \end{macrocode} +% \end{environment} +% +% +% \subsubsection{itemize環境} +% +% \begin{macro}{\labelitemi} +% \begin{macro}{\labelitemii} +% \begin{macro}{\labelitemiii} +% \begin{macro}{\labelitemiv} +% itemize環境のそれぞれの項目のラベルは、 +% |\labelenumi| \ldots\ |\labelenumiv|で生成されます。 +% \changes{v1.1a}{1997/01/28}{Bug fix: \cs{labelitemii}.} +% \begin{macrocode} +\newcommand{\labelitemi}{\textbullet} +\newcommand{\labelitemii}{% + \ifnum\ltjgetparameter{direction}=3 + {\textcircled{~}} + \else + {\normalfont\bfseries\textendash} + \fi +} +\newcommand{\labelitemiii}{\textasteriskcentered} +\newcommand{\labelitemiv}{\textperiodcentered} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{itemize} +% \changes{v1.0e}{1996/03/14}{縦組時のみに設定するようにした} +% トップレベルで使われたときに、最初と最後に半行分のスペースを開けるように、 +% 変更します。この環境は、\file{ltlists.dtx}で定義されています。 +% \changes{v1.7a}{2016/11/16}{Use \cs{expandafter} +% (sync with ltlists.dtx v1.0j)} +% \begin{macrocode} +\renewenvironment{itemize} + {\ifnum \@itemdepth >\thr@@\@toodeep\else + \advance\@itemdepth\@ne + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% + \expandafter \list \csname \@itemitem\endcsname{% + \ifnum\ltjgetparameter{direction}=3 + \ifnum \@listdepth=\@ne \topsep.5\normalbaselineskip + \else\topsep\z@\fi + \parskip\z@ \itemsep\z@ \parsep\z@ + \labelwidth1\zw \labelsep.3\zw + \ifnum \@itemdepth =\@ne \leftmargin1\zw\relax + \else\leftmargin\leftskip\fi + \advance\leftmargin 1\zw + \fi + \def\makelabel##1{\hss\llap{##1}}}% + \fi}{\endlist} +% \end{macrocode} +% \end{environment} +% +% +% \subsubsection{description環境} +% +% \begin{environment}{description} +% \changes{v1.0e}{1996/03/14}{\cs{topskip}や\cs{parkip}などの値を縦組時のみに +% 設定するようにした} +% description環境を定義します。 +% 縦組時には、インデントが3字分だけ深くなります。 +% \begin{macrocode} +\newenvironment{description} + {\list{}{\labelwidth\z@ \itemindent-\leftmargin + \ifnum\ltjgetparameter{direction}=3 + \leftmargin\leftskip \advance\leftmargin3\Cwd + \rightmargin\rightskip + \labelsep=1\zw \itemsep\z@ + \listparindent\z@ \topskip\z@ \parskip\z@ \partopsep\z@ + \fi + \let\makelabel\descriptionlabel}}{\endlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\descriptionlabel} +% ラベルの形式を変更する必要がある場合は、|\descriptionlabel|を +% 再定義してください。 +% \begin{macrocode} +\newcommand{\descriptionlabel}[1]{% + \hspace\labelsep\normalfont\bfseries #1} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{verse環境} +% +% \begin{environment}{verse} +% verse環境は、リスト環境のパラメータを使って定義されています。 +% 改行をするには|\\|を用います。|\\|は|\@centercr|に|\let|されています。 +% \begin{macrocode} +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep\z@ \itemindent -1.5em% + \listparindent\itemindent + \rightmargin\leftmargin \advance\leftmargin 1.5em}% + \item\relax}{\endlist} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{quotation環境} +% +% \begin{environment}{quotation} +% quotation環境もまた、list環境のパラメータを使用して定義されています。 +% この環境の各行は、|\textwidth|よりも小さく設定されています。 +% この環境における、段落の最初の行はインデントされます。 +% \begin{macrocode} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent\listparindent + \rightmargin\leftmargin + \parsep\z@ \@plus\p@}% + \item\relax}{\endlist} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{quote環境} +% +% \begin{environment}{quote} +% quote環境は、段落がインデントされないことを除き、quotation環境と同じです。 +% \begin{macrocode} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax}{\endlist} +% \end{macrocode} +% \end{environment} +% +% +% +% \subsection{フロート} +% +% \file{ltfloat.dtx}では、フロートオブジェクトを操作するためのツールしか +% 定義していません。タイプが\texttt{TYPE}のフロートオブジェクトを +% 扱うマクロを定義するには、次の変数が必要です。 +% +% \begin{description} +% \item[\texttt{\bslash fps@TYPE}] +% タイプ\texttt{TYPE}のフロートを置くデフォルトの位置です。 +% +% \item[\texttt{\bslash ftype@TYPE}] +% タイプ\texttt{TYPE}のフロートの番号です。 +% 各\texttt{TYPE}には、一意な、2の倍数の\texttt{TYPE}番号を割り当てます。 +% たとえば、図が番号1ならば、表は2です。次のタイプは4となります。 +% +% \item[\texttt{\bslash ext@TYPE}] +% タイプ\texttt{TYPE}のフロートの目次を出力するファイルの拡張子です。 +% たとえば、|\ext@figure|は`lot'です。 +% +% \item[\texttt{\bslash fnum@TYPE}] +% キャプション用の図番号を生成するマクロです。 +% たとえば、|\fnum@figure|は`図|\thefigure|'を作ります。 +% \end{description} +% +% \subsubsection{figure環境} +% ここでは、figure環境を実装しています。 +% +% \begin{macro}{\c@figure} +% \begin{macro}{\thefigure} +% 図番号です。 +% \begin{macrocode} +%<article>\newcounter{figure} +%<report|book>\newcounter{figure}[chapter] +%<*tate> +%<article>\renewcommand{\thefigure}{\rensuji{\@arabic\c@figure}} +% \end{macrocode} +% \changes{v1.1d}{1997/02/14}{\cs{ifnum}文の構文エラーを訂正。} +% \begin{macrocode} +%<*report|book> +\renewcommand{\thefigure}{% + \ifnum\c@chapter>\z@\thechapter{}・\fi\rensuji{\@arabic\c@figure}} +%</report|book> +%</tate> +%<*yoko> +%<article>\renewcommand{\thefigure}{\@arabic\c@figure} +%<*report|book> +\renewcommand{\thefigure}{% + \ifnum\c@chapter>\z@\thechapter.\fi\@arabic\c@figure} +%</report|book> +%</yoko> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\fps@figure} +% \begin{macro}{\ftype@figure} +% \begin{macro}{\ext@figure} +% \begin{macro}{\fnum@figure} +% フロートオブジェクトタイプ``figure''のためのパラメータです。 +% \begin{macrocode} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +%<tate>\def\fnum@figure{\figurename\thefigure} +%<yoko>\def\fnum@figure{\figurename~\thefigure} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{figure} +% \begin{environment}{figure*} +% |*|形式は2段抜きのフロートとなります。 +% \begin{macrocode} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \subsubsection{table環境} +% ここでは、table環境を実装しています。 +% +% \begin{macro}{\c@table} +% \begin{macro}{\thetable} +% \changes{v1.1n}{1998/10/13} +% {report, bookクラスでchapterカウンタを考慮していなかったのを修正。 +% ありがとう、平川@慶應大さん。} +% 表番号です。 +% \begin{macrocode} +%<article>\newcounter{table} +%<report|book>\newcounter{table}[chapter] +%<*tate> +%<article>\renewcommand{\thetable}{\rensuji{\@arabic\c@table}} +%<*report|book> +\renewcommand{\thetable}{% + \ifnum\c@chapter>\z@\thechapter{}・\fi\rensuji{\@arabic\c@table}} +%</report|book> +%</tate> +%<*yoko> +%<article>\renewcommand{\thetable}{\@arabic\c@table} +%<*report|book> +\renewcommand{\thetable}{% + \ifnum\c@chapter>\z@\thechapter.\fi\@arabic\c@table} +%</report|book> +%</yoko> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\fps@table} +% \begin{macro}{\ftype@table} +% \begin{macro}{\ext@table} +% \begin{macro}{\fnum@table} +% フロートオブジェクトタイプ``table''のためのパラメータです。 +% \begin{macrocode} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +%<tate>\def\fnum@table{\tablename\thetable} +%<yoko>\def\fnum@table{\tablename~\thetable} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{table} +% \begin{environment}{table*} +% |*|形式は2段抜きのフロートとなります。 +% \begin{macrocode} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \subsection{キャプション} +% +% \begin{macro}{\@makecaption} +% |\caption|コマンドは、キャプションを組み立てるために|\@mkcaption|を呼出ます。 +% このコマンドは二つの引数を取ります。 +% 一つは、\meta{number}で、フロートオブジェクトの番号です。 +% もう一つは、\meta{text}でキャプション文字列です。 +% \meta{number}には通常、`図 3.2'のような文字列が入っています。 +% このマクロは、|\parbox|の中で呼び出されます。書体は|\normalsize|です。 +% +% \begin{macro}{\abovecaptionskip} +% \begin{macro}{\belowcaptionskip} +% これらの長さはキャプションの前後に挿入されるスペースです。 +% \begin{macrocode} +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% キャプション内で複数の段落を作成することができるように、 +% このマクロは|\long|で定義をします。 +% \begin{macrocode} +\long\def\@makecaption#1#2{% + \vskip\abovecaptionskip + \ifnum\ltjgetparameter{direction}=3 \sbox\@tempboxa{#1\hskip1\zw#2}% + \else\sbox\@tempboxa{#1: #2}% + \fi + \ifdim \wd\@tempboxa >\hsize + \ifnum\ltjgetparameter{direction}=3 #1\hskip1\zw#2\relax\par + \else #1: #2\relax\par\fi + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip} +% \end{macrocode} +% \end{macro} +% +% \subsection{コマンドパラメータの設定} +% +% \subsubsection{arrayとtabular環境} +% +% \begin{macro}{\arraycolsep} +% array環境のカラムは2|\arraycolsep|で分離されます。 +% \begin{macrocode} +\setlength\arraycolsep{5\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabcolsep} +% tabular環境のカラムは2|\tabcolsep|で分離されます。 +% \begin{macrocode} +\setlength\tabcolsep{6\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\arrayrulewidth} +% arrayとtabular環境内の罫線の幅です。 +% \begin{macrocode} +\setlength\arrayrulewidth{.4\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doublerulesep} +% arrayとtabular環境内の罫線間を調整する空白です。 +% \begin{macrocode} +\setlength\doublerulesep{2\p@} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{tabbing環境} +% +% \begin{macro}{\tabbingsep} +% |\'|コマンドで置かれるスペースを制御します。 +% \begin{macrocode} +\setlength\tabbingsep{\labelsep} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{minipage環境} +% +% \begin{macro}{\@mpfootins} +% minipageにも脚注を付けることができます。 +% |\skip||\@mpfootins|は、通常の|\skip||\footins|と同じような動作をします。 +% \begin{macrocode} +\skip\@mpfootins = \skip\footins +% \end{macrocode} +% \end{macro} +% +% \subsubsection{framebox環境} +% +% \begin{macro}{\fboxsep} +% \begin{macro}{\fboxrule} +% |\fboxsep|は、|\fbox|と|\framebox|での、 +% テキストとボックスの間に入る空白です。 +% |\fboxrule|は|\fbox|と|\framebox|で作成される罫線の幅です。 +% \begin{macrocode} +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{equationとeqnarray環境} +% +% \begin{macro}{\theequation} +% equationカウンタは、新しい章の開始でリセットされます。 +% また、equation番号には、章番号が付きます。 +% +% このコードは|\chapter|定義の後、より正確にはchapterカウンタの定義の後、 +% でなくてはいけません。 +% \begin{macrocode} +%<article>\renewcommand{\theequation}{\@arabic\c@equation} +%<*report|book> +\@addtoreset{equation}{chapter} +\renewcommand{\theequation}{% + \ifnum\c@chapter>\z@\thechapter.\fi \@arabic\c@equation} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% +% \section{フォントコマンド} +% まず、数式内に日本語を直接、記述するために数式記号用文字に +% ``JY3/mc/m/n''を登録します。数式バージョンがboldの場合は、 +% ``JY3/gt/m/n''を用います。 +% これらは、|\mathmc|, |\mathgt|として登録されます。 +% また、日本語数式ファミリとして|\symmincho|がこの段階で設定されます。 +% |mathrmmc|オプションが指定されていた場合には、これに引き続き +% |\mathrm|と|\mathbf|を和欧文両対応にするための作業がなされます。この際、 +% 他のマクロとの衝突を避けるため|\AtBeginDocument| +% を用いて展開順序を遅らせる必要があります。 +% +% \textbf{変更} +% +% \changes{v1.6}{2006/06/27}{フォントコマンドを修正。ありがとう、ymtさん。} +% \LaTeX{} 2.09 +% compatibility mode では和文数式フォントfamが2重定義されていた +% ので、その部分を変更しました。 +% +% \changes{v1.8-ltj-14}{2018/10/08}{Lua\TeX-ja本体が|disablejfam|オプションをサポートしました。 +% クラス読み込み時に|disablejfam|オプションを指定した場合は、それがLua\TeX-jaに渡されて +% 数式中に日本語を記述することができなくなります(|\mathmc|, |\mathgt|も定義されません)。} +% \begin{macrocode} +\unless\ifltj@disablejfam +\if@compatibility\else + \DeclareSymbolFont{mincho}{JY3}{mc}{m}{n} + \DeclareSymbolFontAlphabet{\mathmc}{mincho} + \SetSymbolFont{mincho}{bold}{JY3}{gt}{m}{n} + \jfam\symmincho + \DeclareMathAlphabet{\mathgt}{JY3}{gt}{m}{n} +\fi +\if@mathrmmc + \AtBeginDocument{% + \reDeclareMathAlphabet{\mathrm}{\mathrm}{\mathmc} + \reDeclareMathAlphabet{\mathbf}{\mathbf}{\mathgt} +}% +\fi +\fi +% \end{macrocode} +% +% ここでは\LaTeX~2.09で一般的に使われていたコマンドを定義しています。 +% これらのコマンドはテキストモードと数式モードの\emph{どちらでも}動作します。 +% これらは互換性のために提供をしますが、できるだけ|\text...|と|\math...|を +% 使うようにしてください。 +% +% \begin{macro}{\mc} +% \begin{macro}{\gt} +% \begin{macro}{\rm} +% \begin{macro}{\sf} +% \begin{macro}{\tt} +% これらのコマンドはフォントファミリを変更します。 +% 互換モードの同名コマンドと異なり、すべてのコマンドがデフォルトフォントに +% リセットしてから、対応する属性を変更することに注意してください。 +% \begin{macrocode} +\DeclareOldFontCommand{\mc}{\normalfont\mcfamily}{\mathmc} +\DeclareOldFontCommand{\gt}{\normalfont\gtfamily}{\mathgt} +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bf} +% このコマンドはボールド書体にします。ノーマル書体に変更するには、 +% |\mdseries|と指定をします。 +% \begin{macrocode} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\it} +% \begin{macro}{\sl} +% \begin{macro}{\sc} +% これらのコマンドはフォントシェイプを切替えます。 +% スラント体とスモールキャップの数式アルファベットはありませんので、 +% 数式モードでは何もしませんが、警告メッセージを出力します。 +% |\upshape|コマンドで通常のシェイプにすることができます。 +% \begin{macrocode} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\cal} +% \begin{macro}{\mit} +% これらのコマンドは数式モードでだけ使うことができます。 +% 数式モード以外では何もしません。 +% 現在のNFSSは、これらのコマンドが警告を生成するように定義していますので、 +% `手ずから'定義する必要があります。 +% \begin{macrocode} +\DeclareRobustCommand*{\cal}{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*{\mit}{\@fontswitch\relax\mathnormal} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \section{相互参照} +% +% \subsection{目次} +% |\section|コマンドは、\file{.toc}ファイルに、次のような行を出力します。 +% +% |\contentsline{section}{|\meta{title}|}{|\meta{page}|}| +% +% \meta{title}には項目が、\meta{page}にはページ番号が入ります。 +% |\section|に見出し番号が付く場合は、\meta{title}は、 +% |\numberline{|\meta{num}|}{|\meta{heading}|}|となります。 +% \meta{num}は|\thesection|コマンドで生成された見出し番号です。 +% \meta{heading}は見出し文字列です。この他の見出しコマンドも同様です。 +% +% figure環境での|\caption|コマンドは、\file{.lof}ファイルに、 +% 次のような行を出力します。 +% +% |\contentsline{figure}{\numberline{|\meta{num}|}{|% +% \meta{caption}|}}{|\meta{page}|}| +% +% \meta{num}は、|\thefigure|コマンドで生成された図番号です。 +% \meta{caption}は、キャプション文字列です。table環境も同様です。 +% +% |\contentsline{|\meta{name}|}|コマンドは、|\l@|\meta{name}に展開されます。 +% したがって、目次の体裁を記述するには、|\l@chapter|, |\l@section|などを +% 定義します。図目次のためには|\l@figure|です。 +% これらの多くのコマンドは|\@dottedtocline|コマンドで定義されています。 +% このコマンドは次のような書式となっています。 +% +% |\@dottedtocline{|\meta{level}|}{|\meta{indent}|}{|^^A +% \meta{numwidth}|}{|\meta{title}|}{|\meta{page}|}| +% +% \begin{description} +% \item[\meta{level}] ``\meta{level} $<=$ \Lcount{tocdepth}''のときにだけ、 +% 生成されます。|\chapter|はレベル0、|\section|はレベル1、$\ldots$ です。 +% \item[\meta{indent}] 一番外側からの左マージンです。 +% \item[\meta{numwidth}] 見出し番号(|\numberline|コマンドの\meta{num})が +% 入るボックスの幅です。 +% \end{description} +% +% \begin{macro}{\c@tocdepth} +% \Lcount{tocdepth}は、目次ページに出力をする見出しレベルです。 +% \begin{macrocode} +%<article>\setcounter{tocdepth}{3} +%<!article>\setcounter{tocdepth}{2} +% \end{macrocode} +% \end{macro} +% +% また、目次を生成するために次のパラメータも使います。 +% +% \begin{macro}{\@pnumwidth} +% ページ番号の入るボックスの幅です。 +% \begin{macrocode} +\newcommand{\@pnumwidth}{1.55em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tocrmarg} +% 複数行にわたる場合の右マージンです。 +% \begin{macrocode} +\newcommand{\@tocrmarg}{2.55em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@dotsep} +% ドットの間隔(mu単位)です。2や1.7のように指定をします。 +% \begin{macrocode} +\newcommand{\@dotsep}{4.5} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\toclineskip} +% この長さ変数は、目次項目の間に入るスペースの長さです。 +% デフォルトはゼロとなっています。縦組のとき、スペースを少し広げます。 +% \begin{macrocode} +\newdimen\toclineskip +%<yoko>\setlength\toclineskip{\z@} +%<tate>\setlength\toclineskip{2\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\numberline} +% \begin{macro}{\@lnumwidth} +% |\numberline|マクロの定義を示します。オリジナルの定義では、ボックスの幅を +% |\@tempdima|にしていますが、この変数はいろいろな箇所で使われますので、 +% 期待した値が入らない場合があります。 +% +% ^^A たとえば、|lltjfont.sty|での|\selectfont|は、和欧文のベースラインを調整する +% ^^A ために|\@tempdima|変数を用いています。そのため、|\l@...|マクロの中で +% ^^A フォントを切替えると、|\numberline|マクロのボックス +% ^^A の幅が、ベースラインを調整するときに計算した値になってしまいます。 +% ^^A →修正(texjporg):最近の|\adjustbaseline|では|\adjust@dimen|が使われて +% ^^A いるため、記述をコメントアウトしました。 +% +% フォント選択コマンドの後、あるいは|\numberline|マクロの中でフォントを +% 切替えてもよいのですが、一時変数を意識したくないので、 +% 見出し番号の入るボックスを|\@lnumwidth|変数を用いて組み立てるように +% |\numberline|マクロを再定義します。 +% \begin{macrocode} +\newdimen\@lnumwidth +\def\numberline#1{\hb@xt@\@lnumwidth{#1\hfil}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@dottedtocline} +% 目次の各行間に|\toclineskip|を入れるように変更します。 +% このマクロは\file{ltsect.dtx}で定義されています。 +% \changes{v1.3}{2001/10/04}{第5引数の書体を\cs{rmfamily}から\cs{normalfont}に変更} +% \changes{v1.7a}{2016/11/16}{Added \cs{nobreak} for +% latex/2343 (sync with ltsect.dtx v1.0z)} +% \begin{macrocode} +\def\@dottedtocline#1#2#3#4#5{% + \ifnum #1>\c@tocdepth \else + \vskip\toclineskip \@plus.2\p@ + {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip + \parindent #2\relax\@afterindenttrue + \interlinepenalty\@M + \leavevmode + \@lnumwidth #3\relax + \advance\leftskip \@lnumwidth \null\nobreak\hskip -\leftskip + {#4}\nobreak + \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern \@dotsep mu$}% + \hfill\nobreak + \hb@xt@\@pnumwidth{\hss\normalfont \normalcolor #5}% + \par}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addcontentsline} +% 縦組の場合にページ番号を|\rensuji|で囲むように変更します。 +% ^^A 横組のときにも`|\rensuji|'コマンドが出力されますが、 +% ^^A このコマンドによる影響はありません。 +% +% このマクロは\file{ltsect.dtx}で定義されています。 +% \changes{v1.8a}{2018/10/25}{ファイル書き出し時の行末文字対策 +% (sync with ltsect.dtx 2018/09/26 v1.1c)} +% \begin{macrocode} +\providecommand*\protected@file@percent{} +\def\addcontentsline#1#2#3{% + \protected@write\@auxout + {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble +%<tate> \@temptokena{\rensuji{\thepage}}}% +%<yoko> \@temptokena{\thepage}}% + {\string\@writefile{#1}% + {\protect\contentsline{#2}{#3}{\the\@temptokena}% + \protected@file@percent}}% +} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{本文目次} +% +% \begin{macro}{\tableofcontents} +% 目次を生成します。 +% \begin{macrocode} +\newcommand{\tableofcontents}{% +%<*report|book> + \if@twocolumn\@restonecoltrue\onecolumn + \else\@restonecolfalse\fi +%</report|book> +%<article> \section*{\contentsname +%<!article> \chapter*{\contentsname +% \end{macrocode} +% |\tableofcontents|では、|\@mkboth|はheadingの中に入れてあります。 +% ほかの命令(|\listoffigures|など)については、|\@mkboth|はheadingの +% 外に出してあります。これは\LaTeX の\file{classes.dtx}に合わせています。 +% \begin{macrocode} + \@mkboth{\contentsname}{\contentsname}% + }\@starttoc{toc}% +%<report|book> \if@restonecol\twocolumn\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@part} +% partレベルの目次です。 +% \begin{macrocode} +\newcommand*{\l@part}[2]{% + \ifnum \c@tocdepth >-2\relax +%<article> \addpenalty{\@secpenalty}% +%<!article> \addpenalty{-\@highpenalty}% + \addvspace{2.25em \@plus\p@}% + \begingroup + \parindent\z@\rightskip\@pnumwidth + \parfillskip-\@pnumwidth + {\leavevmode\large\bfseries + \setlength\@lnumwidth{4\zw}% + #1\hfil\nobreak + \hb@xt@\@pnumwidth{\hss#2}}\par + \nobreak +%<article> \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% +%<article> \fi + \endgroup + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@chapter} +% chapterレベルの目次です。 +% \begin{macrocode} +%<*report|book> +\newcommand*{\l@chapter}[2]{% + \ifnum \c@tocdepth >\m@ne + \addpenalty{-\@highpenalty}% + \addvspace{1.0em \@plus\p@}% + \begingroup + \parindent\z@ \rightskip\@pnumwidth \parfillskip-\rightskip + \leavevmode\bfseries + \setlength\@lnumwidth{4\zw}% + \advance\leftskip\@lnumwidth \hskip-\leftskip + #1\nobreak\hfil\nobreak\hb@xt@\@pnumwidth{\hss#2}\par + \penalty\@highpenalty + \endgroup + \fi} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@section} +% sectionレベルの目次です。 +% \begin{macrocode} +%<*article> +\newcommand*{\l@section}[2]{% + \ifnum \c@tocdepth >\z@ + \addpenalty{\@secpenalty}% + \addvspace{1.0em \@plus\p@}% + \begingroup + \parindent\z@ \rightskip\@pnumwidth \parfillskip-\rightskip + \leavevmode\bfseries + \setlength\@lnumwidth{1.5em}% + \advance\leftskip\@lnumwidth \hskip-\leftskip + #1\nobreak\hfil\nobreak\hb@xt@\@pnumwidth{\hss#2}\par + \endgroup + \fi} +%</article> +% \end{macrocode} +% +% \begin{macrocode} +%<*report|book> +%<tate>\newcommand*{\l@section}{\@dottedtocline{1}{1\zw}{4\zw}} +%<yoko>\newcommand*{\l@section}{\@dottedtocline{1}{1.5em}{2.3em}} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@subsection} +% \begin{macro}{\l@subsubsection} +% \begin{macro}{\l@paragraph} +% \begin{macro}{\l@subparagraph} +% 下位レベルの目次項目の体裁です。 +% \begin{macrocode} +%<*tate> +%<*article> +\newcommand*{\l@subsection} {\@dottedtocline{2}{1\zw}{4\zw}} +\newcommand*{\l@subsubsection}{\@dottedtocline{3}{2\zw}{6\zw}} +\newcommand*{\l@paragraph} {\@dottedtocline{4}{3\zw}{8\zw}} +\newcommand*{\l@subparagraph} {\@dottedtocline{5}{4\zw}{9\zw}} +%</article> +%<*report|book> +\newcommand*{\l@subsection} {\@dottedtocline{2}{2\zw}{6\zw}} +\newcommand*{\l@subsubsection}{\@dottedtocline{3}{3\zw}{8\zw}} +\newcommand*{\l@paragraph} {\@dottedtocline{4}{4\zw}{9\zw}} +\newcommand*{\l@subparagraph} {\@dottedtocline{5}{5\zw}{10\zw}} +%</report|book> +%</tate> +%<*yoko> +%<*article> +\newcommand*{\l@subsection} {\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*{\l@subsubsection}{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*{\l@paragraph} {\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*{\l@subparagraph} {\@dottedtocline{5}{10em}{5em}} +%</article> +%<*report|book> +\newcommand*{\l@subsection} {\@dottedtocline{2}{3.8em}{3.2em}} +\newcommand*{\l@subsubsection}{\@dottedtocline{3}{7.0em}{4.1em}} +\newcommand*{\l@paragraph} {\@dottedtocline{4}{10em}{5em}} +\newcommand*{\l@subparagraph} {\@dottedtocline{5}{12em}{6em}} +%</report|book> +%</yoko> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{図目次と表目次} +% +% \begin{macro}{\listoffigures} +% 図の一覧を作成します。 +% \changes{v1.7}{2016/11/12}{Moved \cs{@mkboth} out of heading +% arg (sync with classes.dtx v1.4c)} +% \begin{macrocode} +\newcommand{\listoffigures}{% +%<*report|book> + \if@twocolumn\@restonecoltrue\onecolumn + \else\@restonecolfalse\fi + \chapter*{\listfigurename}% +%</report|book> +%<article> \section*{\listfigurename}% + \@mkboth{\listfigurename}{\listfigurename}% + \@starttoc{lof}% +%<report|book> \if@restonecol\twocolumn\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@figure} +% 図目次の体裁です。 +% \begin{macrocode} +%<tate>\newcommand*{\l@figure}{\@dottedtocline{1}{1\zw}{4\zw}} +%<yoko>\newcommand*{\l@figure}{\@dottedtocline{1}{1.5em}{2.3em}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\listoftables} +% \changes{v1.0c}{1995/12/28}{fix the \cs{listoftable} typo.} +% 表の一覧を作成します。 +% \changes{v1.7}{2016/11/12}{Moved \cs{@mkboth} out of heading +% arg (sync with classes.dtx v1.4c)} +% \begin{macrocode} +\newcommand{\listoftables}{% +%<*report|book> + \if@twocolumn\@restonecoltrue\onecolumn + \else\@restonecolfalse\fi + \chapter*{\listtablename}% +%</report|book> +%<article> \section*{\listtablename}% + \@mkboth{\listtablename}{\listtablename}% + \@starttoc{lot}% +%<report|book> \if@restonecol\twocolumn\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@table} +% 表目次の体裁は、図目次と同じにします。 +% \begin{macrocode} +\let\l@table\l@figure +% \end{macrocode} +% \end{macro} +% +% +% \subsection{参考文献} +% +% \begin{macro}{\bibindent} +% オープンスタイルの参考文献で使うインデント幅です。 +% \begin{macrocode} +\newdimen\bibindent +\setlength\bibindent{1.5em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newblock} +% |\newblock|のデフォルト定義は、小さなスペースを生成します。 +% \begin{macrocode} +\newcommand{\newblock}{\hskip .11em\@plus.33em\@minus.07em} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{thebibliography} +% 参考文献や関連図書のリストを作成します。 +% \changes{v1.7}{2016/11/12}{Moved \cs{@mkboth} out of heading +% arg (sync with classes.dtx v1.4c)} +% \begin{macrocode} +\newenvironment{thebibliography}[1] +%<article>{\section*{\refname}\@mkboth{\refname}{\refname}% +%<report|book>{\chapter*{\bibname}\@mkboth{\bibname}{\bibname}% + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy +% \end{macrocode} +% \changes{v1.1a}{1997/01/23}{\break\LaTeX\ \texttt{!<1996/12/01!>}に合わせて修正} +% \begin{macrocode} + \clubpenalty4000 + \@clubpenalty\clubpenalty + \widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\@openbib@code} +% |\@openbib@code|のデフォルト定義は何もしません。 +% この定義は、\Lopt{openbib}オプションによって変更されます。 +% \begin{macrocode} +\let\@openbib@code\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@biblabel} +% The label for a |\bibitem[...]| command is produced by this +% macro. The default from \file{latex.dtx} is used. +% \begin{macrocode} +% \renewcommand*{\@biblabel}[1]{[#1]\hfill} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@cite} +% The output of the |\cite| command is produced by this macro. The +% default from \file{ltbibl.dtx} is used. +% \begin{macrocode} +% \renewcommand*{\@cite}[1]{[#1]} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{索引} +% +% \begin{environment}{theindex} +% 2段組の索引を作成します。 +% 索引の先頭のページのスタイルは\pstyle{jpl@in}とします。したがって、 +% \pstyle{headings}と\pstyle{bothstyle}に適した位置に出力されます。 +% \begin{macrocode} +\newenvironment{theindex} + {\if@twocolumn\@restonecolfalse\else\@restonecoltrue\fi +%<article> \twocolumn[\section*{\indexname}]% +%<report|book> \twocolumn[\@makeschapterhead{\indexname}]% + \@mkboth{\indexname}{\indexname}% + \thispagestyle{jpl@in}\parindent\z@ +% \end{macrocode} +% パラメータ|\columnseprule|と|\columnsep|の変更は、|\twocolumn|が +% 実行された後でなければなりません。そうしないと、索引の前のページ +% にも影響してしまうためです。 +% \changes{v1.7}{2016/11/12}{\cs{columnsep}と\cs{columnseprule}の +% 変更を後ろに移動(sync with classes.dtx v1.4f)} +% \begin{macrocode} + \parskip\z@ \@plus .3\p@\relax + \columnseprule\z@ \columnsep 35\p@ + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\@idxitem} +% \begin{macro}{\subitem} +% \begin{macro}{\subsubitem} +% 索引項目の字下げ幅です。|\@idxitem|は|\item|の項目の字下げ幅です。 +% \begin{macrocode} +\newcommand{\@idxitem}{\par\hangindent 40\p@} +\newcommand{\subitem}{\@idxitem \hspace*{20\p@}} +\newcommand{\subsubitem}{\@idxitem \hspace*{30\p@}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\indexspace} +% 索引の``文字''見出しの前に入るスペースです。 +% \begin{macrocode} +\newcommand{\indexspace}{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{脚注} +% +% \begin{macro}{\footnoterule} +% 本文と脚注の間に引かれる罫線です。 +% \changes{v1.7}{2016/11/12}{use \cs{@width} (sync with classes.dtx v1.3a)} +% \begin{macrocode} +\renewcommand{\footnoterule}{% + \kern-3\p@ + \hrule\@width.4\columnwidth + \kern2.6\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@footnote} +% reportとbookクラスでは、chapterレベルでリセットされます。 +% \begin{macrocode} +%<!article>\@addtoreset{footnote}{chapter} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefntext} +% このマクロにしたがって脚注が組まれます。 +% +% |\@makefnmark|は脚注記号を組み立てるマクロです。 +% \changes{v1.7}{2016/11/12}{Replaced all \cs{hbox to} by +% \cs{hb@xt@} (sync with classes.dtx v1.3a)} +% \begin{macrocode} +%<*tate> +\newcommand\@makefntext[1]{\parindent 1\zw + \noindent\hb@xt@ 2\zw{\hss\@makefnmark}#1} +%</tate> +%<*yoko> +\newcommand\@makefntext[1]{\parindent 1em + \noindent\hb@xt@ 1.8em{\hss\@makefnmark}#1} +%</yoko> +% \end{macrocode} +% \end{macro} +% +% +% \section{今日の日付} +% 組版時における現在の日付を出力します。 +% +% \iffalse meta-comment! +% 注意:ここで \DisableCrossrefs, \EnableCrossrefs をしているのは、 +% platex jclasses.dtx で dvi を作るときにエラーになるため。 +% \fi +% \DisableCrossrefs +% \begin{macro}{\if西暦} +% \begin{macro}{\西暦} +% \begin{macro}{\和暦} +% \changes{v1.0h}{1996/12/17}{Typo:和歴 to 和暦} +% |\today|コマンドの`年'を、 +% 西暦か和暦のどちらで出力するかを指定するコマンドです。 +% 2018年7月以降の日本語\TeX{}開発コミュニティ版(v1.8)では、 +% デフォルトを和暦ではなく西暦に設定しています。 +% \changes{v1.8}{2018/07/03}{\cs{today}のデフォルトを和暦から西暦に変更} +% \begin{macrocode} +\newif\if西暦 \西暦true +\def\西暦{\西暦true} +\def\和暦{\西暦false} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \EnableCrossrefs +% +% \begin{macro}{\heisei} +% \changes{v1.1m}{1998/04/07}{\cs{today}の計算手順を変更} +% \changes{v1.8b}{2019/04/02}{\cs{heisei}の値は$\mbox{西暦}-1988$で固定} +% |\today|コマンドを|\rightmark|で指定したとき、|\rightmark|を出力する部分 +% で和暦のための計算ができないので、クラスファイルを読み込む時点で計算して +% おきます。 +% \begin{macrocode} +\newcount\heisei \heisei\year \advance\heisei-1988\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\today} +% \begin{macro}{\pltx@today@year} +% 縦組の場合は、漢数字で出力します。 +% \pLaTeX\ 2018-12-01以前では縦数式ディレクション時でも漢数字で出力していましたが、 +% \pLaTeX\ 2019-04-06以降からはそうしなくなりました。 +% +% \changes{v1.6-ltj-9}{2015/01/01}{縦組では,この漢数字による日付出力でエラーになりました. +% Lua\TeX-ja では,\cs{kansuji}の後に\cs{number}を続けることは出来ないので\cs{number}を削除しました.} +% \changes{v1.8b}{2019/04/02}{\cs{today}の計算・出力方法を変更。} +% \begin{macrocode} +\def\pltx@today@year@#1{% + \ifnum\numexpr\year-#1=1 元\else + \ifnum\ltjgetparameter{direction}=3 + \kansuji\numexpr\year-#1\relax + \else + \number\numexpr\year-#1\relax\nobreak + \fi + \fi 年 +} +\def\pltx@today@year{% + \ifnum\numexpr\year*10000+\month*100+\day<19890108 + 昭和\pltx@today@year@{1925}% + \else\ifnum\numexpr\year*10000+\month*100+\day<20190501 + 平成\pltx@today@year@{1988}% + \else + 令和\pltx@today@year@{2018}% + \fi\fi} +\def\today{{% + \if西暦 + \ifnum\ltjgetparameter{direction}=3 \kansuji\year + \else\number\year\nobreak\fi 年 + \else + \pltx@today@year + \fi + \ifnum\ltjgetparameter{direction}=3 + \kansuji\month 月 + \kansuji\day 日 + \else + \number\month\nobreak 月 + \number\day\nobreak 日 + \fi}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% +% \section{初期設定} +% +% \begin{macro}{\prepartname} +% \begin{macro}{\postpartname} +% \begin{macro}{\prechaptername} +% \begin{macro}{\postchaptername} +% \begin{macrocode} +\newcommand{\prepartname}{第} +\newcommand{\postpartname}{部} +%<report|book>\newcommand{\prechaptername}{第} +%<report|book>\newcommand{\postchaptername}{章} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\contentsname} +% \begin{macro}{\listfigurename} +% \begin{macro}{\listtablename} +% \begin{macrocode} +\newcommand{\contentsname}{目 次} +\newcommand{\listfigurename}{図 目 次} +\newcommand{\listtablename}{表 目 次} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\refname} +% \begin{macro}{\bibname} +% \begin{macro}{\indexname} +% \begin{macrocode} +%<article>\newcommand{\refname}{参考文献} +%<report|book>\newcommand{\bibname}{関連図書} +\newcommand{\indexname}{索 引} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\figurename} +% \begin{macro}{\tablename} +% \begin{macrocode} +\newcommand{\figurename}{図} +\newcommand{\tablename}{表} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\appendixname} +% \begin{macro}{\abstractname} +% \begin{macrocode} +\newcommand{\appendixname}{付 録} +%<article|report>\newcommand{\abstractname}{概 要} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% |stfloats|パッケージがシステムにインストールされている場合は、このパッケージを使って +% p\LaTeX の標準時と同じようにボトムフロートの下に脚注が組まれるようにします。 +% \changes{v1.0d}{1996/02/29}{articleとreportのデフォルトを +% \pstyle{plain}に修正} +% \changes{v1.4}{2002/04/09}{縦組スタイルで\cs{flushbottom}しないようにした} +% \changes{v1.7d-ltj-13}{2017/02/19}{p\LaTeX とLua\TeX-jaの|\@makecol|が違うことを +% 考慮していなかった} +% \begin{macrocode} +%<book>\pagestyle{headings} +%<!book>\pagestyle{plain} +\pagenumbering{arabic} +\raggedbottom +\fnfixbottomtrue % 2017-02-19 +\IfFileExists{stfloats.sty}{\RequirePackage{stfloats}\fnbelowfloat}{} +\if@twocolumn + \twocolumn + \sloppy +\else + \onecolumn +\fi +% \end{macrocode} +% |\@mparswitch|は傍注を左右(縦組では上下)どちらのマージンに +% 出力するかの指定です。偽の場合、傍注は一方の側にしか出力されません。 +% このスイッチを真とすると、とくに縦組の場合、奇数ページでは本文の上に、 +% 偶数ページでは本文の下に傍注が出力されますので、おかしなことになります。 +% +% また、縦組のときには、傍注を本文の下に出すようにしています。 +% |\reversemarginpar|とすると本文の上側に出力されます。 +% ただし、二段組の場合は、つねに隣接するテキスト側のマージンに出力されます。 +% \begin{macrocode} +%<*tate> +\normalmarginpar +\@mparswitchfalse +%</tate> +%<*yoko> +\if@twoside + \@mparswitchtrue +\else + \@mparswitchfalse +\fi +%</yoko> +%</article|report|book> +% \end{macrocode} +% +% \section{各種パッケージへの対応} +% もともと縦組での利用を想定されていないいくつかのパッケージについて、 +% 補正するためのコードを記述しておきます。 +% この節のコードは|filehook|パッケージ(Lua\TeX-ja読み込み時に自動でロードされます) +% の機能を用いています。 +% +% \subsection{\texttt{ftnright}パッケージ} +% 脚注番号の書式が|ftnright|パッケージによって勝手に書き換えられるので、 +% パッケージ読み込み前に予め退避しておき、読み込み後に復帰させます。 +% \changes{v1.7d}{2017/02/19}{コード追加} +% \begin{macrocode} +%<*article|report|book> +\AtBeginOfPackageFile*{ftnright}{\let\ltjt@orig@@makefntext=\@makefntext} +\AtEndOfPackageFile*{ftnright}{\let\@makefntext=\ltjt@orig@@makefntext} +%</article|report|book> +% \end{macrocode} +% +% +% \Finale +% +\endinput diff --git a/macros/luatex/generic/luatexja/src/ltjclasses.ins b/macros/luatex/generic/luatexja/src/ltjclasses.ins new file mode 100644 index 0000000000..a4977146c7 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltjclasses.ins @@ -0,0 +1,28 @@ +% +% ltjclasses.ins +% + +\input docstrip +\keepsilent + +\generateFile{ltjarticle.cls}{f}{\from{ltjclasses.dtx}{article,yoko}} +\generateFile{ltjreport.cls}{f}{\from{ltjclasses.dtx}{report,yoko}} +\generateFile{ltjbook.cls}{f}{\from{ltjclasses.dtx}{book,yoko}} +\generateFile{ltjsize10.clo}{f}{\from{ltjclasses.dtx}{10pt,yoko}} +\generateFile{ltjsize11.clo}{f}{\from{ltjclasses.dtx}{11pt,yoko}} +\generateFile{ltjsize12.clo}{f}{\from{ltjclasses.dtx}{12pt,yoko}} +\generateFile{ltjbk10.clo}{f}{\from{ltjclasses.dtx}{10pt,bk,yoko}} +\generateFile{ltjbk11.clo}{f}{\from{ltjclasses.dtx}{11pt,bk,yoko}} +\generateFile{ltjbk12.clo}{f}{\from{ltjclasses.dtx}{12pt,bk,yoko}} + +\generateFile{ltjtarticle.cls}{f}{\from{ltjclasses.dtx}{article,tate}} +\generateFile{ltjtreport.cls}{f}{\from{ltjclasses.dtx}{report,tate}} +\generateFile{ltjtbook.cls}{f}{\from{ltjclasses.dtx}{book,tate}} +\generateFile{ltjtsize10.clo}{f}{\from{ltjclasses.dtx}{10pt,tate}} +\generateFile{ltjtsize11.clo}{f}{\from{ltjclasses.dtx}{11pt,tate}} +\generateFile{ltjtsize12.clo}{f}{\from{ltjclasses.dtx}{12pt,tate}} +\generateFile{ltjtbk10.clo}{f}{\from{ltjclasses.dtx}{10pt,bk,tate}} +\generateFile{ltjtbk11.clo}{f}{\from{ltjclasses.dtx}{11pt,bk,tate}} +\generateFile{ltjtbk12.clo}{f}{\from{ltjclasses.dtx}{12pt,bk,tate}} + +\endbatchfile diff --git a/macros/luatex/generic/luatexja/src/ltjltxdoc.dtx b/macros/luatex/generic/luatexja/src/ltjltxdoc.dtx new file mode 100644 index 0000000000..0a5c2b370f --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltjltxdoc.dtx @@ -0,0 +1,218 @@ +% \iffalse meta-comment +%% File: ltjltxdoc.dtx +% ------------------------------------- +% Original: jltxdoc.dtx +% +% Copyright 1995,1996,1997 ASCII Corporation. +% +% This file is part of pLaTeX2e system. +% ------------------------------------- +% +% \fi +% +% \setcounter{StandardModuleDepth}{1} +% \StopEventually{} +% +% \iffalse +% \changes{v1.0a}{1997/01/23}{\LaTeX \texttt{!<1996/12/01!>}への対応に +% 合わせて修正} +% \changes{v1.0b}{1997/07/29}{\cs{}と\texttt{"}の\cs{xspcode}を変更} +% \changes{v1.0b-ltj}{2011/09/27}{Lua\LaTeX-ja 用に修正} +% \changes{v1.0b-ltj-2}{2014/07/03}{orを意味する縦棒の出力が異常だったので修正} +% \changes{v1.0c}{2016/07/25}{docパッケージが上書きする\cs{verb}を再々定義} +% \changes{v1.0d}{2017/09/24}{\cs{vadjust\{\}}を追加} +% \changes{v1.0d-ltj-3}{2018/01/01}{\cs{Cjascale}を追加} +% \fi +% +% \iffalse +%<class> +%<class>\NeedsTeXFormat{LaTeX2e} +%<class>\ProvidesClass{ltjltxdoc}[2018/01/01 v1.0d-ltj-3 Standard LuaLaTeX-ja file] +%<*driver> +\documentclass{ltjltxdoc} +\GetFileInfo{ltjltxdoc.cls} +\usepackage[kozuka-pr6n]{luatexja-preset} +\usepackage{unicode-math} +\setmathfont{Latin Modern Math} +\title{Lua\LaTeX-jaドキュメント記述用クラス} +\author{Lua\TeX-jaプロジェクト} +\date{\filedate} +\begin{document} + \maketitle + \DocInput{ltjltxdoc.dtx} +\end{document} +%</driver> +% \fi +% +% \file{ltjltxdoc}クラスは、\file{ltxdoc}をテンプレートにして、日本語用の +% 修正を加えています。 +% \begin{macrocode} +%<*class> +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{ltxdoc}} +\ProcessOptions +\LoadClass{ltxdoc} +% \end{macrocode} +% \file{ltxdoc}の読み込み後に\file{luatexja}を読み込みます。 +% +% \changes{v1.60d-ltj-3}{2018/01/01}{\cs{Cjascale}を追加しました。 +% これは、コミュニティ版p\kern-.05em\LaTeX で導入された、 +% 和文スケール($1\,\cs{zw} \div \hbox{要求サイズ}$)を表す実数値マクロです。} +% +% \begin{macrocode} +\RequirePackage{luatexja} +\def\Cjascale{0.962216} +% \end{macrocode} +% +% \begin{macro}{\normalsize} +% \begin{macro}{\small} +% \begin{macro}{\parindent} +% \changes{v1.0a}{1997/01/23}{\cs{normalsize}, \cs{small}などの再定義} +% \file{ltxdoc}からロードされる\file{article}クラスでの行間などの設定値で、 +% 日本語の文章を組版すると、行間が狭いように思われるので、多少広くするように +% 再設定します。また、段落先頭での字下げ量を全角一文字分とします。 +% \begin{macrocode} +\renewcommand{\normalsize}{% + \@setfontsize\normalsize\@xpt{15}% + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ + \belowdisplayskip \abovedisplayskip + \let\@listi\@listI} +\renewcommand{\small}{% + \@setfontsize\small\@ixpt{11}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 4\p@ \@plus2\p@ \@minus2\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep}% + \belowdisplayskip \abovedisplayskip} +\normalsize +\setlength\parindent{1\zw} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\file} +% |\file|マクロは、ファイル名を示すのに用います。 +% \begin{macrocode} +\providecommand*{\file}[1]{\texttt{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pstyle} +% |\pstyle|マクロは、ページスタイル名を示すのに用います。 +% \begin{macrocode} +\providecommand*{\pstyle}[1]{\textsl{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Lcount} +% |\Lcount|マクロは、カウンタ名を示すのに用います。 +% \begin{macrocode} +\providecommand*{\Lcount}[1]{\textsl{\small#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Lopt} +% |\Lopt|マクロは、クラスオプションやパッケージオプションを示すのに用います。 +% \begin{macrocode} +\providecommand*{\Lopt}[1]{\textsf{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dst} +% |\dst|マクロは、``\dst''を出力する。 +% \begin{macrocode} +\providecommand\dst{{\normalfont\scshape docstrip}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NFSS} +% |\NFSS|マクロは、``\NFSS''を出力します。 +% \begin{macrocode} +\providecommand\NFSS{\textsf{NFSS}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@clineno} +% \begin{macro}{\mlineplus} +% |\mlineplus|マクロは、その時点でのマクロコードの行番号に、引数に指定された +% 行数だけを加えた数値を出力します。たとえば|\mlineplus{3}|とすれば、 +% 直前のマクロコードの行番号(\arabic{CodelineNo})に3を加えた数、 +% ``\mlineplus{3}''が出力されます。 +% \begin{macrocode} +\newcounter{@clineno} +\def\mlineplus#1{\setcounter{@clineno}{\arabic{CodelineNo}}% + \addtocounter{@clineno}{#1}\arabic{@clineno}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{environment}{tsample} +% |tsample|環境は、環境内に指定された内容を罫線で囲って出力をします。 +% 第一引数は、出力するボックスの高さです。 +% このマクロ内では縦組になることに注意してください。 +% \begin{macrocode} +\def\tsample#1{% + \hbox to\linewidth\bgroup\vrule width.1pt\hss + \vbox\bgroup\hrule height.1pt + \vskip.5\baselineskip + \vbox to\linewidth\bgroup\tate\hsize=#1\relax\vss} +\def\endtsample{% + \vss\egroup + \vskip.5\baselineskip + \hrule height.1pt\egroup + \hss\vrule width.1pt\egroup} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\verb} +% p\LaTeX{}では、|\verb|コマンドを修正して直前に|\xkanjiskip|が入るように +% しています。しかし、\file{ltxdoc.cls}が読み込む\file{doc.sty}が上書き +% してしまいますので、これを再々定義します。\file{doc.sty}での定義は +%\begin{verbatim} +% \def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi +% \bgroup \let\do\do@noligs \verbatim@nolig@list +% \ttfamily \verb@eol@error \let\do\@makeother \dospecials +% \@ifstar{\@sverb}{\@vobeyspaces \frenchspacing \@sverb}} +%\end{verbatim} +% となっていますので、\file{plcore.dtx}と同様に|\null|を外して|\vadjust{}|を +% 入れます。 +% \changes{v1.0c}{2016/07/25}{docパッケージが上書きする\cs{verb}を再々定義} +% \changes{v1.0d}{2017/09/24}{\cs{vadjust\{\}}を追加} +% \begin{macrocode} +\def\verb{\relax\ifmmode\hbox\else\leavevmode\vadjust{}\fi + \bgroup \let\do\do@noligs \verbatim@nolig@list + \ttfamily \verb@eol@error \let\do\@makeother \dospecials + \@ifstar{\@sverb}{\@vobeyspaces \frenchspacing \@sverb}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{alxspmode} +% コマンド名の|\|と16進数を示すための|"|の前にもスペースが入るよう、 +% これらの|alxspmode|の値を変更します。 +% \changes{v1.0b}{1997/07/29}{\cs{}と\texttt{"}の\cs{xspcode}を変更} +% \changes{v1.0b-ltj}{2011/09/27}{\cs{xspcode}→\cs{ltjsetparameter{alxspmode={...}}}} +% \begin{macrocode} +\ltjsetparameter{alxspmode={"5C,3}} %% \ +\ltjsetparameter{alxspmode={"22,3}} %% " +%</class> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{mod@math@codes} +% docパッケージでは,ドライバ指定の表示の部分における\texttt{\char`\|}の +% \cs{mathcode}は\texttt{"226A}になっており,これにより\texttt{\char`\|}が小文字のjで表示されて +% しまう状況になっています.改善するため,\texttt{"207C}に変更します. +% \begin{macrocode} +\def\mod@math@codes{\mathcode`\|="207C \mathcode`\&="2026 + \mathcode`\-="702D \mathcode`\+="702B + \mathcode`\:="703A \mathcode`\=="703D } +% \end{macrocode} +% \end{macro} +% \Finale +% +\endinput diff --git a/macros/luatex/generic/luatexja/src/ltjltxdoc.ins b/macros/luatex/generic/luatexja/src/ltjltxdoc.ins new file mode 100644 index 0000000000..e07f3bf365 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltjltxdoc.ins @@ -0,0 +1,10 @@ +% +% ltjltxdoc.ins +% + +\input docstrip +\keepsilent + +\generateFile{ltjltxdoc.cls}{f}{\from{ltjltxdoc.dtx}{class}} + +\endbatchfile diff --git a/macros/luatex/generic/luatexja/src/ltjsclasses.dtx b/macros/luatex/generic/luatexja/src/ltjsclasses.dtx new file mode 100644 index 0000000000..be67a2f68e --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltjsclasses.dtx @@ -0,0 +1,5709 @@ +% \iffalse meta-comment +%% File: ltjsclasses.dtx +% ----------------------------------------- +% Original: jsclasses.dtx +% +% pLaTeX2ε新ドキュメントクラス(日本語 TeX 開発コミュニティ版) +% 原作者:奥村晴彦 <okumura@okumuralab.org> +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% Copyright 1995-1999 ASCII Corporation. +% Copyright 1999-2016 Haruhiko Okumura +% Copyright 2016-2018 Japanese TeX Development Community +% ----------------------------------------- +% +% \fi +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +% +% \iffalse +% +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +%<article>\ProvidesClass{ltjsarticle} +%<book>\ProvidesClass{ltjsbook} +%<report>\ProvidesClass{ltjsreport} +%<jspf>\ProvidesClass{ltjspf} +%<kiyou>\ProvidesClass{ltjskiyou} +%<*driver> +\ProvidesFile{ltjsclasses.dtx} +%</driver> + [2019/08/12 ltjsclasses ] +%<*driver> +\IfFileExists{luatex85.sty}{\RequirePackage{luatex85}}{} +\documentclass[disablejfam]{ltjsarticle} +\usepackage{hypdoc} +\hypersetup{unicode=true} +\begingroup + \suppressfontnotfounderror=1 + \global\font\testfont=file:KozMinPr6N-Regular.otf +\endgroup +\ifx\testfont\nullfont + \usepackage[ipaex,nfssonly]{luatexja-preset} +\else + \usepackage[kozuka-pr6n,nfssonly]{luatexja-preset} +\fi +\ltjsetparameter{alxspmode={`\*,allow}} +\ltjsetparameter{alxspmode={`\\,allow}} +%%%%\usepackage{unicode-math} +%%%%\setmathfont{Latin Modern Math} +\addtolength{\textwidth}{-1in} +\addtolength{\evensidemargin}{1in} +\addtolength{\oddsidemargin}{1in} +\addtolength{\marginparwidth}{1in} +\setlength\marginparpush{0pt} +% \OnlyDescription +\CodelineNumbered +\EnableCrossrefs +\setcounter{StandardModuleDepth}{1} +\GetFileInfo{ltjsclasses.dtx} +\begin{document} +\DocInput{ltjsclasses.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% \fi +% +% \title{Lua\LaTeX-ja用\texttt{jsclasses}互換クラス} +% \author{Lua\TeX-jaプロジェクト} +% \date{\filedate} +% \maketitle +% \tableofcontents +% +% \MakeShortVerb{\|} +% +% \section{はじめに} +% +% これは,元々奥村晴彦先生により作成され,現在は日本語\TeX 開発コミュニティにより +% 管理されている\texttt{jsclasses.dtx}をLua\LaTeX-ja用に改変したものです。 +% 次のドキュメントクラス(スタイルファイル)を生成します。 +% +% [2017-02-13] forum:2121の議論を機に,ltjsreportクラスを新設しました。 +% 従来のltjsbookの |report| オプションと比べると,|abstract| 環境の使い方 +% および挙動がアスキーのjreportに近づきました。 +% +% \begin{quote} +% \begin{tabular}{lll} +% $\langle$\textsf{article}$\rangle$ & \texttt{ltjsarticle.cls} & 論文・レポート用 \\ +% $\langle$\textsf{book}$\rangle$ & \texttt{ltjsbook.cls} & 書籍用 \\ +% $\langle$\textsf{report}$\rangle$ & \texttt{ltjsreport.cls} & レポート用 \\ +% $\langle$\textsf{jspf}$\rangle$ & \texttt{ltjspf.cls} & 某学会誌用 \\ +% $\langle$\textsf{kiyou}$\rangle$ & \texttt{ltjskiyou.cls} & 某紀要用 +% \end{tabular} +% \end{quote} +% +% \subsection{\texttt{jsclasses.dtx}からの主な変更点} +% 全ての変更点を知りたい場合は,\texttt{jsclasses.dtx}と\texttt{ltjsclasses.dtx}でdiffを +% とって下さい。zw, zh は全て |\zw|, |\zh| に置き換えられています。 +% \begin{itemize} +% \item フォントメトリック関係のオプション\texttt{winjis}は単に無視されます。 +% \item 標準では\texttt{jfm-ujis.lua}(Lua\TeX-ja標準のメトリック,OTFパッケージのものがベース)を使用します。 +% \item \texttt{uplatex}オプション,\texttt{autodetect-engine}オプションを +% 削除してあります(前者ではエラーを出すようにしています)。 +% \item \texttt{disablejfam}オプションはクラス側では何もしません(ただLua\TeX-ja本体に +% 渡されるだけです).もし +% \begin{quotation} +% |! LaTeX Error: Too many math alphabets used in version ****.| +% \end{quotation} +% のエラーが起こった場合は,\texttt{lualatex-math}パッケージを読み込んでみて下さい。 +% \item \texttt{papersize}オプションの指定に関わらずPDFのページサイズは適切に +% 設定されます。 +% \item Lua\TeX-ja同梱のメトリックを用いる限りは,段落の頭にグルーは挿入されません。 +% そのため,オリジナルの\texttt{jsclasses}内にあったhack (|\everyparhook|)は不要になったので, +% 削除しました。 +% \item 「\texttt{amsmath}との衝突の回避」のコードは,上流で既に対処されているうえ, +% これがあると\texttt{grfext.sty}を読み込んだ際にエラーを引き起こすので削除しました。 +% \item 本家\texttt{jsclasses}では |\mag| を用いて「10\,pt時の組版結果を本文フォントサイズに合わせ拡大縮小」 +% という方針でしたが,本\texttt{ltjsclasses}ではそのような方法を取っていません。 +% \begin{itemize} +% \item \texttt{nomag}オプション指定時には,単にレイアウトに用いる各種長さの値をスケールさせるだけです。 +% そのため,例えば本文の文字サイズが17\,ptのときにはcmr10でなくcmr17を用いることになり,組版結果の印象が +% 異なる恐れがあります。 +% \item \texttt{nomag*}オプション指定時には,上記に加えてオプティカルサイズを調整する(本文ではcmr17の代わりに +% cmr10を拡大縮小する,など)ため,\LaTeX のフォント選択システムNFSSへパッチを当てます。 +% こうすることで前項に書いた不具合はなくなりますが,かえって別の不具合が起きる可能性 +% はあります\footnote{% +% \texttt{nomag*}は\texttt{jsclasses}でも利用可能ですが,\texttt{ltjsclasses}では\texttt{jsclasses}とは +% 別の実装をしています。 +% }。 +% \end{itemize} +% 標準では\texttt{nomag*}オプションが有効になっています。\texttt{jsclasses}で用意され,かつ既定になっている +% \texttt{usemag}オプションを指定すると警告を出します。 +% \end{itemize} +% +% [2014-02-07 LTJ] jsclasses 2014-02-07 ベースにしました。 +% +% [2014-07-26 LTJ] 縦組用和文フォントの設定を加えました。 +% +% [2014-12-24 LTJ] |\@setfontsize| 中の和欧文間空白の設定で if 文が抜けていたのを直しました。 +% +% [2016-01-30 LTJ] |\rmfamily| 他で和文フォントファミリも変更するコードを +% Lua\TeX-ja カーネル内に移しました。 +% +% [2016-03-21 LTJ] Lua\TeX~beta-0.87.0 ではPDF出力時に|\mag|が使用できなくなったので, +% ZRさんの\texttt{bxjscls}を参考に使わないように書き換えました。 +% +% [2016-03-31 LTJ] \texttt{xreal}オプションを標準で有効にしました。 +% +% [2016-07-12 LTJ] \texttt{jsclasses}開発版に合わせ,\texttt{real},~\texttt{xreal}オプションの名称を変更するなどの変更を行いました。 +% +% [2016-07-18 LTJ] \texttt{usemag}オプションが指定されると警告を出すようにしました。 +% +% [2016-07-21 LTJ] \LaTeX 等のロゴの再定義で,\texttt{jslogo}パッケージがあればそちらを読み込むことにしました。 +% +% [2016-10-13 LTJ] \texttt{slide}オプションの使用時にエラーが出るのを修正. +% +% \StopEventually{} +% +% 以下では実際のコードに即して説明します。 +% +% \begin{macro}{\jsc@clsname} +% +% 文書クラスの名前です。エラーメッセージ表示などで使われます。 +% +% \begin{macrocode} +%<article>\def\jsc@clsname{ltjsarticle} +%<book>\def\jsc@clsname{ltjsbook} +%<report>\def\jsc@clsname{ltjsreport} +%<jspf>\def\jsc@clsname{ltjspf} +%<kiyou>\def\jsc@clsname{ltjskiyou} +% \end{macrocode} +% \end{macro} +% +% \section{Lua\TeX-jaの読み込み} +% +% 和文スケール値を設定した後に,Lua\TeX-jaを読み込みます。 +% \begin{macrocode} +%<!jspf>\def\Cjascale{0.924715} +%<jspf>\def\Cjascale{0.903375} +\RequirePackage{luatexja} +% \end{macrocode} +% +% \section{オプション} +% +% これらのクラスは |\documentclass{ltjsarticle}| +% あるいは |\documentclass[オプション]{ltjsarticle}| +% のように呼び出します。 +% +% まず,オプションに関連するいくつかのコマンドやスイッチ(論理変数)を定 +% 義します。 +% +% \begin{macro}{\if@restonecol} +% +% 段組のときに真になる論理変数です。 +% +% \begin{macrocode} +\newif\if@restonecol +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@titlepage} +% +% これを真にすると表題,概要を独立したページに出力します。 +% +% \begin{macrocode} +\newif\if@titlepage +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@openright} +% +% |\chapter|,|\part| を右ページ起こしにするかどうかです。 +% 横組の書籍では真が標準で,要するに片起こし,奇数ページ起こしになります。 +% +% \begin{macrocode} +%<book|report>\newif\if@openright +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@openleft} +% +% [2017-02-24] |\chapter|,|\part| を左ページ起こしにするかどうかです。 +% +% \begin{macrocode} +%<book|report>\newif\if@openleft +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@mainmatter} +% +% 真なら本文,偽なら前付け・後付けです。 +% 偽なら |\chapter| で章番号が出ません。 +% +% \begin{macrocode} +%<book>\newif\if@mainmatter \@mainmattertrue +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@enablejfam} +% +% 和文フォントを数式フォントとして登録するかどうかを示すスイッチですが, +% 実際には用いられません。 +% +% \begin{macrocode} +\newif\if@enablejfam \@enablejfamtrue +% \end{macrocode} +% \end{macro} +% +% 以下で各オプションを宣言します。 +% +% \paragraph{用紙サイズ} +% +% JISやISOのA0判は面積 $1\,\mathrm{m}^2$,縦横比 $1:\sqrt{2}$ +% の長方形の辺の長さを mm 単位に切り捨てたものです。 +% これを基準として順に半截しては mm 単位に切り捨てたものがA1,A2,…です。 +% +% B判はJISとISOで定義が異なります。 +% JISではB0判の面積が $1.5\,\mathrm{m}^2$ ですが, +% ISOではB1判の辺の長さがA0判とA1判の辺の長さの幾何平均です。 +% したがってISOのB0判は $1000\,\mathrm{mm} \times 1414\,\mathrm{mm}$ です。 +% このため,\LaTeXe の \texttt{b5paper} +% は $250\,\mathrm{mm} \times 176\,\mathrm{mm}$ ですが, +% \pLaTeXe の \texttt{b5paper} +% は $257\,\mathrm{mm} \times 182\,\mathrm{mm}$ になっています。 +% ここでは\pLaTeXe にならってJISに従いました。 +% +% デフォルトは \texttt{a4paper} です。 +% +% \texttt{b5var}(B5変形,182mm×230mm), +% \texttt{a4var}(A4変形,210mm×283mm)を追加しました。 +% +% \begin{macrocode} +\DeclareOption{a3paper}{% + \setlength\paperheight {420mm}% + \setlength\paperwidth {297mm}} +\DeclareOption{a4paper}{% + \setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{a5paper}{% + \setlength\paperheight {210mm}% + \setlength\paperwidth {148mm}} +\DeclareOption{a6paper}{% + \setlength\paperheight {148mm}% + \setlength\paperwidth {105mm}} +\DeclareOption{b4paper}{% + \setlength\paperheight {364mm}% + \setlength\paperwidth {257mm}} +\DeclareOption{b5paper}{% + \setlength\paperheight {257mm}% + \setlength\paperwidth {182mm}} +\DeclareOption{b6paper}{% + \setlength\paperheight {182mm}% + \setlength\paperwidth {128mm}} +\DeclareOption{a4j}{% + \setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{a5j}{% + \setlength\paperheight {210mm}% + \setlength\paperwidth {148mm}} +\DeclareOption{b4j}{% + \setlength\paperheight {364mm}% + \setlength\paperwidth {257mm}} +\DeclareOption{b5j}{% + \setlength\paperheight {257mm}% + \setlength\paperwidth {182mm}} +\DeclareOption{a4var}{% + \setlength\paperheight {283mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{b5var}{% + \setlength\paperheight {230mm}% + \setlength\paperwidth {182mm}} +\DeclareOption{letterpaper}{% + \setlength\paperheight {11in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{legalpaper}{% + \setlength\paperheight {14in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{executivepaper}{% + \setlength\paperheight {10.5in}% + \setlength\paperwidth {7.25in}} +% \end{macrocode} +% +% \paragraph{横置き} +% +% 用紙の縦と横の長さを入れ換えます。 +% +% \begin{macrocode} +\newif\if@landscape +\@landscapefalse +\DeclareOption{landscape}{\@landscapetrue} +% \end{macrocode} +% +% \paragraph{slide} +% +% オプション \texttt{slide} を新設しました。 +% +% [2016-10-08] \texttt{slide} オプションは article 以外では使い物にならなかったので, +% 簡単のため article のみで使えるオプションとしました。 +% +% \begin{macrocode} +\newif\if@slide +\@slidefalse +% \end{macrocode} +% +% \paragraph{サイズオプション} +% +% 10pt,11pt,12pt のほかに,8pt,9pt,14pt,17pt,21pt,25pt,30pt,36pt,43pt を追加しました。 +% これは等比数列になるように選んだものです(従来の 20pt も残しました)。 +% |\@ptsize| の定義が変だったのでご迷惑をおかけしましたが, +% 標準的なドキュメントクラスと同様にポイント数から10を引いたものに直しました。 +% +% [2003-03-22] 14Qオプションを追加しました。 +% +% [2003-04-18] 12Qオプションを追加しました。 +% +% [2016-07-08] |\mag| を使わずに各種寸法をスケールさせるためのオプション \texttt{nomag} を新設しました。 +% \texttt{usemag} オプションの指定で従来通りの動作となります。デフォルトは \texttt{usemag} です。 +% +% [2016-07-24] オプティカルサイズを調整するためにNFSSへパッチを当てるオプション \texttt{nomag*} を新設しました。 +% +% \begin{macrocode} +\def\jsc@magscale{1} +%<*article> +\DeclareOption{slide}{\@slidetrue\def\jsc@magscale{3.583}\@landscapetrue\@titlepagetrue} +%</article> +\DeclareOption{8pt} {\def\jsc@magscale{0.833}}% 1.2^(-1) +\DeclareOption{9pt} {\def\jsc@magscale{0.913}}% 1.2^(-0.5} +\DeclareOption{10pt}{\def\jsc@magscale{1}} +\DeclareOption{11pt}{\def\jsc@magscale{1.095}}% 1.2^0.5 +\DeclareOption{12pt}{\def\jsc@magscale{1.200}} +\DeclareOption{14pt}{\def\jsc@magscale{1.440}} +\DeclareOption{17pt}{\def\jsc@magscale{1.728}} +\DeclareOption{20pt}{\def\jsc@magscale{2}} +\DeclareOption{21pt}{\def\jsc@magscale{2.074}} +\DeclareOption{25pt}{\def\jsc@magscale{2.488}} +\DeclareOption{30pt}{\def\jsc@magscale{2.986}} +\DeclareOption{36pt}{\def\jsc@magscale{3.583}} +\DeclareOption{43pt}{\def\jsc@magscale{4.300}} +\DeclareOption{12Q} {\def\jsc@magscale{0.923}}% 1pt*12Q/13Q +\DeclareOption{14Q} {\def\jsc@magscale{1.077}}% 1pt*14Q/13Q +\DeclareOption{10ptj}{\def\jsc@magscale{1.085}}% 1pt*10bp/13Q +\DeclareOption{10.5ptj}{\def\jsc@magscale{1.139}} +\DeclareOption{11ptj}{\def\jsc@magscale{1.194}} +\DeclareOption{12ptj}{\def\jsc@magscale{1.302}} +% \end{macrocode} +% +% \paragraph{オプティカルサイズの補正} +% \texttt{nomag*}オプション指定時には,本文のフォントサイズが10pt以外の場合に +% オプティカルサイズの補正を行うためにNFSSにパッチを当てます。 +% 現在の\texttt{ltjsclasses}ではこのパッチ当ては標準では行いますが, +% 将来どうなるかわからないので\texttt{nomag}で無効化することができるようにしました。 +% +% \texttt{noxreal},~\texttt{real}は旧来の互換性として今は残してありますが,2017年7月に削除する予定です。 +% +% [2018-01-14] \texttt{noxreal},~\texttt{real} を削除しました.また,内部命令の名称を +% \texttt{jsclasses}に合わせました. +% +% \begin{macrocode} +\newif\ifjsc@mag@xreal +\jsc@mag@xrealtrue +\DeclareOption{nomag*}{\jsc@mag@xrealtrue} +\DeclareOption{nomag}{\jsc@mag@xrealfalse} +\DeclareOption{usemag}{% + \ClassWarningNoLine{\jsc@clsname}{% + This \jsc@clsname\space cls does not support `usemag'\MessageBreak + option, since LuaTeX does not support \string\mag\MessageBreak in pdf output}% + \jsc@mag@xrealtrue} +% \end{macrocode} +% +% +% \paragraph{トンボオプション} +% +% トンボ(crop marks)を出力します。 +% 実際の処理は\texttt{lltjcore.sty}で行います。 +% オプション \texttt{tombow} で日付付きのトンボ, +% オプション \texttt{tombo} で日付なしのトンボを出力します。 +% これらはアスキー版のままです。 +% カウンタ |\hour|,|\minute| は\texttt{luatexja-compat.sty}で宣言されています。 +% +% \begin{macrocode} +\hour\time \divide\hour by 60\relax +\@tempcnta\hour \multiply\@tempcnta 60\relax +\minute\time \advance\minute-\@tempcnta +\DeclareOption{tombow}{% + \tombowtrue \tombowdatetrue + \setlength{\@tombowwidth}{.1\p@}% + \@bannertoken{% + \jobname\space(\number\year-\two@digits\month-\two@digits\day + \space\two@digits\hour:\two@digits\minute)}% + \maketombowbox} +\DeclareOption{tombo}{% + \tombowtrue \tombowdatefalse + \setlength{\@tombowwidth}{.1\p@}% + \maketombowbox} +% \end{macrocode} +% +% \paragraph{面付け} +% +% オプション \texttt{mentuke} で幅ゼロのトンボを出力します。 +% 面付けに便利です。これもアスキー版のままです。 +% +% \begin{macrocode} +\DeclareOption{mentuke}{% + \tombowtrue \tombowdatefalse + \setlength{\@tombowwidth}{\z@}% + \maketombowbox} +% \end{macrocode} +% +% \paragraph{両面,片面オプション} +% +% \texttt{twoside} で奇数ページ・偶数ページのレイアウトが変わります。 +% +% [2003-04-29] \texttt{vartwoside} でどちらのページも傍注が右側になります。 +% +% \begin{macrocode} +\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse} +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{vartwoside}{\@twosidetrue \@mparswitchfalse} +% \end{macrocode} +% +% \paragraph{二段組} +% +% \texttt{twocolumn} で二段組になります。 +% +% \begin{macrocode} +\DeclareOption{onecolumn}{\@twocolumnfalse} +\DeclareOption{twocolumn}{\@twocolumntrue} +% \end{macrocode} +% +% \paragraph{表題ページ} +% +% \texttt{titlepage} で表題・概要を独立したページに出力します。 +% +% \begin{macrocode} +\DeclareOption{titlepage}{\@titlepagetrue} +\DeclareOption{notitlepage}{\@titlepagefalse} +% \end{macrocode} +% +% \paragraph{右左起こし} +% +% 書籍では章は通常は奇数ページ起こしになりますが,横組ではこれを +% \texttt{openright} と表すことにしてあります。 +% \texttt{openany} で偶数ページからでも始まるようになります。 +% +% [2017-02-24] \texttt{openright} は横組では奇数ページ起こし,縦組では +% 偶数ページ起こしを表します。ややこしいですが,これは\LaTeX の標準クラスが +% 西欧の横組事情しか考慮せずに,奇数ページ起こしと右起こしを一緒にしてしまっ +% たせいです。縦組での奇数ページ起こしと横組での偶数ページ起こしも表現したい +% ので,ltjsclassesでは新たに \texttt{openleft} も追加しました。 +% +% \begin{macrocode} +%<book|report>\DeclareOption{openright}{\@openrighttrue\@openleftfalse} +%<book|report>\DeclareOption{openleft}{\@openlefttrue\@openrightfalse} +%<book|report>\DeclareOption{openany}{\@openrightfalse\@openleftfalse} +% \end{macrocode} +% +% \paragraph{eqnarray環境と数式の位置} +% +% 森本さんのご教示にしたがって前に移動しました。 +% +% \begin{environment}{eqnarray} +% +% \LaTeX の |eqnarray| 環境では |&| でできるアキが大きすぎる +% ようですので,少し小さくします。 +% また,中央の要素も |\displaystyle| にします。 +% +% \begin{macrocode} +\def\eqnarray{% + \stepcounter{equation}% + \def\@currentlabel{\p@equation\theequation}% + \global\@eqnswtrue + \m@th + \global\@eqcnt\z@ + \tabskip\@centering + \let\\\@eqncr + $$\everycr{}\halign to\displaywidth\bgroup + \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel + &\global\@eqcnt\@ne \hfil$\displaystyle{{}##{}}$\hfil + &\global\@eqcnt\tw@ $\displaystyle{##}$\hfil\tabskip\@centering + &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup + \tabskip\z@skip + \cr} +% \end{macrocode} +% \end{environment} +% +% \texttt{leqno} で数式番号が左側になります。 +% \texttt{fleqn} で数式が本文左端から一定距離のところに出力されます。 +% 森本さんにしたがって訂正しました。 +% +% \begin{macrocode} +\DeclareOption{leqno}{\input{leqno.clo}} +\DeclareOption{fleqn}{\input{fleqn.clo}% +% fleqn用のeqnarray環境の再定義 + \def\eqnarray{% + \stepcounter{equation}% + \def\@currentlabel{\p@equation\theequation}% + \global\@eqnswtrue\m@th + \global\@eqcnt\z@ + \tabskip\mathindent + \let\\=\@eqncr + \setlength\abovedisplayskip{\topsep}% + \ifvmode + \addtolength\abovedisplayskip{\partopsep}% + \fi + \addtolength\abovedisplayskip{\parskip}% + \setlength\belowdisplayskip{\abovedisplayskip}% + \setlength\belowdisplayshortskip{\abovedisplayskip}% + \setlength\abovedisplayshortskip{\abovedisplayskip}% + $$\everycr{}\halign to\linewidth% $$ + \bgroup + \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel + &\global\@eqcnt\@ne \hfil$\displaystyle{{}##{}}$\hfil + &\global\@eqcnt\tw@ + $\displaystyle{##}$\hfil \tabskip\@centering + &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup + \tabskip\z@skip\cr + }} +% \end{macrocode} +% +% \paragraph{文献リスト} +% +% 文献リストをopen形式(著者名や書名の後に改行が入る)で出力します。 +% これは使われることはないのでコメントアウトしてあります。 +% +% \begin{macrocode} +% \DeclareOption{openbib}{% +% \AtEndOfPackage{% +% \renewcommand\@openbib@code{% +% \advance\leftmargin\bibindent +% \itemindent -\bibindent +% \listparindent \itemindent +% \parsep \z@}% +% \renewcommand\newblock{\par}}} +% \end{macrocode} +% +% \paragraph{数式フォントとして和文フォントを登録しないオプション} +% +% \pTeX では数式中では16通りのフォントしか使えませんでしたが,Lua\TeX では +% Omega拡張が取り込まれていて256通りのフォントが使えます。 +% ただし,\LaTeXe カーネルでは未だに数式ファミリの数は16個に制限されているので, +% 実際に使用可能な数式ファミリの数を増やすためには\texttt{lualatex-math}パッケージを +% 読み込む必要があることに注意が必要です。 +% +% [2018-10-08 LTJ] Lua\TeX-ja本体が\texttt{disablejfam}オプションをサポートしたので, +% クラスファイルからは削除します. +% +% [2019-08-12 LTJ] ……と思いましたが,``Unused global option(s): [disablejfam]''警告が +% 出てしまいますので,「何もしない」クラスオプションとして形だけ定義します. +% \begin{macrocode} +%<*article|report|book> +\DeclareOption{disablejfam}{} +%</article|report|book> +% \end{macrocode} +% +% \paragraph{ドラフト} +% +% \texttt{draft} でoverfull boxの起きた行末に5ptの罫線を引きます。 +% +% [2016-07-13] |\ifdraft| を定義するのをやめました。 +% +% \begin{macrocode} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +% \end{macrocode} +% +% \paragraph{和文フォントメトリックの選択} +% +% ここではOTFパッケージのメトリックを元とした,\texttt{jfm-ujis.lua}メトリックを標準で使います。 +% 古い\texttt{min10},\texttt{goth10}互換のメトリックを使いたいときは\texttt{mingoth} +% というオプションを指定します。 +% \pTeX でよく利用される\texttt{jis}フォントメトリックと互換のメトリックを使いたい場合は, +% \texttt{ptexjis}というオプションを指定します。 +% \texttt{winjis}メトリックは用済みのため,\texttt{winjis}オプションは無視されます。 +% +% [2016-11-09] pLaTeX / upLaTeX を自動判別するオプション \texttt{autodetect-engine} を新設しました。 +% +% [2016-11-24 LTJ] \texttt{autodetect-engine} はLua\TeX-jaでは意味がないので警告を表示させます. +% +% [2018-07-30 LTJ] \texttt{uplatex} 指定時のエラーが正しく表示されなかったので修正しました. +% +% \begin{macrocode} +\newif\ifmingoth +\mingothfalse +\newif\ifjisfont +\jisfontfalse +\newif\ifptexjis +\ptexjisfalse +\DeclareOption{winjis}{% + \ClassWarningNoLine{\jsc@clsname}{this class does not support `winjis' option}} +\DeclareOption{uplatex}{% + \ClassError{\jsc@clsname}{this class does not support `uplatex' option}} +\DeclareOption{autodetect-engine}{% + \ClassWarningNoLine{\jsc@clsname}{this class does not support `autodetect-engine' option}} +\DeclareOption{mingoth}{\mingothtrue} +\DeclareOption{ptexjis}{\ptexjistrue} +\DeclareOption{jis}{\jisfonttrue} +% \end{macrocode} +% +% \paragraph{papersizeスペシャルの利用} +% +% \texttt{ltjsclasses}では\texttt{papersize}オプションの有無に関わらず, +% PDFのページサイズは適切に設定されるので,削除しました。 +% +% \paragraph{英語化} +% +% オプション \texttt{english} を新設しました。 +% +% \begin{macrocode} +\newif\if@english +\@englishfalse +\DeclareOption{english}{\@englishtrue} +% \end{macrocode} +% +% \paragraph{ltjsbookをltjsreportもどきに} +% +% オプション \texttt{report} を新設しました。 +% +% [2017-02-13] 従来は「ltjsreport相当」をltjsbookの \texttt{report} オプションで提供して +% いましたが,新しくltjsreportクラスも作りました。どちらでもお好きな方を使ってください。 +% +% \begin{macrocode} +%<*book> +\newif\if@report +\@reportfalse +\DeclareOption{report}{\@reporttrue\@openrightfalse\@twosidefalse\@mparswitchfalse} +%</book> +% \end{macrocode} +% +% \paragraph{\texttt{jslogo}パッケージの読み込み} +% +% \LaTeX 関連のロゴを再定義する\texttt{jslogo}パッケージを +% 読み込まないオプション\texttt{nojslogo}を新設しました。 +% \texttt{jslogo}オプションの指定で従来どおりの動作となります。 +% デフォルトは\texttt{jslogo}で,すなわちパッケージを読み込みます。 +% \begin{macrocode} +\newif\if@jslogo \@jslogotrue +\DeclareOption{jslogo}{\@jslogotrue} +\DeclareOption{nojslogo}{\@jslogofalse} +% \end{macrocode} +% +% \paragraph{オプションの実行} +% +% デフォルトのオプションを実行します。 +% |multicols| や |url| を |\RequirePackage| するのはやめました。 +% +% \begin{macrocode} +%<article>\ExecuteOptions{a4paper,oneside,onecolumn,notitlepage,final} +%<book>\ExecuteOptions{a4paper,twoside,onecolumn,titlepage,openright,final} +%<report>\ExecuteOptions{a4paper,oneside,onecolumn,titlepage,openany,final} +%<jspf>\ExecuteOptions{a4paper,twoside,twocolumn,notitlepage,fleqn,final} +%<kiyou>\ExecuteOptions{a4paper,twoside,twocolumn,notitlepage,final} +\ProcessOptions +% \end{macrocode} +% +% 後処理 +% +% \begin{macrocode} +\if@slide + \def\maybeblue{\@ifundefined{ver@color.sty}{}{\color{blue}}} +\fi +\if@landscape + \setlength\@tempdima {\paperheight} + \setlength\paperheight{\paperwidth} + \setlength\paperwidth {\@tempdima} +\fi +% \end{macrocode} +% +% \paragraph{基準となる行送り} +% +% \begin{macro}{\n@baseline} +% +% 基準となる行送りをポイント単位で表したものです。 +% +% \begin{macrocode} +%<article|book|report>\if@slide\def\n@baseline{13}\else\def\n@baseline{16}\fi +%<jspf>\def\n@baseline{14.554375} +%<kiyou>\def\n@baseline{14.897} +% \end{macrocode} +% \end{macro} +% +% \paragraph{拡大率の設定} +% +% サイズの変更は\TeX のプリミティブ |\mag| を使って行います。 +% 9ポイントについては行送りも若干縮めました。 +% サイズについては全面的に見直しました。 +% +% [2008-12-26] 1000 / |\mag| に相当する |\inv@mag| を定義しました。 +% |truein| を使っていたところを |\inv@mag in| に直しましたので, +% |geometry| パッケージと共存できると思います。 +% なお,新ドキュメントクラス側で |10pt| 以外にする場合の注意: +% \begin{itemize} +% \item |geometry| 側でオプション |truedimen| を指定してください。 +% \item |geometry| 側でオプション |mag| は使えません。 +% \end{itemize} +% +% [2016-03-21 LTJ] |\mag| を使わないように全面的に書き換えました。 +% |\ltjs@mpt| に「拡大率だけ大きくしたpt」の値が格納されます。 +% \texttt{bxjscls}と同様に,|\@ptsize| は |10pt|,~|11pt|,~|12pt| オプションが指定された時だけ +% 従来通り0,~1,~2と設定し,それ以外の場合は$-20$とすることにしました。 +% |\inv@mag| はもはや定義していません。 +% +% [2016-03-26 LTJ] |\ltjs@magscale| に拡大率を格納した後,それを用いて |\ltjs@mpt| を +% 設定するようにしました。 +% +% [2016-07-08] |\jsc@mpt| および |\jsc@mmm| に,それぞれ1ptおよび1mmを拡大させた値を格納します。 +% 以降のレイアウト指定ではこちらを使います。 +% +% [2016-07-12 LTJ] |\ltjs@...| を本家に合わせて |\jsc@...| に名称変更しました。 +% \begin{macrocode} +%<*kiyou> +\def\jsc@magscale{0.9769230} +%</kiyou> +\newdimen\jsc@mpt +\newdimen\jsc@mmm +\jsc@mpt=\jsc@magscale\p@ +\jsc@mmm=\jsc@magscale mm +\ifdim\jsc@mpt<.92\p@ % 8pt, 9pt 指定時 + \def\n@baseline{15}% +\fi +\newcommand{\@ptsize}{0} +\ifdim\jsc@mpt=1.0954\p@ \renewcommand{\@ptsize}{1}\else +\ifdim\jsc@mpt=1.2\p@ \renewcommand{\@ptsize}{2}\else +\renewcommand{\@ptsize}{-20}\fi\fi +% \end{macrocode} +% +% \paragraph{オプティカルサイズの補正} +% \leavevmode\par +% [2016-03-26 LTJ] |xreal|オプションの指定時には,\texttt{bxjscls}の|magstyle=xreal| +% オプションのように,オプティカルの補正を行うためにNFSSにパッチを当てます。 +% パッチは,概ねmiscさんによる「js*.cls 同様の文字サイズ設定を +% |\mag|によらずに行う方法:試案」 +% (\texttt{http://oku.edu.mie-u.ac.jp/\textasciitilde okumura/texfaq/qa/28416.html})の +% 方法に沿っていますが,拡大/縮小するところの計算にはLuaを用いています。 +% +% なお,\TeX 内部で長さはsp単位の整数倍で表現されているので,数spの誤差は仕方がないです。 +% そのため,事前に\texttt{type1cm}パッケージを読みこんでおきます。 +% +% [2016-03-28 LTJ] |\luafunction|を使うようにし,また本文のフォントサイズが10\,ptのときには +% (不要なので)パッチを当てないことにしました。 +% +% [2016-04-04 LTJ] NFSSへのパッチを修正。 +% +% [2017-01-23 LTJ] \LaTeXe\ 2017-01-01以降ではTUエンコーディングが標準なので, +% \texttt{type1cm}パッケージは読み込まないようにしました. +% +% [2017-02-17 LTJ] |\directlua|中で出力される数字のカテゴリーコードが12になるようにしました. +% この保証をしないと例えば\texttt{listings}パッケージで無限ループになります. +% +% [2018-07-02 LTJ] 10ptオプションが指定されており, +% 実際にはオプティカルサイズの補正が不要なときは「|xreal|オプションは指定されなかった」という +% 扱いにしておきます. +% \begin{macrocode} +\ifjsc@mag@xreal +\ifdim\jsc@mpt=\p@\jsc@mag@xrealfalse\else + \expandafter\let\csname OT1/cmr/m/n/10\endcsname\relax + \expandafter\let\csname TU/lmr/m/n/10\endcsname\relax + \expandafter\let\csname OMX/cmex/m/n/10\endcsname\relax + \newluafunction\ltjs@@magnify@font@calc + \begingroup\catcode`\%=12\relax + \directlua{ + local getdimen, mpt=tex.getdimen, tex.getdimen('jsc@mpt')/65536 + local t = lua.get_functions_table() + t[\the\ltjs@@magnify@font@calc] = function() + tex.sprint(-2,math.floor(0.5+mpt*getdimen('dimen@'))) + end + function luatexja.ltjs_unmagnify_fsize(a) + local s = luatexja.print_scaled(math.floor(0.5+a/mpt*65536)) + tex.sprint(-2, (s:match('%.0$')) and s:sub(1,-3) or s ) + end + } + \endgroup + \def\ltjs@magnify@external@font#1 at#2 at#3\@nil{% + \def\@tempa{#1}\def\@tempb{#2}% + \ifx\@tempb\@empty + \edef\@tempb{ scaled\directlua{% + tex.sprint(-2,math.floor(0.5+\jsc@magscale*1000)) + }}% + \else + \dimen@\@tempb\relax + \edef\@tempb{ at\luafunction\ltjs@@magnify@font@calc sp}% + \fi + \edef\@tempa{\def\noexpand\external@font{\@tempa\@tempb}}% + } + \let\ltjs@orig@get@external@font=\get@external@font + \def\get@external@font{% + \edef\f@size{\directlua{luatexja.ltjs_unmagnify_fsize(\f@size)}}% + \ltjs@orig@get@external@font + \begingroup + \edef\@tempa{\external@font\space at\space at}% + \expandafter\ltjs@magnify@external@font\@tempa\@nil + \expandafter\endgroup\@tempa + } +\fi\fi +% \end{macrocode} +% +% [2016-11-16] latex.ltx (ltspace.dtx)で定義されている |\smallskip| の, +% 単位 |pt| を |\jsc@mpt| に置き換えた |\jsc@smallskip| を定義します。 +% これは |\maketitle| で用いられます。 +% |\jsc@medskip| と |\jsc@bigskip| は必要ないのでコメントアウトしています。 +% +% \begin{macro}{\jsc@smallskip} +% \begin{macro}{\jsc@medskip} +% \begin{macro}{\jsc@bigskip} +% \begin{macrocode} +\def\jsc@smallskip{\vspace\jsc@smallskipamount} +%\def\jsc@medskip{\vspace\jsc@medskipamount} +%\def\jsc@bigskip{\vspace\jsc@bigskipamount} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\jsc@smallskipamount} +% \begin{macro}{\jsc@medskipamount} +% \begin{macro}{\jsc@bigskipamount} +% \begin{macrocode} +\newskip\jsc@smallskipamount +\jsc@smallskipamount=3\jsc@mpt plus 1\jsc@mpt minus 1\jsc@mpt +%\newskip\jsc@medskipamount +%\jsc@medskipamount =6\jsc@mpt plus 2\jsc@mpt minus 2\jsc@mpt +%\newskip\jsc@bigskipamount +%\jsc@bigskipamoun =12\jsc@mpt plus 4\jsc@mpt minus 4\jsc@mpt +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \paragraph{PDFの用紙サイズの設定} +% +% \begin{macro}{\pagewidth} +% \begin{macro}{\pageheight} +% \begin{macro}{\stockwidth} +% \begin{macro}{\stockheight} +% 出力のPDFの用紙サイズをここで設定しておきます。 +% |tombow| が真のときは2インチ足しておきます。 +% +% [2015-10-18 LTJ] Lua\TeX\ 0.81.0ではプリミティブの名称変更がされたので, +% それに合わせておきます。 +% +% [2016-07-12 LTJ] luatex.defが新しくなったことに対応するaminophenさんのパッチを取り込みました。 +% +% [2017-01-11] トンボオプションが指定されているとき「だけ」|\stockwidth|, +% |\stockheight|を定義するようにしました。 +% +% \begin{macrocode} +\iftombow + \newlength{\stockwidth} + \newlength{\stockheight} + \setlength{\stockwidth}{\paperwidth} + \setlength{\stockheight}{\paperheight} + \advance \stockwidth 2in + \advance \stockheight 2in + \ifdefined\pdfpagewidth + \setlength{\pdfpagewidth}{\stockwidth} + \setlength{\pdfpageheight}{\stockheight} + \else + \setlength{\pagewidth}{\stockwidth} + \setlength{\pageheight}{\stockheight} + \fi +\else + \ifdefined\pdfpagewidth + \setlength{\pdfpagewidth}{\paperwidth} + \setlength{\pdfpageheight}{\paperheight} + \else + \setlength{\pagewidth}{\paperwidth} + \setlength{\pageheight}{\paperheight} + \fi +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{和文フォントの変更} +% +% JISの1ポイントは0.3514mm(約1/72.28インチ), +% PostScriptの1ポイントは1/72インチですが, +% \TeX では1/72.27インチを1pt(ポイント), +% 1/72インチを1bp(ビッグポイント)と表します。 +% QuarkXPressなどのDTPソフトは標準で1/72インチを1ポイント +% としますが,以下ではすべて1/72.27インチを1ptとしています。 +% 1インチは定義により25.4mmです。 +% +% \pTeX (アスキーが日本語化した\TeX )では,例えば従来のフォントメトリック +% \texttt{min10}やJISフォントメトリックでは「公称10ポイントの和文フォントは, +% 実際には9.62216ptで出力される(メトリック側で0.962216倍される)」という +% 仕様になっています。 +% 一方,Lua\TeX-jaの提供するメトリックでは,そのようなことはありません。 +% 公称10ポイントの和文フォントは,10ポイントで出力されます。 +% +% この\texttt{ltjsclasses}でも,派生元の\texttt{jsclasses}と同じように, +% この公称10ポイントのフォントをここでは13級に縮小して +% 使うことにします。そのためには,$13\,\textrm{Q}/10\,\textrm{pt}\simeq 0.924715$倍 +% すればいいことになります。 +% +% |\ltj@stdmcfont|,~|\ltj@stdgtfont| による,デフォルトで使われる明朝・ゴシックのフォントの +% 設定に対応しました。この2つの命令の値はユーザが日々の利用でその都度指定するものではなく, +% 何らかの理由で非埋め込みフォントが正しく利用できない場合にのみ\texttt{luatexja.cfg}によって +% セットされるものです。 +% +% [2014-07-26 LTJ] なお,現状のところ,縦組用JFMは\texttt{jfm-ujisv.lua}しか準備していません。 +% +% [2016-03-21 LTJ] 拡大率の計算で1~ptを$1/72.27$インチでなく0.3514\,mmと間違えて扱っていたのを修正。 +% +% [2017-12-31] 和文スケール($1\,\mathrm{zw} \div \hbox{要求サイズ}$)を +% 表す実数値マクロ |\Cjascale| を定義しました。 +% +% +% これにより,公称10ポイントの和文フォントを0.924715倍したことにより, +% 約9.25ポイント, +% DTPで使う単位(1/72インチ)では9.21ポイントということになり, +% 公称10ポイントといっても実は9ポイント強になります。 +% +% 某学会誌では, +% 和文フォントをPostScriptの9ポイントにするために, +% $0.9*72.27/72 \simeq 0.903375$ 倍します。 +% +% [2018-09-23 LTJ] 実際の|\Cjascale|の定義はLua\TeX-jaの読み込み前に移動しました. +% こうすることによって「0.962216倍された和文フォント」という実際には使われない和文フォントを +% 読み込む必要がなくなります. +% +% +% 実際にフォントの再定義を行う部分です. +% +% [2018-09-23 LTJ] |\Cjascale|の設定を前倒ししたことに伴い,実際の再定義は +% \texttt{mingoth}, \texttt{ptexjis}のときしか必要なくなりました. +% +% \begin{macrocode} +\expandafter\let\csname JY3/mc/m/n/10\endcsname\relax +\ifmingoth + \DeclareFontShape{JY3}{mc}{m}{n}{<-> s * [\Cjascale] \ltj@stdmcfont:jfm=min}{} + \DeclareFontShape{JY3}{gt}{m}{n}{<-> s * [\Cjascale] \ltj@stdgtfont:jfm=min}{} +\else + \ifptexjis + \DeclareFontShape{JY3}{mc}{m}{n}{<-> s * [\Cjascale] \ltj@stdmcfont:jfm=jis}{} + \DeclareFontShape{JY3}{gt}{m}{n}{<-> s * [\Cjascale] \ltj@stdgtfont:jfm=jis}{} + \fi +\fi +% \end{macrocode} +% +% 和文でイタリック体,斜体,サンセリフ体, +% タイプライタ体の代わりにゴシック体を使うことにします。 +% +% [2014-03-25 LTJ] タイプライタ体に合わせるファミリを |\jttdefault| とし, +% 通常のゴシック体と別にできるようにしました。|\jttdefault| は,標準で +% |\gtdefault| と定義しています。 +% +% [2003-03-16] イタリック体,斜体について,和文でゴシックを当てていましたが, +% 数学の定理環境などで多量のイタリック体を使うことがあり,ゴシックに +% すると黒々となってしまうという弊害がありました。 +% |amsthm| を使わない場合は定理の本文が明朝になるように |\newtheorem| +% 環境を手直ししてしのいでいましたが, +% \TeX が数学で多用されることを考えると,イタリック体に明朝体を +% 当てたほうがいいように思えてきましたので, +% イタリック体・斜体に対応する和文を明朝体に変えることにしました。 +% +% [2004-11-03] |\rmfamily| も和文対応にしました。 +% +% [2016-01-30 LTJ] |\rmfamily|, |\sffamily|, |\ttfamily| の再定義をLua\TeX-ja +% カーネルに移動させたので,ここでは和文対応にするフラグ |\@ltj@match@family|\ +% を有効にさせるだけでよいです。 +% +% [2018-06-09 LTJ] シリーズ|b|は同じ書体の|bx|と等価になるように宣言します。 +% +% \begin{macrocode} +\DeclareFontShape{JY3}{mc}{bx}{n}{<->ssub*gt/m/n}{} +\DeclareFontShape{JY3}{gt}{bx}{n}{<->ssub*gt/m/n}{} +\DeclareFontShape{JY3}{mc}{b}{n}{<->ssub*gt/m/n}{} +\DeclareFontShape{JY3}{mc}{b}{n}{<->ssub*gt/m/n}{} +\DeclareFontShape{JY3}{mc}{m}{it}{<->ssub*mc/m/n}{} +\DeclareFontShape{JY3}{mc}{m}{sl}{<->ssub*mc/m/n}{} +\DeclareFontShape{JY3}{mc}{m}{sc}{<->ssub*mc/m/n}{} +\DeclareFontShape{JY3}{gt}{m}{it}{<->ssub*gt/m/n}{} +\DeclareFontShape{JY3}{gt}{m}{sl}{<->ssub*gt/m/n}{} +\DeclareFontShape{JY3}{mc}{bx}{it}{<->ssub*gt/m/n}{} +\DeclareFontShape{JY3}{mc}{bx}{sl}{<->ssub*gt/m/n}{} +\DeclareFontShape{JY3}{mc}{b}{it}{<->ssub*gt/m/n}{} +\DeclareFontShape{JY3}{mc}{b}{sl}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{mc}{bx}{n}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{gt}{bx}{n}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{mc}{b}{n}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{mc}{b}{n}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{mc}{m}{it}{<->ssub*mc/m/n}{} +\DeclareFontShape{JT3}{mc}{m}{sl}{<->ssub*mc/m/n}{} +\DeclareFontShape{JT3}{mc}{m}{sc}{<->ssub*mc/m/n}{} +\DeclareFontShape{JT3}{gt}{m}{it}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{gt}{m}{sl}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{mc}{bx}{it}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{mc}{bx}{sl}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{mc}{b}{it}{<->ssub*gt/m/n}{} +\DeclareFontShape{JT3}{mc}{b}{sl}{<->ssub*gt/m/n}{} +\renewcommand\jttdefault{\gtdefault}\@ltj@match@familytrue +% \end{macrocode} +%% +% Lua\TeX-jaでは和文組版に伴うグルーはノードベースで挿入するようになり,また +% 欧文・和文間のグルーとイタリック補正は干渉しないようになりました。 +% まだ「和文の斜体」についてはLua\LaTeX カーネル側でまともな対応がされていませんが, +% \texttt{jsclasses}で行われていた |\textmc|, |\textgt| の再定義は不要のように思われます。 +% +% \texttt{jsclasses.dtx}中で行われていた |\reDeclareMathAlphabet| の再定義は削除。 +% また,Yue ZHANGさん作の\texttt{fixjfm}パッケージ対応のコードもLua\TeX-jaでは削除しています. +% +% \begin{macrocode} +\AtBeginDocument{% + \unless\ifltj@disablejfam + \reDeclareMathAlphabet{\mathrm}{\mathrm}{\mathmc} + \reDeclareMathAlphabet{\mathbf}{\mathbf}{\mathgt} + \fi +}% +% \end{macrocode} +% +% \begin{macro}{\textsterling} +% +% これは |\pounds| 命令で実際に呼び出される文字です。 +% 従来からのOT1エンコーディングでは |\$| のイタリック体が |\pounds| +% なので \texttt{cmti} が使われていましたが, +% 1994年春からは \texttt{cmu}(upright italic,直立イタリック体) +% に変わりました。 +% しかし \texttt{cmu} はその性格からして実験的なものであり, +% |\pounds| 以外で使われるとは思えないので, +% ここでは \texttt{cmti} に戻してしまいます。 +% +% [2003-08-20] Computer Modernフォントを使う機会も減り,T1エンコーディング +% が一般的になってきました。この定義はもうあまり意味がないので消します。 +% +% \begin{macrocode} +% \DeclareTextCommand{\textsterling}{OT1}{{\itshape\char`\$}} +% \end{macrocode} +% \end{macro} +% +% アスキーの \texttt{kinsoku.dtx} では「’」「“」「”」前後のペナルティが5000に +% なっていたので,\texttt{jsclasses.dtx} ではそれを 10000 に補正していました。 +% しかし,Lua\TeX-jaでは最初からこれらのパラメータは 10000 なので, +% もはや補正する必要はありません。 +% +% 「\TeX!」「〒515」の記号と数字の間に四分アキが入らないようにします。 +% +% \begin{macrocode} +\ltjsetparameter{jaxspmode={`!,2}} +\ltjsetparameter{jaxspmode={`〒,1}} +% \end{macrocode} +% +% 「CやC++では……」と書くと,C++の直後に四分アキが入らないのでバランスが悪くなります。 +% 四分アキが入るようにしました。\% の両側も同じです。 +% +% \begin{macrocode} +\ltjsetparameter{alxspmode={`+,3}} +\ltjsetparameter{alxspmode={`\%,3}} +% \end{macrocode} +% +% \texttt{jsclasses.dtx} では80〜ffの文字の |\xspcode| を全て3にしていましたが, +% Lua\TeX-jaでは同様の内容が最初から設定されていますので,対応する部分は削除。 +% +% \begin{macro}{\@} +% +% 欧文といえば,\LaTeX の |\def\@{\spacefactor\@m}| という定義(|\@m| は1000) +% では |I watch TV\@.| と書くと V とピリオドのペアカーニングが効かなくなります。 +% そこで,次のような定義に直し,|I watch TV.\@| と書くことにします。 +% +% [2016-07-14] 2015-01-01の\LaTeX で,auxiliary filesに書き出されたときに +% スペースが食われないようにする修正が入りました。これに合わせて |{}| を補いました。 +% +% \begin{macrocode} +\def\@{\spacefactor3000{}} +% \end{macrocode} +% \end{macro} +% +% \section{フォントサイズ} +% +% フォントサイズを変える命令(|\normalsize|,|\small| など) +% の実際の挙動の設定は,三つの引数をとる命令 |\@setfontsize| を使って, +% たとえば +% \begin{quote} +% |\@setfontsize{\normalsize}{10}{16}| +% \end{quote} +% のようにして行います。これは +% \begin{quote} +% |\normalsize| は10ポイントのフォントを使い,行送りは16ポイントである +% \end{quote} +% という意味です。 +% ただし,処理を速くするため, +% 以下では10と同義の\LaTeX の内部命令 |\@xpt| を使っています。 +% この |\@xpt| の類は次のものがあり,\LaTeX 本体で定義されています。 +%\begin{verbatim} +% \@vpt 5 \@vipt 6 \@viipt 7 +% \@viiipt 8 \@ixpt 9 \@xpt 10 +% \@xipt 10.95 \@xiipt 12 \@xivpt 14.4 +%\end{verbatim} +% +% \begin{macro}{\@setfontsize} +% +% ここでは |\@setfontsize| の定義を少々変更して, +% 段落の字下げ |\parindent|, +% 和文文字間のスペース |kanjiskip|, +% 和文・欧文間のスペース |xkanjiskip| を変更しています。 +% +% |kanjiskip| は |ltj-latex.sty| で |0pt plus 0.4pt minus 0.5pt| に +% 設定していますが, +% これはそもそも文字サイズの変更に応じて変わるべきものです。 +% それに,プラスになったりマイナスになったりするのは, +% 追い出しと追い込みの混在が生じ,統一性を欠きます。 +% なるべく追い出しになるようにプラスの値だけにしたいところですが, +% ごくわずかなマイナスは許すことにしました。 +% +% |xkanjiskip| については,四分つまり全角の1/4を標準として, +% 追い出すために三分あるいは二分まで延ばすのが一般的ですが, +% ここではTimesやPalatinoのスペースがほぼ四分であることに着目して, +% これに一致させています。これなら書くときにスペースを空けても +% 空けなくても同じ出力になります。 +% +% |\parindent| については,0(以下)でなければ全角幅(|1\zw|)に直します。 +% +% [2008-02-18] |english| オプションで |\parindent| を 1em にしました。 +% +% [2014-05-14 LTJ] |\ltjsetparameter|の実行は時間がかかるので, +% |\ltjsetkanjiskip| と |\ltjsetxkanjiskip|(両者とも, +% 実行前には |\ltj@setpar@global| の実行が必要)にしました。 +% +% [2014-12-24 LTJ] |jsclasses| では,|\@setfontsize| 中で |xkanjiskip| を +% 設定するのは現在の和欧文間空白の自然長が正の場合だけでした。 +% |ltjsclasses| では最初からこの判定が抜けてしまっていたので,復活させます。 +% +% \begin{macrocode} +\def\@setfontsize#1#2#3{% +% \@nomath#1% + \ifx\protect\@typeset@protect + \let\@currsize#1% + \fi + \fontsize{#2}{#3}\selectfont + \ifdim\parindent>\z@ + \if@english + \parindent=1em + \else + \parindent=1\zw + \fi + \fi + \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{macrocode} +% \end{macro} +% +% \begin{macro}{\jsc@setfontsize} +% クラスファイルの内部では,拡大率も考慮した |\jsc@setfontsize| を +% |\@setfontsize| の変わりに用いることにします。 +% \begin{macrocode} +\def\jsc@setfontsize#1#2#3{% + \@setfontsize#1{#2\jsc@mpt}{#3\jsc@mpt}} +% \end{macrocode} +% \end{macro} +% +% これらのグルーをもってしても行分割ができない場合は, +% |\emergencystretch| に訴えます。 +% +% \begin{macrocode} +\emergencystretch 3\zw +% \end{macrocode} +% +% \begin{macro}{\ifnarrowbaselines} +% \begin{macro}{\narrowbaselines} +% \begin{macro}{\widebaselines} +% +% 欧文用に行間を狭くする論理変数と,それを真・偽にするためのコマンドです。 +% +% [2003-06-30] 数式に入るところで |\narrowbaselines| +% を実行しているので |\abovedisplayskip| 等が初期化 +% されてしまうというshintokさんのご指摘に対して, +% しっぽ愛好家さんが次の修正を教えてくださいました。 +% +% [2008-02-18] |english| オプションで最初の段落のインデントをしないようにしました。 +% +% TODO: Hasumiさん [qa:54539] のご指摘は考慮中です。 +% +% [2015-01-07 LTJ] 遅くなりましたが, +% \url{http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=1005} にあったZRさんのパッチを取り込みました。 +% +% \begin{macrocode} +\newif\ifnarrowbaselines +\if@english + \narrowbaselinestrue +\fi +\def\narrowbaselines{% + \narrowbaselinestrue + \skip0=\abovedisplayskip + \skip2=\abovedisplayshortskip + \skip4=\belowdisplayskip + \skip6=\belowdisplayshortskip + \@currsize\selectfont + \abovedisplayskip=\skip0 + \abovedisplayshortskip=\skip2 + \belowdisplayskip=\skip4 + \belowdisplayshortskip=\skip6\relax} +\def\widebaselines{\narrowbaselinesfalse\@currsize\selectfont} +\def\ltj@@ifnarrowbaselines{% + \ifnarrowbaselines\expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\normalsize} +% +% 標準のフォントサイズと行送りを選ぶコマンドです。 +% +% 本文10ポイントのときの行送りは, +% 欧文の標準クラスファイルでは12ポイント, +% アスキーの和文クラスファイルでは15ポイントになっていますが, +% ここでは16ポイントにしました。 +% ただし |\narrowbaselines| で欧文用の12ポイントになります。 +% +% 公称10ポイントの和文フォントが約9.25ポイント +% (アスキーのものの0.961倍)であることもあり, +% 行送りがかなりゆったりとしたと思います。 +% 実際,$16/9.25 \approx 1.73$ であり, +% 和文の推奨値の一つ「二分四分」(1.75) +% に近づきました。 +% +% \begin{macrocode} +\renewcommand{\normalsize}{% + \ltj@@ifnarrowbaselines + {\jsc@setfontsize\normalsize\@xpt\@xiipt}% + {\jsc@setfontsize\normalsize\@xpt{\n@baseline}}% +% \end{macrocode} +% +% 数式の上のアキ(|\abovedisplayskip|), +% 短い数式の上のアキ(|\abovedisplayshortskip|), +% 数式の下のアキ(|\belowdisplayshortskip|)の設定です。 +% +% [2003-02-16] ちょっと変えました。 +% +% [2009-08-26] \TeX\ Q\,\&\,A 52569から始まる議論について逡巡して +% いましたが,結局,微調節してみることにしました。 +% +% \begin{macrocode} + \abovedisplayskip 11\jsc@mpt \@plus3\jsc@mpt \@minus4\jsc@mpt + \abovedisplayshortskip \z@ \@plus3\jsc@mpt + \belowdisplayskip 9\jsc@mpt \@plus3\jsc@mpt \@minus4\jsc@mpt + \belowdisplayshortskip \belowdisplayskip +% \end{macrocode} +% +% 最後に,リスト環境のトップレベルのパラメータ |\@listI| を, +% |\@listi| にコピーしておきます。|\@listI| の設定は後で出てきます。 +% +% \begin{macrocode} + \let\@listi\@listI} +% \end{macrocode} +% +% ここで実際に標準フォントサイズで初期化します。 +% +% \begin{macrocode} +\mcfamily\selectfont\normalsize +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\Cht} +% \begin{macro}{\Cdp} +% \begin{macro}{\Cwd} +% \begin{macro}{\Cvs} +% \begin{macro}{\Chs} +% +% 基準となる長さの設定をします。 +% \texttt{lltjfont.sty}で宣言されている +% パラメータに実際の値を設定します。 +% たとえば |\Cwd| は |\normalfont| の全角幅(|1\zw|)です。 +% +% [2017-08-31] 基準とする文字を「全角空白」(EUCコード\texttt{0xA1A1})から +% 「漢」(JISコード\texttt{0x3441})へ変更しました。 +% +% [2017-09-19] 内部的に使った |\box0| を空にします。 +% \begin{macrocode} +\setbox0\hbox{漢} +\setlength\Cht{\ht0} +\setlength\Cdp{\dp0} +\setlength\Cwd{\wd0} +\setlength\Cvs{\baselineskip} +\setlength\Chs{\wd0} +\setbox0=\box\voidb@x +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\small} +% +% |\small| も |\normalsize| と同様に設定します。 +% 行送りは,|\normalsize| が16ポイントなら, +% 割合からすれば$16 \times 0.9 = 14.4$ポイントになりますが, +% |\small| の使われ方を考えて,ここでは和文13ポイント, +% 欧文11ポイントとします。 +% また,|\topsep| と |\parsep| は,元はそれぞれ$4 \pm 2$,$2 \pm 1$ +% ポイントでしたが,ここではゼロ(|\z@|)にしました。 +% +% \begin{macrocode} +\newcommand{\small}{% + \ltj@@ifnarrowbaselines +%<!kiyou> {\jsc@setfontsize\small\@ixpt{11}}% +%<kiyou> {\jsc@setfontsize\small{8.8888}{11}}% +%<!kiyou> {\jsc@setfontsize\small\@ixpt{13}}% +%<kiyou> {\jsc@setfontsize\small{8.8888}{13.2418}}% + \abovedisplayskip 9\jsc@mpt \@plus3\jsc@mpt \@minus4\jsc@mpt + \abovedisplayshortskip \z@ \@plus3\jsc@mpt + \belowdisplayskip \abovedisplayskip + \belowdisplayshortskip \belowdisplayskip + \def\@listi{\leftmargin\leftmargini + \topsep \z@ + \parsep \z@ + \itemsep \parsep}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footnotesize} +% +% |\footnotesize| も同様です。 +% |\topsep| と |\parsep| は,元はそれぞれ$3 \pm 1$,$2 \pm 1$ +% ポイントでしたが,ここではゼロ(|\z@|)にしました。 +% +% \begin{macrocode} +\newcommand{\footnotesize}{% + \ltj@@ifnarrowbaselines +%<!kiyou> {\jsc@setfontsize\footnotesize\@viiipt{9.5}}% +%<kiyou> {\jsc@setfontsize\footnotesize{8.8888}{11}}% +%<!kiyou> {\jsc@setfontsize\footnotesize\@viiipt{11}}% +%<kiyou> {\jsc@setfontsize\footnotesize{8.8888}{13.2418}}% + \abovedisplayskip 6\jsc@mpt \@plus2\jsc@mpt \@minus3\jsc@mpt + \abovedisplayshortskip \z@ \@plus2\jsc@mpt + \belowdisplayskip \abovedisplayskip + \belowdisplayshortskip \belowdisplayskip + \def\@listi{\leftmargin\leftmargini + \topsep \z@ + \parsep \z@ + \itemsep \parsep}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\scriptsize} +% \begin{macro}{\tiny} +% \begin{macro}{\large} +% \begin{macro}{\Large} +% \begin{macro}{\LARGE} +% \begin{macro}{\huge} +% \begin{macro}{\Huge} +% \begin{macro}{\HUGE} +% +% それ以外のサイズは,本文に使うことがないので, +% 単にフォントサイズと行送りだけ変更します。 +% 特に注意すべきは |\large| で, +% これは二段組のときに節見出しのフォントとして使い, +% 行送りを |\normalsize| と同じにすることによって, +% 節見出しが複数行にわたっても段間で行が揃うようにします。 +% +% [2004-11-03] |\HUGE| を追加。 +% +% \begin{macrocode} +\newcommand{\scriptsize}{\jsc@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand{\tiny}{\jsc@setfontsize\tiny\@vpt\@vipt} +\if@twocolumn +%<!kiyou> \newcommand{\large}{\jsc@setfontsize\large\@xiipt{\n@baseline}} +%<kiyou> \newcommand{\large}{\jsc@setfontsize\large{11.111}{\n@baseline}} +\else +%<!kiyou> \newcommand{\large}{\jsc@setfontsize\large\@xiipt{17}} +%<kiyou> \newcommand{\large}{\jsc@setfontsize\large{11.111}{17}} +\fi +%<!kiyou>\newcommand{\Large}{\jsc@setfontsize\Large\@xivpt{21}} +%<kiyou>\newcommand{\Large}{\jsc@setfontsize\Large{12.222}{21}} +\newcommand{\LARGE}{\jsc@setfontsize\LARGE\@xviipt{25}} +\newcommand{\huge}{\jsc@setfontsize\huge\@xxpt{28}} +\newcommand{\Huge}{\jsc@setfontsize\Huge\@xxvpt{33}} +\newcommand{\HUGE}{\jsc@setfontsize\HUGE{30}{40}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% 別行立て数式の中では |\narrowbaselines| にします。 +% 和文の行送りのままでは,行列や場合分けの行送り, +% 連分数の高さなどが不釣合いに大きくなるためです。 +% +% 本文中の数式の中では |\narrowbaselines| にしていません。 +% 本文中ではなるべく行送りが変わるような大きいものを使わず, +% 行列は |amsmath| の |smallmatrix| 環境を使うのがいいでしょう。 +% +% \begin{macrocode} +\everydisplay=\expandafter{\the\everydisplay \narrowbaselines} +% \end{macrocode} +% +% しかし,このおかげで別行数式の上下のスペースが少し違ってしまいました。 +% とりあえず |amsmath| の |equation| 関係は |okumacro| のほうで逃げていますが, +% もっとうまい逃げ道があればお教えください。 +% +% 見出し用のフォントは |\bfseries| 固定ではなく,|\headfont| +% という命令で定めることにします。 +% これは太ゴシックが使えるときは |\sffamily| |\bfseries| +% でいいと思いますが,通常の中ゴシックでは単に |\sffamily| +% だけのほうがよさそうです。 +% 『p\LaTeXe 美文書作成入門』(1997年)では |\sffamily| +% |\fontseries{sbc}| として新ゴMと合わせましたが, +% |\fontseries{sbc}| はちょっと幅が狭いように感じました。 +% +% \begin{macrocode} +% \newcommand{\headfont}{\bfseries} +\newcommand{\headfont}{\gtfamily\sffamily} +% \newcommand{\headfont}{\sffamily\fontseries{sbc}\selectfont} +% \end{macrocode} +% +% \section{レイアウト} +% +% \paragraph{二段組} +% +% \begin{macro}{\columnsep} +% \begin{macro}{\columnseprule} +% +% |\columnsep| は二段組のときの左右の段間の幅です。 +% 元は10ptでしたが,|2\zw|にしました。 +% このスペースの中央に |\columnseprule| の幅の罫線が引かれます。 +% +% \begin{macrocode} +%<!kiyou>\setlength\columnsep{2\zw} +%<kiyou>\setlength\columnsep{28truebp} +\setlength\columnseprule{\z@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \paragraph{段落} +% +% \begin{macro}{\lineskip} +% \begin{macro}{\normallineskip} +% \begin{macro}{\lineskiplimit} +% \begin{macro}{\normallineskiplimit} +% +% 上下の行の文字が |\lineskiplimit| より接近したら, +% |\lineskip| より近づかないようにします。 +% 元は0ptでしたが1ptに変更しました。 +% \texttt{normal...} の付いた方は保存用です。 +% +% \begin{macrocode} +\setlength\lineskip{1\jsc@mpt} +\setlength\normallineskip{1\jsc@mpt} +\setlength\lineskiplimit{1\jsc@mpt} +\setlength\normallineskiplimit{1\jsc@mpt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\baselinestretch} +% +% 実際の行送りが |\baselineskip| の何倍かを表すマクロです。たとえば +% \begin{quote} +% |\renewcommand{\baselinestretch}{2}| +% \end{quote} +% とすると,行送りが通常の2倍になります。ただし, +% これを設定すると,たとえ |\baselineskip| が伸縮するように +% 設定しても,行送りの伸縮ができなくなります。 +% 行送りの伸縮はしないのが一般的です。 +% +% \begin{macrocode} +\renewcommand{\baselinestretch}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parskip} +% \begin{macro}{\parindent} +% +% |\parskip| は段落間の追加スペースです。 +% 元は 0pt plus 1pt になっていましたが,ここではゼロにしました。 +% |\parindent| は段落の先頭の字下げ幅です。 +% +% \begin{macrocode} +\setlength\parskip{\z@} +\if@slide + \setlength\parindent{0\zw} +\else + \setlength\parindent{1\zw} +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@lowpenalty} +% \begin{macro}{\@medpenalty} +% \begin{macro}{\@highpenalty} +% +% |\nopagebreak|,|\nolinebreak| は引数に応じて次のペナルティ値 +% のうちどれかを選ぶようになっています。 +% ここはオリジナル通りです。 +% +% \begin{macrocode} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\interlinepenalty} +% +% 段落中の改ページのペナルティです。デフォルトは 0 です。 +% +% \begin{macrocode} +% \interlinepenalty 0 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\brokenpenalty} +% +% ページの最後の行がハイフンで終わる際のペナルティです。 +% デフォルトは100です。 +% +% \begin{macrocode} +% \brokenpenalty 100 +% \end{macrocode} +% \end{macro} +% +% \subsection{ページレイアウト} +% +% \paragraph{縦方向のスペース} +% +% \begin{macro}{\headheight} +% \begin{macro}{\topskip} +% +% |\topskip| は本文領域上端と本文1行目のベースラインとの距離です。 +% あまりぎりぎりの値にすると,本文中に $\int$ のような高い文字が +% 入ったときに1行目のベースラインが他のページより下がってしまいます。 +% ここでは本文の公称フォントサイズ(10pt)にします。 +% +% [2003-06-26] |\headheight| はヘッダの高さで, +% 元は12ptでしたが,新ドキュメントクラスでは |\topskip| +% と等しくしていました。ところが,|fancyhdr| パッケージ +% で |\headheight| が小さいとおかしいことになるようです +% ので,2倍に増やしました。代わりに,版面の上下揃えの +% 計算では |\headheight| ではなく |\topskip| を使う +% ことにしました。 +% +% [2016-08-17] 圏点やルビが一行目に来た場合に下がるのを防ぐた +% め,|\topskip| を10ptから1.38zwに増やしました。 +% |\headheight| は従来と同じ20ptのままとします。 +% +% [2016-08-17 LTJ] 1.38zwの代わりに1.38|\zh|にしています。 +% +% \begin{macrocode} +\setlength\topskip{1.38\zh}%% from 10\jsc@mpt (2016-08-17) +\if@slide + \setlength\headheight{0\jsc@mpt} +\else + \setlength\headheight{20\jsc@mpt}%% from 2\topskip (2016-08-17); from \topskip (2003-06-26) +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\footskip} +% +% |\footskip| は本文領域下端とフッタ下端との距離です。 +% 標準クラスファイルでは,book で0.35in(約8.89mm), +% book 以外で30pt(約10.54mm)となっていましたが, +% ここではA4判のときちょうど1cmとなるように, +% |\paperheight| の0.03367倍(最小 |\baselineskip|)としました。 +% 書籍については,フッタは使わないことにして,ゼロにしました。 +% +% \begin{macrocode} +%<*article|kiyou> +\if@slide + \setlength\footskip{\z@} +\else + \setlength\footskip{0.03367\paperheight} + \ifdim\footskip<\baselineskip + \setlength\footskip{\baselineskip} + \fi +\fi +%</article|kiyou> +%<jspf>\setlength\footskip{9\jsc@mmm} +%<*book> +\if@report + \setlength\footskip{0.03367\paperheight} + \ifdim\footskip<\baselineskip + \setlength\footskip{\baselineskip} + \fi +\else + \setlength\footskip{\z@} +\fi +%</book> +%<*report> +\setlength\footskip{0.03367\paperheight} +\ifdim\footskip<\baselineskip + \setlength\footskip{\baselineskip} +\fi +%</report> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\headsep} +% +% |\headsep| はヘッダ下端と本文領域上端との距離です。 +% 元は book で18pt(約6.33mm), +% それ以外で25pt(約8.79mm)になっていました。 +% ここでは article は |\footskip| $-$ |\topskip| としました。 +% +% [2016-10-08] article の \texttt{slide} のとき, +% および book の非 \texttt{report} と kiyou のときに |\headsep| を +% 減らしそこねていたのを修正しました(2016-08-17での修正漏れ)。 +% +% \begin{macrocode} +%<*article> +\if@slide + \setlength\headsep{0\jsc@mpt} + \addtolength\headsep{-\topskip}%% added (2016-10-08) + \addtolength\headsep{10\jsc@mpt}%% added (2016-10-08) +\else + \setlength\headsep{\footskip} + \addtolength\headsep{-\topskip} +\fi +%</article> +%<*book> +\if@report + \setlength\headsep{\footskip} + \addtolength\headsep{-\topskip} +\else + \setlength\headsep{6\jsc@mmm} + \addtolength\headsep{-\topskip}%% added (2016-10-08) + \addtolength\headsep{10\jsc@mpt}%% added (2016-10-08) +\fi +%</book> +%<*report> +\setlength\headsep{\footskip} +\addtolength\headsep{-\topskip} +%</report> +%<*jspf> +\setlength\headsep{9\jsc@mmm} +\addtolength\headsep{-\topskip} +%</jspf> +%<*kiyou> +\setlength\headheight{0\jsc@mpt} +\setlength\headsep{0\jsc@mpt} +\addtolength\headsep{-\topskip}%% added (2016-10-08) +\addtolength\headsep{10\jsc@mpt}%% added (2016-10-08) +%</kiyou> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maxdepth} +% +% |\maxdepth| は本文最下行の最大の深さで, +% plain \TeX や\LaTeX~2.09では4ptに固定でした。 +% \LaTeX2e では |\maxdepth| $+$ |\topskip| を本文フォントサイズ +% の1.5倍にしたいのですが,|\topskip| は本文フォントサイズ +% (ここでは10pt)に等しいので,結局 |\maxdepth| は |\topskip| +% の半分の値(具体的には5pt)にします。 +% +% \begin{macrocode} +\setlength\maxdepth{.5\topskip} +% \end{macrocode} +% \end{macro} +% +% \paragraph{本文の幅と高さ} +% +% \begin{macro}{\fullwidth} +% +% 本文の幅が全角40文字を超えると読みにくくなります。 +% そこで,書籍の場合に限って, +% 紙の幅が広いときは外側のマージンを余分にとって全角40文字に押え, +% ヘッダやフッタは本文領域より広く取ることにします。 +% このときヘッダやフッタの幅を表す |\fullwidth| という長さを定義します。 +% +% \begin{macrocode} +\newdimen\fullwidth +% \end{macrocode} +% +% この |\fullwidth| は article では紙幅 |\paperwidth|の0.76倍を超えない +% 全角幅の整数倍(二段組では全角幅の偶数倍)にします。0.76倍という数値は +% A4縦置きの場合に紙幅から約2インチを引いた値になるように選びました。 +% book では紙幅から36ミリを引いた値にしました。 +% +% \begin{macro}{\textwidth} +% +% 書籍以外では本文領域の幅 |\textwidth| は |\fullwidth| と等しくします。 +% |article| ではA4縦置きで49文字となります。 +% 某学会誌スタイルでは |50\zw|(25文字×2段)+段間8\,mmとします。 +% +% \begin{macrocode} +%<*article> +\if@slide + \setlength\fullwidth{0.9\paperwidth} +\else + \setlength\fullwidth{0.76\paperwidth} +\fi +\if@twocolumn \@tempdima=2\zw \else \@tempdima=1\zw \fi +\divide\fullwidth\@tempdima \multiply\fullwidth\@tempdima +\setlength\textwidth{\fullwidth} +%</article> +%<*book> +\if@report + \setlength\fullwidth{0.76\paperwidth} +\else + \setlength\fullwidth{\paperwidth} + \addtolength\fullwidth{-36\jsc@mmm} +\fi +\if@twocolumn \@tempdima=2\zw \else \@tempdima=1\zw \fi +\divide\fullwidth\@tempdima \multiply\fullwidth\@tempdima +\setlength\textwidth{\fullwidth} +\if@report \else + \if@twocolumn \else + \ifdim \fullwidth>40\zw + \setlength\textwidth{40\zw} + \fi + \fi +\fi +%</book> +%<*report> +\setlength\fullwidth{0.76\paperwidth} +\if@twocolumn \@tempdima=2\zw \else \@tempdima=1\zw \fi +\divide\fullwidth\@tempdima \multiply\fullwidth\@tempdima +\setlength\textwidth{\fullwidth} +%</report> +%<*jspf> +\setlength\fullwidth{50\zw} +\addtolength\fullwidth{8\jsc@mmm} +\setlength\textwidth{\fullwidth} +%</jspf> +%<*kiyou> +\setlength\fullwidth{48\zw} +\addtolength\fullwidth{\columnsep} +\setlength\textwidth{\fullwidth} +%</kiyou> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\textheight} +% +% 紙の高さ |\paperheight| は,1インチと |\topmargin| +% と |\headheight| と |\headsep| と |\textheight| +% と |\footskip| とページ下部の余白を加えたものです。 +% +% 本文部分の高さ |\textheight| は, +% 紙の高さ |\paperheight| の0.83倍から, +% ヘッダの高さ,ヘッダと本文の距離,本文とフッタ下端の距離, +% |\topskip| を引き, +% それを |\baselineskip| の倍数に切り捨て, +% 最後に |\topskip| を加えます。 +% 念のため0.1ポイント余分に加えておきます。 +% 0.83倍という数値は,A4縦置きの場合に紙の高さから +% 上下マージン各約1インチを引いた値になるように選びました。 +% +% 某学会誌スタイルでは44行にします。 +% +% [2003-06-26] |\headheight| を |\topskip| に直しました。 +% 以前はこの二つは値が同じであったので,変化はないはずです。 +% +% [2016-08-26] |\topskip| を10ptから1.38zwに増やしましたので, +% その分 |\textheight| を増やします(2016-08-17での修正漏れ)。 +% +% [2016-10-08] article の slide のときに |\headheight| はゼロ +% なので,さらに修正しました(2016-08-17での修正漏れ)。 +% +% \begin{macrocode} +%<*article|book|report> +\if@slide + \setlength{\textheight}{0.95\paperheight} +\else + \setlength{\textheight}{0.83\paperheight} +\fi +\addtolength{\textheight}{-10\jsc@mpt}%% from -\topskip (2016-10-08); from -\headheight (2003-06-26) +\addtolength{\textheight}{-\headsep} +\addtolength{\textheight}{-\footskip} +\addtolength{\textheight}{-\topskip} +\divide\textheight\baselineskip +\multiply\textheight\baselineskip +%</article|book|report> +%<jspf>\setlength{\textheight}{51\baselineskip} +%<kiyou>\setlength{\textheight}{47\baselineskip} +\addtolength{\textheight}{\topskip} +\addtolength{\textheight}{0.1\jsc@mpt} +%<jspf>\setlength{\mathindent}{10\jsc@mmm} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\flushbottom} +% +% [2016-07-18] |\textheight| に念のため0.1ポイント余裕を持たせて +% いるのと同様に,|\flushbottom| にも余裕を持たせます。 +% 元の\LaTeXe での完全な |\flushbottom| の定義は +%\begin{verbatim} +% \def\flushbottom{% +% \let\@textbottom\relax \let\@texttop\relax} +%\end{verbatim} +% ですが,次のようにします。 +% +% \begin{macrocode} +\def\flushbottom{% + \def\@textbottom{\vskip \z@ \@plus.1\jsc@mpt}% + \let\@texttop\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\marginparsep} +% \begin{macro}{\marginparpush} +% +% |\marginparsep| は欄外の書き込みと本文との間隔です。 +% |\marginparpush| は欄外の書き込みどうしの最小の間隔です。 +% +% \begin{macrocode} +\setlength\marginparsep{\columnsep} +\setlength\marginparpush{\baselineskip} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\oddsidemargin} +% \begin{macro}{\evensidemargin} +% +% それぞれ奇数ページ,偶数ページの左マージンから1インチ引いた値です。 +% 片面印刷では |\oddsidemargin| が使われます。 +% \TeX は上・左マージンに |1truein| を挿入しますが, +% トンボ関係のオプションが指定されると |lltjcore.sty| +% はトンボの内側に |1in| のスペース(|1truein| ではなく)を挿入するので, +% 場合分けしています。 +% +% [2011-10-03 LTJ] Lua\TeX{} (pdf\TeX?) では |1truein| ではなく +% |1in| になるようです。 +% +% \begin{macrocode} +\setlength{\oddsidemargin}{\paperwidth} +\addtolength{\oddsidemargin}{-\fullwidth} +\setlength{\oddsidemargin}{.5\oddsidemargin} +\addtolength{\oddsidemargin}{-1in} +\setlength{\evensidemargin}{\oddsidemargin} +\if@mparswitch + \addtolength{\evensidemargin}{\fullwidth} + \addtolength{\evensidemargin}{-\textwidth} +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\marginparwidth} +% +% |\marginparwidth| は欄外の書き込みの横幅です。 +% 外側マージンの幅(|\evensidemargin| $+$ 1インチ)から1センチを引き, +% さらに |\marginparsep|(欄外の書き込みと本文のアキ)を引いた値に +% しました。最後に |1\zw| の整数倍に切り捨てます。 +% +% \begin{macrocode} +\setlength\marginparwidth{\paperwidth} +\addtolength\marginparwidth{-\oddsidemargin} +\addtolength\marginparwidth{-1in} +\addtolength\marginparwidth{-\textwidth} +\addtolength\marginparwidth{-10\jsc@mmm} +\addtolength\marginparwidth{-\marginparsep} +\@tempdima=1\zw +\divide\marginparwidth\@tempdima +\multiply\marginparwidth\@tempdima +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\topmargin} +% +% 上マージン(紙の上端とヘッダ上端の距離) +% から1インチ引いた値です。 +% +% [2003-06-26] |\headheight| を |\topskip| に直しました。 +% 以前はこの二つは値が同じであったので,変化はないはずです。 +% +% [2011-10-03 LTJ] ここも |\oddsidemargin| のときと同様に |-\inv@mag in| ではなく +% |-1in| にします。 +% +% [2016-08-17] |\topskip| を10ptから1.38zwに直しましたが, +% |\topmargin| は従来の値から変わらないように調節しました。 +% …のつもりでしたが,|\textheight| を増やし忘れていたので +% 変わってしまっていました(2016-08-26修正済み)。 +% +% \begin{macrocode} +\setlength\topmargin{\paperheight} +\addtolength\topmargin{-\textheight} +\if@slide + \addtolength\topmargin{-\headheight} +\else + \addtolength\topmargin{-10\jsc@mpt}%% from -\topskip (2016-10-08); from -\headheight (2003-06-26) +\fi +\addtolength\topmargin{-\headsep} +\addtolength\topmargin{-\footskip} +\setlength\topmargin{0.5\topmargin} +%<kiyou>\setlength\topmargin{81truebp} +\addtolength\topmargin{-1in} +% \end{macrocode} +% \end{macro} +% +% \paragraph{脚注} +% +% \begin{macro}{\footnotesep} +% +% 各脚注の頭に入る支柱(strut)の高さです。 +% 脚注間に余分のアキが入らないように, +% |\footnotesize| の支柱の高さ(行送りの0.7倍)に等しくします。 +% +% \begin{macrocode} +{\footnotesize\global\setlength\footnotesep{\baselineskip}} +\setlength\footnotesep{0.7\footnotesep} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footins} +% +% |\skip\footins| は本文の最終行と最初の脚注との間の距離です。 +% 標準の10ポイントクラスでは 9 plus 4 minus 2 ポイントになっていますが, +% 和文の行送りを考えてもうちょっと大きくします。 +% +% \begin{macrocode} +\setlength{\skip\footins}{16\jsc@mpt \@plus 5\jsc@mpt \@minus 2\jsc@mpt} +% \end{macrocode} +% \end{macro} +% +% \paragraph{フロート関連} +% +% フロート(図,表)関連のパラメータは\LaTeXe 本体で定義されていますが, +% ここで設定変更します。本文ページ(本文とフロートが共存するページ) +% とフロートだけのページで設定が異なります。 +% ちなみに,カウンタは内部では |\c@| を名前に冠したマクロになっています。 +% +% \begin{macro}{\c@topnumber} +% +% |topnumber| カウンタは本文ページ上部のフロートの最大数です。 +% +% [2003-08-23] ちょっと増やしました。 +% +% \begin{macrocode} +\setcounter{topnumber}{9} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\topfraction} +% +% 本文ページ上部のフロートが占有できる最大の割合です。 +% フロートが入りやすいように,元の値 0.7 を 0.8 [2003-08-23: 0.85] に変えてあります。 +% +% \begin{macrocode} +\renewcommand{\topfraction}{.85} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@bottomnumber} +% +% |bottomnumber| カウンタは本文ページ下部のフロートの最大数です。 +% +% [2003-08-23] ちょっと増やしました。 +% +% \begin{macrocode} +\setcounter{bottomnumber}{9} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bottomfraction} +% +% 本文ページ下部のフロートが占有できる最大の割合です。元は 0.3 でした。 +% +% \begin{macrocode} +\renewcommand{\bottomfraction}{.8} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@totalnumber} +% +% |totalnumber| カウンタは本文ページに入りうるフロートの最大数です。 +% +% [2003-08-23] ちょっと増やしました。 +% +% \begin{macrocode} +\setcounter{totalnumber}{20} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textfraction} +% +% 本文ページに最低限入らなければならない本文の割合です。 +% フロートが入りやすいように元の 0.2 を 0.1 に変えました。 +% +% \begin{macrocode} +\renewcommand{\textfraction}{.1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\floatpagefraction} +% +% フロートだけのページでのフロートの最小割合です。 +% これも 0.5 を 0.8 に変えてあります。 +% +% \begin{macrocode} +\renewcommand{\floatpagefraction}{.8} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@dbltopnumber} +% +% 二段組のとき本文ページ上部に出力できる +% 段抜きフロートの最大数です。 +% +% [2003-08-23] ちょっと増やしました。 +% +% \begin{macrocode} +\setcounter{dbltopnumber}{9} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dbltopfraction} +% +% 二段組のとき本文ページ上部に出力できる +% 段抜きフロートが占めうる最大の割合です。 +% 0.7 を 0.8 に変えてあります。 +% +% \begin{macrocode} +\renewcommand{\dbltopfraction}{.8} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dblfloatpagefraction} +% +% 二段組のときフロートだけのページに入るべき +% 段抜きフロートの最小割合です。 +% 0.5 を 0.8 に変えてあります。 +% +% \begin{macrocode} +\renewcommand{\dblfloatpagefraction}{.8} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\floatsep} +% \begin{macro}{\textfloatsep} +% \begin{macro}{\intextsep} +% +% |\floatsep| はページ上部・下部のフロート間の距離です。 +% |\textfloatsep| はページ上部・下部のフロートと本文との距離です。 +% |\intextsep| は本文の途中に出力されるフロートと本文との距離です。 +% +% \begin{macrocode} +\setlength\floatsep {12\jsc@mpt \@plus 2\jsc@mpt \@minus 2\jsc@mpt} +\setlength\textfloatsep{20\jsc@mpt \@plus 2\jsc@mpt \@minus 4\jsc@mpt} +\setlength\intextsep {12\jsc@mpt \@plus 2\jsc@mpt \@minus 2\jsc@mpt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dblfloatsep} +% \begin{macro}{\dbltextfloatsep} +% +% 二段組のときの段抜きのフロートについての値です。 +% +% \begin{macrocode} +\setlength\dblfloatsep {12\jsc@mpt \@plus 2\jsc@mpt \@minus 2\jsc@mpt} +\setlength\dbltextfloatsep{20\jsc@mpt \@plus 2\jsc@mpt \@minus 4\jsc@mpt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@fptop} +% \begin{macro}{\@fpsep} +% \begin{macro}{\@fpbot} +% +% フロートだけのページに入るグルーです。 +% |\@fptop| はページ上部, +% |\@fpbot| はページ下部, +% |\@fpsep| はフロート間に入ります。 +% +% \begin{macrocode} +\setlength\@fptop{0\jsc@mpt \@plus 1fil} +\setlength\@fpsep{8\jsc@mpt \@plus 2fil} +\setlength\@fpbot{0\jsc@mpt \@plus 1fil} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@dblfptop} +% \begin{macro}{\@dblfpsep} +% \begin{macro}{\@dblfpbot} +% +% 段抜きフロートについての値です。 +% +% \begin{macrocode} +\setlength\@dblfptop{0\jsc@mpt \@plus 1fil} +\setlength\@dblfpsep{8\jsc@mpt \@plus 2fil} +\setlength\@dblfpbot{0\jsc@mpt \@plus 1fil} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{改ページ(日本語\TeX{}開発コミュニティ版のみ)}\label{sec:cleardoublepage} +% +% \begin{macro}{\pltx@cleartorightpage} +% \begin{macro}{\pltx@cleartoleftpage} +% \begin{macro}{\pltx@cleartooddpage} +% \begin{macro}{\pltx@cleartoevenpage} +% [2017-02-24] コミュニティ版\pLaTeX の標準クラス2017/02/15に合わせて, +% 同じ命令を追加しました。 +% \begin{enumerate} +% \item|\pltx@cleartorightpage|:右ページになるまでページを繰る命令 +% \item|\pltx@cleartoleftpage|:左ページになるまでページを繰る命令 +% \item|\pltx@cleartooddpage|:奇数ページになるまでページを繰る命令 +% \item|\pltx@cleartoevenpage|:偶数ページになるまでページを繰る命令 +% \end{enumerate} +% となっています。 +% +% \begin{macrocode} +%<*article|book|report> +\def\pltx@cleartorightpage{\clearpage\if@twoside + \unless\ifodd\numexpr\c@page+\ltjgetparameter{direction}\relax + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi\fi} +\def\pltx@cleartoleftpage{\clearpage\if@twoside + \ifodd\numexpr\c@page+\ltjgetparameter{direction}\relax + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi\fi} +\def\pltx@cleartooddpage{\clearpage\if@twoside + \ifodd\c@page\else + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi\fi} +\def\pltx@cleartoevenpage{\clearpage\if@twoside + \ifodd\c@page + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi\fi} +%</article|book|report> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\cleardoublepage} +% [2017-02-24] コミュニティ版\pLaTeX の標準クラス2017/02/15に合わせて, +% reportとbookクラスの場合に|\cleardoublepage|を再定義します。 +% \begin{macrocode} +%<*book|report> +\if@openleft + \let\cleardoublepage\pltx@cleartoleftpage +\else\if@openright + \let\cleardoublepage\pltx@cleartorightpage +\fi\fi +%</book|report> +% \end{macrocode} +% \end{macro} +% +% \section{ページスタイル}\label{sec:pagestyle} +% +% ページスタイルとして,\LaTeXe (欧文版)の標準クラス +% では |empty|,|plain|,|headings|,|myheadings| があります。 +% このうち |empty|,|plain| スタイルは\LaTeXe 本体 +% で定義されています。 +% +% アスキーのクラスファイルでは |headnombre|,|footnombre|, +% |bothstyle|,|jpl@in| が追加されていますが, +% ここでは欧文標準のものだけにしました。 +% +% ページスタイルは |\ps@...| の形のマクロで定義されています。 +% +% \begin{macro}{\@evenhead} +% \begin{macro}{\@oddhead} +% \begin{macro}{\@evenfoot} +% \begin{macro}{\@oddfoot} +% +% |\@oddhead|,|\@oddfoot|,|\@evenhead|,|\@evenfoot| は +% 偶数・奇数ページの柱(ヘッダ,フッタ)を出力する命令です。 +% これらは |\fullwidth| 幅の |\hbox| の中で呼び出されます。 +% |\ps@...| の中で定義しておきます。 +% +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% 柱の内容は,|\chapter| が呼び出す |\chaptermark{何々}|, +% |\section| が呼び出す |\sectionmark{何々}| で設定します。 +% 柱を扱う命令には次のものがあります。 +% +% \begin{quote} +% \begin{tabbing} +% |\markboth{左}{右} | \= 両方の柱を設定します。\\ +% |\markright{右}| \> 右の柱を設定します。\\ +% |\leftmark| \> 左の柱を出力します。\\ +% |\rightmark| \> 右の柱を出力します。 +% \end{tabbing} +% \end{quote} +% +% 柱を設定する命令は,右の柱が左の柱の下位にある場合は十分まともに +% 動作します。たとえば左マークを |\chapter|,右マークを |\section| +% で変更する場合がこれにあたります。 +% しかし,同一ページに複数の |\markboth| があると, +% おかしな結果になることがあります。 +% +% |\tableofcontents| のような命令で使われる |\@mkboth| は, +% |\ps@...| コマンド中で |\markboth| か |\@gobbletwo|(何もしない) +% に |\let| されます。 +% +% \begin{macro}{\ps@empty} +% +% |empty| ページスタイルの定義です。 +% \LaTeX 本体で定義されているものをコメントアウトした形で +% 載せておきます。 +% +% \begin{macrocode} +% \def\ps@empty{% +% \let\@mkboth\@gobbletwo +% \let\@oddhead\@empty +% \let\@oddfoot\@empty +% \let\@evenhead\@empty +% \let\@evenfoot\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@plainhead} +% \begin{macro}{\ps@plainfoot} +% \begin{macro}{\ps@plain} +% +% |plainhead| はシンプルなヘッダだけのページスタイルです。 +% +% |plainfoot| はシンプルなフッタだけのページスタイルです。 +% +% |plain| は |book| では |plainhead|,それ以外では |plainfoot| になります。 +% +% \begin{macrocode} +\def\ps@plainfoot{% + \let\@mkboth\@gobbletwo + \let\@oddhead\@empty + \def\@oddfoot{\normalfont\hfil\thepage\hfil}% + \let\@evenhead\@empty + \let\@evenfoot\@oddfoot} +\def\ps@plainhead{% + \let\@mkboth\@gobbletwo + \let\@oddfoot\@empty + \let\@evenfoot\@empty + \def\@evenhead{% + \if@mparswitch \hss \fi + \hbox to \fullwidth{\textbf{\thepage}\hfil}% + \if@mparswitch\else \hss \fi}% + \def\@oddhead{% + \hbox to \fullwidth{\hfil\textbf{\thepage}}\hss}} +%<book>\if@report \let\ps@plain\ps@plainfoot \else \let\ps@plain\ps@plainhead \fi +%<!book>\let\ps@plain\ps@plainfoot +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ps@headings} +% +% |headings| スタイルはヘッダに見出しとページ番号を出力します。 +% ここではヘッダにアンダーラインを引くようにしてみました。 +% +% まず article の場合です。 +% +% \begin{macrocode} +%<*article|kiyou> +\if@twoside + \def\ps@headings{% + \let\@oddfoot\@empty + \let\@evenfoot\@empty + \def\@evenhead{\if@mparswitch \hss \fi + \underline{\hbox to \fullwidth{\textbf{\thepage}\hfil\leftmark}}% + \if@mparswitch\else \hss \fi}% + \def\@oddhead{% + \underline{% + \hbox to \fullwidth{{\rightmark}\hfil\textbf{\thepage}}}\hss}% + \let\@mkboth\markboth + \def\sectionmark##1{\markboth{% + \ifnum \c@secnumdepth >\z@ \thesection \hskip1\zw\fi + ##1}{}}% + \def\subsectionmark##1{\markright{% + \ifnum \c@secnumdepth >\@ne \thesubsection \hskip1\zw\fi + ##1}}% + } +\else % if not twoside + \def\ps@headings{% + \let\@oddfoot\@empty + \def\@oddhead{% + \underline{% + \hbox to \fullwidth{{\rightmark}\hfil\textbf{\thepage}}}\hss}% + \let\@mkboth\markboth + \def\sectionmark##1{\markright{% + \ifnum \c@secnumdepth >\z@ \thesection \hskip1\zw\fi + ##1}}} +\fi +%</article|kiyou> +% \end{macrocode} +% +% 次は book および report の場合です。 +% [2011-05-10] しっぽ愛好家さん [qa:6370] のパッチを取り込ませていただきました +% (北見さん [qa:55896] のご指摘ありがとうございます)。 +% +% \begin{macrocode} +%<*book|report> +\newif\if@omit@number +\def\ps@headings{% + \let\@oddfoot\@empty + \let\@evenfoot\@empty + \def\@evenhead{% + \if@mparswitch \hss \fi + \underline{\hbox to \fullwidth{\ltjsetparameter{autoxspacing={true}} + \textbf{\thepage}\hfil\leftmark}}% + \if@mparswitch\else \hss \fi}% + \def\@oddhead{\underline{\hbox to \fullwidth{\ltjsetparameter{autoxspacing={true}} + {\if@twoside\rightmark\else\leftmark\fi}\hfil\textbf{\thepage}}}\hss}% + \let\@mkboth\markboth + \def\chaptermark##1{\markboth{% + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \if@omit@number\else + \@chapapp\thechapter\@chappos\hskip1\zw + \fi +%<book> \fi + \fi + ##1}{}}% + \def\sectionmark##1{\markright{% + \ifnum \c@secnumdepth >\z@ \thesection \hskip1\zw\fi + ##1}}}% +%</book|report> +% \end{macrocode} +% +% 最後は学会誌の場合です。 +% +% \begin{macrocode} +%<*jspf> +\def\ps@headings{% + \def\@oddfoot{\normalfont\hfil\thepage\hfil} + \def\@evenfoot{\normalfont\hfil\thepage\hfil} + \def\@oddhead{\normalfont\hfil \@title \hfil} + \def\@evenhead{\normalfont\hfil プラズマ・核融合学会誌\hfil}} +%</jspf> +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\ps@myheadings} +% +% |myheadings| ページスタイルではユーザが |\markboth| や |\markright| で +% 柱を設定するため,ここでの定義は非常に簡単です。 +% +% [2004-01-17] 渡辺徹さんのパッチを適用しました。 +% +% \begin{macrocode} +\def\ps@myheadings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{% + \if@mparswitch \hss \fi% + \hbox to \fullwidth{\thepage\hfil\leftmark}% + \if@mparswitch\else \hss \fi}% + \def\@oddhead{% + \hbox to \fullwidth{\rightmark\hfil\thepage}\hss}% + \let\@mkboth\@gobbletwo +%<book|report> \let\chaptermark\@gobble + \let\sectionmark\@gobble +%<!book&!report> \let\subsectionmark\@gobble +} +% \end{macrocode} +% \end{macro} +% +% \section{文書のマークアップ} +% +% \subsection{表題} +% +% \begin{macro}{\title} +% \begin{macro}{\author} +% \begin{macro}{\date} +% +% これらは\LaTeX 本体で次のように定義されています。 +% ここではコメントアウトした形で示します。 +% +% \begin{macrocode} +% \newcommand*{\title}[1]{\gdef\@title{#1}} +% \newcommand*{\author}[1]{\gdef\@author{#1}} +% \newcommand*{\date}[1]{\gdef\@date{#1}} +% \date{\today} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\etitle} +% \begin{macro}{\eauthor} +% \begin{macro}{\keywords} +% +% 某学会誌スタイルで使う英語のタイトル,英語の著者名,キーワード,メールアドレスです。 +% +% \begin{macrocode} +%<*jspf> +\newcommand*{\etitle}[1]{\gdef\@etitle{#1}} +\newcommand*{\eauthor}[1]{\gdef\@eauthor{#1}} +\newcommand*{\keywords}[1]{\gdef\@keywords{#1}} +\newcommand*{\email}[1]{\gdef\authors@mail{#1}} +\newcommand*{\AuthorsEmail}[1]{\gdef\authors@mail{author's e-mail:\ #1}} +%</jspf> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\plainifnotempty} +% +% 従来の標準クラスでは,文書全体のページスタイルを |empty| に +% しても表題のあるページだけ |plain| になってしまうことが +% ありました。これは |\maketitle| の定義中 +% に |\thispagestyle|\hspace{0pt}|{plain}| が入っている +% ためです。この問題を解決するために, +% 「全体のページスタイルが |empty| でないなら +% このページのスタイルを |plain| にする」という次の +% 命令を作ることにします。 +% +% \begin{macrocode} +\def\plainifnotempty{% + \ifx \@oddhead \@empty + \ifx \@oddfoot \@empty + \else + \thispagestyle{plainfoot}% + \fi + \else + \thispagestyle{plainhead}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maketitle} +% +% 表題を出力します。 +% 著者名を出力する部分は,欧文の標準クラスファイルでは |\large|, +% 和文のものでは |\Large| になっていましたが,ここでは |\large| +% にしました。 +% +% [2016-11-16] スペーシングを元の |jsclasses| に合わせるため,|\smallskip| を +% |\jsc@smallskip| に置き換えました。|\smallskip| のままでは +% \texttt{nomag(*)} の場合にスケールしなくなり,レイアウトが変わってしまいます。 +% +% \begin{macrocode} +%<*article|book|report|kiyou> +\if@titlepage + \newcommand{\maketitle}{% + \begin{titlepage}% + \let\footnotesize\small + \let\footnoterule\relax + \let\footnote\thanks + \null\vfil + \if@slide + {\footnotesize \@date}% + \begin{center} + \mbox{} \\[1\zw] + \large + {\maybeblue\hrule height0\jsc@mpt depth2\jsc@mpt\relax}\par + \jsc@smallskip + \@title + \jsc@smallskip + {\maybeblue\hrule height0\jsc@mpt depth2\jsc@mpt\relax}\par + \vfill + {\small \@author}% + \end{center} + \else + \vskip 60\jsc@mpt + \begin{center}% + {\LARGE \@title \par}% + \vskip 3em% + {\large + \lineskip .75em + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1.5em + {\large \@date \par}% + \end{center}% + \fi + \par + \@thanks\vfil\null + \end{titlepage}% + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax + }% +\else + \newcommand{\maketitle}{\par + \begingroup + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}% + \long\def\@makefntext##1{\advance\leftskip 3\zw + \parindent 1\zw\noindent + \llap{\@textsuperscript{\normalfont\@thefnmark}\hskip0.3\zw}##1}% + \if@twocolumn + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi + \else + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \fi + \plainifnotempty + \@thanks + \endgroup + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@maketitle} +% +% 独立した表題ページを作らない場合の表題の出力形式です。 +% +% \begin{macrocode} + \def\@maketitle{% + \newpage\null + \vskip 2em + \begin{center}% + \let\footnote\thanks + {\LARGE \@title \par}% + \vskip 1.5em + {\large + \lineskip .5em + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em + {\large \@date}% + \end{center}% + \par\vskip 1.5em +%<article|report|kiyou> \ifvoid\@abstractbox\else\centerline{\box\@abstractbox}\vskip1.5em\fi + } +\fi +%</article|book|report|kiyou> +%<*jspf> +\newcommand{\maketitle}{\par + \begingroup + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}% + \long\def\@makefntext##1{\advance\leftskip 3\zw + \parindent 1\zw\noindent + \llap{\@textsuperscript{\normalfont\@thefnmark}\hskip0.3\zw}##1}% + \twocolumn[\@maketitle]% + \plainifnotempty + \@thanks + \endgroup + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty +% \global\let\@title\@empty % \@title は柱に使う + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax + \ifx\authors@mail\@undefined\else{% + \def\@makefntext{\advance\leftskip 3\zw \parindent -3\zw}% + \footnotetext[0]{\itshape\authors@mail}% + }\fi + \global\let\authors@mail\@undefined} +\def\@maketitle{% + \newpage\null + \vskip 6em % used to be 2em + \begin{center} + \let\footnote\thanks + \ifx\@title\@undefined\else{\LARGE\headfont\@title\par}\fi + \lineskip .5em + \ifx\@author\@undefined\else + \vskip 1em + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par + \fi + \ifx\@etitle\@undefined\else + \vskip 1em + {\large \@etitle \par}% + \fi + \ifx\@eauthor\@undefined\else + \vskip 1em + \begin{tabular}[t]{c}% + \@eauthor + \end{tabular}\par + \fi + \vskip 1em + \@date + \end{center} + \vskip 1.5em + \centerline{\box\@abstractbox} + \ifx\@keywords\@undefined\else + \vskip 1.5em + \centerline{\parbox{157\jsc@mmm}{\textsf{Keywords:}\\ \small\@keywords}} + \fi + \vskip 1.5em} +%</jspf> +% \end{macrocode} +% \end{macro} +% +% \subsection{章・節} +% +% \paragraph{構成要素} +% +% |\@startsection| マクロは6個の必須引数と,オプションとして |*| と +% 1個のオプション引数と1個の必須引数をとります。 +% +% \begin{quote} +% |\@startsection{名}{レベル}{字下げ}{前アキ}{後アキ}{スタイル}| \\ +% | *[別見出し]{見出し}| +% \end{quote} +% +% それぞれの引数の意味は次の通りです。 +% +% \begin{description} +% \item[名] ユーザレベルコマンドの名前です(例: section)。 +% \item[レベル] 見出しの深さを示す数値です +% (chapter=1, section=2, \ldots )。 +% この数値が |secnumdepth| 以下のとき見出し番号を出力します。 +% \item[字下げ] 見出しの字下げ量です。 +% \item[前アキ] この値の絶対値が見出し上側の空きです。 +% 負の場合は,見出し直後の段落をインデントしません。 +% \item[後アキ] 正の場合は,見出しの下の空きです。 +% 負の場合は,絶対値が見出しの右の空きです +% (見出しと同じ行から本文を始めます)。 +% \item[スタイル] 見出しの文字スタイルの設定です。 +% \item[\texttt{*}] この \texttt{*} 印がないと,見出し番号を付け, +% 見出し番号のカウンタに1を加算します。 +% \item[別見出し] 目次や柱に出力する見出しです。 +% \item[見出し] 見出しです。 +% \end{description} +% +% 見出しの命令は通常 |\@startsection| とその最初の6個の引数として +% 定義されます。 +% +% 次は |\@startsection| の定義です。 +% 情報処理学会論文誌スタイルファイル(\texttt{ipsjcommon.sty}) +% を参考にさせていただきましたが,完全に行送りが |\baselineskip| +% の整数倍にならなくてもいいから前の行と重ならないようにしました。 +% +% \begin{macrocode} +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par +% 見出し上の空きを \@tempskipa にセットする + \@tempskipa #4\relax +% \@afterindent は見出し直後の段落を字下げするかどうかを表すスイッチ + \if@english \@afterindentfalse \else \@afterindenttrue \fi +% 見出し上の空きが負なら見出し直後の段落を字下げしない + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty +% 次の行は削除 +% \addvspace\@tempskipa +% 次の \noindent まで追加 + \ifdim \@tempskipa >\z@ + \if@slide\else + \null + \vspace*{-\baselineskip}% + \fi + \vskip\@tempskipa + \fi + \fi + \noindent +% 追加終わり + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% \end{macrocode} +% +% |\@sect| と |\@xsect| は, +% 前のアキがちょうどゼロの場合にもうまくいくように,多少変えてあります。 +% +% \begin{macrocode} +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi +% 見出し後の空きを \@tempskipa にセット + \@tempskipa #5\relax +% 条件判断の順序を入れ換えました + \ifdim \@tempskipa<\z@ + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% 目次にフルネームを載せるなら #8 + \else + \begingroup + \interlinepenalty \@M % 下から移動 + #6{% + \@hangfrom{\hskip #3\relax\@svsec}% +% \interlinepenalty \@M % 上に移動 + #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}% 目次にフルネームを載せるならここは #8 + \fi + \@xsect{#5}} +% \end{macrocode} +% +% 二つ挿入した |\everyparhook| のうち後者が |\paragraph| 類の後で2回実行され, +% それ以降は前者が実行されます。 +% +% [2011-10-05 LTJ] Lua\TeX-jaでは |\everyparhook| は不要なので削除。 +% +% [2016-07-28] \texttt{slide}オプションと\texttt{twocolumn}オプションを +% 同時に指定した場合の罫線の位置を微調整しました。 +% +% \begin{macrocode} +\def\@xsect#1{% +% 見出しの後ろの空きを \@tempskipa にセット + \@tempskipa #1\relax +% 条件判断の順序を変えました + \ifdim \@tempskipa<\z@ + \@nobreakfalse + \global\@noskipsectrue + \everypar{% + \if@noskipsec + \global\@noskipsecfalse + {\setbox\z@\lastbox}% + \clubpenalty\@M + \begingroup \@svsechd \endgroup + \unskip + \@tempskipa #1\relax + \hskip -\@tempskipa\ltjfakeparbegin + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi}% + \else + \par \nobreak + \vskip \@tempskipa + \@afterheading + \fi + \if@slide + {\vskip\if@twocolumn-5\jsc@mpt\else-6\jsc@mpt\fi + \maybeblue\hrule height0\jsc@mpt depth1\jsc@mpt + \vskip\if@twocolumn 4\jsc@mpt\else 7\jsc@mpt\fi\relax}% + \fi + \par % 2000-12-18 + \ignorespaces} +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa<\z@ + \def\@svsechd{#4{\hskip #1\relax #5}}% + \else + \begingroup + #4{% + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \fi + \@xsect{#3}} +% \end{macrocode} +% +% \paragraph{柱関係の命令} +% +% \begin{macro}{\chaptermark} +% \begin{macro}{\sectionmark} +% \begin{macro}{\subsectionmark} +% \begin{macro}{\subsubsectionmark} +% \begin{macro}{\paragraphmark} +% \begin{macro}{\subparagraphmark} +% +% |\...mark| の形の命令を初期化します(第\ref{sec:pagestyle}節参照)。 +% |\chaptermark| 以外は\LaTeX 本体で定義済みです。 +% +% \begin{macrocode} +\newcommand*\chaptermark[1]{} +% \newcommand*{\sectionmark}[1]{} +% \newcommand*{\subsectionmark}[1]{} +% \newcommand*{\subsubsectionmark}[1]{} +% \newcommand*{\paragraphmark}[1]{} +% \newcommand*{\subparagraphmark}[1]{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \paragraph{カウンタの定義} +% +% \begin{macro}{\c@secnumdepth} +% +% |secnumdepth| は第何レベルの見出しまで +% 番号を付けるかを決めるカウンタです。 +% +% \begin{macrocode} +%<!book&!report>\setcounter{secnumdepth}{3} +%<book|report>\setcounter{secnumdepth}{2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@chapter} +% \begin{macro}{\c@section} +% \begin{macro}{\c@subsection} +% \begin{macro}{\c@subsubsection} +% \begin{macro}{\c@paragraph} +% \begin{macro}{\c@subparagraph} +% +% 見出し番号のカウンタです。 +% |\newcounter| の第1引数が新たに作るカウンタです。 +% これは第2引数が増加するたびに 0 に戻されます。 +% 第2引数は定義済みのカウンタです。 +% +% \begin{macrocode} +\newcounter{part} +%<book|report>\newcounter{chapter} +%<book|report>\newcounter{section}[chapter] +%<!book&!report>\newcounter{section} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] +\newcounter{subparagraph}[paragraph] +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\thepart} +% \begin{macro}{\thechapter} +% \begin{macro}{\thesection} +% \begin{macro}{\thesubsection} +% \begin{macro}{\thesubsubsection} +% \begin{macro}{\theparagraph} +% \begin{macro}{\thesubparagraph} +% +% カウンタの値を出力する命令 |\the何々| を定義します。 +% +% カウンタを出力するコマンドには次のものがあります。 +% +% \begin{quote} +% |\arabic{COUNTER} | 1, 2, 3, \ldots \\ +% |\roman{COUNTER} | i, ii, iii, \ldots \\ +% |\Roman{COUNTER} | I, II, III, \ldots \\ +% |\alph{COUNTER} | a, b, c, \ldots \\ +% |\Alph{COUNTER} | A, B, C, \ldots \\ +% |\kansuji{COUNTER} | 一, 二, 三, \ldots +% \end{quote} +% +% 以下ではスペース節約のため |@| の付いた内部表現を多用しています。 +% +% \begin{macrocode} +\renewcommand{\thepart}{\@Roman\c@part} +%<!book&!report>% \renewcommand{\thesection}{\@arabic\c@section} +%<!book&!report>\renewcommand{\thesection}{\presectionname\@arabic\c@section\postsectionname} +%<!book&!report>\renewcommand{\thesubsection}{\@arabic\c@section.\@arabic\c@subsection} +%<*book|report> +\renewcommand{\thechapter}{\@arabic\c@chapter} +\renewcommand{\thesection}{\thechapter.\@arabic\c@section} +\renewcommand{\thesubsection}{\thesection.\@arabic\c@subsection} +%</book|report> +\renewcommand{\thesubsubsection}{% + \thesubsection.\@arabic\c@subsubsection} +\renewcommand{\theparagraph}{% + \thesubsubsection.\@arabic\c@paragraph} +\renewcommand{\thesubparagraph}{% + \theparagraph.\@arabic\c@subparagraph} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@chapapp} +% \begin{macro}{\@chappos} +% +% |\@chapapp| の初期値は |\prechaptername|(第)です。 +% +% |\@chappos| の初期値は |\postchaptername|(章)です。 +% +% |\appendix| は |\@chapapp| を |\appendixname| に, +% |\@chappos| を空に再定義します。 +% +% [2003-03-02] |\@secapp| は外しました。 +% +% \begin{macrocode} +%<book|report>\newcommand{\@chapapp}{\prechaptername} +%<book|report>\newcommand{\@chappos}{\postchaptername} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \paragraph{前付,本文,後付} +% +% 本のうち章番号があるのが「本文」, +% それ以外が「前付」「後付」です。 +% +% \begin{macro}{\frontmatter} +% +% ページ番号をローマ数字にし,章番号を付けないようにします。 +% +% [2017-03-05] |\frontmatter| と |\mainmatter| の2つの命令は, +% 改丁または改ページした後で |\pagenumbering{...}| でノンブルを1に +% リセットします。長い間 |\frontmatter| は \texttt{openany} のときに +% 単なる改ページとしていましたが,これではノンブルをリセットする際に +% 偶奇逆転が起こる場合がありました。\texttt{openany} かどうかに依らず +% 奇数ページまで繰るように修正することで,問題を解消しました。 +% 実は,\LaTeX の標準クラスでは1998年に修正されていた問題です +% (コミュニティ版\pLaTeX の標準クラス2017/03/05も参照)。 +% +% \begin{macrocode} +%<*book> +\newcommand\frontmatter{% + \pltx@cleartooddpage + \@mainmatterfalse + \pagenumbering{roman}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mainmatter} +% +% ページ番号を算用数字にし,章番号を付けるようにします。 +% +% \begin{macrocode} +\newcommand\mainmatter{% + \pltx@cleartooddpage + \@mainmattertrue + \pagenumbering{arabic}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\backmatter} +% +% 章番号を付けないようにします。ページ番号の付け方は変わりません。 +% +% \begin{macrocode} +\newcommand\backmatter{% + \if@openleft + \cleardoublepage + \else\if@openright + \cleardoublepage + \else + \clearpage + \fi\fi + \@mainmatterfalse} +%</book> +% \end{macrocode} +% \end{macro} +% +% \paragraph{部} +% +% \begin{macro}{\part} +% +% 新しい部を始めます。 +% +% |\secdef| を使って見出しを定義しています。 +% このマクロは二つの引数をとります。 +% +% \begin{quote} +% |\secdef{星なし}{星あり}| +% \end{quote} +% +% \begin{description} +% \item[星なし] \texttt{*} のない形の定義です。 +% \item[星あり] \texttt{*} のある形の定義です。 +% \end{description} +% +% |\secdef| は次のようにして使います。 +% +%\begin{verbatim} +% \def\chapter { ... \secdef \CMDA \CMDB } +% \def\CMDA [#1]#2{....} % \chapter[...]{...} の定義 +% \def\CMDB #1{....} % \chapter*{...} の定義 +%\end{verbatim} +% +% まず |book| と |report| のクラス以外です。 +% +% \begin{macrocode} +%<*!book&!report> +\newcommand\part{% + \if@noskipsec \leavevmode \fi + \par + \addvspace{4ex}% + \if@english \@afterindentfalse \else \@afterindenttrue \fi + \secdef\@part\@spart} +%</!book&!report> +% \end{macrocode} +% +% |book| および |report| クラスの場合は,少し複雑です。 +% +% \begin{macrocode} +%<*book|report> +\newcommand\part{% + \if@openleft + \cleardoublepage + \else\if@openright + \cleardoublepage + \else + \clearpage + \fi\fi + \thispagestyle{empty}% 欧文用標準スタイルでは plain + \if@twocolumn + \onecolumn + \@restonecoltrue + \else + \@restonecolfalse + \fi + \null\vfil + \secdef\@part\@spart} +%</book|report> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@part} +% +% 部の見出しを出力します。 +% |\bfseries| を |\headfont| に変えました。 +% +% |book| および |report| クラス以外では |secnumdepth| が $-1$ より大きいとき +% 部番号を付けます。 +% +% \begin{macrocode} +%<*!book&!report> +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >\m@ne + \refstepcounter{part}% + \addcontentsline{toc}{part}{% + \prepartname\thepart\postpartname\hspace{1\zw}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\parindent\z@ + \raggedright + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >\m@ne + \Large\headfont\prepartname\thepart\postpartname + \par\nobreak + \fi + \huge \headfont #2% + \markboth{}{}\par}% + \nobreak + \vskip 3ex + \@afterheading} +%</!book&!report> +% \end{macrocode} +% +% |book| および |report| クラスでは |secnumdepth| が $-2$ より大きいとき部番号を付けます。 +% +% \begin{macrocode} +%<*book|report> +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \addcontentsline{toc}{part}{% + \prepartname\thepart\postpartname\hspace{1\zw}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\centering + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >-2\relax + \huge\headfont \prepartname\thepart\postpartname + \par\vskip20\jsc@mpt + \fi + \Huge \headfont #2\par}% + \@endpart} +%</book|report> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@spart} +% +% 番号を付けない部です。 +% +% \begin{macrocode} +%<*!book&!report> +\def\@spart#1{{% + \parindent \z@ \raggedright + \interlinepenalty \@M + \normalfont + \huge \headfont #1\par}% + \nobreak + \vskip 3ex + \@afterheading} +%</!book&!report> +%<*book|report> +\def\@spart#1{{% + \centering + \interlinepenalty \@M + \normalfont + \Huge \headfont #1\par}% + \@endpart} +%</book|report> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@endpart} +% +% |\@part| と |\@spart| の最後で実行されるマクロです。 +% 両面印刷のときは白ページを追加します。 +% 二段組のときには,二段組に戻します。 +% +% [2016-12-13] \texttt{openany} のときには白ページが追加されるのは変なので, +% その場合は追加しないようにしました。このバグは\LaTeX では +% classes.dtx v1.4b (2000/05/19) +% で修正されています。 +% +% \begin{macrocode} +%<*book|report> +\def\@endpart{\vfil\newpage + \if@twoside + \if@openleft %% added (2017/02/24) + \null\thispagestyle{empty}\newpage + \else\if@openright %% added (2016/12/13) + \null\thispagestyle{empty}\newpage + \fi\fi %% added (2016/12/13, 2017/02/24) + \fi + \if@restonecol + \twocolumn + \fi} +%</book|report> +% \end{macrocode} +% \end{macro} +% +% \paragraph{章} +% +% \begin{macro}{\chapter} +% +% 章の最初のページスタイルは,全体が |empty| でなければ |plain| に +% します。 +% また,|\@topnum| を 0 にして, +% 章見出しの上に図や表が来ないようにします。 +% +% \begin{macrocode} +%<*book|report> +\newcommand{\chapter}{% + \if@openleft\cleardoublepage\else + \if@openright\cleardoublepage\else\clearpage\fi\fi + \plainifnotempty % 元: \thispagestyle{plain} + \global\@topnum\z@ + \if@english \@afterindentfalse \else \@afterindenttrue \fi + \secdef + {\@omit@numberfalse\@chapter}% + {\@omit@numbertrue\@schapter}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@chapter} +% +% 章見出しを出力します。 +% |secnumdepth| が0以上かつ |\@mainmatter| が真のとき章番号を出力します。 +% +% \begin{macrocode} +\def\@chapter[#1]#2{% + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \refstepcounter{chapter}% + \typeout{\@chapapp\thechapter\@chappos}% + \addcontentsline{toc}{chapter}% + {\protect\numberline + % {\if@english\thechapter\else\@chapapp\thechapter\@chappos\fi}% + {\@chapapp\thechapter\@chappos}% + #1}% +%<book> \else\addcontentsline{toc}{chapter}{#1}\fi + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\jsc@mpt}}% + \addtocontents{lot}{\protect\addvspace{10\jsc@mpt}}% + \if@twocolumn + \@topnewpage[\@makechapterhead{#2}]% + \else + \@makechapterhead{#2}% + \@afterheading + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makechapterhead} +% +% 実際に章見出しを組み立てます。 +% |\bfseries| を |\headfont| に変えました。 +% +% \begin{macrocode} +\def\@makechapterhead#1{% + \vspace*{2\Cvs}% 欧文は50pt + {\parindent \z@ \raggedright \normalfont + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \huge\headfont \@chapapp\thechapter\@chappos + \par\nobreak + \vskip \Cvs % 欧文は20pt +%<book> \fi + \fi + \interlinepenalty\@M + \Huge \headfont #1\par\nobreak + \vskip 3\Cvs}} % 欧文は40pt +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@schapter} +% +% |\chapter*{...}| コマンドの本体です。 +% |\chaptermark| を補いました。 +% +% \begin{macrocode} +\def\@schapter#1{% + \chaptermark{#1}% + \if@twocolumn + \@topnewpage[\@makeschapterhead{#1}]% + \else + \@makeschapterhead{#1}\@afterheading + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makeschapterhead} +% +% 番号なしの章見出しです。 +% +% \begin{macrocode} +\def\@makeschapterhead#1{% + \vspace*{2\Cvs}% 欧文は50pt + {\parindent \z@ \raggedright + \normalfont + \interlinepenalty\@M + \Huge \headfont #1\par\nobreak + \vskip 3\Cvs}} % 欧文は40pt +%</book|report> +% \end{macrocode} +% \end{macro} +% +% \paragraph{下位レベルの見出し} +% +% \begin{macro}{\section} +% +% 欧文版では |\@startsection| の第4引数を負にして最初の段落の +% 字下げを禁止していますが, +% 和文版では正にして字下げするようにしています。 +% +% 段組のときはなるべく左右の段が狂わないように工夫しています。 +% +% \begin{macrocode} +\if@twocolumn + \newcommand{\section}{% +%<jspf>\ifx\maketitle\relax\else\maketitle\fi + \@startsection{section}{1}{\z@}% +%<!kiyou> {0.6\Cvs}{0.4\Cvs}% +%<kiyou> {\Cvs}{0.5\Cvs}% +% {\normalfont\large\headfont\@secapp}} + {\normalfont\large\headfont\raggedright}} +\else + \newcommand{\section}{% + \if@slide\clearpage\fi + \@startsection{section}{1}{\z@}% + {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% 前アキ + {.5\Cvs \@plus.3\Cdp}% 後アキ +% {\normalfont\Large\headfont\@secapp}} + {\normalfont\Large\headfont\raggedright}} +\fi +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\subsection} +% +% 同上です。 +% +% \begin{macrocode} +\if@twocolumn + \newcommand{\subsection}{\@startsection{subsection}{2}{\z@}% + {\z@}{\if@slide .4\Cvs \else \z@ \fi}% + {\normalfont\normalsize\headfont}} +\else + \newcommand{\subsection}{\@startsection{subsection}{2}{\z@}% + {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% 前アキ + {.5\Cvs \@plus.3\Cdp}% 後アキ + {\normalfont\large\headfont}} +\fi +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\subsubsection} +% +% [2016-07-22] \texttt{slide}オプション指定時に |\subsubsection| の文字列 +% と罫線が重なる問題に対処しました(forum:1982)。 +% +% \begin{macrocode} +\if@twocolumn + \newcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}% + {\z@}{\if@slide .4\Cvs \else \z@ \fi}% + {\normalfont\normalsize\headfont}} +\else + \newcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}% + {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% + {\if@slide .5\Cvs \@plus.3\Cdp \else \z@ \fi}% + {\normalfont\normalsize\headfont}} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\paragraph} +% \begin{macro}{\jsParagraphMark} +% +% 見出しの後ろで改行されません。 +% +% [2016-11-16] 従来は |\paragraph| の最初に出るマークを「■」に固定して +% いましたが,このマークを変更可能にするため |\jsParagraphMark| というマクロ +% に切り出しました。これで,たとえば +%\begin{verbatim} +% \renewcommand{\jsParagraphMark}{★} +%\end{verbatim} +% とすれば「★」に変更できますし,マークを空にすることも容易です。 +% なお,某学会クラスでは従来どおりマークは付きません。 +% +% \begin{macrocode} +%<!jspf>\newcommand{\jsParagraphMark}{■} +\if@twocolumn + \newcommand{\paragraph}{\@startsection{paragraph}{4}{\z@}% + {\z@}{\if@slide .4\Cvs \else -1\zw\fi}% 改行せず 1\zw のアキ +%<jspf> {\normalfont\normalsize\headfont}} +%<!jspf> {\normalfont\normalsize\headfont\jsParagraphMark}} +\else + \newcommand{\paragraph}{\@startsection{paragraph}{4}{\z@}% + {0.5\Cvs \@plus.5\Cdp \@minus.2\Cdp}% + {\if@slide .5\Cvs \@plus.3\Cdp \else -1\zw\fi}% 改行せず 1\zw のアキ +%<jspf> {\normalfont\normalsize\headfont}} +%<!jspf> {\normalfont\normalsize\headfont\jsParagraphMark}} +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\subparagraph} +% +% 見出しの後ろで改行されません。 +% +% \begin{macrocode} +\if@twocolumn + \newcommand{\subparagraph}{\@startsection{subparagraph}{5}{\z@}% + {\z@}{\if@slide .4\Cvs \@plus.3\Cdp \else -1\zw\fi}% + {\normalfont\normalsize\headfont}} +\else + \newcommand{\subparagraph}{\@startsection{subparagraph}{5}{\z@}% + {\z@}{\if@slide .5\Cvs \@plus.3\Cdp \else -1\zw\fi}% + {\normalfont\normalsize\headfont}} +\fi +% \end{macrocode} +% \end{macro} +% +% \subsection{リスト環境} +% +% 第 $k$ レベルのリストの初期化をするのが |\@list|$k$ です +% ($k = \mathtt{i}, \mathtt{ii}, \mathtt{iii}, \mathtt{iv}$)。 +% |\@list|$k$ は |\leftmargin| を |\leftmargin|$k$ に設定します。 +% +% \begin{macro}{\leftmargini} +% +% 二段組であるかないかに応じてそれぞれ 2em,2.5em でしたが, +% ここでは全角幅の2倍にしました。 +% +% [2002-05-11] |3\zw| に変更しました。 +% +% [2005-03-19] 二段組は |2\zw| に戻しました。 +% +% \begin{macrocode} +\if@slide + \setlength\leftmargini{1\zw} +\else + \if@twocolumn + \setlength\leftmargini{2\zw} + \else + \setlength\leftmargini{3\zw} + \fi +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\leftmarginii} +% \begin{macro}{\leftmarginiii} +% \begin{macro}{\leftmarginiv} +% \begin{macro}{\leftmarginv} +% \begin{macro}{\leftmarginvi} +% +% |ii|,|iii|,|iv| は |\labelsep| と +% それぞれ `(m)',`vii.',`M.' の幅との和より大きくする +% ことになっています。ここでは全角幅の整数倍に丸めました。 +% +% \begin{macrocode} +\if@slide + \setlength\leftmarginii {1\zw} + \setlength\leftmarginiii{1\zw} + \setlength\leftmarginiv {1\zw} + \setlength\leftmarginv {1\zw} + \setlength\leftmarginvi {1\zw} +\else + \setlength\leftmarginii {2\zw} + \setlength\leftmarginiii{2\zw} + \setlength\leftmarginiv {2\zw} + \setlength\leftmarginv {1\zw} + \setlength\leftmarginvi {1\zw} +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\labelsep} +% \begin{macro}{\labelwidth} +% +% |\labelsep| はラベルと本文の間の距離です。 +% |\labelwidth| はラベルの幅です。 +% これは二分に変えました。 +% +% \begin{macrocode} +\setlength \labelsep {0.5\zw} % .5em +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\partopsep} +% +% リスト環境の前に空行がある場合, +% |\parskip| と |\topsep| に |\partopsep| を +% 加えた値だけ縦方向の空白ができます。 +% 0 に改変しました。 +% +% \begin{macrocode} +\setlength\partopsep{\z@} % {2\p@ \@plus 1\p@ \@minus 1\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@beginparpenalty} +% \begin{macro}{\@endparpenalty} +% \begin{macro}{\@itempenalty} +% +% リストや段落環境の前後,リスト項目間に挿入されるペナルティです。 +% +% \begin{macrocode} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@listi} +% \begin{macro}{\@listI} +% +% |\@listi| は |\leftmargin|,|\parsep|,|\topsep|,|\itemsep| などの +% トップレベルの定義をします。 +% この定義は,フォントサイズコマンドによって変更されます +% (たとえば |\small| の中では小さい値に設定されます)。 +% このため,|\normalsize| がすべてのパラメータを戻せるように, +% |\@listI| で |\@listi| のコピーを保存します。 +% 元の値はかなり複雑ですが,ここでは簡素化してしまいました。 +% 特に最初と最後に行送りの半分の空きが入るようにしてあります。 +% アスキーの標準スタイルでは +% トップレベルの |itemize|,|enumerate| 環境でだけ +% 最初と最後に行送りの半分の空きが入るようになっていました。 +% +% [2004-09-27] |\topsep| のグルー $_{-0.1}^{+0.2}$ |\baselineskip| +% を思い切って外しました。 +% +% \begin{macrocode} +\def\@listi{\leftmargin\leftmargini + \parsep \z@ + \topsep 0.5\baselineskip + \itemsep \z@ \relax} +\let\@listI\@listi +% \end{macrocode} +% +% 念のためパラメータを初期化します(実際には不要のようです)。 +% +% \begin{macrocode} +\@listi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@listii} +% \begin{macro}{\@listiii} +% \begin{macro}{\@listiv} +% \begin{macro}{\@listv} +% \begin{macro}{\@listvi} +% +% 第2〜6レベルのリスト環境のパラメータの設定です。 +% +% \begin{macrocode} +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \z@ + \itemsep\parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \z@ + \itemsep\parsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \paragraph{enumerate環境} +% +% |enumerate| 環境はカウンタ |enumi|,|enumii|,|enumiii|, +% |enumiv| を使います。|enum|$n$ は第 $n$ レベルの番号です。 +% +% \begin{macro}{\theenumi} +% \begin{macro}{\theenumii} +% \begin{macro}{\theenumiii} +% \begin{macro}{\theenumiv} +% +% 出力する番号の書式を設定します。 +% これらは\LaTeX 本体(\texttt{ltlists.dtx} 参照)で定義済みですが, +% ここでは表し方を変えています。 +% |\@arabic|,|\@alph|,|\@roman|,|\@Alph| はそれぞれ +% 算用数字,小文字アルファベット,小文字ローマ数字,大文字アルファベット +% で番号を出力する命令です。 +% +% \begin{macrocode} +\renewcommand{\theenumi}{\@arabic\c@enumi} +\renewcommand{\theenumii}{\@alph\c@enumii} +\renewcommand{\theenumiii}{\@roman\c@enumiii} +\renewcommand{\theenumiv}{\@Alph\c@enumiv} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\labelenumi} +% \begin{macro}{\labelenumii} +% \begin{macro}{\labelenumiii} +% \begin{macro}{\labelenumiv} +% +% |enumerate| 環境の番号を出力する命令です。 +% 第2レベル以外は最後に欧文のピリオドが付きますが, +% これは好みに応じて取り払ってください。 +% 第2レベルの番号のかっこは和文用に換え, +% その両側に入る余分なグルーを |\inhibitglue| で +% 取り除いています。 +% +% \begin{macrocode} +\newcommand{\labelenumi}{\theenumi.} +\newcommand{\labelenumii}{\inhibitglue(\theenumii)\inhibitglue} +\newcommand{\labelenumiii}{\theenumiii.} +\newcommand{\labelenumiv}{\theenumiv.} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\p@enumii} +% \begin{macro}{\p@enumiii} +% \begin{macro}{\p@enumiv} +% +% |\p@enum|$n$ は |\ref| コマンドで |enumerate| 環境の第 $n$ レベルの +% 項目が参照されるときの書式です。 +% これも第2レベルは和文用かっこにしました。 +% +% \begin{macrocode} +\renewcommand{\p@enumii}{\theenumi} +\renewcommand{\p@enumiii}{\theenumi\inhibitglue(\theenumii)} +\renewcommand{\p@enumiv}{\p@enumiii\theenumiii} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \paragraph{itemize環境} +% +% \begin{macro}{\labelitemi} +% \begin{macro}{\labelitemii} +% \begin{macro}{\labelitemiii} +% \begin{macro}{\labelitemiv} +% |itemize| 環境の第 $n$ レベルのラベルを作るコマンドです。 +% \begin{macrocode} +\newcommand\labelitemi{\textbullet} +\newcommand\labelitemii{\normalfont\bfseries \textendash} +\newcommand\labelitemiii{\textasteriskcentered} +\newcommand\labelitemiv{\textperiodcentered} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \paragraph{description環境} +% +% \begin{environment}{description} +% +% 本来の |description| 環境では,項目名が短いと,説明部分の頭が +% それに引きずられて左に出てしまいます。 +% これを解決した新しい |description| の実装です。 +% +% \begin{macrocode} +\newenvironment{description}{% + \list{}{% + \labelwidth=\leftmargin + \labelsep=1\zw + \advance \labelwidth by -\labelsep + \let \makelabel=\descriptionlabel}}{\endlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\descriptionlabel} +% +% |description| 環境のラベルを出力するコマンドです。 +% 好みに応じて |#1| の前に適当な空き +% (たとえば |\hspace{1\zw}|)を入れるのもいいと思います。 +% +% \begin{macrocode} +\newcommand*\descriptionlabel[1]{\normalfont\headfont #1\hfil} +% \end{macrocode} +% \end{macro} +% +% \paragraph{概要} +% +% \begin{environment}{abstract} +% +% 概要(要旨,梗概)を出力する環境です。 +% |book| クラスでは各章の初めにちょっとしたことを書くのに使います。 +% |titlepage| オプション付きの |article| クラスでは, +% 独立したページに出力されます。 +% |abstract| 環境は元は |quotation| 環境で作られていましたが, +% |quotation| 環境の右マージンをゼロにしたので, +% |list| 環境で作り直しました。 +% +% JSPFスタイルでは実際の出力は |\maketitle| で行われます。 +% +% \begin{macrocode} +%<*book> +\newenvironment{abstract}{% + \begin{list}{}{% + \listparindent=1\zw + \itemindent=\listparindent + \rightmargin=0pt + \leftmargin=5\zw}\item[]}{\end{list}\vspace{\baselineskip}} +%</book> +%<*article|report|kiyou> +\newbox\@abstractbox +\if@titlepage + \newenvironment{abstract}{% + \titlepage + \null\vfil + \@beginparpenalty\@lowpenalty + \begin{center}% + \headfont \abstractname + \@endparpenalty\@M + \end{center}}% + {\par\vfil\null\endtitlepage} +\else + \newenvironment{abstract}{% + \if@twocolumn + \ifx\maketitle\relax + \section*{\abstractname}% + \else + \global\setbox\@abstractbox\hbox\bgroup + \begin{minipage}[b]{\textwidth} + \small\parindent1\zw + \begin{center}% + {\headfont \abstractname\vspace{-.5em}\vspace{\z@}}% + \end{center}% + \list{}{% + \listparindent\parindent + \itemindent \listparindent + \rightmargin \leftmargin}% + \item\relax + \fi + \else + \small + \begin{center}% + {\headfont \abstractname\vspace{-.5em}\vspace{\z@}}% + \end{center}% + \list{}{% + \listparindent\parindent + \itemindent \listparindent + \rightmargin \leftmargin}% + \item\relax + \fi}{\if@twocolumn + \ifx\maketitle\relax + \else + \endlist\end{minipage}\egroup + \fi + \else + \endlist + \fi} +\fi +%</article|report|kiyou> +%<*jspf> +\newbox\@abstractbox +\newenvironment{abstract}{% + \global\setbox\@abstractbox\hbox\bgroup + \begin{minipage}[b]{157\jsc@mmm}{\sffamily Abstract}\par + \small + \if@english \parindent6\jsc@mmm \else \parindent1\zw \fi}% + {\end{minipage}\egroup} +%</jspf> +% \end{macrocode} +% \end{environment} +% +% \paragraph{キーワード} +% +% \begin{environment}{keywords} +% +% キーワードを準備する環境です。 +% 実際の出力は |\maketitle| で行われます。 +% +% \begin{macrocode} +%<*jspf> +%\newbox\@keywordsbox +%\newenvironment{keywords}{% +% \global\setbox\@keywordsbox\hbox\bgroup +% \begin{minipage}[b]{157\jsc@mmm}{\sffamily Keywords:}\par +% \small\parindent0\zw}% +% {\end{minipage}\egroup} +%</jspf> +% \end{macrocode} +% \end{environment} +% +% \paragraph{verse環境} +% +% \begin{environment}{verse} +% +% 詩のための |verse| 環境です。 +% +% \begin{macrocode} +\newenvironment{verse}{% + \let \\=\@centercr + \list{}{% + \itemsep \z@ + \itemindent -2\zw % 元: -1.5em + \listparindent\itemindent + \rightmargin \z@ + \advance\leftmargin 2\zw}% 元: 1.5em + \item\relax}{\endlist} +% \end{macrocode} +% \end{environment} +% +% \paragraph{quotation環境} +% +% \begin{environment}{quotation} +% +% 段落の頭の字下げ量を1.5emから |\parindent| に変えました。 +% また,右マージンを 0 にしました。 +% +% \begin{macrocode} +\newenvironment{quotation}{% + \list{}{% + \listparindent\parindent + \itemindent\listparindent + \rightmargin \z@}% + \item\relax}{\endlist} +% \end{macrocode} +% \end{environment} +% +% \paragraph{quote環境} +% +% \begin{environment}{quote} +% +% |quote| 環境は,段落がインデントされないことを除き, +% |quotation| 環境と同じです。 +% +% \begin{macrocode} +\newenvironment{quote}% + {\list{}{\rightmargin\z@}\item\relax}{\endlist} +% \end{macrocode} +% \end{environment} +% +% \paragraph{定理など} +% +% |ltthm.dtx| 参照。たとえば次のように定義します。 +%\begin{verbatim} +% \newtheorem{definition}{定義} +% \newtheorem{axiom}{公理} +% \newtheorem{theorem}{定理} +%\end{verbatim} +% +% [2001-04-26] 定理の中はイタリック体になりましたが, +% これでは和文がゴシック体になってしまうので, +% |\itshape| を削除しました。 +% +% [2009-08-23] |\bfseries| を |\headfont| に直し, +% |\labelsep| を |1\zw| にし,括弧を全角にしました。 +% +% \begin{macrocode} +\def\@begintheorem#1#2{\trivlist\labelsep=1\zw + \item[\hskip \labelsep{\headfont #1\ #2}]} +\def\@opargbegintheorem#1#2#3{\trivlist\labelsep=1\zw + \item[\hskip \labelsep{\headfont #1\ #2(#3)}]} +% \end{macrocode} +% +% \begin{environment}{titlepage} +% +% タイトルを独立のページに出力するのに使われます。 +% +% [2017-02-24] コミュニティ版\pLaTeX の標準クラス2017/02/15に合わせて, +% bookクラスでタイトルを必ず奇数ページに送るようにしました。といっても, +% 横組クラスしかありませんでしたので,従来の挙動は何も変わっていません。 +% また,book以外の場合のページ番号のリセットもコミュニティ版\pLaTeX の +% 標準クラス2017/02/15に合わせましたが,こちらも片面印刷あるいは +% 独立のタイトルページを作らないクラスばかりでしたので,従来の挙動は +% 何も変わらずに済みました。 +% +% \begin{macrocode} +\newenvironment{titlepage}{% +%<book> \pltx@cleartooddpage %% 2017-02-24 + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse\newpage + \fi + \thispagestyle{empty}% + \ifodd\c@page\setcounter{page}\@ne\else\setcounter{page}\z@\fi + }% + {\if@restonecol\twocolumn \else \newpage \fi + \if@twoside\else + \setcounter{page}\@ne + \fi} +% \end{macrocode} +% \end{environment} +% +% \paragraph{付録} +% +% \begin{macro}{\appendix} +% +% 本文と付録を分離するコマンドです。 +% +% \begin{macrocode} +%<*!book&!report> +\newcommand{\appendix}{\par + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \gdef\presectionname{\appendixname}% + \gdef\postsectionname{}% +% \gdef\thesection{\@Alph\c@section}% [2003-03-02] + \gdef\thesection{\presectionname\@Alph\c@section\postsectionname}% + \gdef\thesubsection{\@Alph\c@section.\@arabic\c@subsection}} +%</!book&!report> +%<*book|report> +\newcommand{\appendix}{\par + \setcounter{chapter}{0}% + \setcounter{section}{0}% + \gdef\@chapapp{\appendixname}% + \gdef\@chappos{}% + \gdef\thechapter{\@Alph\c@chapter}} +%</book|report> +% \end{macrocode} +% \end{macro} +% +% \subsection{パラメータの設定} +% +% \paragraph{arrayとtabular環境} +% +% \begin{macro}{\arraycolsep} +% +% |array| 環境の列間には |\arraycolsep| の2倍の幅の空きが入ります。 +% +% \begin{macrocode} +\setlength\arraycolsep{5\jsc@mpt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabcolsep} +% +% |tabular| 環境の列間には |\tabcolsep| の2倍の幅の空きが入ります。 +% +% \begin{macrocode} +\setlength\tabcolsep{6\jsc@mpt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\arrayrulewidth} +% +% |array|,|tabular| 環境内の罫線の幅です。 +% +% \begin{macrocode} +\setlength\arrayrulewidth{.4\jsc@mpt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doublerulesep} +% +% |array|,|tabular| 環境での二重罫線間のアキです。 +% +% \begin{macrocode} +\setlength\doublerulesep{2\jsc@mpt} +% \end{macrocode} +% \end{macro} +% +% \paragraph{tabbing環境} +% +% \begin{macro}{\tabbingsep} +% +% |\'| コマンドで入るアキです。 +% +% \begin{macrocode} +\setlength\tabbingsep{\labelsep} +% \end{macrocode} +% \end{macro} +% +% \paragraph{minipage環境} +% +% \begin{macro}{\@mpfootins} +% +% |minipage| 環境の脚注の |\skip|\hspace{0pt}|\@mpfootins| +% は通常のページの |\skip|\hspace{0pt}|\footins| +% と同じ働きをします。 +% +% \begin{macrocode} +\skip\@mpfootins = \skip\footins +% \end{macrocode} +% \end{macro} +% +% \paragraph{framebox環境} +% +% \begin{macro}{\fboxsep} +% +% |\fbox|,|\framebox| で内側のテキストと枠との間の空きです。 +% +% \begin{macro}{\fboxrule} +% +% |\fbox|,|\framebox| の罫線の幅です。 +% +% \begin{macrocode} +\setlength\fboxsep{3\jsc@mpt} +\setlength\fboxrule{.4\jsc@mpt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \paragraph{equationとeqnarray環境} +% +% \begin{macro}{\theequation} +% +% 数式番号を出力するコマンドです。 +% +% \begin{macrocode} +%<!book&!report>\renewcommand \theequation {\@arabic\c@equation} +%<*book|report> +\@addtoreset{equation}{chapter} +\renewcommand\theequation + {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@equation} +%</book|report> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\jot} +% +% |eqnarray| の行間に余分に入るアキです。 +% デフォルトの値をコメントアウトして示しておきます。 +% +% \begin{macrocode} +% \setlength\jot{3pt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@eqnnum} +% +% 数式番号の形式です。 +% デフォルトの値をコメントアウトして示しておきます。 +% +% |\inhibitglue(\theequation)\inhibitglue| のように和文かっこ +% を使うことも可能です。 +% +% \begin{macrocode} +% \def\@eqnnum{(\theequation)} +% \end{macrocode} +% \end{macro} +% +% |amsmath| パッケージを使う場合は |\tagform@| を次のように修正します。 +% +% \begin{macrocode} +% \def\tagform@#1{\maketag@@@{(\ignorespaces#1\unskip\@@italiccorr)}} +% \end{macrocode} +% +% \subsection{フロート} +% +% タイプ \texttt{TYPE} のフロートオブジェクトを +% 扱うには,次のマクロを定義します。 +% \begin{description} +% \item[\texttt{\bslash fps@TYPE}] +% フロートを置く位置(float placement specifier)です。 +% \item[\texttt{\bslash ftype@TYPE}] +% フロートの番号です。2の累乗(1,2,4,\ldots )でなければなりません。 +% \item[\texttt{\bslash ext@TYPE}] +% フロートの目次を出力するファイルの拡張子です。 +% \item[\texttt{\bslash fnum@TYPE}] +% キャプション用の番号を生成するマクロです。 +% \item[\texttt{\bslash @makecaption}{\meta{num}}{\meta{text}}] +% キャプションを出力するマクロです。 +% \meta{num} は |\fnum@...| の生成する番号, +% \meta{text} はキャプションのテキストです。 +% テキストは適当な幅の |\parbox| に入ります。 +% \end{description} +% +% \paragraph{figure環境} +% +% \begin{macro}{\c@figure} +% +% 図番号のカウンタです。 +% +% \begin{macro}{\thefigure} +% +% 図番号を出力するコマンドです。 +% +% \begin{macrocode} +%<*!book&!report> +\newcounter{figure} +\renewcommand \thefigure {\@arabic\c@figure} +%</!book&!report> +%<*book|report> +\newcounter{figure}[chapter] +\renewcommand \thefigure + {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@figure} +%</book|report> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\fps@figure} +% \begin{macro}{\ftype@figure} +% \begin{macro}{\ext@figure} +% \begin{macro}{\fnum@figure} +% +% |figure| のパラメータです。 +% |\figurename| の直後に |~| が入っていましたが, +% ここでは外しました。 +% +% \begin{macrocode} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename\nobreak\thefigure} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{figure} +% \begin{environment}{figure*} +% +% |*| 形式は段抜きのフロートです。 +% +% \begin{macrocode} +\newenvironment{figure}% + {\@float{figure}}% + {\end@float} +\newenvironment{figure*}% + {\@dblfloat{figure}}% + {\end@dblfloat} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \paragraph{table環境} +% +% \begin{macro}{\c@table} +% \begin{macro}{\thetable} +% +% 表番号カウンタと表番号を出力するコマンドです。 +% アスキー版では |\thechapter.| が |\thechapter{}・| になっていますが, +% ここではオリジナルのままにしています。 +% +% \begin{macrocode} +%<*!book&!report> +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +%</!book&!report> +%<*book|report> +\newcounter{table}[chapter] +\renewcommand \thetable + {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@table} +%</book|report> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\fps@table} +% \begin{macro}{\ftype@table} +% \begin{macro}{\ext@table} +% \begin{macro}{\fnum@table} +% +% |table| のパラメータです。 +% |\tablename| の直後に |~| が入っていましたが, +% ここでは外しました。 +% +% \begin{macrocode} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename\nobreak\thetable} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{table} +% \begin{environment}{table*} +% +% |*| は段抜きのフロートです。 +% +% \begin{macrocode} +\newenvironment{table}% + {\@float{table}}% + {\end@float} +\newenvironment{table*}% + {\@dblfloat{table}}% + {\end@dblfloat} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \subsection{キャプション} +% +% \begin{macro}{\@makecaption} +% +% |\caption| コマンドにより呼び出され, +% 実際にキャプションを出力するコマンドです。 +% 第1引数はフロートの番号, +% 第2引数はテキストです。 +% +% \begin{macro}{\abovecaptionskip} +% \begin{macro}{\belowcaptionskip} +% +% それぞれキャプションの前後に挿入されるスペースです。 +% |\belowcaptionskip| が0になっていましたので, +% キャプションを表の上につけた場合にキャプションと表が +% くっついてしまうのを直しました。 +% +% \begin{macrocode} +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{5\jsc@mpt} % 元: 10\p@ +\setlength\belowcaptionskip{5\jsc@mpt} % 元: 0\p@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% 実際のキャプションを出力します。 +% オリジナルと異なり,文字サイズを |\small| にし, +% キャプションの幅を2cm狭くしました。 +% +% [2003-11-05] ロジックを少し変えてみました。 +% +% [2015-05-26] |listings| パッケージを使うときに|title| を指定すると次のエラーが出るのを修正。 +% \begin{verbatim} +% ! Missing number, treated as zero. +% \end{verbatim} +% +% +% \begin{macrocode} +%<*!jspf> +% \long\def\@makecaption#1#2{{\small +% \advance\leftskip10\jsc@mmm +% \advance\rightskip10\jsc@mmm +% \vskip\abovecaptionskip +% \sbox\@tempboxa{#1{\hskip1\zw}#2}% +% \ifdim \wd\@tempboxa >\hsize +% #1{\hskip1\zw}#2\par +% \else +% \global \@minipagefalse +% \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% +% \fi +% \vskip\belowcaptionskip}} +\long\def\@makecaption#1#2{{\small + \advance\leftskip .0628\linewidth + \advance\rightskip .0628\linewidth + \vskip\abovecaptionskip + \sbox\@tempboxa{#1{\hskip1\zw}#2}% + \ifdim \wd\@tempboxa <\hsize \centering \fi + #1{\hskip1\zw}#2\par + \vskip\belowcaptionskip}} +%</!jspf> +%<*jspf> +\long\def\@makecaption#1#2{% + \vskip\abovecaptionskip + \sbox\@tempboxa{\small\sffamily #1\quad #2}% + \ifdim \wd\@tempboxa >\hsize + {\small\sffamily + \list{#1}{% + \renewcommand{\makelabel}[1]{##1\hfil} + \itemsep \z@ + \itemindent \z@ + \labelsep \z@ + \labelwidth 11\jsc@mmm + \listparindent\z@ + \leftmargin 11\jsc@mmm}\item\relax #2\endlist} + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip} +%</jspf> +% \end{macrocode} +% \end{macro} +% +% \section{フォントコマンド} +% +% ここでは\LaTeX~2.09で使われていたコマンドを定義します。 +% これらはテキストモードと数式モードのどちらでも動作します。 +% これらは互換性のためのもので, +% できるだけ |\text...| と |\math...| を使ってください。 +% +% [2016-07-15] KOMA-Script中の |\scr@DeclareOldFontCommand| に倣い, +% これらの命令を使うときには警告を発することにしました。 +% +% [2016-07-16] 警告を最初の一回だけ発することにしました。また, +% 例外的に警告を出さないようにするスイッチも付けます。 +% +% \begin{macro}{\if@jsc@warnoldfontcmd} +% \begin{macro}{\if@jsc@warnoldfontcmdexception} +% \begin{macrocode} +\newif\if@jsc@warnoldfontcmd +\@jsc@warnoldfontcmdtrue +\newif\if@jsc@warnoldfontcmdexception +\@jsc@warnoldfontcmdexceptionfalse +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\jsc@DeclareOldFontCommand} +% \begin{macrocode} +\newcommand*{\jsc@DeclareOldFontCommand}[3]{% + \DeclareOldFontCommand{#1}{% + \jsc@warnoldfontcmd{#1}#2% + }{% + \jsc@warnoldfontcmd{#1}#3% + }% +} +\DeclareRobustCommand*{\jsc@warnoldfontcmd}[1]{% + \if@jsc@warnoldfontcmdexception\else\if@jsc@warnoldfontcmd + \ClassWarning{\jsc@clsname}{% + deprecated old font command `\string#1' used.\MessageBreak + You should note, that since 1994 LaTeX2e provides a\MessageBreak + new font selection scheme called NFSS2 with several\MessageBreak + new, combinable font commands. This \jsc@clsname\MessageBreak + class has defined the old font commands like\MessageBreak + `\string#1' only for compatibility% + }% + \global\@jsc@warnoldfontcmdfalse + \fi\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mc} +% \begin{macro}{\gt} +% \begin{macro}{\rm} +% \begin{macro}{\sf} +% \begin{macro}{\tt} +% +% フォントファミリを変更します。 +% +% \begin{macrocode} +\jsc@DeclareOldFontCommand{\mc}{\normalfont\mcfamily}{\mathmc} +\jsc@DeclareOldFontCommand{\gt}{\normalfont\gtfamily}{\mathgt} +\jsc@DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\jsc@DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\jsc@DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bf} +% +% ボールドシリーズにします。通常のミーディアムシリーズに戻す +% コマンドは |\mdseries| です。 +% +% \begin{macrocode} +\jsc@DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\it} +% \begin{macro}{\sl} +% \begin{macro}{\sc} +% +% フォントシェイプを変えるコマンドです。 +% 斜体とスモールキャップスは数式中では何もしません +% (警告メッセージを出力します)。 +% 通常のアップライト体に戻すコマンドは |\upshape| です。 +% +% \begin{macrocode} +\jsc@DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\jsc@DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\jsc@DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\cal} +% \begin{macro}{\mit} +% +% 数式モード以外では何もしません(警告を出します)。 +% +% \begin{macrocode} +\DeclareRobustCommand*{\cal}{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*{\mit}{\@fontswitch\relax\mathnormal} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{相互参照} +% +% \subsection{目次の類} +% +% |\section| コマンドは |.toc| ファイルに次のような行を出力します。 +% \begin{quote} +% |\contentsline{section}{タイトル}{ページ}| +% \end{quote} +% たとえば |\section| に見出し番号が付く場合,上の「タイトル」は +% \begin{quote} +% |\numberline{番号}{見出し}| +% \end{quote} +% となります。 +% この「番号」は |\thesection| コマンドで生成された見出し番号です。 +% +% |figure| 環境の |\caption| コマンドは |.lof| ファイルに +% 次のような行を出力します。 +% \begin{quote} +% |\contentsline{figure}{\numberline{番号}{キャプション}{ページ}| +% \end{quote} +% この「番号」は |\thefigure| コマンドで生成された図番号です。 +% +% |table| 環境も同様です。 +% +% |\contentsline{...}| は |\l@...| というコマンドを実行するので, +% あらかじめ |\l@chapter|,|\l@section|,|\l@figure| などを +% 定義しておかなければなりません。 +% これらの多くは |\@dottedtocline| コマンドを使って定義します。 +% これは +% \begin{quote} +% |\@dottedtocline{レベル}{インデント}{幅}{タイトル}{ページ}| +% \end{quote} +% という書式です。 +% \begin{description} +% \item[レベル] この値が |tocdepth| 以下のときだけ出力されます。 +% |\chapter| はレベル0,|\section| はレベル1,等々です。 +% \item[インデント] 左側の字下げ量です。 +% \item[幅] 「タイトル」に |\numberline| コマンドが含まれる場合, +% 節番号が入る箱の幅です。 +% \end{description} +% +% \begin{macro}{\@pnumwidth} +% +% ページ番号の入る箱の幅です。 +% +% \begin{macro}{\@tocrmarg} +% +% 右マージンです。 +% |\@tocrmarg| $\ge$ |\@pnumwidth| とします。 +% +% \begin{macro}{\@dotsep} +% +% 点の間隔です(単位 mu)。 +% +% \begin{macro}{\c@tocdepth} +% +% 目次ページに出力する見出しレベルです。 +% 元は \texttt{article} で3,その他で2でしたが, +% ここでは一つずつ減らしています。 +% +% \begin{macrocode} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +%<!book&!report>\setcounter{tocdepth}{2} +%<book|report>\setcounter{tocdepth}{1} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \paragraph{目次} +% +% \begin{macro}{\tableofcontents} +% +% 目次を生成します。 +% +% \begin{macro}{\jsc@tocl@width} +% +% [2013-12-30] |\prechaptername| などから見積もった目次のラベルの長さです。(by ts) +% +% \begin{macrocode} +\newdimen\jsc@tocl@width +\newcommand{\tableofcontents}{% +%<*book|report> + \settowidth\jsc@tocl@width{\headfont\prechaptername\postchaptername}% + \settowidth\@tempdima{\headfont\appendixname}% + \ifdim\jsc@tocl@width<\@tempdima \setlength\jsc@tocl@width{\@tempdima}\fi + \ifdim\jsc@tocl@width<2\zw \divide\jsc@tocl@width by 2 \advance\jsc@tocl@width 1\zw\fi + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse + \fi + \chapter*{\contentsname}% + \@mkboth{\contentsname}{}% +%</book|report> +%<*!book&!report> + \settowidth\jsc@tocl@width{\headfont\presectionname\postsectionname}% + \settowidth\@tempdima{\headfont\appendixname}% + \ifdim\jsc@tocl@width<\@tempdima\relax\setlength\jsc@tocl@width{\@tempdima}\fi + \ifdim\jsc@tocl@width<2\zw \divide\jsc@tocl@width by 2 \advance\jsc@tocl@width 1\zw\fi + \section*{\contentsname}% + \@mkboth{\contentsname}{\contentsname}% +%</!book&!report> + \@starttoc{toc}% +%<book|report> \if@restonecol\twocolumn\fi +} +% \end{macrocode} +% \end{macro}\end{macro} +% +% \begin{macro}{\l@part} +% +% 部の目次です。 +% +% \begin{macrocode} +\newcommand*{\l@part}[2]{% + \ifnum \c@tocdepth >-2\relax +%<!book&!report> \addpenalty\@secpenalty +%<book|report> \addpenalty{-\@highpenalty}% + \addvspace{2.25em \@plus\jsc@mpt}% + \begingroup + \parindent \z@ +% \@pnumwidth should be \@tocrmarg +% \rightskip \@pnumwidth + \rightskip \@tocrmarg + \parfillskip -\rightskip + {\leavevmode + \large \headfont + \setlength\@lnumwidth{4\zw}% + #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak +%<book|report> \global\@nobreaktrue +%<book|report> \everypar{\global\@nobreakfalse\everypar{}}% + \endgroup + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@chapter} +% +% 章の目次です。|\@lnumwidth| を |4.683\zw| に増やしました。 +% +% [2013-12-30] |\@lnumwidth| を |\jsc@tocl@width| から +% 決めるようにしてみました。(by ts) +% +% \begin{macrocode} +%<*book|report> +\newcommand*{\l@chapter}[2]{% + \ifnum \c@tocdepth >\m@ne + \addpenalty{-\@highpenalty}% + \addvspace{1.0em \@plus\jsc@mpt} +% \vskip 1.0em \@plus\p@ % book.clsでは↑がこうなっている + \begingroup + \parindent\z@ +% \rightskip\@pnumwidth + \rightskip\@tocrmarg + \parfillskip-\rightskip + \leavevmode\headfont + % \if@english\setlength\@lnumwidth{5.5em}\else\setlength\@lnumwidth{4.683\zw}\fi + \setlength\@lnumwidth{\jsc@tocl@width}\advance\@lnumwidth 2.683\zw + \advance\leftskip\@lnumwidth \hskip-\leftskip + #1\nobreak\hfil\nobreak\hbox to\@pnumwidth{\hss#2}\par + \penalty\@highpenalty + \endgroup + \fi} +%</book|report> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@section} +% +% 節の目次です。 +% +% \begin{macrocode} +%<*!book&!report> +\newcommand*{\l@section}[2]{% + \ifnum \c@tocdepth >\z@ + \addpenalty{\@secpenalty}% + \addvspace{1.0em \@plus\jsc@mpt}% + \begingroup + \parindent\z@ +% \rightskip\@pnumwidth + \rightskip\@tocrmarg + \parfillskip-\rightskip + \leavevmode\headfont + %\setlength\@lnumwidth{4\zw}% 元1.5em [2003-03-02] + \setlength\@lnumwidth{\jsc@tocl@width}\advance\@lnumwidth 2\zw + \advance\leftskip\@lnumwidth \hskip-\leftskip + #1\nobreak\hfil\nobreak\hbox to\@pnumwidth{\hss#2}\par + \endgroup + \fi} +%</!book&!report> +% \end{macrocode} +% +% インデントと幅はそれぞれ1.5em,2.3emでしたが, +% |1\zw|,|3.683\zw|に変えました。 +% +% \begin{macrocode} +%<book|report> % \newcommand*{\l@section}{\@dottedtocline{1}{1\zw}{3.683\zw}} +% \end{macrocode} +% +% [2013-12-30] 上のインデントは |\jsc@tocl@width| から決めるように +% しました。(by ts) +% +% \end{macro} +% +% \begin{macro}{\l@subsection} +% \begin{macro}{\l@subsubsection} +% \begin{macro}{\l@paragraph} +% \begin{macro}{\l@subparagraph} +% +% さらに下位レベルの目次項目の体裁です。 +% あまり使ったことがありませんので,要修正かもしれません。 +% +% [2013-12-30] ここも |\jsc@tocl@width| から決めるように +% してみました。(by ts) +% +% \begin{macrocode} +%<*!book&!report> +% \newcommand*{\l@subsection} {\@dottedtocline{2}{1.5em}{2.3em}} +% \newcommand*{\l@subsubsection}{\@dottedtocline{3}{3.8em}{3.2em}} +% \newcommand*{\l@paragraph} {\@dottedtocline{4}{7.0em}{4.1em}} +% \newcommand*{\l@subparagraph} {\@dottedtocline{5}{10em}{5em}} +% +% \newcommand*{\l@subsection} {\@dottedtocline{2}{1\zw}{3\zw}} +% \newcommand*{\l@subsubsection}{\@dottedtocline{3}{2\zw}{3\zw}} +% \newcommand*{\l@paragraph} {\@dottedtocline{4}{3\zw}{3\zw}} +% \newcommand*{\l@subparagraph} {\@dottedtocline{5}{4\zw}{3\zw}} +% +\newcommand*{\l@subsection}{% + \@tempdima\jsc@tocl@width \advance\@tempdima -1\zw + \@dottedtocline{2}{\@tempdima}{3\zw}} +\newcommand*{\l@subsubsection}{% + \@tempdima\jsc@tocl@width \advance\@tempdima 0\zw + \@dottedtocline{3}{\@tempdima}{4\zw}} +\newcommand*{\l@paragraph}{% + \@tempdima\jsc@tocl@width \advance\@tempdima 1\zw + \@dottedtocline{4}{\@tempdima}{5\zw}} +\newcommand*{\l@subparagraph}{% + \@tempdima\jsc@tocl@width \advance\@tempdima 2\zw + \@dottedtocline{5}{\@tempdima}{6\zw}} +%</!book&!report> +%<*book|report> +% \newcommand*{\l@subsection} {\@dottedtocline{2}{3.8em}{3.2em}} +% \newcommand*{\l@subsubsection}{\@dottedtocline{3}{7.0em}{4.1em}} +% \newcommand*{\l@paragraph} {\@dottedtocline{4}{10em}{5em}} +% \newcommand*{\l@subparagraph} {\@dottedtocline{5}{12em}{6em}} +\newcommand*{\l@section}{% + \@tempdima\jsc@tocl@width \advance\@tempdima -1\zw + \@dottedtocline{1}{\@tempdima}{3.683\zw}} +\newcommand*{\l@subsection}{% + \@tempdima\jsc@tocl@width \advance\@tempdima 2.683\zw + \@dottedtocline{2}{\@tempdima}{3.5\zw}} +\newcommand*{\l@subsubsection}{% + \@tempdima\jsc@tocl@width \advance\@tempdima 6.183\zw + \@dottedtocline{3}{\@tempdima}{4.5\zw}} +\newcommand*{\l@paragraph}{% + \@tempdima\jsc@tocl@width \advance\@tempdima 10.683\zw + \@dottedtocline{4}{\@tempdima}{5.5\zw}} +\newcommand*{\l@subparagraph}{% + \@tempdima\jsc@tocl@width \advance\@tempdima 16.183\zw + \@dottedtocline{5}{\@tempdima}{6.5\zw}} +%</book|report> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\numberline} +% \begin{macro}{\@lnumwidth} +% +% 欧文版\LaTeX では |\numberline{...}| は幅 |\@tempdima| の箱に左詰め +% で出力する命令ですが, +% アスキー版では |\@tempdima| の代わりに |\@lnumwidth| という変数 +% で幅を決めるように再定義しています。 +% 後続文字が全角か半角かでスペースが変わらないように |\hspace| +% を入れておきました。 +% +% \begin{macrocode} +\newdimen\@lnumwidth +\def\numberline#1{\hb@xt@\@lnumwidth{#1\hfil}\hspace{0pt}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@dottedtocline} +% \begin{macro}{\jsTocLine} +% +% \LaTeX 本体(\texttt{ltsect.dtx} 参照)での定義と同じですが, +% |\@tempdima| を |\@lnumwidth| に変えています。 +% +% [2018-06-23] デフォルトでは\jsTocLine のようにベースラインになります。\par +% これを変更可能にするため,|\jsTocLine| というマクロに切り出しました。 +% 例えば,仮想ボディの中央 +% {\renewcommand{\jsTocLine}{\leaders \hbox {\hss ・\hss}\hfill}\jsTocLine} +% に変更したい場合は +%\begin{verbatim} +% \renewcommand{\jsTocLine}{\leaders \hbox {\hss ・\hss}\hfill} +%\end{verbatim} +% とします。 +% +% \begin{macrocode} +\def\jsTocLine{\leaders\hbox{% + $\m@th \mkern \@dotsep mu\hbox{.}\mkern \@dotsep mu$}\hfill} +\def\@dottedtocline#1#2#3#4#5{\ifnum #1>\c@tocdepth \else + \vskip \z@ \@plus.2\jsc@mpt + {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip + \parindent #2\relax\@afterindenttrue + \interlinepenalty\@M + \leavevmode + \@lnumwidth #3\relax + \advance\leftskip \@lnumwidth \null\nobreak\hskip -\leftskip + {#4}\nobreak + \jsTocLine \nobreak\hb@xt@\@pnumwidth{% + \hfil\normalfont \normalcolor #5}\par}\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \paragraph{図目次と表目次} +% +% \begin{macro}{\listoffigures} +% +% 図目次を出力します。 +% +% \begin{macrocode} +\newcommand{\listoffigures}{% +%<*book|report> + \if@twocolumn\@restonecoltrue\onecolumn + \else\@restonecolfalse\fi + \chapter*{\listfigurename}% + \@mkboth{\listfigurename}{}% +%</book|report> +%<*!book&!report> + \section*{\listfigurename}% + \@mkboth{\listfigurename}{\listfigurename}% +%</!book&!report> + \@starttoc{lof}% +%<book|report> \if@restonecol\twocolumn\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@figure} +% +% 図目次の項目を出力します。 +% +% \begin{macrocode} +\newcommand*{\l@figure}{\@dottedtocline{1}{1\zw}{3.683\zw}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\listoftables} +% +% 表目次を出力します。 +% +% \begin{macrocode} +\newcommand{\listoftables}{% +%<*book|report> + \if@twocolumn\@restonecoltrue\onecolumn + \else\@restonecolfalse\fi + \chapter*{\listtablename}% + \@mkboth{\listtablename}{}% +%</book|report> +%<*!book&!report> + \section*{\listtablename}% + \@mkboth{\listtablename}{\listtablename}% +%</!book&!report> + \@starttoc{lot}% +%<book|report> \if@restonecol\twocolumn\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@table} +% +% 表目次は図目次と同じです。 +% +% \begin{macrocode} +\let\l@table\l@figure +% \end{macrocode} +% \end{macro} +% +% \subsection{参考文献} +% +% \begin{macro}{\bibindent} +% +% オープンスタイルの参考文献で使うインデント幅です。 +% 元は 1.5em でした。 +% +% \begin{macrocode} +\newdimen\bibindent +\setlength\bibindent{2\zw} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{thebibliography} +% +% 参考文献リストを出力します。 +% +% [2016-07-16] \LaTeX~2.09で使われていたフォントコマンドの警告を, +% 文献スタイル(.bst)ではよく |\bf| がいまだに用いられることが多いため, +% |thebibliography| 環境内では例外的に出さないようにしました。 +% +% \begin{macrocode} +\newenvironment{thebibliography}[1]{% + \global\@jsc@warnoldfontcmdexceptiontrue + \global\let\presectionname\relax + \global\let\postsectionname\relax +%<article|jspf> \section*{\refname}\@mkboth{\refname}{\refname}% +%<*kiyou> + \vspace{1.5\baselineskip} + \subsubsection*{\refname}\@mkboth{\refname}{\refname}% + \vspace{0.5\baselineskip} +%</kiyou> +%<book|report> \chapter*{\bibname}\@mkboth{\bibname}{}% +%<book|report> \addcontentsline{toc}{chapter}{\bibname}% + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% +%<kiyou> \small + \sloppy + \clubpenalty4000 + \@clubpenalty\clubpenalty + \widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist + \global\@jsc@warnoldfontcmdexceptionfalse} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\newblock} +% +% |\newblock| はデフォルトでは小さなスペースを生成します。 +% +% \begin{macrocode} +\newcommand{\newblock}{\hskip .11em\@plus.33em\@minus.07em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@openbib@code} +% +% |\@openbib@code| はデフォルトでは何もしません。 +% この定義は |openbib| オプションによって変更されます。 +% +% \begin{macrocode} +\let\@openbib@code\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@biblabel} +% +% |\bibitem[...]| のラベルを作ります。 +% \texttt{ltbibl.dtx} の定義の半角 [] を全角[]に変え, +% 余分なスペースが入らないように |\inhibitglue| ではさみました。 +% とりあえずコメントアウトしておきますので,必要に応じて生かしてください。 +% +% \begin{macrocode} +% \def\@biblabel#1{\inhibitglue[#1]\inhibitglue} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite} +% \begin{macro}{\@cite} +% \begin{macro}{\@citex} +% +% 文献の番号を出力する部分は \texttt{ltbibl.dtx} で定義されていますが, +% コンマとかっこを和文フォントにするには次のようにします。 +% とりあえずコメントアウトしておきましたので,必要に応じて生かしてください。 +% かっこの前後に入るグルーを |\inhibitglue| で取っていますので, +% オリジナル同様,\verb*+Knuth~\cite{knu} + のように半角空白 +% で囲んでください。 +% +% \begin{macrocode} +% \def\@citex[#1]#2{\leavevmode +% \let\@citea\@empty +% \@cite{\@for\@citeb:=#2\do +% {\@citea\def\@citea{,\inhibitglue\penalty\@m\ }% +% \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}% +% \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi +% \@ifundefined{b@\@citeb}{\mbox{\normalfont\bfseries ?}% +% \G@refundefinedtrue +% \@latex@warning +% {Citation `\@citeb' on page \thepage \space undefined}}% +% {\@cite@ofmt{\csname b@\@citeb\endcsname}}}}{#1}} +% \def\@cite#1#2{\inhibitglue[{#1\if@tempswa ,#2\fi}]\inhibitglue} +% \end{macrocode} +% +% 引用番号を上ツキの 1)のようなスタイルにするには次のようにします。 +% |\cite| の先頭に |\unskip| を付けて先行のスペース(\verb|~| も) +% を帳消しにしています。 +% +% \begin{macrocode} +% \DeclareRobustCommand\cite{\unskip +% \@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}} +% \def\@cite#1#2{$^{\hbox{\scriptsize{#1\if@tempswa +% ,\inhibitglue\ #2\fi})}}$} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{索引} +% +% \begin{environment}{theindex} +% +% 2〜3段組の索引を作成します。 +% 最後が偶数ページのときにマージンがずれる現象を直しました(Thanks: 藤村さん)。 +% +% \begin{macrocode} +\newenvironment{theindex}{% 索引を3段組で出力する環境 + \if@twocolumn + \onecolumn\@restonecolfalse + \else + \clearpage\@restonecoltrue + \fi + \columnseprule.4pt \columnsep 2\zw + \ifx\multicols\@undefined +%<book|report> \twocolumn[\@makeschapterhead{\indexname}% +%<book|report> \addcontentsline{toc}{chapter}{\indexname}]% +%<!book&!report> \def\presectionname{}\def\postsectionname{}% +%<!book&!report> \twocolumn[\section*{\indexname}]% + \else + \ifdim\textwidth<\fullwidth + \setlength{\evensidemargin}{\oddsidemargin} + \setlength{\textwidth}{\fullwidth} + \setlength{\linewidth}{\fullwidth} +%<book|report> \begin{multicols}{3}[\chapter*{\indexname}% +%<book|report> \addcontentsline{toc}{chapter}{\indexname}]% +%<!book&!report> \def\presectionname{}\def\postsectionname{}% +%<!book&!report> \begin{multicols}{3}[\section*{\indexname}]% + \else +%<book|report> \begin{multicols}{2}[\chapter*{\indexname}% +%<book|report> \addcontentsline{toc}{chapter}{\indexname}]% +%<!book&!report> \def\presectionname{}\def\postsectionname{}% +%<!book&!report> \begin{multicols}{2}[\section*{\indexname}]% + \fi + \fi +%<book|report> \@mkboth{\indexname}{}% +%<!book&!report> \@mkboth{\indexname}{\indexname}% + \plainifnotempty % \thispagestyle{plain} + \parindent\z@ + \parskip\z@ \@plus .3\jsc@mpt\relax + \let\item\@idxitem + \raggedright + \footnotesize\narrowbaselines + }{ + \ifx\multicols\@undefined + \if@restonecol\onecolumn\fi + \else + \end{multicols} + \fi + \clearpage + } +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\@idxitem} +% \begin{macro}{\subitem} +% \begin{macro}{\subsubitem} +% +% 索引項目の字下げ幅です。|\@idxitem| は |\item| の項目の字下げ幅です。 +% +% \begin{macrocode} +\newcommand{\@idxitem}{\par\hangindent 4\zw} % 元 40pt +\newcommand{\subitem}{\@idxitem \hspace*{2\zw}} % 元 20pt +\newcommand{\subsubitem}{\@idxitem \hspace*{3\zw}} % 元 30pt +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\indexspace} +% +% 索引で先頭文字ごとのブロックの間に入るスペースです。 +% +% \begin{macrocode} +\newcommand{\indexspace}{\par \vskip 10\jsc@mpt \@plus5\jsc@mpt \@minus3\jsc@mpt\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\seename} +% \begin{macro}{\alsoname} +% +% 索引の |\see|,|\seealso| コマンドで出力されるものです。 +% デフォルトはそれぞれ \emph{see},\emph{see also} という英語ですが, +% ここではとりあえず両方とも「→」に変えました。 +% $\Rightarrow$(|$\Rightarrow$|)などでもいいでしょう。 +% +% \begin{macrocode} +\newcommand\seename{\if@english see\else →\fi} +\newcommand\alsoname{\if@english see also\else →\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{脚注} +% +% \begin{macro}{\footnote} +% \begin{macro}{\footnotemark} +% +% 和文の句読点・閉じかっこ類の直後で用いた際に +% 余分なアキが入るのを防ぐため, +% |\inhibitglue| を入れることにします。 +% +% \begin{macrocode} +\let\footnotes@ve=\footnote +\def\footnote{\inhibitglue\footnotes@ve} +\let\footnotemarks@ve=\footnotemark +\def\footnotemark{\inhibitglue\footnotemarks@ve} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@makefnmark} +% +% 脚注番号を付ける命令です。 +% ここでは脚注番号の前に記号 $*$ を付けています。 +% 「注1」の形式にするには |\textasteriskcentered| +% を |注\kern0.1em| にしてください。 +% |\@xfootnotenext| と合わせて, +% もし脚注番号が空なら記号も出力しないようにしてあります。 +% +% [2002-04-09] インプリメントの仕方を変えたため消しました。 +% +% [2013-04-23] 新しい\pTeX では脚注番号のまわりにスペースが入りすぎることを防ぐため, +% 北川さんのパッチ [qa:57090] を取り込みました。 +% +% [2013-05-14] plcore.ltx に倣った形に書き直しました(Thanks: 北川さん)。 +% +% [2014-07-02 LTJ] |\ifydir| を使わない形に書換えました。 +% +% [2016-07-11] コミュニティ版p\LaTeX の変更に追随しました(Thanks: 角藤さん)。 +% +% [2016-08-27 LTJ] 結果的に |\@makefnmark| の定義が +% Lua\TeX-ja本体(lltjcore.sty)中のものと全く同じになっていたので,削除します, +% \end{macro} +% +% \begin{macro}{\thefootnote} +% +% 脚注番号に * 印が付くようにしました。 +% ただし,番号がゼロのときは * 印も脚注番号も付きません。 +% +% [2003-08-15] |\textasteriskcentered| ではフォントによって +% 下がりすぎるので変更しました。 +% +% [2016-10-08] TODO: 脚注番号が |newtxtext| や |newpxtext| の使用時に +% おかしくなってしまいます。これらのパッケージは内部で |\thefootnote| を +% 再定義していますので,気になる場合はパッケージを読み込むときに +% \texttt{defaultsups} オプションを付けてください(qa:57284, qa:57287)。 +% +% \begin{macrocode} +\def\thefootnote{\ifnum\c@footnote>\z@\leavevmode\lower.5ex\hbox{*}\@arabic\c@footnote\fi} +% \end{macrocode} +% +% 「注1」の形式にするには次のようにしてください。 +% +% \begin{macrocode} +% \def\thefootnote{\ifnum\c@footnote>\z@ 注\kern0.1\zw\@arabic\c@footnote\fi} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\footnoterule} +% +% 本文と脚注の間の罫線です。 +% +% \begin{macrocode} +\renewcommand{\footnoterule}{% + \kern-3\jsc@mpt + \hrule width .4\columnwidth height 0.4\jsc@mpt + \kern 2.6\jsc@mpt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@footnote} +% +% 脚注番号は章ごとにリセットされます。 +% +% [2018-03-11] |\next|などいくつかの内部命令を |\jsc@...| 付きの +% ユニークな名前にしました。 +% \begin{macrocode} +%<book|report>\@addtoreset{footnote}{chapter} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@footnotetext} +% +% 脚注で |\verb| が使えるように改変してあります。 +% Jeremy Gibbons, \textit{\TeX\ and TUG NEWS}, +% Vol.~2, No.~4 (1993), p.~9) +% +% [2018-03-11] |\next|などいくつかの内部命令を |\jsc@...| 付きの +% ユニークな名前にしました。 +% \begin{macrocode} +\long\def\@footnotetext{% + \insert\footins\bgroup + \normalfont\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + \csname p@footnote\endcsname\@thefnmark + }% + \color@begingroup + \@makefntext{% + \rule\z@\footnotesep\ignorespaces}% + \futurelet\jsc@next\jsc@fo@t} +\def\jsc@fo@t{\ifcat\bgroup\noexpand\jsc@next \let\jsc@next\jsc@f@@t + \else \let\jsc@next\jsc@f@t\fi \jsc@next} +\def\jsc@f@@t{\bgroup\aftergroup\jsc@@foot\let\jsc@next} +\def\jsc@f@t#1{#1\jsc@@foot} +\def\jsc@@foot{\@finalstrut\strutbox\color@endgroup\egroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefntext} +% +% 実際に脚注を出力する命令です。 +% |\@makefnmark| は脚注の番号を出力する命令です。 +% ここでは脚注が左端から一定距離に来るようにしてあります。 +% +% \begin{macrocode} +\newcommand\@makefntext[1]{% + \advance\leftskip 3\zw + \parindent 1\zw + \noindent + \llap{\@makefnmark\hskip0.3\zw}#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xfootnotenext} +% +% 最初の |\footnotetext{...}| は番号が付きません。 +% 著者の所属などを脚注の欄に書くときに便利です。 +% +% すでに |\footnote| を使った後なら |\footnotetext[0]{...}| +% とすれば番号を付けない脚注になります。 +% ただし,この場合は脚注番号がリセットされてしまうので, +% 工夫が必要です。 +% +% [2002-04-09] インプリメントの仕方を変えたため消しました。 +% +% \begin{macrocode} +% \def\@xfootnotenext[#1]{% +% \begingroup +% \ifnum#1>\z@ +% \csname c@\@mpfn\endcsname #1\relax +% \unrestored@protected@xdef\@thefnmark{\thempfn}% +% \else +% \unrestored@protected@xdef\@thefnmark{}% +% \fi +% \endgroup +% \@footnotetext} +% \end{macrocode} +% \end{macro} +% +% \section{段落の頭へのグルー挿入禁止} +% +% 段落頭のかぎかっこなどを見かけ1字半下げから全角1字下げに直します。 +% +% [2012-04-24 LTJ] Lua\TeX-jaではJFMに段落開始時の括弧類の字下げ幅をコントロール +% する機能がありますが,|\item| 直後ではラベル用のボックスが段落先頭になる +% ため,うまく働きませんでした。形を変えて復活させます。 +% +% [2017-04-03 LTJ] 従来クラスファイルで定義していた |\@inhibitglue| は, +% Lua\TeX-jaのコアに |\ltjfakeparbegin| として正式に追加されたのでリネームします. +% +% |\item| 命令の直後です。 +% +% \begin{macrocode} +\let\@inhibitglue=\ltjfakeparbegin +\def\@item[#1]{% + \if@noparitem + \@donoparitem + \else + \if@inlabel + \indent \par + \fi + \ifhmode + \unskip\unskip \par + \fi + \if@newlist + \if@nobreak + \@nbitem + \else + \addpenalty\@beginparpenalty + \addvspace\@topsep + \addvspace{-\parskip}% + \fi + \else + \addpenalty\@itempenalty + \addvspace\itemsep + \fi + \global\@inlabeltrue + \fi + \everypar{% + \@minipagefalse + \global\@newlistfalse + \if@inlabel + \global\@inlabelfalse + {\setbox\z@\lastbox + \ifvoid\z@ + \kern-\itemindent + \fi}% + \box\@labels + \penalty\z@ + \fi + \if@nobreak + \@nobreakfalse + \clubpenalty \@M + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi\ltjfakeparbegin}% + \if@noitemarg + \@noitemargfalse + \if@nmbrlist + \refstepcounter\@listctr + \fi + \fi + \sbox\@tempboxa{\makelabel{#1}}% + \global\setbox\@labels\hbox{% + \unhbox\@labels + \hskip \itemindent + \hskip -\labelwidth + \hskip -\labelsep + \ifdim \wd\@tempboxa >\labelwidth + \box\@tempboxa + \else + \hbox to\labelwidth {\unhbox\@tempboxa}% + \fi + \hskip \labelsep}% + \ignorespaces} +% \end{macrocode} +% +% |\@gnewline| についてはちょっと複雑な心境です。 +% もともとのp\LaTeXe は段落の頭にグルーが入る方で統一されていました。 +% しかし |\\| の直後にはグルーが入らず,不統一でした。 +% そこで |\\| の直後にもグルーを入れるように直していただいた経緯があります。 +% しかし,ここでは逆にグルーを入れない方で統一したいので, +% また元に戻してしまいました。 +% +% しかし単に戻すだけでも駄目みたいなので,ここでも最後にグルーを消しておきます。 +% +% [2016-12-05 LTJ] 本家[2016-11-29],lltjcore.styでの変更に追従させます. +% +% [2017-02-18 LTJ] lltjcore.sty側で戻したのを忘れていました. +% \begin{macrocode} +\def\@gnewline #1{% + \ifvmode + \@nolnerr + \else + \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break \null + \inhibitglue \ignorespaces + \fi} +% \end{macrocode} +% +% \section{いろいろなロゴ} +% +% \LaTeX 関連のロゴを作り直します。 +% +% [2016-07-14] ロゴの定義は\texttt{jslogo}パッケージに移転しました。 +% 後方互換のため,\texttt{jsclasses}ではデフォルトでこれを読み込みます。 +% \texttt{nojslogo}オプションが指定されている場合は読み込みません。 +% +% [2016-07-21 LTJ] \texttt{jsclasses} とLua\TeX-jaの更新タイミングが一致しない可能性を考慮し, +% \texttt{jslogo}パッケージが存在しない場合は旧来の定義をそのまま使うことにしました。 +% +% \begin{macrocode} +\IfFileExists{jslogo.sty}{}{\@jslogofalse}% +\if@jslogo + \RequirePackage{jslogo} + \def\小{\jslg@small} + \def\上小{\jslg@uppersmall} +\else +% \end{macrocode} +% +% 以下は\texttt{jslogo}パッケージがない場合の定義です。 +% +% \begin{macro}{\小} +% \begin{macro}{\上小} +% +% 文字を小さめに出したり上寄りに小さめに出したりする命令です。 +% +% \begin{macrocode} +\def\小#1{\hbox{$\m@th$% + \csname S@\f@size\endcsname + \fontsize\sf@size\z@ + \math@fontsfalse\selectfont + #1}} +\def\上小#1{{\sbox\z@ T\vbox to\ht0{\小{#1}\vss}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\TeX} +% \begin{macro}{\LaTeX} +% +% これらは \texttt{ltlogos.dtx} で定義されていますが, +% TimesやHelveticaでも見栄えがするように若干変更しました。 +% +% [2003-06-12] Palatinoも加えました(要調整)。 +% +% \begin{macrocode} +\def\cmrTeX{% + \ifdim \fontdimen\@ne\font >\z@ + T\kern-.25em\lower.5ex\hbox{E}\kern-.125emX\@ + \else + T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@ + \fi} +\def\cmrLaTeX{% + \ifdim \fontdimen\@ne\font >\z@ + L\kern-.32em\上小{A}\kern-.22em\cmrTeX + \else + L\kern-.36em\上小{A}\kern-.15em\cmrTeX + \fi} +\def\sfTeX{T\kern-.1em\lower.4ex\hbox{E}\kern-.07emX\@} +\def\sfLaTeX{L\kern-.25em\上小{A}\kern-.08em\sfTeX} +\def\ptmTeX{% + \ifdim \fontdimen\@ne\font >\z@ + T\kern-.12em\lower.37ex\hbox{E}\kern-.02emX\@ + \else + T\kern-.07em\lower.37ex\hbox{E}\kern-.05emX\@ + \fi} +\def\ptmLaTeX{% + \ifdim \fontdimen\@ne\font >\z@ + L\kern-.2em\上小{A}\kern-.1em\ptmTeX + \else + L\kern-.3em\上小{A}\kern-.1em\ptmTeX + \fi} +\def\pncTeX{% + \ifdim \fontdimen\@ne\font >\z@ + T\kern-.2em\lower.5ex\hbox{E}\kern-.08emX\@ + \else + T\kern-.13em\lower.5ex\hbox{E}\kern-.13emX\@ + \fi} +\def\pncLaTeX{% + \ifdim \fontdimen\@ne\font >\z@ + L\kern-.3em\上小{A}\kern-.1em\pncTeX + \else + L\kern-.3em\上小{A}\kern-.1em\pncTeX + \fi} +\def\pplTeX{% + \ifdim \fontdimen\@ne\font >\z@ + T\kern-.17em\lower.32ex\hbox{E}\kern-.15emX\@ + \else + T\kern-.12em\lower.34ex\hbox{E}\kern-.1emX\@ + \fi} +\def\pplLaTeX{% + \ifdim \fontdimen\@ne\font >\z@ + L\kern-.27em\上小{A}\kern-.12em\pplTeX + \else + L\kern-.3em\上小{A}\kern-.15em\pplTeX + \fi} +\def\ugmTeX{% + \ifdim \fontdimen\@ne\font >\z@ + T\kern-.1em\lower.32ex\hbox{E}\kern-.06emX\@ + \else + T\kern-.12em\lower.34ex\hbox{E}\kern-.1emX\@ + \fi} +\def\ugmLaTeX{% + \ifdim \fontdimen\@ne\font >\z@ + L\kern-.2em\上小{A}\kern-.13em\ugmTeX + \else + L\kern-.3em\上小{A}\kern-.13em\ugmTeX + \fi} +\DeclareRobustCommand{\TeX}{% + \def\@tempa{cmr}% + \ifx\f@family\@tempa\cmrTeX + \else + \def\@tempa{ptm}% + \ifx\f@family\@tempa\ptmTeX + \else + \def\@tempa{txr}% + \ifx\f@family\@tempa\ptmTeX + \else + \def\@tempa{pnc}% + \ifx\f@family\@tempa\pncTeX + \else + \def\@tempa{ppl}% + \ifx\f@family\@tempa\pplTeX + \else + \def\@tempa{ugm}% + \ifx\f@family\@tempa\ugmTeX + \else\sfTeX + \fi + \fi + \fi + \fi + \fi + \fi} + +\DeclareRobustCommand{\LaTeX}{% + \def\@tempa{cmr}% + \ifx\f@family\@tempa\cmrLaTeX + \else + \def\@tempa{ptm}% + \ifx\f@family\@tempa\ptmLaTeX + \else + \def\@tempa{txr}% + \ifx\f@family\@tempa\ptmLaTeX + \else + \def\@tempa{pnc}% + \ifx\f@family\@tempa\pncLaTeX + \else + \def\@tempa{ppl}% + \ifx\f@family\@tempa\pplLaTeX + \else + \def\@tempa{ugm}% + \ifx\f@family\@tempa\ugmLaTeX + \else\sfLaTeX + \fi + \fi + \fi + \fi + \fi + \fi} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\LaTeXe} +% +% |\LaTeXe| コマンドの |\mbox{\m@th ...| で始まる新しい定義では +% 直後の和文との間に |xkanjiskip| が入りません。また, +% |mathptmx| パッケージなどと併用すると,最後の $\varepsilon$ が +% 下がりすぎてしまいます。そのため,ちょっと手を加えました。 +% +% \begin{macrocode} +\DeclareRobustCommand{\LaTeXe}{$\mbox{% + \if b\expandafter\@car\f@series\@nil\boldmath\fi + \LaTeX\kern.15em2\raisebox{-.37ex}{$\textstyle\varepsilon$}}$} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pTeX} +% \begin{macro}{\pLaTeX} +% \begin{macro}{\pLaTeXe} +% +% \pTeX ,\pLaTeXe のロゴを出す命令です。 +% +% \begin{macrocode} +\def\pTeX{p\kern-.05em\TeX} +\def\pLaTeX{p\LaTeX} +\def\pLaTeXe{p\LaTeXe} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\AmSTeX} +% +% \texttt{amstex.sty} で定義されています。 +% +% \begin{macrocode} +\def\AmSTeX{\protect\AmS-\protect\TeX{}} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\BibTeX} +% \begin{macro}{\SliTeX} +% +% これらは \texttt{doc.dtx} から取ったものです。 +% ただし,|\BibTeX| だけはちょっと修正しました。 +% +% \begin{macrocode} +% \@ifundefined{BibTeX} +% {\def\BibTeX{{\rmfamily B\kern-.05em% +% \textsc{i\kern-.025em b}\kern-.08em% +% T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}}{} +\DeclareRobustCommand{\BibTeX}{B\kern-.05em\小{I\kern-.025em B}% + \ifx\f@family\cmr\kern-.08em\else\kern-.15em\fi\TeX} +\DeclareRobustCommand{\SliTeX}{% + S\kern-.06emL\kern-.18em\上小{I}\kern -.03em\TeX} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \texttt{jslogo}パッケージがない場合の定義はここで終わりです。 +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \section{初期設定} +% +% \paragraph{いろいろな語} +% +% \begin{macro}{\prepartname} +% \begin{macro}{\postpartname} +% \begin{macro}{\prechaptername} +% \begin{macro}{\postchaptername} +% \begin{macro}{\presectionname} +% \begin{macro}{\postsectionname} +% \begin{macrocode} +\newcommand{\prepartname}{\if@english Part~\else 第\fi} +\newcommand{\postpartname}{\if@english\else 部\fi} +%<book|report>\newcommand{\prechaptername}{\if@english Chapter~\else 第\fi} +%<book|report>\newcommand{\postchaptername}{\if@english\else 章\fi} +\newcommand{\presectionname}{}% 第 +\newcommand{\postsectionname}{}% 節 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\contentsname} +% \begin{macro}{\listfigurename} +% \begin{macro}{\listtablename} +% \begin{macrocode} +\newcommand{\contentsname}{\if@english Contents\else 目次\fi} +\newcommand{\listfigurename}{\if@english List of Figures\else 図目次\fi} +\newcommand{\listtablename}{\if@english List of Tables\else 表目次\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\refname} +% \begin{macro}{\bibname} +% \begin{macro}{\indexname} +% \begin{macrocode} +\newcommand{\refname}{\if@english References\else 参考文献\fi} +\newcommand{\bibname}{\if@english Bibliography\else 参考文献\fi} +\newcommand{\indexname}{\if@english Index\else 索引\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\figurename} +% \begin{macro}{\tablename} +% \begin{macrocode} +%<!jspf>\newcommand{\figurename}{\if@english Fig.~\else 図\fi} +%<jspf>\newcommand{\figurename}{Fig.~} +%<!jspf>\newcommand{\tablename}{\if@english Table~\else 表\fi} +%<jspf>\newcommand{\tablename}{Table~} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\appendixname} +% \begin{macro}{\abstractname} +% \begin{macrocode} +% \newcommand{\appendixname}{\if@english Appendix~\else 付録\fi} +\newcommand{\appendixname}{\if@english \else 付録\fi} +%<!book>\newcommand{\abstractname}{\if@english Abstract\else 概要\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \paragraph{今日の日付} +% +% \LaTeX で処理した日付を出力します。 +% ^^A |jarticle| などと違って,標準を西暦にし, +% ^^A 余分な空白が入らないように改良しました。 +% ^^A -- 2018年7月以降は |jarticle| なども標準が西暦, +% ^^A -- 2019年4月以降は余分な空白が入らなくなっています。 +% 和暦にするには |\和暦| と書いてください。 +% ちなみにこの文章の作成日は西暦では{\西暦\today}で, +% 和暦では{\和暦\today}です。 +% +% \begin{macro}{\today} +% \begin{macrocode} +\newif\if西暦 \西暦true +\def\西暦{\西暦true} +\def\和暦{\西暦false} +\newcount\heisei \heisei\year \advance\heisei-1988\relax +\def\pltx@today@year@#1{% + \ifnum\numexpr\year-#1=1 元\else + \ifnum\ltjgetparameter{direction}=3 + \kansuji\numexpr\year-#1\relax + \else + \number\numexpr\year-#1\relax\nobreak + \fi + \fi 年 +} +\def\pltx@today@year{% + \ifnum\numexpr\year*10000+\month*100+\day<19890108 + 昭和\pltx@today@year@{1925}% + \else\ifnum\numexpr\year*10000+\month*100+\day<20190501 + 平成\pltx@today@year@{1988}% + \else + 令和\pltx@today@year@{2018}% + \fi\fi} +\def\today{% + \if@english + \ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year + \else\if西暦 + \ifnum\ltjgetparameter{direction}=3 \kansuji\year + \else\number\year\nobreak\fi 年 + \else + \pltx@today@year + \fi + \ifnum\ltjgetparameter{direction}=3 + \kansuji\month 月 + \kansuji\day 日 + \else + \number\month\nobreak 月 + \number\day\nobreak 日 + \fi\fi} +% \end{macrocode} +% \end{macro} +% +% \paragraph{ハイフネーション例外} +% +% \TeX のハイフネーションルールの補足です(ペンディング:eng-lish) +% +% \begin{macrocode} +\hyphenation{ado-be post-script ghost-script phe-nom-e-no-log-i-cal man-u-script} +% \end{macrocode} +% +% \paragraph{ページ設定} +% +% ページ設定の初期化です。 +% |stfloats|パッケージがシステムにインストールされている場合は、このパッケージを使って +% \pLaTeX の標準時と同じようにボトムフロートの下に脚注が組まれるようにします。 +% +% [2017-02-19] \pLaTeX とLua\TeX-jaの|\@makecol|が違うことを +% 考慮していませんでした。 +% \begin{macrocode} +%<article>\if@slide \pagestyle{empty} \else \pagestyle{plain} \fi +%<book>\if@report \pagestyle{plain} \else \pagestyle{headings} \fi +%<report|kiyou>\pagestyle{plain} +%<jspf>\pagestyle{headings} +\pagenumbering{arabic} +\fnfixbottomtrue % 2017-02-19 +\IfFileExists{stfloats.sty}{\RequirePackage{stfloats}\fnbelowfloat}{} +\if@twocolumn + \twocolumn + \sloppy + \flushbottom +\else + \onecolumn + \raggedbottom +\fi +\if@slide + \renewcommand\kanjifamilydefault{\gtdefault} + \renewcommand\familydefault{\sfdefault} + \raggedright + \ltj@setpar@global + \ltjsetxkanjiskip0.1em\relax +\fi +% \end{macrocode} +% +% 以上です。 +% +% \Finale +% +\endinput diff --git a/macros/luatex/generic/luatexja/src/ltjsclasses.ins b/macros/luatex/generic/luatexja/src/ltjsclasses.ins new file mode 100644 index 0000000000..957178678c --- /dev/null +++ b/macros/luatex/generic/luatexja/src/ltjsclasses.ins @@ -0,0 +1,13 @@ +% +% ltjsclasses.ins +% + +\input docstrip.tex +\keepsilent +\generateFile{ltjsarticle.cls}{f}{\from{ltjsclasses.dtx}{article}} +\generateFile{ltjsbook.cls}{f}{\from{ltjsclasses.dtx}{book}} +\generateFile{ltjsreport.cls}{f}{\from{ltjsclasses.dtx}{report}} +\generateFile{ltjspf.cls}{f}{\from{ltjsclasses.dtx}{jspf}} +\generateFile{ltjskiyou.cls}{f}{\from{ltjsclasses.dtx}{kiyou}} + +\endbatchfile diff --git a/macros/luatex/generic/luatexja/src/luatexja-compat.sty b/macros/luatex/generic/luatexja/src/luatexja-compat.sty new file mode 100644 index 0000000000..f55bf51114 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/luatexja-compat.sty @@ -0,0 +1,140 @@ +% +% luatexja-compat.sty +% + +%! 外から読まれるので仰々しくなってます +%% Avoid multiple loading. +\csname\if11luatexjacompatLoaded\fi\endcsname +\edef\x{% +\catcode32=\the\catcode32% +\catcode33=\the\catcode33% +\catcode35=\the\catcode35% +\catcode40=\the\catcode40% +\catcode41=\the\catcode41% +\catcode42=\the\catcode42% +\catcode43=\the\catcode43% +\catcode44=\the\catcode44% +\catcode45=\the\catcode45% +\catcode46=\the\catcode46% +\catcode58=\the\catcode58% +\catcode59=\the\catcode59% +\catcode60=\the\catcode60% +\catcode61=\the\catcode61% +\catcode62=\the\catcode62% +\catcode64=\the\catcode64% +\catcode91=\the\catcode91% +\catcode93=\the\catcode93% +\catcode94=\the\catcode94% +\catcode95=\the\catcode95% +\catcode126=\the\catcode126% +\endlinechar=\the\endlinechar +\relax} +\catcode32=10 %< > +\catcode33=12 %<"> +\catcode35=6 %<#> +\catcode40=12 %<(> +\catcode41=12 %<)> +\catcode42=12 %<*> +\catcode43=12 %<+> +\catcode44=12 %<,> +\catcode45=12 %<-> +\catcode46=12 %<.> +\catcode58=12 %<:> +\catcode59=12 %<;> +\catcode60=12 %<<> +\catcode61=12 %<=> +\catcode62=12 %<>> +\catcode64=11 %<@> +\catcode91=12 %<[> +\catcode93=12 %<]> +\catcode94=7 %<^> +\catcode95=8 %<_> +\catcode126=13 %<~> +\endlinechar=-1 % +%! なお, 上のcatcode設定はcoreとcompatで同一にしておく. +\edef\ltj@compat@AtEnd{\x + \noexpand\let\noexpand\ltj@compat@AtEnd\relax} +\def\luatexjacompatLoaded{\endinput} + +%% Check if LaTeX is used. +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname RequirePackage\endcsname\relax %<*!LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iffalse\endcsname +\else %<*LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iftrue\endcsname + \NeedsTeXFormat{LaTeX2e} + \ProvidesPackage{luatexja-compat}[2018/03/29 Compatibility with pTeX] +\fi %</LaTeX> + +% Load core module if not yet. +\ifx\luatexjacoreLoaded\@undefined + \ifltj@in@latex %<*LaTeX> + \RequirePackage{luatexja-core} + \else %<*!LaTeX> + \input luatexja-core.sty % + \fi %</LaTeX> +\fi + +%% When environment check fails, exit now. +\ifx\LuaTeXjaAvailable\@undefined + \ltj@compat@AtEnd +\expandafter\endinput\fi\relax + +%% Load Lua modules. +%\RequireLuaModule{luatexja.infomute} +% not yet implemented. + +%% Silence info messages of luatexbase-mcb +%\directlua{ luatexja.infomute.add_mute("luatexbase-mcb") } +% not yet implemented. + +%%------------------ +\RequireLuaTeXjaSubmodule{compat} + +\def\euc{\ltj@code@conv{euc}} +\def\kuten{\ltj@code@conv{kuten}} +\def\jis{\ltj@code@conv{jis}} +\def\sjis{\ltj@code@conv{sjis}} +\def\ucs{\ltj@code@conv{ucs}} + +\def\ltj@code@conv#1{% + \directlua{luatexja.compat.from_#1(token.scan_int())}% +} + +\def\kansuji{% + \directlua{luatexja.compat.to_kansuji(token.scan_int())}% +} + +\define@key[ltj]{japaram}{kansujichar}{\ltj@@set@stack{KSJ}{0}{0x7FFFFFFF}#1 } + +\ltjsetparameter{kansujichar={0,`〇}} +\ltjsetparameter{kansujichar={1,`一}} +\ltjsetparameter{kansujichar={2,`二}} +\ltjsetparameter{kansujichar={3,`三}} +\ltjsetparameter{kansujichar={4,`四}} +\ltjsetparameter{kansujichar={5,`五}} +\ltjsetparameter{kansujichar={6,`六}} +\ltjsetparameter{kansujichar={7,`七}} +\ltjsetparameter{kansujichar={8,`八}} +\ltjsetparameter{kansujichar={9,`九}} +\ltj@@decl@array@param{kansujichar} + +\ifltj@in@latex +% \pltx@next@inhibitglue (pLaTeX 2018-03-09) +\protected\def\pltx@next@inhibitglue{% + \ifhmode\inhibitglue\else + \edef\@tempa{\everypar{% + \everypar{\unexpanded\expandafter{\the\everypar}}% + \unexpanded\expandafter{\the\everypar}\inhibitglue}}% +\@tempa\fi} + \newcommand\printglossary{\@input@{\jobname.gls}} +\csname newcount\endcsname\hour +\csname newcount\endcsname\minute +\fi + +%%------------------ all done +\ltj@compat@AtEnd +\endinput +%% EOF diff --git a/macros/luatex/generic/luatexja/src/luatexja-core.sty b/macros/luatex/generic/luatexja/src/luatexja-core.sty new file mode 100644 index 0000000000..ba13695352 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/luatexja-core.sty @@ -0,0 +1,742 @@ +% +% luatexja-core.sty +% + +%! 外から読まれるので仰々しくなってます +%% Avoid multiple loading. +\csname\if11luatexjacoreLoaded\fi\endcsname +\edef\x{% +\catcode32=\the\catcode32% +\catcode33=\the\catcode33% +\catcode35=\the\catcode35% +\catcode40=\the\catcode40% +\catcode41=\the\catcode41% +\catcode42=\the\catcode42% +\catcode43=\the\catcode43% +\catcode44=\the\catcode44% +\catcode45=\the\catcode45% +\catcode46=\the\catcode46% +\catcode58=\the\catcode58% +\catcode59=\the\catcode59% +\catcode60=\the\catcode60% +\catcode61=\the\catcode61% +\catcode62=\the\catcode62% +\catcode64=\the\catcode64% +\catcode91=\the\catcode91% +\catcode93=\the\catcode93% +\catcode94=\the\catcode94% +\catcode95=\the\catcode95% +\catcode126=\the\catcode126% +\endlinechar=\the\endlinechar +\relax} +\catcode32=10 %< > +\catcode33=12 %<"> +\catcode35=6 %<#> +\catcode40=12 %<(> +\catcode41=12 %<)> +\catcode42=12 %<*> +\catcode43=12 %<+> +\catcode44=12 %<,> +\catcode45=12 %<-> +\catcode46=12 %<.> +\catcode58=12 %<:> +\catcode59=12 %<;> +\catcode60=12 %<<> +\catcode61=12 %<=> +\catcode62=12 %<>> +\catcode64=11 %<@> +\catcode91=12 %<[> +\catcode93=12 %<]> +\catcode94=7 %<^> +\catcode95=8 %<_> +\catcode126=13 %<~> +\endlinechar=-1 % +%! なお, 上のcatcode設定はcoreとcompatで同一にしておく. +\edef\ltj@core@AtEnd{\x + \noexpand\let\noexpand\ltj@core@AtEnd\relax} +\def\luatexjacoreLoaded{\endinput} + +%% Check if LaTeX is used. +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname RequirePackage\endcsname\relax %<*!LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iffalse\endcsname +\else %<*LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iftrue\endcsname + \NeedsTeXFormat{LaTeX2e} + \ProvidesPackage{luatexja-core}[2017/11/12 Core of LuaTeX-ja] +\fi %</LaTeX> + +%% Load prerequisite packages. +\endlinechar=13 % +\newif\ifltj@everyhook@avail\ltj@everyhook@availfalse +%! 外部パッケージは普通の \endlinechar で読まないと危険. +\ifltj@in@latex %<*LaTeX> + \RequirePackage{luatexbase} + \RequirePackage{luaotfload} + \RequirePackage{ltxcmds} [2011/11/09] % v1.22 + \RequirePackage{pdftexcmds} [2011/11/29] % v0.20 + \RequirePackage{xkeyval} [2012/10/14] % v2.6b + \RequirePackage{atbegshi} + \RequirePackage{etoolbox} + \AtBeginShipoutInit + \IfFileExists{everyhook.sty}{\RequirePackage{everyhook}\ltj@everyhook@availtrue}{} +\else %<*!LaTeX> + \input luatexbase.sty + \input luaotfload.sty + \input ltxcmds.sty + \input pdftexcmds.sty + \input xkeyval + \input atbegshi.sty + \AtBeginShipoutInit +\fi %</LaTeX> +\endlinechar=-1 % + +%% Check if LuaTeX is used +\ltx@LocalExpandAfter\ifx\csname directlua\endcsname\relax + % Loading is silently aborted, since the notice of the wrong + % engine is already shown in luaotfload. + \ltj@core@AtEnd +\expandafter\endinput\fi\relax + +%% Check LuaTeX version. +\ifnum\luatexversion<100 + \@PackageError{luatexja-core} + {This LuaTeX engine is too old for this package;\MessageBreak + at least 1.0.0 is needed} + {Package loading is aborted now.\MessageBreak} +\expandafter\endinput\fi\relax + +%% \LuaTeXjaAvailable +%! 環境検査にパスした時に定義される. +\let\LuaTeXjaAvailable=t % + +%%------------------ +\endlinechar=13 + +%! ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ +% LuaTeX-ja core TeX source + +\newcount\ltjlineendcomment +\ltjlineendcomment="FFFFF +\catcode\ltjlineendcomment=14 %" + +\def\ltj@loaded{hoge} + +\newdimen\ltj@zw +\newdimen\ltj@zh +\newdimen\jQ \jQ=0.25mm +\let\jH=\jQ + +%%%%%%%% error message +\def\ltj@defnum{0} +\def\ltj@defdimen{0} + +%%%%%%%% Attributes for Japanese typesetting. +\newattribute\ltj@icflag % attribute for italic correction +\newattribute\ltj@curjfnt % index for ``current horizontal Japanese font'' +\newattribute\ltj@curtfnt % index for ``current vertical Japanese font'' +\newattribute\ltj@charclass % +\newattribute\ltj@charcode % +\newattribute\ltj@autospc % attribute for autospacing +\newattribute\ltj@autoxspc % attribute for autoxspacing +\newattribute\ltj@yablshift % attribute for yalbaselineshift +\newattribute\ltj@ykblshift % attribute for yjabaselineshift +\newattribute\ltj@tablshift % attribute for talbaselineshift +\newattribute\ltj@tkblshift % attribute for tjabaselineshift +\newattribute\jfam % index for current jfam +\newattribute\ltj@vert@ori % <=0: UAX#50, >0: always upright + +\newattribute\ltj@dir +\newlanguage\ltj@@japanese +\ltj@dir\z@ +\ltj@icflag\z@ +\ltj@charclass\z@ +\ltj@curjfnt\m@ne +\ltj@curtfnt\m@ne + +%%%%%%%% Attributes for character ranges +\newcount\ltj@tempcnta +\ltj@tempcnta\z@ +\loop\ifnum\ltj@tempcnta<7 + \expandafter\newattribute% + \csname ltj@kcat\the\ltj@tempcnta\endcsname + \csname ltj@kcat\the\ltj@tempcnta\endcsname=0 + \advance\ltj@tempcnta\@ne +\repeat + + +%%%%%%%% Loading luatexja.lua +%% Quark tokens needed in ltj-base +\protected\def\ltj@@q@escape{\ltj@@q@escape@} +\protected\def\ltj@@q@escapenum{\ltj@@q@escapenum@} + +\directlua{% + luatexja = {}; + luatexja.lang_ja = \the\ltj@@japanese; + dofile(assert(kpse.find_file('luatexja.lua', 'tex'), + "File `luatexja.lua' not found")) +} + +%% \RequireLuaTeXjaSubmodule{name}[date] +% A TeX version of luatexja.load_module(name) +% The second optional argument [date] is simply ignored. +\def\RequireLuaTeXjaSubmodule#1{% + \@ifnextchar[{\ltj@requirelua@submod{#1}}{\ltj@requirelua@submod{#1}[]}} +\def\ltj@requirelua@submod#1[#2]{% + \directlua{luatexja.load_module("\luatexluaescapestring{#1}")}} + + +%%%%%%%% Load all sub-packages. +\ifltj@in@latex %<*LaTeX> + \RequirePackage{ltj-base} +\else %<*!LaTeX> + \input ltj-base.sty % +\fi %</LaTeX> + +%%%%%%%% \asluastring +\def\asluastring#1{'\luatexluaescapestring{\detokenize{#1}}'} + +%%%%%%%% Redefine \/ +\newluafunction\ltj@@italic@inner +\directlua{ + local t = lua.get_functions_table() + t[\the\ltj@@italic@inner] = luatexja.jfont.append_italic +} +\protected\def\/{\relax\luafunction\ltj@@italic@inner} + +%%%%%%%% \jfont\CS={...:...;jfm=metric;...}, \globaljfont +\protected\def\jfont#1{% + \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false, 'yoko','\luatexluaescapestring{\noexpand#1}')}} +\protected\def\globaljfont#1{% + \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true, 'yoko','\luatexluaescapestring{\noexpand#1}')}} +\newluafunction\ltj@@jfont@inner +\directlua{ + local t = lua.get_functions_table() + t[\the\ltj@@jfont@inner] = luatexja.jfont.jfontdefY +} +\def\ltj@@jfont{\luafunction\ltj@@jfont@inner} + +%%%%%%%% \tfont\CS={...:...;jfm=metric;...}, \globaltfont +\protected\def\tfont#1{% + \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(false, 'tate','\luatexluaescapestring{\noexpand#1}')}} +\protected\def\globaltfont#1{% + \afterassignment\ltj@@jfont\directlua{luatexja.jfont.jfontdefX(true, 'tate','\luatexluaescapestring{\noexpand#1}')}} + +%%%%%%%% \zw, \zh +\newluafunction\ltj@zw@inner +\newluafunction\ltj@zh@inner +\directlua{ + local t, setdimen, ltjf = lua.get_functions_table(), tex.setdimen, luatexja.jfont + t[\the\ltj@zw@inner] = function() setdimen('ltj@zw', ltjf.get_zw()) end + t[\the\ltj@zh@inner] = function() setdimen('ltj@zh', ltjf.get_zh()) end +} +\protected\def\zw{\luafunction\ltj@zw@inner\ltj@zw} +\protected\def\zh{\luafunction\ltj@zh@inner\ltj@zh} + +%%%%%%%% \inhibitglue +\newluafunction\ltj@reset@globaldefs@inner +\newluafunction\ltj@restore@globaldefs@inner +\newluafunction\ltj@@ihb@inner +\newluafunction\ltj@@fakeparbegin@inner +\newluafunction\ltj@@fakeboxbdd@inner +\directlua{ + local t = lua.get_functions_table() + t[\the\ltj@reset@globaldefs@inner] + = function() luatexja.global_temp = tex.globaldefs; tex.globaldefs = 0 end + t[\the\ltj@restore@globaldefs@inner] + = function() tex.globaldefs = luatexja.global_temp end + t[\the\ltj@@ihb@inner] = luatexja.jfmglue.create_inhibitglue_node + t[\the\ltj@@fakeparbegin@inner] = luatexja.jfmglue.create_beginpar_node + t[\the\ltj@@fakeboxbdd@inner] = luatexja.jfmglue.create_boxbdd_node +} +\protected\def\ltj@reset@globaldefs{\luafunction\ltj@reset@globaldefs@inner} +\protected\def\ltj@restore@globaldefs{\luafunction\ltj@restore@globaldefs@inner} +\protected\def\inhibitglue{\ifhmode\relax\luafunction\ltj@@ihb@inner\fi} +\protected\def\ltjfakeparbegin{\ifhmode\relax\luafunction\ltj@@fakeparbegin@inner\fi} +\protected\def\ltjfakeboxbdd{\ifhmode\relax\luafunction\ltj@@fakeboxbdd@inner\fi} + + +%%%%%%%% \ltjdefcharrange<name>{100-200,3000-,5000,...} +\protected\def\ltjdefcharrange#1#2{% + {\ltj@tempcntc=#1 \expandafter\ltj@@dcrange#2,,}\ignorespaces} +\def\ltj@@dcrange#1,{\def\ltj@temp{#1}% + \ifx\ltj@temp\empty\let\@next=\relax\else + \ltj@@dcrangeA{#1}\let\@next=\ltj@@dcrange\fi\@next} +\def\ltj@@dcrangeA#1{\ltj@@dcrangeB#1--\@nil} +\def\ltj@@dcrangeB#1-#2-#3\@nil{\def\ltj@temp{#3}% + \ifx\ltj@temp\empty + \ltj@tempcnta=#1 \ltj@tempcntb=\ltj@tempcnta + \else + \def\ltj@temp{#1}% + \ifx\ltj@temp\empty\ltj@tempcnta='200\else\ltj@tempcnta=#1\fi\relax + \def\ltj@temp{#2}% + \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF\else\ltj@tempcntb=#2\fi\relax%" + \fi + \directlua{luatexja.charrange.add_char_range(\the\ltj@tempcnta,\the\ltj@tempcntb, + \the\ltj@tempcntc)}% + } + +%%%%%%%% \ltjsetparameter +\newcount\ltj@@stack \newcount\ltj@@group@level +\ltj@@group@level\z@\ltj@@stack\z@ + +\setbox\z@\hbox{% + \directlua{% This value depends on the version of LuaTeX. + luatexja.stack.hmode = -tex.nest[tex.nest.ptr].mode + }% +} +\setbox\z@\vbox{% + \directlua{% This value depends on the version of LuaTeX. + luatexja.stack.vmode = -tex.nest[tex.nest.ptr].mode + }% +} +\setbox\z@\box\voidb@x + +% prebreakpenalty = {<char_code>, <penalty>} +\define@key[ltj]{japaram}{kcatcode}{\ltj@@set@stack{KCAT}{0}{0x7FFFFFFF}#1\relax} +\define@key[ltj]{japaram}{prebreakpenalty}{\ltj@@set@stack{PRE}{-10000}{10000}#1\relax} +\define@key[ltj]{japaram}{postbreakpenalty}{\ltj@@set@stack{POST}{-10000}{10000}#1\relax} +\def\ltj@@set@stack#1#2#3{% + \directlua{luatexja.stack.set_stack_perchar(luatexja.stack_table_index.#1,#2,#3)}} +%\def\ltj@@set@stack#1,#2:#3#4#5{% +% \directlua{luatexja.stack.set_stack_perchar(luatexja.stack_table_index.#3, +% \ltj@safe@num@or{nil}{#1},\ltj@safe@num@or{nil}{#2},#4,#5)}} + +% jatextfont = {<char_code>, <font_cs>} +% only horizontal font is supported +\define@key[ltj]{japaram}{jatextfont}{% + \expandafter\ltj@@set@stackfont#1:{MJT}} +\define@key[ltj]{japaram}{jascriptfont}{% + \expandafter\ltj@@set@stackfont#1:{MJS}} +\define@key[ltj]{japaram}{jascriptscriptfont}{% + \expandafter\ltj@@set@stackfont#1:{MJSS}} +\protected\def\ltj@@set@stackfont#1,#2:#3{% + \ltj@reset@globaldefs + \ltj@tempcnta=\ltj@curjfnt\ltj@curjfnt\m@ne#2% + \ifnum\ltj@curjfnt=\m@ne + \@PackageError{luatexja-core}% + {\string#2 is not a control sequence that represents \MessageBreak + a Japanese font}{}% + \else + \directlua{luatexja.stack.set_stack_font(luatexja.stack_table_index.#3, + \ltj@safe@num@or{nil}{#1}, \the\ltj@curjfnt)}% + \fi + \ltj@curjfnt=\ltj@tempcnta + \ltj@restore@globaldefs + } + +% {y,t}{ja,al}baselineshift = <dimen> +% yjabaselineshift = <dimen> +\define@key[ltj]{japaram}{yalbaselineshift}{% + \directlua{tex.setattribute(luatexja.isglobal, + luatexbase.attributes['ltj@yablshift'], token.scan_dimen())}#1\relax} +\define@key[ltj]{japaram}{yjabaselineshift}{% + \directlua{tex.setattribute(luatexja.isglobal, + luatexbase.attributes['ltj@ykblshift'], token.scan_dimen())}#1\relax} +\define@key[ltj]{japaram}{talbaselineshift}{% + \directlua{tex.setattribute(luatexja.isglobal, + luatexbase.attributes['ltj@tablshift'], token.scan_dimen())}#1\relax} +\define@key[ltj]{japaram}{tjabaselineshift}{% + \directlua{tex.setattribute(luatexja.isglobal, + luatexbase.attributes['ltj@tkblshift'], token.scan_dimen())}#1\relax} + +% jaxspmode = {<char_code>, <mode>} +% mode: inhibit, preonly, postonly, allow +% or 0 1 2 3 +\define@key[ltj]{japaram}{jaxspmode}{% \inhibitxspcode + \expandafter\ltj@set@jaxspmode#1:\relax} +\def\ltj@set@jaxspmode#1,#2:{% + \lowercase{\edef\ltj@temp{#2}}% + \def\ltj@tempa{inhibit}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{0}\fi + \def\ltj@tempa{preonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{1}\fi + \def\ltj@tempa{postonly}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{2}\fi + \def\ltj@tempa{allow}\ifx\ltj@temp\ltj@tempa\def\ltj@temp{3}\fi + \ltj@@set@stack{XSP}03#1 \ltj@temp} + +% alxspmode = {<char_code>, <mode>} +% mode: inhibit, preonly, postonly, allow +% or 0 1 2 3 +\define@key[ltj]{japaram}{alxspmode}{% \inhibitxspcode + \expandafter\ltj@set@jaxspmode#1:\relax}% same code as jaxspmode + +% autospacing = <bool> (default: true) +\define@boolkey[ltj]{japaram}{autospacing}[true]{% + \ifltj@japaram@autospacing + \directlua{luatexja.ext_print_global()}\ltj@autospc\@ne + \else + \directlua{luatexja.ext_print_global()}\ltj@autospc\z@ + \fi} + +% autoxspacing = <bool> (default: true) +\define@boolkey[ltj]{japaram}{autoxspacing}[true]{% + \ifltj@japaram@autoxspacing + \directlua{luatexja.ext_print_global()}\ltj@autoxspc\@ne + \else + \directlua{luatexja.ext_print_global()}\ltj@autoxspc\z@ + \fi} + +% [x]]kanjiskip = <skip> +\define@key[ltj]{japaram}{kanjiskip}{\ltjsetkanjiskip#1} +\define@key[ltj]{japaram}{xkanjiskip}{\ltjsetxkanjiskip#1} +\newluafunction\ltjsetkanjiskip@inner +\newluafunction\ltjsetxkanjiskip@inner +\directlua{ + local t, scan_glue = lua.get_functions_table(), token.scan_glue + local sss, sti = luatexja.stack.set_stack_skip, luatexja.stack_table_index + t[\the\ltjsetkanjiskip@inner] = function() + local d = scan_glue(); sss(sti.KSK, d); node.free(d) + end + t[\the\ltjsetxkanjiskip@inner] = function() + local d = scan_glue(); sss(sti.XSK, d); node.free(d) + end +} +\protected\def\ltjsetkanjiskip{\luafunction\ltjsetkanjiskip@inner} +\protected\def\ltjsetxkanjiskip{\luafunction\ltjsetxkanjiskip@inner} + +% jcharwidowpenalty = <count> +\define@key[ltj]{japaram}{jcharwidowpenalty}{% %COUNT + \ltj@@set@stack{JWP}{-10000}{10000}\z@#1 } + +% differentjfm = { large | small | average | pleft | pright | paverage | both} +\define@choicekey*+[ltj]{japaram}{differentjfm}[\ltj@temp\ltj@tempr]% + {large,small,average,pleft,pright,paverage,both}{% + \ifcase\ltj@tempr + \directlua{luatexja.jfmglue.diffmet_rule = math.max}\or + \directlua{luatexja.jfmglue.diffmet_rule = math.min}\or + \directlua{luatexja.jfmglue.diffmet_rule = math.two_average}\or + \directlua{luatexja.jfmglue.diffmet_rule = math.two_pleft}\or + \directlua{luatexja.jfmglue.diffmet_rule = math.two_pright}\or + \directlua{luatexja.jfmglue.diffmet_rule = math.two_paverage}\or + \directlua{luatexja.jfmglue.diffmet_rule = math.two_add} + \fi +}{\ltj@PackageError{luatexja}{invalid argument `#1' for `differentjfm'}{% + Argument for `differentjfm' must be one of `large', `small', `average',^^J% + `pleft', `pright', 'paverage' or `both'. }} + % large, small, average, pleft, pright, paverage, both + + +% jacharrange = { +-<range_number> } +\define@key[ltj]{japaram}{jacharrange}{\expandafter\ltj@@scrange#1,,} +\def\ltj@@scrange#1,{% + \edef\ltj@temp{#1}% + \ifx\ltj@temp\empty\let\ltj@@next=\relax\else\let\ltj@@next=\ltj@@scrange + \directlua{luatexja.charrange.toggle_char_range(% + luatexja.is_global,\ltj@safe@num@or{nil}{#1})}% + \fi\ltj@@next +} + +\protected\def\ltj@setpar@global{% + \relax\ifnum\globaldefs>0\directlua{luatexja.isglobal='global'}% + \else\directlua{luatexja.isglobal=''}\fi +} +\protected\def\ltjsetparameter#1{% + \directlua{luatexja.base.start_time_measure('set_par')}% + \ltj@setpar@global\setkeys[ltj]{japaram}{#1}% + \directlua{luatexja.base.stop_time_measure('set_par')}% + \ignorespaces} +\protected\def\ltjglobalsetparameter#1{% + \relax\ifnum\globaldefs<0\directlua{luatexja.isglobal=''}% + \else\directlua{luatexja.isglobal='global'}\fi% + \directlua{luatexja.base.start_time_measure('set_par')}% + \setkeys[ltj]{japaram}{#1}% + \directlua{luatexja.base.stop_time_measure('set_par')}% + \ignorespaces} + +%%%%%%%% \ltjgetparameter +\def\ltj@@decl@array@param#1{% + \expandafter\let\csname ltj@@array@param/#1\endcsname=t% +} +\ltj@@decl@array@param{prebreakpenalty} +\ltj@@decl@array@param{postbreakpenalty} +\ltj@@decl@array@param{jaxspmode} +\ltj@@decl@array@param{alxspmode} +\ltj@@decl@array@param{kcatcode} +\ltj@@decl@array@param{jacharrange} +\ltj@@decl@array@param{chartorange} +\ltj@@decl@array@param{boxdir} +\def\ltjgetparameter#1{% + \directlua{luatexja.base.start_time_measure('get_par')}% + % stop call is moved in luatexja.lua + \ifcsname ltj@@array@param/#1\endcsname + \expandafter\ltx@firstoftwo + \else + \expandafter\ltx@secondoftwo + \fi + {\ltj@@getparam@two{#1}}% + {\ltj@@getparam@one{#1}}% +} +\def\ltj@@getparam@one#1{% + \directlua{luatexja.ext_get_parameter_unary('#1')}% +}% +\def\ltj@@getparam@two#1#2{% + \directlua{luatexja.ext_get_parameter_binary('#1', \ltj@safe@num@or{nil}{#2})}% +} + +%%%%%%%% \ltjalchar<number>, \ltjjachar<number> +\let\ltj@@origchar=\char +\newluafunction\ltj@alljachar@inner +\directlua{ + local t, set_attr = lua.get_functions_table(), tex.setattribute + local get_attr, floor = tex.getattribute, math.floor + local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] + local lang_ja = luatexja.lang_ja + t[\the\ltj@alljachar@inner] = function() + font.current(get_attr(attr_curjfnt)); tex.language=lang_ja; + for i=0,6 do + set_attr(luatexbase.attributes['ltj@kcat' .. floor(i)],0) + end + end +} +\protected\def\ltj@alljachar{\luafunction\ltj@alljachar@inner} +\protected\def\ltj@allalchar{\relax + \csname ltj@kcat0\endcsname="7FFFFFFF %" + \csname ltj@kcat1\endcsname="7FFFFFFF %" + \csname ltj@kcat2\endcsname="7FFFFFFF %" + \csname ltj@kcat3\endcsname="7FFFFFFF %" + \csname ltj@kcat4\endcsname="7FFFFFFF %" + \csname ltj@kcat5\endcsname="7FFFFFFF %" + \csname ltj@kcat6\endcsname="7FFFFFFF }%" + +\protected\def\ltjjachar{\afterassignment\ltj@@jachar\ltj@tempcnta} +\def\ltj@@jachar{{\directlua{tex.globaldefs=0}\ltj@alljachar\ltj@@origchar\ltj@tempcnta}} +\protected\def\ltjalchar{\afterassignment\ltj@@alchar\ltj@tempcnta} +\def\ltj@@alchar{{\directlua{tex.globaldefs=0}\ltj@allalchar\ltj@@origchar\ltj@tempcnta}} + +%%%%%%%% \ltjsetmathletter<number>, \ltjunsetmathletter<number> +\protected\def\ltjsetmathletter#1{% + \directlua{luatexja.math.is_math_letters[token.scan_int()]=true}#1\relax +} +\protected\def\ltjunsetmathletter#1{% + \directlua{luatexja.math.is_math_letters[token.scan_int()]=false}#1\relax +} + +%%%%%%%% \ltjdeclarealtfont<base_font_cs><alt_font_cs>{100-200,3000-,5000,...} +% <base_font_cs> の 第 3 引数の文字達は <alt_font_cs> で組む +% いつも global +\def\ltj@@getjfontnumber#1{% result in \ltj@tempcntc + \ltj@reset@globaldefs + \begingroup\ltj@curjfnt\m@ne\ltj@curtfnt\m@ne\relax + #1\directlua{luatexja.__temp = -(\the\ltj@curjfnt)*(\the\ltj@curtfnt)}\endgroup + \ltj@tempcntc=\directlua{tex.sprint(luatexja.__temp)}\relax + \ifnum\ltj@tempcntc=\m@ne + \@PackageError{luatexja-core}% + {\string#1 is not a control sequence that represents \MessageBreak + a Japanese font}{I'll use the current horizontal Japanese font instead.^^J}% + \ltj@tempcntc=\ltj@curjfnt + \fi\ltj@restore@globaldefs} + +\protected\def\ltjdeclarealtfont#1#2#3{% + {\ltj@@getjfontnumber#1\@tempcnta=\ltj@tempcntc% \@tempcnta: 基底フォント + \ltj@@getjfontnumber#2% + \expandafter\ltj@@altfont#3,,}\ignorespaces} +\def\ltj@@altfont#1,{\def\ltj@temp{#1}% + \ifx\ltj@temp\empty\let\@next=\relax\else + \ltj@@altfontA{#1}\let\@next=\ltj@@altfont\fi\@next} +\def\ltj@@altfontA#1{\ltj@@altfontB#1--\@nil} +\def\ltj@@altfontB#1-#2-#3\@nil{\def\ltj@temp{#3}% + \ifx\ltj@temp\empty + \ltj@tempcnta=#1 \ltj@tempcntb=\ltj@tempcnta + \else + \def\ltj@temp{#1}% + \ifx\ltj@temp\empty\ltj@tempcnta='200\else\ltj@tempcnta=#1\fi\relax + \def\ltj@temp{#2}% + \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF\else\ltj@tempcntb=#2\fi\relax%" + \fi + \directlua{luatexja.jfont.set_alt_font( + \the\ltj@tempcnta,\the\ltj@tempcntb, + \the\ltj@tempcntc, \the\@tempcnta)}% + } + +%%%%%%%% \ltjclearaltfont<font_cs> +% <font_cs> の文字は全部 <font_cs> 本来の文字で組む +\protected\def\ltjclearaltfont#1{% + {\ltj@@getjfontnumber#1% + \directlua{luatexja.jfont.clear_alt_font(\the\ltj@tempcntc)}}\ignorespaces} + + +%%%%%%%% \yoko, \tate,\dtou +\protected\def\tate{% + \directlua{luatexja.direction.set_list_direction(3, 'tate')}% +} +\protected\def\yoko{% + \directlua{luatexja.direction.set_list_direction(4, 'yoko')}% +} +\protected\def\dtou{% + \directlua{luatexja.direction.set_list_direction(1, 'dtou')}% +} +\protected\def\utod{% 「縦数式ディレクション」 + \directlua{luatexja.direction.set_list_direction(11, 'utod')}% +} +\define@key[ltj]{japaram}{direction}{%% always local + \directlua{luatexja.direction.set_list_direction(1, 'ltjsetparameter')}% +} + +\yoko + +%%%% insert +\let\orig@insert=\insert +\protected\def\insert{\begingroup\afterassignment\ltj@@insert@A\ltj@tempcnta} +\protected\def\ltj@@insert@A{\orig@insert\ltj@tempcnta\bgroup + \aftergroup\ltj@@insert@B\let\ltj@@next} +\protected\def\ltj@@insert@B{\directlua{luatexja.direction.populate_insertion_dir_whatsit()}\endgroup} + +%%%% vadjust +\let\ltj@@orig@vadjust=\vadjust +\protected\def\vadjust{% + \ltj@@orig@vadjust\bgroup + \directlua{luatexja.direction.set_list_direction_hook('adj')}% + \aftergroup\ltj@@vadjust@check@dir\let\ltj@@next} +\protected\def\ltj@@vadjust@check@dir{% + \directlua{luatexja.direction.check_adjust_direction()}% +} + +%%%% \hbox, \vbox, \vtop +\setbox\z@\hbox{% + \primitive\everymath{} + $\directlua{% This value depends on the version of LuaTeX. + luatexja.stack.mmode = -tex.nest[tex.nest.ptr].mode + }$% +} +\setbox\z@\box\voidb@x +\ifltj@everyhook@avail% using everyhook package + \newluafunction\ltj@@box@dirhook + \directlua{ + local t, ltjd = lua.get_functions_table(), luatexja.direction + t[\the\ltj@@box@dirhook] + = function() ltjd.set_list_direction_hook() end + } + \PushPreHook{hbox}{\luafunction\ltj@@box@dirhook\aftergroup\ltj@@reset@badness} + \PushPreHook{vbox}{\luafunction\ltj@@box@dirhook\aftergroup\ltj@@reset@badness} +\else + \let\ltj@@everyhbox=\everyhbox\let\ltj@@everyvbox=\everyvbox + \newtoks\ltj@@i@everyhbox\newtoks\ltj@@i@everyvbox + \let\everyhbox=\ltj@@i@everyhbox\let\everyvbox=\ltj@@i@everyvbox + \newluafunction\ltj@@box@dirhook + \directlua{ + local t, ltjd = lua.get_functions_table(), luatexja.direction + t[\the\ltj@@box@dirhook] + = function() ltjd.set_list_direction_hook() end + } + \ltj@@everyhbox{\luafunction\ltj@@box@dirhook + \aftergroup\ltj@@reset@badness\the\ltj@@i@everyhbox} + \ltj@@everyvbox{\luafunction\ltj@@box@dirhook + \aftergroup\ltj@@reset@badness\the\ltj@@i@everyvbox} +\fi + +\newluafunction\ltj@@reset@badness@inner +\directlua{ + local t = lua.get_functions_table() + t[\the\ltj@@reset@badness@inner] = function() + if luatexja.global_temp then + tex.hbadness= tex.hbadness or luatexja.hbadness_temp + tex.vbadness= tex.vbadness or luatexja.vbadness_temp + tex.globaldefs= luatexja.global_temp or tex.globaldefs + end + end} +\protected\def\ltj@@reset@badness{\luafunction\ltj@@reset@badness@inner} + +\AtBeginShipout{\directlua{luatexja.direction.finalize()}} + +%%%% \raise, \lower, \moveleft, \moveright +\let\ltj@@orig@raise=\raise +\let\ltj@@orig@lower=\lower +\protected\def\raise{\ltj@reset@globaldefs\afterassignment\ltj@@raise\ltj@tempdima} +\protected\def\lower{\ltj@reset@globaldefs\afterassignment\ltj@@raise\ltj@tempdima-} +\protected\def\ltj@@raise{% + \ltj@restore@globaldefs + \edef\ltj@@raise@a{% + \noexpand\directlua{luatexja.direction.raise_box()}% + \ltj@@orig@raise\the\ltj@tempdima\noexpand\box\ltj@afbox + }\ltj@afterbox\ltj@@raise@a} +\let\ltj@@orig@moveleft=\moveleft +\let\ltj@@orig@moveright=\moveright +\protected\def\moveleft{\ltj@reset@globaldefs\afterassignment\ltj@@moveleft\ltj@tempdima} +\protected\def\moveright{\ltj@reset@globaldefs\afterassignment\ltj@@moveleft\ltj@tempdima-} +\protected\def\ltj@@moveleft{% + \ltj@restore@globaldefs + \edef\ltj@@moveleft@a{% + \noexpand\directlua{luatexja.direction.raise_box()}% + \ltj@@orig@moveleft\the\ltj@tempdima\noexpand\box\ltj@afbox + }\ltj@afterbox\ltj@@moveleft@a} + +%%%%\vsplit +\let\ltj@@orig@vsplit=\vsplit +\protected\def\vsplit{\directlua{luatexja.direction.vsplit()}} +%%%% \vcenter +\let\ltj@@orig@vcenter=\vcenter +\protected\def\vcenter{\ltj@afterbox\ltj@@vcenter\vbox} +\protected\def\ltj@@vcenter{% + \directlua{luatexja.direction.raise_box()}% + \ltj@@orig@vcenter{\box\ltj@afbox}% +} + +%%%% \unhbox and \unvbox +\long\def \@gobbletwo #1#2{} +\let\ltj@@orig@unhbox=\unhbox +\let\ltj@@orig@unvbox=\unvbox +\protected\def\unhbox{\ltj@reset@globaldefs\afterassignment\ltj@@unhbox\ltj@tempcnta} +\protected\def\unvbox{\ltj@reset@globaldefs\afterassignment\ltj@@unvbox\ltj@tempcnta} +\protected\def\ltj@@unhbox{% + \directlua{luatexja.direction.unbox_check_dir()}% + \ltj@@orig@unhbox\ltj@tempcnta} +\protected\def\ltj@@unvbox{% + \directlua{luatexja.direction.unbox_check_dir()}% + \ltj@@orig@unvbox\ltj@tempcnta} +\let\ltj@@orig@unhcopy=\unhcopy +\let\ltj@@orig@unvcopy=\unvcopy +\protected\def\unhcopy{\ltj@reset@globaldefs\afterassignment\ltj@@unhcopy\ltj@tempcnta} +\protected\def\unvcopy{\ltj@reset@globaldefs\afterassignment\ltj@@unvcopy\ltj@tempcnta} +\protected\def\ltj@@unhcopy{% + \directlua{luatexja.direction.unbox_check_dir(true)}% + \ltj@@orig@unhcopy\ltj@tempcnta + \directlua{luatexja.direction.uncopy_restore_whatsit()}} +\protected\def\ltj@@unvcopy{% + \directlua{luatexja.direction.unbox_check_dir(true)}% + \ltj@@orig@unvcopy\ltj@tempcnta + \directlua{luatexja.direction.uncopy_restore_whatsit()}} + +%%%% lastbox +\let\ltj@@orig@lastbox=\lastbox +\protected\def\lastbox{% + \directlua{luatexja.direction.lastbox_hook()}\ltj@@orig@lastbox +} + +%%%%%%%% \ltjgetwd<box_num> etc. +\def\ltj@@getwd{% + \directlua{luatexja.direction.get_box_dim('width', token.scan_int())}} +\def\ltj@@getht{% + \directlua{luatexja.direction.get_box_dim('height', token.scan_int())}} +\def\ltj@@getdp{% + \directlua{luatexja.direction.get_box_dim('depth', token.scan_int())}} +\let\ltjgetwd=\ltj@@getwd\let\ltjgetht=\ltj@@getht\let\ltjgetdp=\ltj@@getdp + +%%%%%%%% \ltjsetwd<box_num>=<dimen> etc. +\protected\def\ltjsetwd{\directlua{luatexja.direction.set_box_dim('width')}} +\protected\def\ltjsetht{\directlua{luatexja.direction.set_box_dim('height')}} +\protected\def\ltjsetdp{\directlua{luatexja.direction.set_box_dim('depth')}} + + +%%------------------ Load module for the format + +\ifltj@in@latex %<*LaTeX> + \RequirePackage{ltj-latex} +\else\ifltj@in@plain %<*plain> + \input ltj-plain.sty % +\fi\fi %</LaTeX|plain> + +\newcatcodetable\ltj@temp@cctb +\def\ltj@overwrite@catcodetable#1{% + \setluatexcatcodetable\ltj@temp@cctb{\luatexcatcodetable#1}% + \setluatexcatcodetable#1{\luatexcatcodetable\ltj@temp@cctb\catcode\ltjlineendcomment=14}%" +} +\ltj@overwrite@catcodetable\CatcodeTableLaTeX +\ltj@overwrite@catcodetable\CatcodeTableLaTeXAtLetter +\ltj@overwrite@catcodetable\CatcodeTableExpl + + +%%------------------ all done +\ltj@core@AtEnd +\endinput +%% EOF diff --git a/macros/luatex/generic/luatexja/src/luatexja.lua b/macros/luatex/generic/luatexja/src/luatexja.lua new file mode 100644 index 0000000000..4a4de62b0d --- /dev/null +++ b/macros/luatex/generic/luatexja/src/luatexja.lua @@ -0,0 +1,601 @@ + +require('lualibs') +tableunpack = table.unpack + +------------------------------------------------------------------------ +local function load_lua(fn) + local found = kpse.find_file(fn, 'tex') + if not found then + tex.error("LuaTeX-ja error: File `" .. fn .. "' not found") + else + texio.write_nl('(' .. found .. ')') + dofile(found) + end +end +luatexja.load_lua = load_lua +function luatexja.load_module(name) + require('ltj-' .. name.. '.lua') +end + +do + local setfield = node.direct.setfield + luatexja.setglue = node.direct.setglue or + function(g,w,st,sh,sto,sho) + setfield(g,'width', w or 0) + setfield(g,'stretch',st or 0) + setfield(g,'shrink', sh or 0) + setfield(g,'stretch_order',sto or 0) + setfield(g,'shrink_order', sho or 0) + end + local getfield = node.direct.getfield + luatexja.getglue = node.direct.getglue or + function(g) + return getfield(g,'width'), + getfield(g,'stretch'), + getfield(g,'shrink'), + getfield(g,'stretch_order'), + getfield(g,'shrink_order') + end +end + +--- 以下は全ファイルで共有される定数 +local icflag_table = {} +luatexja.icflag_table = icflag_table +icflag_table.ITALIC = 1 +icflag_table.PACKED = 2 +icflag_table.KINSOKU = 3 +icflag_table.FROM_JFM = 4 +-- FROM_JFM: 4, 5, 6, 7, 8 →優先度高(伸びやすく,縮みやすい) +-- 6 が標準 +icflag_table.KANJI_SKIP = 68 -- = 4+64 +icflag_table.KANJI_SKIP_JFM = 69 +icflag_table.XKANJI_SKIP = 70 +icflag_table.XKANJI_SKIP_JFM = 71 +icflag_table.LINEEND = 72 +icflag_table.PROCESSED = 73 +icflag_table.IC_PROCESSED = 74 +icflag_table.BOXBDD = 75 +icflag_table.PROCESSED_BEGIN_FLAG = 4096 -- sufficiently large power of 2 + +local stack_table_index = {} +luatexja.stack_table_index = stack_table_index +stack_table_index.PRE = 0x200000 -- characterごと +stack_table_index.POST = 0x400000 -- characterごと +stack_table_index.KCAT = 0x600000 -- characterごと +stack_table_index.XSP = 0x800000 -- characterごと +stack_table_index.RIPRE = 0xA00000 -- characterごと,ruby pre +stack_table_index.RIPOST = 0xC00000 -- characterごと,ruby post +stack_table_index.JWP = 0 -- これだけ +stack_table_index.KSK = 1 -- これだけ +stack_table_index.XSK = 2 -- これだけ +stack_table_index.MJT = 0x100 -- 0--255 +stack_table_index.MJS = 0x200 -- 0--255 +stack_table_index.MJSS = 0x300 -- 0--255 +stack_table_index.KSJ = 0x400 -- 0--9 + +local userid_table = {} +luatexja.userid_table = userid_table +userid_table.IHB = luatexbase.newuserwhatsitid('inhibitglue', 'luatexja') -- \inhibitglue +userid_table.STCK = luatexbase.newuserwhatsitid('stack_marker', 'luatexja') -- スタック管理 +userid_table.BPAR = luatexbase.newuserwhatsitid('begin_par', 'luatexja') -- 「段落始め」 +userid_table.DIR = luatexbase.newuserwhatsitid('direction', 'luatexja') -- 組方向 +userid_table.BOXB = luatexbase.newuserwhatsitid('box_boundary', 'luatexja') -- 「ボックス始め・終わり」 +userid_table.JA_AL_BDD = luatexbase.newuserwhatsitid('ja_al_boundary', 'luatexja') + +local dir_table = {} +luatexja.dir_table = dir_table +dir_table.dir_dtou = 1 +dir_table.dir_tate = 3 +dir_table.dir_yoko = 4 +dir_table.dir_math_mod = 8 +dir_table.dir_node_auto = 128 -- 組方向を合わせるために自動で作られたもの +dir_table.dir_node_manual = 256 -- 寸法代入によって作られたもの +dir_table.dir_utod = dir_table.dir_tate + dir_table.dir_math_mod + -- 「縦数式ディレクション」 in pTeX +--- 定義終わり + +local load_module = luatexja.load_module +load_module('base'); local ltjb = luatexja.base +load_module('rmlgbm'); local ltjr = luatexja.rmlgbm -- must be 1st + +if luatexja_debug then load_module('debug') end + +load_module('charrange'); local ltjc = luatexja.charrange +load_module('stack'); local ltjs = luatexja.stack +load_module('direction'); local ltjd = luatexja.direction -- +1 hlist +1 attr_list +load_module('lineskip'); local ltjl = luatexja.lineskip -- +1 hlist +1 attr_list +load_module('jfont'); local ltjf = luatexja.jfont +load_module('inputbuf'); local ltji = luatexja.inputbuf +load_module('pretreat'); local ltjp = luatexja.pretreat +load_module('setwidth'); local ltjw = luatexja.setwidth +load_module('jfmglue'); local ltjj = luatexja.jfmglue -- +1 glue +1 gs +1 attr_list +load_module('math'); local ltjm = luatexja.math +load_module('base'); local ltjb = luatexja.base + + +local attr_jchar_class = luatexbase.attributes['ltj@charclass'] +local attr_jchar_code = luatexbase.attributes['ltj@charcode'] +local attr_curjfnt = luatexbase.attributes['ltj@curjfnt'] +local attr_yablshift = luatexbase.attributes['ltj@yablshift'] +local attr_icflag = luatexbase.attributes['ltj@icflag'] +local attr_uniqid = luatexbase.attributes['ltj@uniqid'] +local attr_dir = luatexbase.attributes['ltj@dir'] +local cat_lp = luatexbase.catcodetables['latex-package'] + +-- Three aux. functions, bollowed from tex.web + +local unity=65536 +local floor = math.floor + +local function print_scaled(s) + local out='' + local delta=10 + if s<0 then + out=out..'-'; s=-s + end + out=out..tostring(floor(s/unity)) .. '.' + s=10*(s%unity)+5 + repeat + if delta>unity then s=s+32768-50000 end + out=out .. tostring(floor(s/unity)) + s=10*(s%unity) + delta=delta*10 + until s<=delta + return out +end +luatexja.print_scaled = print_scaled + +local function print_glue(d,order) + local out=print_scaled(d) + if order>0 then + out=out..'fi' + while order>1 do + out=out..'l'; order=order-1 + end + else + out=out..'pt' + end + return out +end + +local function print_spec(p) + local out=print_scaled(p.width)..'pt' + if p.stretch~=0 then + out=out..' plus '..print_glue(p.stretch,p.stretch_order) + end + if p.shrink~=0 then + out=out..' minus '..print_glue(p.shrink,p.shrink_order) + end +return out +end + + +------------------------------------------------------------------------ +-- CODE FOR GETTING/SETTING PARAMETERS +------------------------------------------------------------------------ + +-- EXT: print parameters that don't need arguments +do + local tex_getattr = tex.getattribute + local function getattr(a) + local r = tex.getattribute(a) + return (r==-0x7FFFFFFF) and 0 or r + end + luatexja.unary_pars = { + yalbaselineshift = function(t) + return print_scaled(getattr('ltj@yablshift'))..'pt' + end, + yjabaselineshift = function(t) + return print_scaled(getattr('ltj@ykblshift'))..'pt' + end, + talbaselineshift = function(t) + return print_scaled(getattr('ltj@tablshift'))..'pt' + end, + tjabaselineshift = function(t) + return print_scaled(getattr('ltj@tkblshift'))..'pt' + end, + kanjiskip = function(t) + return print_spec(ltjs.get_stack_skip(stack_table_index.KSK, t)) + end, + xkanjiskip = function(t) + return print_spec(ltjs.get_stack_skip(stack_table_index.XSK, t)) + end, + jcharwidowpenalty = function(t) + return ltjs.get_stack_table(stack_table_index.JWP, 0, t) + end, + autospacing = function(t) + return getattr('ltj@autospc') + end, + autoxspacing = function(t) + return getattr('ltj@autoxspc') + end, + differentjfm = function(t) + local f, r = luatexja.jfmglue.diffmet_rule, '???' + if f == math.max then r = 'large' + elseif f == math.min then r = 'small' + elseif f == math.two_average then r = 'average' + elseif f == math.two_paverage then r = 'paverage' + elseif f == math.two_pleft then r = 'pleft' + elseif f == math.two_pright then r = 'pright' + elseif f == math.two_add then r = 'both' + end + return r + end, + direction = function() + local v = ltjd.get_dir_count() + if math.abs(tex.nest[tex.nest.ptr].mode) == ltjs.mmode and v == dir_table.dir_tate then + v = dir_table.dir_utod + end + return v + end, + adjustdir = ltjd.get_adjust_dir_count, + } + + local unary_pars = luatexja.unary_pars + function luatexja.ext_get_parameter_unary(k) + if unary_pars[k] then + tex.write(tostring(unary_pars[k](tex.getcount('ltj@@stack')))) + end + ltjb.stop_time_measure('get_par') + end +end + + +-- EXT: print parameters that need arguments +do + luatexja.binary_pars = { + jacharrange = function(c, t) + if type(c)~='number' or c<-1 or c>31*ltjc.ATTR_RANGE then + -- 0, -1 はエラーにしない(隠し) + ltjb.package_error('luatexja', + 'invalid character range number (' .. tostring(c) .. ')', + 'A character range number should be in the range 1..' + .. 31*ltjc.ATTR_RANGE .. ",\n".. + 'So I changed this one to ' .. 31*ltjc.ATTR_RANGE .. ".") + c=0 -- external range 217 == internal range 0 + elseif c==31*ltjc.ATTR_RANGE then c=0 + end + -- 負の値は <U+0080 の文字の文字範囲,として出てくる.この時はいつも欧文文字なので 1 を返す + return (c<0) and 1 or ltjc.get_range_setting(c) + end, + prebreakpenalty = function(c, t) + return ltjs.get_stack_table(stack_table_index.PRE + + ltjb.in_unicode(c, true), 0, t) + end, + postbreakpenalty = function(c, t) + return ltjs.get_stack_table(stack_table_index.POST + + ltjb.in_unicode(c, true), 0, t) + end, + kcatcode = function(c, t) + return ltjs.get_stack_table(stack_table_index.KCAT + + ltjb.in_unicode(c, false), 0, t) + end, + chartorange = function(c, t) + return ltjc.char_to_range(ltjb.in_unicode(c, false)) + end, + jaxspmode = function(c, t) + return ltjs.get_stack_table(stack_table_index.XSP + + ltjb.in_unicode(c, true), 3, t) + end, + boxdir = function(c, t) + if type(c)~='number' or c<0 or c>65535 then + ltjb.package_error('luatexja', + 'Bad register code (' .. tostring(c) .. ')', + 'A register must be between 0 and 65535.\n'.. + 'I changed this one to zero.') + c=0 + end + return ltjd.get_register_dir(c) + end, + } + local binary_pars = luatexja.binary_pars + + binary_pars.alxspmode = binary_pars.jaxspmode + function luatexja.ext_get_parameter_binary(k,c) + if binary_pars[k] then + tex.write(tostring(binary_pars[k](c,tex.getcount('ltj@@stack')))) + end + ltjb.stop_time_measure('get_par') + end +end + +-- EXT: print \global if necessary +function luatexja.ext_print_global() + if luatexja.isglobal=='global' then tex.sprint(cat_lp, '\\global') end +end + + +-- main process +do + local start_time_measure, stop_time_measure + = ltjb.start_time_measure, ltjb.stop_time_measure + local nullfunc = function (n) return n end + local to_node = node.direct.tonode + local to_direct = node.direct.todirect + local ensure_tex_attr = ltjb.ensure_tex_attr + + -- mode = true iff main_process is called from pre_linebreak_filter + local function main_process(head, mode, dir, gc) + ensure_tex_attr(attr_icflag, 0) + if gc == 'fin_row' then return head + else + --luatexja.ext_show_node_list(head, 'T> ', print) + start_time_measure('jfmglue') + local p = ltjj.main(to_direct(head),mode, dir) + stop_time_measure('jfmglue') + return to_node(p) + end + end + + local function adjust_icflag(h) + -- kern from luaotfload will have icflag = 1 + -- (same as italic correction) + ensure_tex_attr(attr_icflag, 1) + return h + end + + -- callbacks + ltjb.add_to_callback( + 'pre_linebreak_filter', + function (head,groupcode) + return main_process(head, true, tex.textdir, groupcode) + end,'ltj.main', + luatexbase.priority_in_callback('pre_linebreak_filter', 'luaotfload.node_processor')+1) + ltjb.add_to_callback( + 'hpack_filter', + function (head,groupcode,size,packtype, dir) + return main_process(head, false, dir, groupcode) + end,'ltj.main', + luatexbase.priority_in_callback('hpack_filter', 'luaotfload.node_processor')+1) + ltjb.add_to_callback('pre_linebreak_filter', adjust_icflag, 'ltj.adjust_icflag', 1) + ltjb.add_to_callback('hpack_filter', adjust_icflag, 'ltj.adjust_icflag', 1) + +end + +-- cleanup process +function luatexja.ext_cleanup() + ltjf.cleanup_size_cache() + ltjd.remove_end_whatsit() +end + + +-- lastnodechar +do + local id_glyph = node.id('glyph') + function luatexja.pltx_composite_last_node_char() + local n = tex.nest[tex.nest.ptr].tail + local r = '-1' + if n then + if n.id==id_glyph then + while n.componetns and n.subtype and n.subtype%4 >= 2 do + n = node.tail(n) + end + r = tostring(n.char) + end + end + tex.sprint(r) + end +end + +-- debug + +do + +local node_type = node.type +local node_next = node.next +local has_attr = node.has_attribute + +local id_penalty = node.id('penalty') +local id_glyph = node.id('glyph') +local id_glue = node.id('glue') +local id_kern = node.id('kern') +local id_hlist = node.id('hlist') +local id_vlist = node.id('vlist') +local id_rule = node.id('rule') +local id_math = node.id('math') +local id_whatsit = node.id('whatsit') +local sid_user = node.subtype('user_defined') + +local function get_attr_icflag(p) + return (has_attr(p, attr_icflag) or 0) % icflag_table.PROCESSED_BEGIN_FLAG +end + +local prefix, inner_depth +local utfchar = utf.char +local function debug_show_node_X(p,print_fn, limit) + local k = prefix + local s + local pt=node_type(p.id) + local base = prefix .. string.format('%X', get_attr_icflag(p)) + .. ' ' .. pt .. ' ' .. tostring(p.subtype) .. ' ' + if pt == 'glyph' then + s = base .. ' ' .. + (p.char>=0xF0000 and string.format('(U+%X)', p.char) or utfchar(p.char)) .. ' ' + .. tostring(p.font) .. ' (' .. print_scaled(p.height) .. '+' + .. print_scaled(p.depth) .. ')x' .. print_scaled(p.width) + if p.xoffset~=0 or p.yoffset~=0 then + s = s .. ' off: (' .. print_scaled(p.xoffset) + .. ',' .. print_scaled(p.yoffset) .. ')' + end + print_fn(s) + elseif pt=='hlist' or pt=='vlist' or pt=='unset'or pt=='ins' then + if pt=='ins' then + s = base .. '(' .. print_scaled(p.height) .. '+' + .. print_scaled(p.depth) .. ')' + .. ', dir=' .. tostring(node.has_attribute(p, attr_dir)) + else + s = base .. '(' .. print_scaled(p.height) .. '+' + .. print_scaled(p.depth) .. ')x' .. print_scaled(p.width) + .. ', dir=' .. tostring(node.has_attribute(p, attr_dir)) + end + if (p.shift or 0)~=0 then + s = s .. ', shifted ' .. print_scaled(p.shift) + end + if p.glue_set and p.glue_sign ==2 or ( p.glue_sign==1 and p.glue_set>0) then + s = s .. ' glue set ' + if p.glue_sign == 2 then s = s .. '-' end + s = s .. tostring(floor(p.glue_set*10000)/10000) + if p.glue_order == 0 then + s = s .. 'pt' + else + s = s .. 'fi' + for i = 2, p.glue_order do s = s .. 'l' end + end + end + if get_attr_icflag(p) == icflag_table.PACKED then + s = s .. ' (packed)' + end + print_fn(s); + local bid = inner_depth + prefix, inner_depth = prefix.. '.', inner_depth + 1 + if inner_depth < limit then + for q in node.traverse(p.head) do + debug_show_node_X(q, print_fn, limit) + end + end + prefix=k + elseif pt=='rule' then + s = base .. '(' .. print_scaled(p.height) .. '+' + .. print_scaled(p.depth) .. ')x' .. print_scaled(p.width) + .. ', dir=' .. tostring(node.has_attribute(p, attr_dir)) + print_fn(s) + elseif pt=='disc' then + print_fn(s) + local bid = inner_depth + if inner_depth < limit then + prefix, inner_depth = k.. 'p.', inner_depth + 1 + for q in node.traverse(p.pre) do + debug_show_node_X(q, print_fn, limit) + end + prefix = k.. 'P.' + for q in node.traverse(p.post) do + debug_show_node_X(q, print_fn, limit) + end + prefix = k.. 'R.' + for q in node.traverse(p.replace) do + debug_show_node_X(q, print_fn, limit) + end + end + prefix=k + elseif pt == 'glue' then + s = base .. ' ' .. print_spec(p) + if get_attr_icflag(p)>icflag_table.KINSOKU + and get_attr_icflag(p)<icflag_table.KANJI_SKIP then + s = s .. ' (from JFM: priority ' .. get_attr_icflag(p)-icflag_table.FROM_JFM .. ')' + elseif get_attr_icflag(p)==icflag_table.KANJI_SKIP then + s = s .. ' (kanjiskip)' + elseif get_attr_icflag(p)==icflag_table.KANJI_SKIP_JFM then + s = s .. ' (kanjiskip, JFM specified)' + elseif get_attr_icflag(p)==icflag_table.XKANJI_SKIP then + s = s .. ' (xkanjiskip)' + elseif get_attr_icflag(p)==icflag_table.XKANJI_SKIP_JFM then + s = s .. ' (xkanjiskip, JFM specified)' + end + print_fn(s) + elseif pt == 'kern' then + s = base .. ' ' .. print_scaled(p.kern) .. 'pt' + if p.subtype==2 then + s = s .. ' (for accent)' + elseif get_attr_icflag(p)==icflag_table.IC_PROCESSED then + s = s .. ' (italic correction)' + elseif get_attr_icflag(p)==icflag_table.LINEEND then + s = s .. ' (end-of-line)' + -- elseif get_attr_icflag(p)==ITALIC then + -- s = s .. ' (italic correction)' + elseif get_attr_icflag(p)>icflag_table.KINSOKU + and get_attr_icflag(p)<icflag_table.KANJI_SKIP then + s = s .. ' (from JFM: priority ' .. get_attr_icflag(p)-icflag_table.FROM_JFM .. ')' + end + print_fn(s) + elseif pt == 'penalty' then + s = base .. ' ' .. tostring(p.penalty) + if get_attr_icflag(p)==icflag_table.KINSOKU then + s = s .. ' (for kinsoku)' + end + print_fn(s) + elseif pt == 'whatsit' then + s = base + if p.subtype==sid_user then + local t = tostring(p.user_id) .. ' (' .. + luatexbase.get_user_whatsit_name(p.user_id) .. ') ' + if p.type ~= 110 then + s = s .. ' userid:' .. t .. p.value + print_fn(s) + else + s = s .. ' userid:' .. t .. '(node list)' + if p.user_id==userid_table.DIR then + s = s .. ' dir: ' .. tostring(node.has_attribute(p, attr_dir)) + end + print_fn(s) + local bid = inner_depth + prefix, inner_depth =prefix.. '.', inner_depth + 1 + if inner_depth < limit then + for q in node.traverse(p.value) do + debug_show_node_X(q, print_fn, limit) + end + end + prefix, inner_depth = k, bid + end + else + s = s .. (node.subtype(p.subtype) or '') + if p.subtype==1 then + s = s .. ' stream=' .. p.stream + print_fn(s) + for i=1,#p.data do + print_fn(s .. ' [' .. i .. '] = ' .. tostring(p.data[i].csname)) + end + else + print_fn(s) + end + end + -------- math node -------- + elseif pt=='noad' then + s = base ; print_fn(s) + if p.nucleus then + prefix = k .. 'N'; debug_show_node_X(p.nucleus, print_fn, limit); + end + if p.sup then + prefix = k .. '^'; debug_show_node_X(p.sup, print_fn, limit); + end + if p.sub then + prefix = k .. '_'; debug_show_node_X(p.sub, print_fn, limit); + end + prefix = k; + elseif pt=='math_char' then + s = base .. ' fam: ' .. p.fam .. ' , char = ' .. utfchar(p.char) + print_fn(s) + elseif pt=='sub_box' or pt=='sub_mlist' then + print_fn(base) + if p.head then + prefix = k .. '.'; + for q in node.traverse(p.head) do + debug_show_node_X(q, print_fn) + end + end + else + print_fn(base) + end + p=node_next(p) +end +function luatexja.ext_show_node_list(head,depth,print_fn, lim) + prefix = depth + inner_depth = 0 + if head then + while head do + debug_show_node_X(head, print_fn, lim or 1/0); head = node_next(head) + end + else + print_fn(prefix .. ' (null list)') + end +end +function luatexja.ext_show_node(head,depth,print_fn, lim) + prefix = depth + inner_depth = 0 + if head then + debug_show_node_X(head, print_fn, lim or 1/0) + else + print_fn(prefix .. ' (null list)') + end +end + +end diff --git a/macros/luatex/generic/luatexja/src/luatexja.sty b/macros/luatex/generic/luatexja/src/luatexja.sty new file mode 100644 index 0000000000..71f90ca327 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/luatexja.sty @@ -0,0 +1,61 @@ +% +% luatexja.sty +% +%! 外から読まれるので多少仰々しくなってます +%% Avoid multiple loading. +\csname\if11luatexjaLoaded\fi\endcsname +\edef\x{% +\catcode32=\the\catcode32% +\catcode45=\the\catcode45% +\catcode46=\the\catcode46% +\catcode64=\the\catcode64% +\catcode91=\the\catcode91% +\catcode93=\the\catcode93% +\endlinechar=\the\endlinechar +\relax} +\catcode32=10 %< > +\catcode45=12 %<-> +\catcode46=12 %<.> +\catcode64=11 %<@> +\catcode91=12 %<[> +\catcode93=12 %<]> +\endlinechar=13 % +%! あまり恩恵がないので \endlinechar=-1 はなし +\edef\ltj@AtEnd{\x + \noexpand\let\noexpand\ltj@AtEnd\relax} +\def\luatexjaLoaded{\endinput} +\newif\ifltj@disablejfam + +%% Check if LaTeX is used. +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname RequirePackage\endcsname\relax %<*!LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iffalse\endcsname +\else %<*LaTeX> + \expandafter\let\csname ifltj@in@latex\expandafter\endcsname + \csname iftrue\endcsname + \NeedsTeXFormat{LaTeX2e} + \ProvidesPackage{luatexja}[2019/04/08 Japanese Typesetting with Lua(La)TeX] + \DeclareOption{disablejfam}{\ltj@disablejfamtrue} + \DeclareOption*{} + \ProcessOptions\relax +\fi %</LaTeX> +%%%% VERSION +\def\LuaTeXjaversion{20190827.0} + +\directlua{require('ltj-unicode-ccfix.lua')}% catcode of ideographs + +%% Load all sub-packages. +\ifltj@in@latex %<*LaTeX> + %% \RequirePackage{expl3} needed if the version of l3kernel is v6111 + \RequirePackage{luatexja-core,luatexja-compat} +\else %<*!LaTeX> + \input luatexja-core.sty % + \input luatexja-compat.sty % +\fi %</LaTeX> + +\directlua{luatexja.base.start_time_measure('RUN')} +%% all done +\ltj@AtEnd +\endinput +%% EOF diff --git a/macros/luatex/generic/luatexja/src/patches/lltjcore.sty b/macros/luatex/generic/luatexja/src/patches/lltjcore.sty new file mode 100644 index 0000000000..100a1c2b7e --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjcore.sty @@ -0,0 +1,339 @@ +% +% lltjcore.sty: derived from plcore.dtx in pLaTeX. +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjcore}[2018/06/15 Patch to LaTeX2e Kernel for LuaTeX-ja] +\RequirePackage{etoolbox} + +\def\cleardoublepage{\clearpage\if@twoside + \ifodd\c@page + \ifnum\ltjgetparameter{direction}=3 + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi + \else + \ifnum\ltjgetparameter{direction}=4 + \hbox{}\thispagestyle{empty}\newpage + \if@twocolumn\hbox{}\newpage\fi + \fi + \fi\fi} +\newif\iftombow \tombowfalse +\newif\iftombowdate \tombowdatetrue +\newdimen\@tombowwidth +\setlength{\@tombowwidth}{.1\p@} +\newbox\@TL\newbox\@Tl +\newbox\@TC +\newbox\@TR\newbox\@Tr +\newbox\@BL\newbox\@Bl +\newbox\@BC +\newbox\@BR\newbox\@Br +\newbox\@CL +\newbox\@CR +\font\@bannerfont=cmtt9 +\newtoks\@bannertoken +\@bannertoken{} +\def\maketombowbox{% + \setbox\@TL\hbox to\z@{\yoko\hss + \vrule width\dimexpr 10mm+\@tombowbleed\relax height\@tombowwidth depth\z@ + \vrule height10mm width\@tombowwidth depth\z@ + \iftombowdate + \raise4pt\hbox to\z@{\hskip5mm\@bannerfont\the\@bannertoken\hss}% + \fi}% + \setbox\@Tl\hbox to\z@{\yoko\hss + \vrule width10mm height\@tombowwidth depth\z@ + \vrule height\dimexpr 10mm+\@tombowbleed\relax width\@tombowwidth depth\z@}% + \setbox\@TC\hbox{\yoko + \vrule width10mm height\@tombowwidth depth\z@ + \vrule height10mm width\@tombowwidth depth\z@ + \vrule width10mm height\@tombowwidth depth\z@}% + \setbox\@TR\hbox to\z@{\yoko + \vrule height10mm width\@tombowwidth depth\z@ + \vrule width\dimexpr 10mm+\@tombowbleed\relax height\@tombowwidth depth\z@\hss}% + \setbox\@Tr\hbox to\z@{\yoko + \vrule height\dimexpr 10mm+\@tombowbleed\relax width\@tombowwidth depth\z@ + \vrule width10mm height\@tombowwidth depth\z@\hss}% + \setbox\@BL\hbox to\z@{\yoko\hss + \vrule width\dimexpr 10mm+\@tombowbleed\relax depth\@tombowwidth height\z@ + \vrule depth10mm width\@tombowwidth height\z@}% + \setbox\@Bl\hbox to\z@{\yoko\hss + \vrule width10mm depth\@tombowwidth height\z@ + \vrule depth\dimexpr 10mm+\@tombowbleed\relax width\@tombowwidth height\z@}% + \setbox\@BC\hbox{\yoko + \vrule width10mm depth\@tombowwidth height\z@ + \vrule depth10mm width\@tombowwidth height\z@ + \vrule width10mm depth\@tombowwidth height\z@}% + \setbox\@BR\hbox to\z@{\yoko + \vrule depth10mm width\@tombowwidth height\z@ + \vrule width\dimexpr 10mm+\@tombowbleed\relax depth\@tombowwidth height\z@\hss}% + \setbox\@Br\hbox to\z@{\yoko + \vrule depth\dimexpr 10mm+\@tombowbleed\relax width\@tombowwidth height\z@ + \vrule width10mm depth\@tombowwidth height\z@\hss}% + \setbox\@CL\hbox to\z@{\yoko\hss + \vrule width10mm height.5\@tombowwidth depth.5\@tombowwidth + \vrule height10mm depth10mm width\@tombowwidth}% + \setbox\@CR\hbox to\z@{\yoko + \vrule height10mm depth10mm width\@tombowwidth + \vrule height.5\@tombowwidth depth.5\@tombowwidth width10mm\hss}% +} +\def\@outputtombow{% + \iftombow + \vbox to\z@{\kern-\dimexpr 10mm+\@tombowbleed\relax + \boxmaxdepth\maxdimen + \moveleft\@tombowbleed\vbox to\@@paperheight{% + \color@begingroup + \@tombowcolor + \hbox to\@@paperwidth{\hskip\@tombowbleed\relax + \copy\@TL\hfill\copy\@TC\hfill\copy\@TR\hskip\@tombowbleed}% + \kern-10mm + \hbox to\@@paperwidth{\copy\@Tl\hfill\copy\@Tr}% + \vfill + \hbox to\@@paperwidth{\copy\@CL\hfill\copy\@CR}% + \vfill + \hbox to\@@paperwidth{\copy\@Bl\hfill\copy\@Br}% + \kern-10mm + \hbox to\@@paperwidth{\hskip\@tombowbleed\relax + \copy\@BL\hfill\copy\@BC\hfill\copy\@BR\hskip\@tombowbleed}% + \color@endgroup + }\vss + }% + \fi +} +\def\@tombowcolor{\normalcolor} +\def\@tombowbleed{3mm} +\def\@tombowreset@@paper{% + \@@topmargin\topmargin + \iftombow + \@@paperwidth\paperwidth + \advance\@@paperwidth 2\dimexpr\@tombowbleed\relax + \@@paperheight\paperheight\advance\@@paperheight 10mm\relax + \advance\@@paperheight 2\dimexpr\@tombowbleed\relax + \advance\@@topmargin 1in\relax \advance\@themargin 1in\relax + \fi +} +\newdimen\@@paperheight +\newdimen\@@paperwidth +\newdimen\@@topmargin +\def\@outputpage{% +\begingroup % the \endgroup is put in by \aftergroup + \ifnum\ltjgetparameter{direction}=4\else + \dimen\z@\textwidth \textwidth\textheight \textheight\dimen\z@ + \fi + \let \protect \noexpand + \language\document@default@language %LaTeX2e 2017/05/01 + \@resetactivechars + \global\let\@@if@newlist\if@newlist + \global\@newlistfalse + \@parboxrestore + \shipout\vbox{\yoko + \set@typeset@protect + \aftergroup\endgroup + \aftergroup\set@typeset@protect + \if@specialpage + \global\@specialpagefalse\@nameuse{ps@\@specialstyle}% + \fi + \if@twoside + \ifodd\count\z@ \let\@thehead\@oddhead \let\@thefoot\@oddfoot + \ifnum\ltjgetparameter{direction}=3 \let\@themargin\evensidemargin + \else\let\@themargin\oddsidemargin\fi + \else \let\@thehead\@evenhead + \let\@thefoot\@evenfoot + \ifnum\ltjgetparameter{direction}=3 \let\@themargin\oddsidemargin + \else\let\@themargin\evensidemargin\fi + \fi\fi + \@tombowreset@@paper + \reset@font + \normalsize + \normalsfcodes + \let\label\@gobble + \let\index\@gobble + \let\glossary\@gobble + \baselineskip\z@skip \lineskip\z@skip \lineskiplimit\z@ + \@begindvi + \@outputtombow + \vskip \@@topmargin + \moveright\@themargin\vbox{% + \setbox\@tempboxa \vbox to\headheight{% + \vfil + \color@hbox + \normalcolor + \hb@xt@\textwidth{\@thehead}% + \color@endbox + }% %% 22 Feb 87 + \dp\@tempboxa \z@ + \box\@tempboxa + \vskip \headsep + \box\@outputbox + \baselineskip \footskip + \color@hbox + \normalcolor + \hb@xt@\textwidth{\@thefoot}% + \color@endbox + }% + }% + \global\let\if@newlist\@@if@newlist + \global \@colht \textheight + \stepcounter{page}% + \let\firstmark\botmark +} + +%%% Remove extra xkanjiskip +\renewcommand\@makefnmark{% + \unless\ifnum\ltjgetparameter{direction}=3 + \hbox{}\hbox{\@textsuperscript{\normalfont\@thefnmark}}\hbox{}% + \else\hbox{\yoko \@textsuperscript{\normalfont\@thefnmark}}\fi} +\begingroup +\@ifpackageloaded{hyperref} + {\def\ltj@setrefprefix{real}} + {\def\ltj@setrefprefix{}} +\expandafter\gdef\csname \ltj@setrefprefix @setref\endcsname#1#2#3{% + \ifx#1\relax + \protect\G@refundefinedtrue + \nfss@text{\reset@font\bfseries ??}% + \@latex@warning{Reference `#3' on page \thepage \space + undefined}% + \else + \expandafter#2#1\protect\@setref@{}% change \null to \protect\@setref@{} + \fi} +\gdef\@setref@{\ifhmode\spacefactor\@m\fi} +\endgroup +\if@compatibility\else +\def\verb{\relax\ifmmode\hbox\else\leavevmode\vadjust{}\fi + \bgroup + \verb@eol@error \let\do\@makeother \dospecials + \verbatim@font\@noligs + \language\l@nohyphenation + \@ifstar\@sverb\@verb} +\fi +\gdef\@stopfield{% + \inhibitglue\@tempskipa\lastskip\unskip + \hskip\@tempskipa\color@endgroup\egroup} +\pretocmd{\footnote}{\inhibitglue}{}{} +\pretocmd{\footnotemark}{\inhibitglue}{}{} +\patchcmd{\@footnotemark}{\@makefnmark}{% + \unless\ifnum\ltjgetparameter{direction}=3 \@makefnmark% + \else\hbox to\z@{\hskip-.25\zw\raise.9\zh\@makefnmark\hss}\fi% +}{}{} +\let\@parboxto\@empty +\long\def\@iiiparbox#1#2[#3]#4#5{% + \leavevmode + \@pboxswfalse + \setlength\@tempdima{#4}% + \@begin@tempboxa\vbox{\hsize\@tempdima\@parboxrestore#5\@@par}% + \ifx\relax#2\else + \setlength\@tempdimb{#2}% + \edef\@parboxto{to\the\@tempdimb}% + \fi + \if#1b\vbox + \else\if #1t\vtop + \else\ifmmode\vcenter + \else\@pboxswtrue\null$\vcenter% !!! + \fi\fi\fi + \@parboxto{\let\hss\vss\let\unhbox\unvbox + \csname bm@#3\endcsname}% + \if@pboxsw \m@th$\null\fi% !!! + \@end@tempboxa} +\def\underline#1{% + \relax + \ifmmode\@@underline{#1}% + \else \leavevmode\null$\@@underline{\hbox{#1}}\m@th$\null\relax\fi} + +%%% AtBeginDvi +\def \AtBeginDvi #1{% + \global \setbox \@begindvibox + \vbox{\yoko\unvbox \@begindvibox #1}% +} + +\newif\iffnfixbottom +\newif\ifltj@ftn@unvboxed +%%% @makecol +\gdef \@makecol {% + \ifvoid\footins + \ltj@ftn@unvboxedfalse + \setbox\@outputbox \box\@cclv + \else + \ltj@ftn@unvboxedtrue + \setbox\@outputbox \vbox {% + \boxmaxdepth \@maxdepth + \unvbox \@cclv + \iffnfixbottom\vskip\z@ \@plus.0001fil\fi + \vskip \skip\footins + \color@begingroup + \normalcolor + \footnoterule + \unvbox \footins + \color@endgroup + }% + \fi + \let\@elt\relax + \xdef\@freelist{\@freelist\@midlist}% + \global \let \@midlist \@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht {% + \@texttop + \dimen@ \dp\@outputbox + \unvbox \@outputbox + \ifnum\ltjgetparameter{direction}=4\else\vbox{\hskip\z@}\fi %%% LuaTeX-ja + \vskip -\dimen@ + \ifltj@ftn@unvboxed\iffnfixbottom\else\@textbottom\fi\else\@textbottom\fi + }% + \fi + \global \maxdepth \@maxdepth +} +\let\ltj@orig@makecol=\@makecol + +\patchcmd\@makespecialcolbox{\@textbottom}{\ifltj@ftn@unvboxed\iffnfixbottom\else\@textbottom\fi\else\@textbottom\fi}{}{} + +\def\@gnewline #1{% + \ifvmode + \@nolnerr + \else + \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break \null + % \null は \break の効果が行頭禁則文字で打ち消されないために必要 + \ignorespaces +\fi} + + +%%%%%% tabular (platex/#43) \@tabclassz +\def\ltj@sharp{\relax\pltx@next@inhibitglue\ltjfakeboxbdd\ignorespaces\@sharp\unskip\ltjfakeboxbdd} +\def\@tabclassz{% + \ifcase\@lastchclass + \@acolampacol + \or + \@ampacol + \or + \or + \or + \@addamp + \or + \@acolampacol + \or + \@firstampfalse\@acol + \fi + \edef\@preamble{% + \@preamble{% + \ifcase\@chnum + \hfil\hskip1sp\ltj@sharp\hfil + \or + \hskip1sp\ltj@sharp\hfil + \or + \hfil\hskip1sp\ltj@sharp + \fi}}} +\patchcmd\@classv{% + \ignorespaces\@sharp +}{% + \everypar\expandafter{\the\everypar\ltjfakeboxbdd}\ignorespaces\@sharp\unskip +}{}{} +\patchcmd{\@tabular}{\leavevmode}{\leavevmode\null}{}{} +\apptocmd{\endtabular}{\null}{}{} +\expandafter \let \csname endtabular*\endcsname = \endtabular + +%%%%%% tabbing (platex/#53) +\patchcmd\@startline{\strut}{\strut\inhibitglue}{}{} +\def\ltj@unhbox@curfield{\ltjfakeboxbdd\unhbox\@curfield\ltjfakeboxbdd} +%\patchcmd\@contfield{\unhbox\@curfield}{\ltj@unhbox@curfield}{}{} +\patchcmd\@addfield{\unhbox\@curfield}{\ltj@unhbox@curfield}{}{} +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjdefs.sty b/macros/luatex/generic/luatexja/src/patches/lltjdefs.sty new file mode 100644 index 0000000000..52649e8426 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjdefs.sty @@ -0,0 +1,230 @@ +% +% lltjdefs.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjdefs}[2019/08/21 Default font settings of LuaTeX-ja] + +\ifdefined\ltj@stdmcfont\else\def\ltj@stdmcfont{IPAExMincho}\fi +\ifdefined\ltj@stdgtfont\else\def\ltj@stdgtfont{IPAExGothic}\fi +\ifdefined\ltj@stdyokojfm\else\def\ltj@stdyokojfm{ujis}\fi +\ifdefined\ltj@stdtatejfm\else\def\ltj@stdtatejfm{ujisv}\fi +\InputIfFileExists{luatexja.cfg}{% + \typeout{*************************^^J% + * Loading luatexja.cfg.^^J% + *************************}% +}{} + +\DeclareKanjiEncodingDefaults{}{} +\DeclareErrorKanjiFont{JY3}{mc}{m}{n}{10} +\kanjifamily{mc} +\kanjiseries{m} +\kanjishape{n} +\fontsize{10}{10} +\DeclareYokoKanjiEncoding{JY3}{}{} +\DeclareKanjiSubstitution{JY3}{mc}{m}{n} +\DeclareTateKanjiEncoding{JT3}{}{} +\DeclareKanjiSubstitution{JT3}{mc}{m}{n} + +\newcommand\mcdefault{mc} +\newcommand\gtdefault{gt} +\newcommand\jttdefault{\mcdefault} +\newcommand\kanjiencodingdefault{JY3} +\newcommand\kanjifamilydefault{\mcdefault} +\newcommand\kanjiseriesdefault{\mddefault} +\newcommand\kanjishapedefault{\updefault} + +\DeclareKanjiFamily{JY3}{mc}{} +\DeclareFontShape{JY3}{mc}{m}{n}{<-> s*[\ifdefined\Cjascale\Cjascale\else 0.962216\fi] \ltj@stdmcfont:jfm=\ltj@stdyokojfm}{} +\DeclareKanjiFamily{JY3}{gt}{} +\DeclareFontShape{JY3}{gt}{m}{n}{<-> s*[\ifdefined\Cjascale\Cjascale\else 0.962216\fi] \ltj@stdgtfont:jfm=\ltj@stdyokojfm}{} +\DeclareFontShape{JY3}{mc}{bx}{n}{<-> ssub*gt/m/n}{} +\DeclareFontShape{JY3}{gt}{bx}{n}{<-> ssub*gt/m/n}{} +\DeclareFontShape{JY3}{mc}{b}{n}{<-> ssub*mc/bx/n}{} +\DeclareFontShape{JY3}{gt}{b}{n}{<-> ssub*gt/bx/n}{} + +\DeclareKanjiFamily{JT3}{mc}{} +\DeclareFontShape{JT3}{mc}{m}{n}{<-> s*[\ifdefined\Cjascale\Cjascale\else 0.962216\fi] \ltj@stdmcfont:jfm=\ltj@stdtatejfm}{} +\DeclareKanjiFamily{JT3}{gt}{} +\DeclareFontShape{JT3}{gt}{m}{n}{<-> s*[\ifdefined\Cjascale\Cjascale\else 0.962216\fi] \ltj@stdgtfont:jfm=\ltj@stdtatejfm}{} +\DeclareFontShape{JT3}{mc}{bx}{n}{<-> ssub*gt/m/n}{} +\DeclareFontShape{JT3}{gt}{bx}{n}{<-> ssub*gt/m/n}{} +\DeclareFontShape{JT3}{mc}{b}{n}{<-> ssub*mc/bx/n}{} +\DeclareFontShape{JT3}{gt}{b}{n}{<-> ssub*gt/bx/n}{} +\KanjiEncodingPair{JY3}{JT3} + +\DeclareRelationFont{JY3}{gt}{m}{}{TU}{lmr}{bx}{} +\DeclareRelationFont{JY3}{mc}{m}{}{TU}{lmr}{m}{} +\DeclareRelationFont{JY3}{mc}{bx}{}{TU}{lmr}{bx}{} +\DeclareRelationFont{JY3}{mc}{b}{}{TU}{lmr}{b}{} +\DeclareRelationFont{JT3}{gt}{m}{}{TU}{lmr}{bx}{} +\DeclareRelationFont{JT3}{mc}{m}{}{TU}{lmr}{m}{} +\DeclareRelationFont{JT3}{mc}{bx}{}{TU}{lmr}{bx}{} +\DeclareRelationFont{JT3}{mc}{b}{}{TU}{lmr}{b}{} + +\kanjiencoding{JY3}\selectfont\adjustbaseline + +\DeclareTextFontCommand{\textmc}{\mcfamily} +\DeclareTextFontCommand{\textgt}{\gtfamily} +\DeclareOldFontCommand{\mc}{\normalfont\mcfamily}{} +\DeclareOldFontCommand{\gt}{\normalfont\gtfamily}{} + +\unless\ifltj@disablejfam + \DeclareSymbolFont{mincho}{JY3}{mc}{m}{n} + \jfam\symmincho + \SetSymbolFont{mincho}{bold}{JY3}{gt}{m}{n} + \DeclareSymbolFontAlphabet{\mathmc}{mincho} + \DeclareMathAlphabet{\mathgt}{JY3}{gt}{m}{n} +\fi + +\newif\if@ltj@match@family +\@ltj@match@familyfalse +\def\verbatim@font{\normalfont\ttfamily\kanjifamily\jttdefault\selectfont} +\DeclareRobustCommand\rmfamily + {\not@math@alphabet\rmfamily\mathrm + \romanfamily\rmdefault + \if@ltj@match@family\kanjifamily\mcdefault\fi\selectfont} +\DeclareRobustCommand\sffamily + {\not@math@alphabet\sffamily\mathsf + \romanfamily\sfdefault + \if@ltj@match@family\kanjifamily\gtdefault\fi\selectfont} +\DeclareRobustCommand\ttfamily + {\not@math@alphabet\ttfamily\mathtt + \romanfamily\ttdefault + \if@ltj@match@family\kanjifamily\jttdefault\fi\selectfont} +%%% \eminnershape +\DeclareRobustCommand\em + {\@nomath\em \ifdim \fontdimen\@ne\font >\z@ + \eminnershape \else \gtfamily \itshape \fi} +\def\eminnershape{\mcfamily \upshape} + +\ltjdefcharrange{1}{"80-"36F, "1E00-"1EFF} +\ltjdefcharrange{2}{"370-"4FF, "1F00-"1FFF} +\ltjdefcharrange{3}{% + "2000-"243F, "2500-"27BF, "2900-"29FF, "2B00-"2BFF} +\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 +\ltjdefcharrange{5}{"D800-"DFFF, "E0000-"E00FF, "E01F0-"10FFFF} +\ltjdefcharrange{6}{% + "2460-"24FF, "2E80-"2EFF, "3000-"30FF, "3190-"319F, "31F0-"4DBF, + "4E00-"9FFF, "F900-"FAFF, "FE10-"FE1F, "FE30-"FE6F, "FF00-"FFEF, + "1B000-"1B16F, "1F100-"1F2FF, "20000-"2FFFF, "E0100-"E01EF +} +\ltjdefcharrange{7}{% + "1100-"11FF, "2F00-"2FFF, "3100-"318F, "31A0-"31EF, "A000-"A4CF, + "A960-"A97F, "AC00-"D7FF +} +\ltjdefcharrange{8}{"A7, "A8, "B0, "B1, "B4, "B6, "D7, "F7} +\ltjsetparameter{jacharrange={-1, +2, +3, -4, -5, +6, +7, -8}} + +\directlua{for x=128,255 do luatexja.math.is_math_letters[x] = true end} +\protected\def\<{\ifvmode\leavevmode\fi\inhibitglue} + +\directlua{luatexja.jfont.register_vert_replace{ + [',']='、', ['.']='。', ['“']=0x301D, ['”']=0x301F, +}} + +% END OF FILE +\endinput + +======== comment ======== + +MIDDLE + +\ltjdefcharrange{1}{"80-"36F, "1E00-"1EFF} + % 2 "80-"FF num = 471/128 name = Latin-1 Supplement + % 3 "100-"17F num = 484/128 name = Latin Extended-A + % 4 "180-"24F num = 87/208 name = Latin Extended-B + % 5 "250-"2AF num = 154/96 name = IPA Extensions + % 6 "2B0-"2FF num = 42/80 name = Spacing Modifier Letters + % 7 "300-"36F num = 98/112 name = Combining Diacritical Marks + % 64 "1E00-"1EFF num = 16/256 name = Latin Extended Additional + +\ltjdefcharrange{2}{"370-"4FF, "1F00-"1FFF} + % Greek and Coptic, Cyrillic, Greek Extended + +\ltjdefcharrange{3}{% + "2000-"243F, "2500-"27BF, "2900-"29FF, "2B00-"2BFF} + % 66 "2000-"206F num = 140/112 name = General Punctuation + % 67 "2070-"209F num = 68/48 name = Superscripts and Subscripts + % 68 "20A0-"20CF num = 5/48 name = Currency Symbols + % 69 "20D0-"20FF num = 2/48 name = Combining Diacritical Marks for Symbols + % 70 "2100-"214F num = 46/80 name = Letterlike Symbols + % 71 "2150-"218F num = 90/64 name = Number Forms + % 72 "2190-"21FF num = 39/112 name = Arrows + % 73 "2200-"22FF num = 210/256 name = Mathematical Operators + % 74 "2300-"23FF num = 69/256 name = Miscellaneous Technical + % 75 "2400-"243F num = 1/64 name = Control Pictures + % 78 "2500-"257F num = 241 name = Box Drawing + % 79 "2580-"259F num = 17 name = Block Elements + % 80 "25A0-"25FF num = 70 name = Geometric Shapes + % 81 "2600-"26FF num = 49 name = Miscellaneous Symbols + % 82 "2700-"27BF num = 23 name = Dingbats + % 86 "2900-"297F num = 2 name = Supplemental Arrows-B + % 87 "2980-"29FF num = 4 name = Miscellaneous Mathematical Symbols-B + % 89 "2B00-"2BFF num = 3 name = Miscellaneous Symbols and Arrows + +\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 + +\ltjdefcharrange{5}{"D800-"DFFF, "E0000-"E00FF, "E01F0-"10FFFF} + % Surrogates, Tags + % 208 "F0000-"FFFFF num = 0/65536 name = Supplementary Private Use Area-A + % 209 "100000-"10FFFF num = 0/65536 name = Supplementary Private Use Area-B + +POSITIVE + +% Japanese +\ltjdefcharrange{6}{% + "2460-"24FF, "2E80-"2EFF, "3000-"30FF, "3190-"319F, "31F0-"4DBF, + "4E00-"9FFF, "F900-"FAFF, "FE10-"FE1F, "FE30-"FE6F, "FF00-"FFEF, + "1B000-"1B16F, "1F100-"1F2FF, "20000-"2FFFF, "E0100-"E01EF +} +% 77 "2460-"24FF num = 150/160 name = Enclosed Alphanumerics +% 98 "2E80-"2EFF num = 21 name = CJK Radicals Supplement +% 101 "3000-"303F num = 144 name = CJK Symbols and Punctuation +% 102 "3040-"309F num = 1074 name = Hiragana +% 103 "30A0-"30FF num = 985 name = Katakana +% 106 "3190-"319F num = 16/16 name = Kanbun +% 109 "31F0-"31FF num = 128 name = Katakana Phonetic Extensions +% 110 "3200-"32FF num = 143 name = Enclosed CJK Letters and Months +% 111 "3300-"33FF num = 255 name = CJK Compatibility +% 112 "3400-"4DBF num = 203 name = CJK Unified Ideographs Extension A +% 114 "4E00-"9FFF num = 14087 name = CJK Unified Ideographs +% 143 "F900-"FAFF num = 110/512 name = CJK Compatibility Ideographs +% 147 "FE10-"FE1F num = 0/16 name = Vertical Forms +% 149 "FE30-"FE4F num = 8/32 name = CJK Compatibility Forms +% 150 "FE50-"FE6F num = 0/32 name = Small Form Variants +% "FF00-"FFEF name = Halfwidth and Fullwidth Forms +% "1B000-"1B0FF name = Kana Supplement +% "1B100-"1B12F name = Kana Extended-A +% "1B130-"1B16F name = Small Kana Extension +% "1F100-"1F1FF name = Enclosed Alphanumeric Supplement +% "1F200-"1F2FF name = Enclosed Ideographic Supplement +% SIP +% "E0000-"E01EF name = Variation Selectors Supplement + +\ltjdefcharrange{7}{% + "1100-"11FF, "2F00-"2FFF, "3100-"318F, "31A0-"31EF, "A000-"A4CF, + "A960-"A97F, "AC00-"D7FF +} + % 35 "1100-"11FF num = 1 name = Hangul Jamo + % 99 "2F00-"2FDF num = 0/224 name = Kangxi Radicals + % 100 "2FF0-"2FFF num = 0/16 name = Ideographic Description Characters + % 104 "3100-"312F num = 0/48 name = Bopomofo + % 105 "3130-"318F num = 0/96 name = Hangul Compatibility Jamo + % 107 "31A0-"31BF num = 0/32 name = Bopomofo Extended + % 108 "31C0-"31EF num = 0/48 name = CJK Strokes + % 115 "A000-"A48F num = 0/1168 name = Yi Syllables + % 116 "A490-"A4CF num = 0/64 name = Yi Radicals + % "A960-"A97F name = Hangul Jamo Extended-A + % 137 "AC00-"D7AF num = 0/11184 name = Hangul Syllables + % 138 "D7B0-"D7FF num = 0/80 name = Hangul Jamo Extended-B diff --git a/macros/luatex/generic/luatexja/src/patches/lltjfont.sty b/macros/luatex/generic/luatexja/src/patches/lltjfont.sty new file mode 100644 index 0000000000..8068d3326b --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjfont.sty @@ -0,0 +1,874 @@ +% +% lltjfont.sty: derived from plfonts.dtx in pLaTeX. +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjfont}[2019/08/21 Patch to NFSS2 for LuaTeX-ja] + +\def\ltj@chardef@text@cmd#1{% + \let\@ifdefinable\@@ifdefinable% + \edef\ltj@chardef@text@cmd@name{\expandafter\@gobble\string#1}% + \afterassignment\ltj@chardef@text@cmd@\ltj@tempcnta +} +\def\ltj@chardef@text@cmd@{% + \ifnum\ltj@tempcnta>"7F + \expandafter\edef\csname \ltj@chardef@text@cmd@name\endcsname{% + \noexpand\ltjalchar\the\ltj@tempcnta\space + }% + \else + \expandafter\chardef\csname \ltj@chardef@text@cmd@name\endcsname\ltj@tempcnta + \fi +} +\def\DeclareTextSymbol#1#2#3{% + \@dec@text@cmd\ltj@chardef@text@cmd#1{#2}#3\relax +} + +\ifdefined\UnicodeEncodingName + \let\ltj@temp@DeclareTextComposite=\DeclareTextComposite + \def\DeclareTextComposite#1#2#3#4{}% + \input{tuenc.def} + \let\DeclareTextComposite=\ltj@temp@DeclareTextComposite + \expandafter\patchcmd\csname TU\string\textasteriskcentered\endcsname{\char}{\ltjalchar}{}{} +\fi + + +\let\k@encoding\@empty +\let\ck@encoding\@empty +% LuaTeX-ja uses JY3 and JT3 encodings. +\def\cy@encoding{JY3}\def\ct@encoding{JT3} + +\let\k@family\@empty +\let\k@series\@empty +\let\k@shape\@empty +\def\curr@kfontshape{\k@encoding/\k@family/\k@series/\k@shape} +\def\rel@fontshape{\f@encoding/\f@family/\f@series/\f@shape} +\ifdefined\Cht\else\newdimen\Cht\fi +\ifdefined\cht\else\newdimen\cht\fi +\ifdefined\Cdp\else\newdimen\Cdp\fi +\ifdefined\cdp\else\newdimen\cdp\fi +\ifdefined\Cwd\else\newdimen\Cwd\fi +\ifdefined\cwd\else\newdimen\cwd\fi +\ifdefined\Cvs\else\newdimen\Cvs\fi +\ifdefined\cvs\else\newdimen\cvs\fi +\ifdefined\Chs\else\newdimen\Chs\fi +\ifdefined\chs\else\newdimen\chs\fi +\ifdefined\cHT\else\newdimen\cHT\fi +%\let\afont\font + +\let\ystrutbox\strutbox +\newbox\dstrutbox +\newbox\tstrutbox +\newbox\zstrutbox +\def\strutbox{% + \ifnum\ltjgetparameter{direction}=1 \dstrutbox % dtou + \else\ifnum\ltjgetparameter{direction}=4 \ystrutbox % yoko + \else\tstrutbox % tate and utod + \fi\fi +} +\def\strut{\relax + \ifnum\ltjgetparameter{direction}=1 % dtou + \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi + \else\ifnum\ltjgetparameter{direction}=4 % yoko + \ifmmode\copy\ystrutbox\else\unhcopy\ystrutbox\fi + \else % tate and utod + \ifmmode\copy\tstrutbox\else\unhcopy\tstrutbox\fi + \fi\fi +} + +\def\ystrut{\relax\hbox{\ltj@@orig@yoko + \ifmmode\copy\ystrutbox\else\unhcopy\ystrutbox\fi}} +\def\tstrut{\relax\hbox{\ltj@@orig@tate + \ifmmode\copy\tstrutbox\else\unhcopy\tstrutbox\fi}} +\def\dstrut{\relax\hbox{\ltj@@orig@dtou + \ifmmode\copy\dstrutbox\else\unhcopy\dstrutbox\fi}} +\def\zstrut{\relax\hbox{\ltj@@orig@utod + \ifmmode\copy\zstrutbox\else\unhcopy\zstrutbox\fi}} + +{% + \def\cdp@elt#1#2#3#4{% + \directlua{luatexja.jfont.add_fenc_list('\luatexluaescapestring{#1}')}}% + \cdp@list% +} + +\def\DeclareFontEncoding{% + \begingroup + \nfss@catcodes + \expandafter\endgroup + \DeclareFontEncoding@} +\def\DeclareFontEncoding@#1#2#3{% + \expandafter + \ifx\csname T@#1\endcsname\relax + \def\cdp@elt{\noexpand\cdp@elt}% + \xdef\cdp@list{\cdp@list\cdp@elt{#1}% + {\default@family}{\default@series}% + {\default@shape}}% + \expandafter\let\csname#1-cmd\endcsname\@changed@cmd + \directlua{luatexja.jfont.add_fenc_list('\luatexluaescapestring{#1}')}% + \else + \@font@info{Redeclaring font encoding #1}% + \fi + \global\@namedef{T@#1}{#2}% + \global\@namedef{M@#1}{\default@M#3}% + \xdef\LastDeclaredEncoding{#1}% + } +\def\DeclareKanjiEncoding#1{% + \@latex@warning{% + The \string\DeclareKanjiEncoding\space is obsoleted command. Please use + \MessageBreak + the \string\DeclareTateKanjiEncoding\space for `Tate-kumi' encoding, and + \MessageBreak + the \string\DeclareYokoKanjiEncoding\space for `Yoko-kumi' encoding. + \MessageBreak + I treat the `#1' encoding as `Yoko-kumi'.} + \DeclareYokoKanjiEncoding{#1}% +} +\def\DeclareYokoKanjiEncoding{% + \begingroup + \nfss@catcodes + \expandafter\endgroup + \DeclareYokoKanjiEncoding@} +\def\DeclareYokoKanjiEncoding@#1#2#3{% + \expandafter\ifx\csname T@#1\endcsname\relax + \def\cdp@elt{\noexpand\cdp@elt}% + \xdef\cdp@list{\cdp@list\cdp@elt{#1}% + {\default@k@family}{\default@k@series}% + {\default@k@shape}}% + \expandafter\let\csname#1-cmd\endcsname\@changed@kcmd + \directlua{luatexja.jfont.add_kyenc_list('\luatexluaescapestring{#1}')}% + \else + \@font@info{Redeclaring KANJI (yoko) font encoding #1}% + \fi + \global\@namedef{T@#1}{#2}% + \global\@namedef{M@#1}{\default@KM#3}% + } +\def\DeclareTateKanjiEncoding{% + \begingroup + \nfss@catcodes + \expandafter\endgroup + \DeclareTateKanjiEncoding@} +\def\DeclareTateKanjiEncoding@#1#2#3{% + \expandafter\ifx\csname T@#1\endcsname\relax + \def\cdp@elt{\noexpand\cdp@elt}% + \xdef\cdp@list{\cdp@list\cdp@elt{#1}% + {\default@k@family}{\default@k@series}% + {\default@k@shape}}% + \expandafter\let\csname#1-cmd\endcsname\@changed@kcmd + \directlua{luatexja.jfont.add_ktenc_list('\luatexluaescapestring{#1}')}% + \else + \@font@info{Redeclaring KANJI (tate) font encoding #1}% + \fi + \global\@namedef{T@#1}{#2}% + \global\@namedef{M@#1}{\default@KM#3}% + } +\@onlypreamble\DeclareKanjiEncoding +\@onlypreamble\DeclareYokoKanjiEncoding +\@onlypreamble\DeclareYokoKanjiEncoding@ +\@onlypreamble\DeclareTateKanjiEncoding +\@onlypreamble\DeclareTateKanjiEncoding@ +\def\DeclareKanjiEncodingDefaults#1#2{% + \ifx\relax#1\else + \ifx\default@KT\@empty\else + \@font@info{Overwriting KANJI encoding scheme text defaults}% + \fi + \gdef\default@KT{#1}% + \fi + \ifx\relax#2\else + \ifx\default@KM\@empty\else + \@font@info{Overwriting KANJI encoding scheme math defaults}% + \fi + \gdef\default@KM{#2}% + \fi} +\let\default@KT\@empty +\let\default@KM\@empty +\@onlypreamble\DeclareKanjiEncodingDefaults +\def\DeclareFontFamily#1#2#3{% + \@ifundefined{T@#1}% + {\@latex@error{Encoding scheme `#1' unknown}\@eha}% + {\def\reserved@a{#3}% + \global + \expandafter\let\csname #1+#2\expandafter\endcsname + \ifx \reserved@a\@empty + \@empty + \else \reserved@a + \fi + \directlua{luatexja.jfont.add_ffam('\luatexluaescapestring{#2}')}% + }% +} +\def\DeclareKanjiFamily#1#2#3{% + \@ifundefined{T@#1}% + {\@latex@error{KANJI Encoding scheme `#1' unknown}\@eha}% + {\def\reserved@a{#3}% + \global + \expandafter\let\csname #1+#2\expandafter\endcsname + \ifx \reserved@a\@empty + \@empty + \else \reserved@a + \fi + \directlua{luatexja.jfont.add_kfam('\luatexluaescapestring{#2}')}% + }% +} +\def\DeclareKanjiSubstitution#1#2#3#4{% + \expandafter\ifx\csname T@#1\endcsname\relax + \@latex@error{KANJI Encoding scheme `#1' unknown}\@eha + \else + \begingroup + \def\reserved@a{#1}% + \toks@{}% + \def\cdp@elt##1##2##3##4{% + \def\reserved@b{##1}% + \ifx\reserved@a\reserved@b + \addto@hook\toks@{\cdp@elt{#1}{#2}{#3}{#4}}% + \else + \addto@hook\toks@{\cdp@elt{##1}{##2}{##3}{##4}}% + \fi}% + \cdp@list + \xdef\cdp@list{\the\toks@}% + \endgroup + \global\@namedef{D@#1}{\def\default@family{#2}% + \def\default@series{#3}% + \def\default@shape{#4}}% + \fi} +\@onlypreamble\DeclareKanjiSubstitution +\def\DeclareErrorKanjiFont#1#2#3#4#5{% + \xdef\error@kfontshape{% + \noexpand\expandafter\noexpand\split@name\noexpand\string + \expandafter\noexpand\csname#1/#2/#3/#4/#5\endcsname + \noexpand\@nil}% + \gdef\default@k@family{#2}% + \gdef\default@k@series{#3}% + \gdef\default@k@shape{#4}% + } +\@onlypreamble\DeclareErrorKanjiFont + +\newif\ifltjselectfont@force@define +\def\DeclareFixedFont#1#2#3#4#5#6{% + \begingroup + \math@fontsfalse + \every@math@size{}% + \fontsize{#6}\z@ + \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#2}')}\ifin@% + \ltjselectfont@force@definetrue + \usekanji{#2}{#3}{#4}{#5}% + \global\let#1\getjfont + \ltjselectfont@force@definefalse + \else + \directlua{luatexja.jfont.is_ktenc('\luatexluaescapestring{#2}')}\ifin@% + \ltjselectfont@force@definetrue + \usekanji{#2}{#3}{#4}{#5}% + \global\let#1\gettfont + \ltjselectfont@force@definefalse + \else + \useroman{#2}{#3}{#4}{#5}% + \global\expandafter\let\expandafter#1\the\font + \fi + \fi + \endgroup + } +\def\DLMfontsw@standard#1#2#3{#1{#2{#3}}} +\def\reDeclareMathAlphabet#1#2#3{% + \ifdefined#2 + \@temptokena\expandafter{#2}% + \else + \@temptokena{#2}% + \fi + \ifdefined#3 + \toks0\expandafter{#3}% + \else + \toks0{#3}% + \fi + \long\protected\edef#1{% + \noexpand\DLMfontsw@standard{\the\@temptokena}{\the\toks0}}% +} +\@onlypreamble\reDeclareMathAlphabet +\def\all@shape{all}% +\def\DeclareRelationFont#1#2#3#4#5#6#7#8{% + \def\rel@shape{#4}% + \ifx\rel@shape\@empty + \global + \expandafter\def\csname rel@#1/#2/#3/all\endcsname{% + \romanencoding{#5}\romanfamily{#6}% + \romanseries{#7}}% + \else + \global + \expandafter\def\csname rel@#1/#2/#3/#4\endcsname{% + \romanencoding{#5}\romanfamily{#6}% + \romanseries{#7}\romanshape{#8}}% + \fi +} +\def\SetRelationFont#1#2#3#4#5#6#7#8{% + \def\rel@shape{#4}% + \ifx\rel@shape\@empty + \expandafter\def\csname rel@#1/#2/#3/all\endcsname{% + \romanencoding{#5}\romanfamily{#6}% + \romanseries{#7}}% + \else + \expandafter\def\csname rel@#1/#2/#3/#4\endcsname{% + \romanencoding{#5}\romanfamily{#6}% + \romanseries{#7}\romanshape{#8}}% + \fi +} +\newif\if@knjcmd +\def\userelfont{\@knjcmdtrue} + + +\RequirePackage{everysel} +\let\ltj@@EverySelectfont@Init=\@EverySelectfont@Init +\expandafter\expandafter\expandafter\let +\expandafter\expandafter\csname ltj@@orig@selectfont\endcsname\csname selectfont\space\endcsname +\@EverySelectfont@Init +%\let\ltj@@font@info\@font@info +%\let\ltj@@font@warning\@font@warning +\def\@EverySelectfont@Init{% + \expandafter\let\csname selectfont\space \endcsname \ltj@@orig@selectfont + \ltj@@EverySelectfont@Init +} +\def\ltj@selectfont@tate{% + \let\k@encoding\ct@encoding + \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% + \pickup@tfont + \ifnum\ltjgetparameter{direction}=3 \font@name + \ltj@@does@alt@set{\curr@kfontshape}{% + % alt fonts の定義 + \directlua{luatexja.jfont.output_alt_font_cmd('t', '\luatexluaescapestring{\curr@kfontshape}')}% + % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする + \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% + }% + \fi} +\def\ltj@selectfont@yoko{% + \let\k@encoding\cy@encoding + \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% + \pickup@jfont + \unless\ifnum\ltjgetparameter{direction}=3 \font@name + \ltj@@does@alt@set{\curr@kfontshape}{% + % alt fonts の定義 + \directlua{luatexja.jfont.output_alt_font_cmd('y', '\luatexluaescapestring{\curr@kfontshape}')}% + % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする + \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% + }% + \fi} +\def\ltj@selectfont@patch{% + \directlua{luatexja.base.start_time_measure('selectfont')}% + \let\tmp@error@fontshape\error@fontshape + \let\error@fontshape\error@kfontshape + \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{\k@encoding}')}\ifin@% + \let\cy@encoding\k@encoding + \edef\ct@encoding{\csname t@enc@\k@encoding\endcsname}% + \else + \directlua{luatexja.jfont.is_ktenc('\luatexluaescapestring{\k@encoding}')}\ifin@% + \let\ct@encoding\k@encoding + \edef\cy@encoding{\csname y@enc@\k@encoding\endcsname}% + \else + \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha + \fi + \fi + \global\let\ltj@afont@name=\font@name + \ltj@selectfont@tate\ltj@selectfont@yoko +% + \edef\tmp@item{{\k@encoding}}\expandafter\def\expandafter\k@encoding\tmp@item + \kenc@update + \global\let\font@name=\ltj@afont@name + \let\error@fontshape\tmp@error@fontshape + \if@knjcmd \@knjcmdfalse + \expandafter\ifx + \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname\relax + \expandafter\ifx + \csname rel@\k@encoding/\k@family/\k@series/all\endcsname\relax + \else + \csname rel@\k@encoding/\k@family/\k@series/all\endcsname\selectfont + % 警告: 再び \selectfont を呼んでいる.無限ループの可能性あり + \fi + \else + \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname\selectfont + % 警告: 再び \selectfont を呼んでいる.無限ループの可能性あり + \fi + \fi + \global\let\font@name=\ltj@afont@name + \directlua{luatexja.base.stop_time_measure('selectfont')}% +} +\EverySelectfont{\ltj@selectfont@patch} + +\bgroup + \def\ltj@@dir@patch#1#2#3{% + \global\csletcs{ltj@@orig@#1}{#1}% + \protected\expandafter\xdef\csname #1\endcsname{% + \csname ltj@@orig@#1\endcsname + \unexpanded{\ifnum#3<\z@\let\ltj@@protect\protect\set@typeset@protect}% + \unexpanded{\global\let\ltj@afont@name=\font@name}% + \expandonce{\csname ltj@selectfont@#2\endcsname}% + \unexpanded{\global\let\font@name=\ltj@afont@name}% + \unexpanded{\let\protect\ltj@@protect\fi}% + }% + } + \ltj@@dir@patch{yoko}{yoko}{\ltj@curjfnt} + \ltj@@dir@patch{tate}{tate}{\ltj@curtfnt} + \ltj@@dir@patch{utod}{yoko}{\ltj@curjfnt} + \ltj@@dir@patch{dtou}{yoko}{\ltj@curjfnt} +\egroup + +\def\KanjiEncodingPair#1#2{\@namedef{t@enc@#1}{#2}\@namedef{y@enc@#2}{#1}} +\def\set@fontsize#1#2#3{% + \@defaultunits\@tempdimb#2pt\relax\@nnil + \edef\f@size{\strip@pt\@tempdimb}% + \@defaultunits\@tempskipa#3pt\relax\@nnil + \edef\f@baselineskip{\the\@tempskipa}% + \edef\f@linespread{#1}% + \let\baselinestretch\f@linespread + \def\size@update{% + \baselineskip\f@baselineskip\relax + \baselineskip\f@linespread\baselineskip + \normalbaselineskip\baselineskip + \adjustbaseline + \setbox\ystrutbox\hbox{\ltj@@orig@yoko + \vrule\@width\z@ + \@height.7\baselineskip \@depth.3\baselineskip}% + \setbox\dstrutbox\hbox{\ltj@@orig@dtou + \vrule\@width\z@ + \@height.7\baselineskip \@depth.3\baselineskip}% + \setbox\tstrutbox\hbox{\ltj@@orig@tate + \vrule\@width\z@ + \@height.5\baselineskip \@depth.5\baselineskip}% + \setbox\zstrutbox\hbox{\ltj@@orig@utod + \vrule\@width\z@ + \@height.7\baselineskip \@depth.3\baselineskip}% + \let\size@update\relax}} + +\newluafunction\ltj@@adjust@baseline@inner +\begingroup\catcode`\~=12 +\directlua{% + local nulltable = {} + local t = lua.get_functions_table() + local getfont, dir_tate = font.getfont, luatexja.dir_table.dir_tate + local fmt, get_attr = luatexja.jfont.font_metric_table, tex.getattribute + local getcount=tex.getcount + local setdimen, set_attr = tex.setdimen, tex.setattribute + local dir = luatexja.unary_pars.direction + t[\the\ltj@@adjust@baseline@inner] = function() + local ft = fmt[get_attr('ltj@curtfnt')] or nulltable + ft = ft.char_type or nulltable + local fk = ft[0] or nulltable + local ht, dp, wd = fk.height or 0, fk.depth or 0, + fk.width or ft.zw or 0 + local fm + = ((getfont(font.current()) or nulltable) + .characters or nulltable)[77] or nulltable %% 'M' + set_attr('ltj@tablshift', + tex.round(0.5*((fm.height or 0)- (fm.depth or 0) - ht+ dp))) + if dir() ~= dir_tate then + ft = fmt[get_attr('ltj@curjfnt')] or nulltable + ft = ft.char_type or nulltable + fk = ft[0] or nulltable + ht, dp, wd = fk.height or 0, fk.depth or 0, + fk.width or ft.zw or 0 + end + setdimen('cht', ht); setdimen('cdp', dp) + setdimen('cwd', wd); setdimen('chs', wd) + setdimen('cHT', ht+dp) + end +}\endgroup +\def\adjustbaseline{\luafunction\ltj@@adjust@baseline@inner + \cvs\normalbaselineskip} +\DeclareRobustCommand\romanencoding[1]{% + \expandafter\ifx\csname T@#1\endcsname\relax + \@latex@error{Encoding scheme `#1' unknown}\@eha + \else + \edef\f@encoding{#1}% + \ifx\cf@encoding\f@encoding + \let\enc@update\relax + \else + \let\enc@update\@@enc@update + \fi + \fi +} +\DeclareRobustCommand\kanjiencoding[1]{% + \expandafter\ifx\csname T@#1\endcsname\relax + \@latex@error{KANJI Encoding scheme `#1' unknown}\@eha + \else + \edef\k@encoding{#1}% + \ifx\ck@encoding\k@encoding + \let\kenc@update\relax + \else + \let\kenc@update\@@kenc@update + \fi + \fi +} +\DeclareRobustCommand\fontencoding[1]{% + \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#1}')}\ifin@% + \kanjiencoding{#1}\else\romanencoding{#1}\fi} +\def\@@kenc@update{% + \default@KT + \csname T@\k@encoding\endcsname + \csname D@\k@encoding\endcsname + \let\kenc@update\relax + \let\ck@encoding\k@encoding + \edef\tmp@enc{'\luatexluaescapestring{\k@encoding}'}% + \directlua{luatexja.jfont.is_kyenc(\tmp@enc)}\ifin@% + \let\cy@encoding\k@encoding + \else + \directlua{luatexja.jfont.is_ktenc(\tmp@enc)}\ifin@% + \let\ct@encoding\k@encoding + \else + \@latex@error{KANJI Encoding scheme `\k@encoding' unknown}\@eha + \fi + \fi +} +\let\kenc@update\relax +\def\@changed@kcmd#1#2{% + \ifx\protect\@typeset@protect + \@inmathwarn#1% + \expandafter\ifx\csname\ck@encoding\string#1\endcsname\relax + \expandafter\ifx\csname ?\string#1\endcsname\relax + \expandafter\def\csname ?\string#1\endcsname{% + \TextSymbolUnavailable#1% + }% + \fi + \global\expandafter\let + \csname\cf@encoding \string#1\expandafter\endcsname + \csname ?\string#1\endcsname + \fi + \csname\ck@encoding\string#1% + \expandafter\endcsname + \else + \noexpand#1% + \fi} +\newif\if@notkfam +\newif\if@notffam +\newif\if@tempswz +\def\@ltj@use@fd{true} +\DeclareRobustCommand\romanfamily[1]{\edef\f@family{#1}} +\DeclareRobustCommand\kanjifamily[1]{\edef\k@family{#1}} +\DeclareRobustCommand\fontfamily[1]{% + \@notkfamfalse\@notffamfalse + \edef\tmp@item{'\luatexluaescapestring{#1}'}% + % + \directlua{luatexja.jfont.search_kfam(\tmp@item, \@ltj@use@fd)}% + \ifin@\edef\k@family{#1}\else\@notkfamtrue\fi + % + % alphabetic fonts part + \directlua{luatexja.jfont.is_ffam(\tmp@item)}% + \ifin@\edef\f@family{#1}\else + % checking is_stored_ffam is not sufficient, + % since LuaTeX-ja doesn't know whats fonts are defined before LuaTeX-ja is loaded. + \ifcsname \f@encoding+#1\endcsname % easy case + \directlua{luatexja.jfont.add_ffam(\tmp@item)}\edef\f@family{#1}% + \else + \@tempswafalse + \def\cdp@elt##1{\ifcsname ##1+#1\endcsname\@tempswatrue\fi}% + \directlua{luatexja.jfont.search_ffam_declared()}% + \if@tempswz + \directlua{luatexja.jfont.add_ffam(\tmp@item)}\edef\f@family{#1}% + \else + % now we search Nffam_list and font definition files. + \directlua{luatexja.jfont.search_ffam_fd(\tmp@item)}% + \ifin@\edef\f@family{#1}\else\@notffamtrue\fi + \fi + \fi + \fi + % + \if@notkfam\if@notffam + \edef\k@family{#1}\edef\f@family{#1}% + \fi\fi +} +\DeclareRobustCommand\romanseries[1]{\edef\f@series{#1}} +\DeclareRobustCommand\kanjiseries[1]{\edef\k@series{#1}} +\DeclareRobustCommand\fontseries[1]{\kanjiseries{#1}\romanseries{#1}} +\DeclareRobustCommand\romanshape[1]{\edef\f@shape{#1}} +\DeclareRobustCommand\kanjishape[1]{\edef\k@shape{#1}} +\DeclareRobustCommand\fontshape[1]{\kanjishape{#1}\romanshape{#1}} +\def\usekanji#1#2#3#4{% + \kanjiencoding{#1}\kanjifamily{#2}\kanjiseries{#3}\kanjishape{#4}% + \selectfont\ignorespaces} +\def\useroman#1#2#3#4{% + \romanencoding{#1}\romanfamily{#2}\romanseries{#3}\romanshape{#4}% + \selectfont\ignorespaces} +\protected\def\usefont#1#2#3#4{% + \directlua{luatexja.jfont.is_kenc('\luatexluaescapestring{#1}')}\ifin@% + \usekanji{#1}{#2}{#3}{#4}% + \else\useroman{#1}{#2}{#3}{#4}% + \fi} +\DeclareRobustCommand\normalfont{% + \kanjiencoding{\kanjiencodingdefault}% + \kanjifamily{\kanjifamilydefault}% + \kanjiseries{\kanjiseriesdefault}% + \kanjishape{\kanjishapedefault}% + \romanencoding{\encodingdefault}% + \romanfamily{\familydefault}% + \romanseries{\seriesdefault}% + \romanshape{\shapedefault}% + \selectfont\ignorespaces} +\let\reset@font\normalfont +\DeclareRobustCommand\mcfamily{% + \unless\ifltj@disablejfam\not@math@alphabet\mcfamily\mathmc\fi + \kanjifamily\mcdefault\selectfont} +\DeclareRobustCommand\gtfamily{% + \unless\ifltj@disablejfam\not@math@alphabet\gtfamily\mathgt\fi + \kanjifamily\gtdefault\selectfont} +\let\romanprocess@table\process@table +\def\kanjiprocess@table{% + \kanjiencoding{\kanjiencodingdefault}% + \kanjifamily{\kanjifamilydefault}% + \kanjiseries{\kanjiseriesdefault}% + \kanjishape{\kanjishapedefault}% +} +\def\process@table{% + \romanprocess@table + \kanjiprocess@table +} +\@onlypreamble\romanprocess@table +\@onlypreamble\kanjiprocess@table + +%%%%%% LuaTeX-ja specific + +% #1 の展開結果から encoding 部分をとりだし,それが和文用かどうかの結果を \ifin@ に代入 +\def\ltj@@IsFontJapanese#1{% + \directlua{luatexja.jfont.is_kenc(string.match( + '\luatexluaescapestring{#1}', '[^/]+'))}} + + +\let\extract@afont\extract@font +\def\pickup@jfont{% + \ifnum + \unless\ifnum\ltjgetparameter{direction}=3 1\else + \ifltjselectfont@force@define 1\else 0\fi\fi =1 % + \expandafter \ifx \font@name \relax + \let\extract@font\extract@jfont + \define@newfont + \let\extract@font\extract@afont + \fi + \let\getjfont\font@name + \else + \begingroup\escapechar\m@ne + \ifcsname ltj@@fontjfm/\expandafter\string\font@name\endcsname\else + \let\extract@font\extract@jfont@onlyjfm + \define@newfont + \let\extract@font\extract@afont + \fi + \endgroup + \csname ltj@@fontjfm/\expandafter\expandafter\expandafter\@gobble\expandafter\string\font@name\endcsname + \fi +} +\def\pickup@tfont{% + \ifnum + \ifnum\ltjgetparameter{direction}=3 1\else + \ifltjselectfont@force@define 1\else 0\fi\fi =1 % + \expandafter \ifx \font@name \relax + \let\extract@font\extract@tfont + \define@newfont + \let\extract@font\extract@afont + \fi + \let\gettfont\font@name + \else + \begingroup\escapechar\m@ne + \ifcsname ltj@@fontjfm/\expandafter\string\font@name\endcsname\else + \let\extract@font\extract@tfont@onlyjfm + \define@newfont + \let\extract@font\extract@afont + \fi + \endgroup + \csname ltj@@fontjfm/\expandafter\expandafter\expandafter\@gobble\expandafter\string\font@name\endcsname + \fi +} + +% 異なる和文 enc/fam/ser/shape からは異なるフォント番号が振られるように +% わざと「ゴミをつける」 +\def\ltj@@patch@external@font#1 at{% + \directlua{ + local s = '\luatexluaescapestring{#1}' + local is_braced, is_quoted + if s:sub(1,1)=='{' and s:sub(-1)=='}' then is_braced=true; s=s:sub(2,-2) end + if s:sub(1,1)=='"' and s:sub(-1)=='"' then is_quoted=true; s=s:sub(2,-2) end + s=s..luatexja.jfont.print_aftl_address() + if is_braced then s='{'..s..'}' elseif is_quoted then s='"'..s..'"' end + %print(s, is_quoted, is_braced) + tex.sprint(-2, s)}% + \space at% +} +\def\extract@jfont{% + \get@external@font + \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}{% + \edef\external@font{\expandafter\ltj@@patch@external@font\external@font}% + }% + \expandafter\globaljfont\font@name\external@font\relax\font@name% ここで時間がかかる + \csname \f@encoding+\f@family\endcsname + \csname\curr@fontshape\endcsname} +\def\extract@tfont{% + \get@external@font + \ltj@@does@alt@set{\f@encoding/\f@family/\f@series/\f@shape}{% + \edef\external@font{\expandafter\ltj@@patch@external@font\external@font}% + }% + \expandafter\globaltfont\font@name\external@font\relax\font@name + \csname \f@encoding+\f@family\endcsname + \csname\curr@fontshape\endcsname} +\def\extract@jfont@onlyjfm{% + \get@external@font + \csxdef{ltj@@fontjfm/\expandafter\string\font@name}{% + \directlua{% + luatexja.jfont.load_jfmonly('\luatexluaescapestring{\external@font}', 'yoko') + }% + }} +\def\extract@tfont@onlyjfm{% + \get@external@font + \csxdef{ltj@@fontjfm/\expandafter\string\font@name}{% + \directlua{% + luatexja.jfont.load_jfmonly('\luatexluaescapestring{\external@font}', 'tate') + }% + }} + +\let\ltj@@al@do@subst@correction=\do@subst@correction +\def\ltj@@ja@do@subst@correction{% + \xdef\subst@correction{% + \font@name + \global\expandafter\let\csname \curr@fontshape/\f@size\endcsname\font@name% + \relax}% + \aftergroup\subst@correction +} +\def\do@subst@correction{% + \ltj@@IsFontJapanese{\curr@fontshape}\ifin@% + \ltj@@ja@do@subst@correction + \else + \ltj@@al@do@subst@correction + \fi +} +\let\@@italiccorr=\/ + +%%%%%% Japanese font for math mode +\unless\ifltj@disablejfam + +% \M@<enc> から その <enc> が和文用か調べる +{\catcode`M=12% +\gdef\ltj@@mathJapaneseFonts#1M#2#3\relax{\ltj@@IsFontJapanese{#3}}} + +\let\ltj@@al@getanddefine@fonts=\getanddefine@fonts +\def\ltj@@ja@getanddefine@fonts#1#2{% + \csletcs{if@ltj@tempif}{ifltjselectfont@force@define}% + \ltjselectfont@force@definetrue + \xdef\font@name{\csname \string#2/\tf@size\endcsname}% + \pickup@jfont\let\textfont@name\font@name + \xdef\font@name{\csname \string#2/\sf@size\endcsname}% + \pickup@jfont\let\scriptfont@name\font@name + \xdef\font@name{\csname \string#2/\ssf@size\endcsname}% + \pickup@jfont + \csletcs{ifltjselectfont@force@define}{if@ltj@tempif}% + \edef\math@fonts{\math@fonts\ltj@setpar@global% + \ltj@@set@stackfont#1,\textfont@name:{MJT}% + \ltj@@set@stackfont#1,\scriptfont@name:{MJS}% + \ltj@@set@stackfont#1,\font@name:{MJSS}% + }% +} + +\def\getanddefine@fonts#1#2{% + \ltj@tempcnta=#1\ltj@@IsFontJapanese{\string#2}% + \ifin@\let\ltj@temp=\ltj@@ja@getanddefine@fonts% + \else \let\ltj@temp=\ltj@@al@getanddefine@fonts\fi + \ltj@temp{#1}{#2}% +} +\def\use@mathgroup#1#2{\relax\ifmmode + \math@bgroup + \expandafter\ifx\csname M@\f@encoding\endcsname#1\else + #1\fi\ltj@tempcnta=#2 \expandafter\ltj@@mathJapaneseFonts\string#1\relax% + \ifin@\jfam#2\relax\else\mathgroup#2\relax\fi + \expandafter\math@egroup\fi}% + +\fi + +%%%%%% Alternate Japanese Fonts +%%%% \DeclareAlternateKanjiFont<Benc><Bfam><Bser><Bshape><Aenc><Afam><Aser><Ashape><range> +% いつも global +\def\DeclareAlternateKanjiFont#1#2#3#4#5#6#7#8#9{% + \edef\@temp{#9}% + \ifx\@temp\@empty\else + {\def\ltj@temp@bfont{#1/#2/#3/#4}\def\ltj@temp@afont{#5/#6/#7/#8}% + \expandafter\ltj@@altfont@latex#9,,}\ignorespaces + \fi} +\def\ltj@@altfont@latex#1,{\def\ltj@temp{#1}% + \ifx\ltj@temp\empty\let\@next=\relax\else + \ltj@@altfont@latexA{#1}\let\@next=\ltj@@altfont@latex\fi\@next} +\def\ltj@@altfont@latexA#1{\ltj@@altfont@latexB#1--\@nil} +\def\ltj@@altfont@latexB#1-#2-#3\@nil{\def\ltj@temp{#3}% + \ifx\ltj@temp\empty + \ltj@tempcnta=#1\relax\ltj@tempcntb=\ltj@tempcnta + \else + \def\ltj@temp{#1}% + \ifx\ltj@temp\empty\ltj@tempcnta='200\else\ltj@tempcnta=#1\fi\relax + \def\ltj@temp{#2}% + \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF\else\ltj@tempcntb=#2\fi\relax%" + \fi + \directlua{luatexja.jfont.set_alt_font_latex( + \the\ltj@tempcnta,\the\ltj@tempcntb, + '\luatexluaescapestring{\ltj@temp@afont}', + '\luatexluaescapestring{\ltj@temp@bfont}')}% + } + +%%%% \ClearAlternateKanjiFont<Benc><Bfam><Bser><Bshape> +% いつも global +\def\ClearAlternateKanjiFont#1#2#3#4{% + \directlua{luatexja.jfont.clear_alt_font_latex('\luatexluaescapestring{#1/#2/#3/#4}')}} + +\def\ltj@pickup@altfont@auxy#1{% + \begingroup\edef\font@name{\csname #1/\f@size\endcsname}\pickup@jfont\endgroup% +} +\def\ltj@pickup@altfont@auxt#1{% + \begingroup\edef\font@name{\csname #1/\f@size\endcsname}\pickup@tfont\endgroup% +} +\def\ltj@pickup@altfont@copy#1#2{% + \ltj@@getjfontnumber#1% + \directlua{luatexja.jfont.pickup_alt_font_b(\the\ltj@tempcntc,'\luatexluaescapestring{#2}')}% +} + +\def\ltj@@does@alt@set#1#2{% + \directlua{luatexja.jfont.does_alt_set'\luatexluaescapestring{#1}'}{#2}} + +%%%% patch \@text@composite because of {y,t}albaselineshift + +% %% \pltx@isletter from plfonts.dtx +% \def\pltx@mark{\pltx@mark@} +% \let\pltx@scanstop\relax +% \long\def\pltx@cond#1\fi{% +% #1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} +% \long\def\pltx@isletter#1{% +% \expandafter\pltx@isletter@i#1\pltx@scanstop} +% \long\def\pltx@isletter@i#1\pltx@scanstop{% +% \pltx@cond\ifx\pltx@mark#1\pltx@mark\fi{\@firstoftwo}% +% {\pltx@isletter@ii\pltx@scanstop#1\pltx@scanstop{}#1\pltx@mark}} +% \long\def\pltx@isletter@ii#1\pltx@scanstop#{% +% \pltx@cond\ifx\pltx@mark#1\pltx@mark\fi% +% {\pltx@isletter@iii}{\pltx@isletter@iv}} +% \long\def\pltx@isletter@iii#1\pltx@mark{\@secondoftwo} +% \long\def\pltx@isletter@iv#1#2#3\pltx@mark{% +% \pltx@cond\ifx\pltx@mark#3\pltx@mark\fi{% +% \pltx@cond{\ifnum0\ifcat A\noexpand#21\fi\ifcat=\noexpand#21\fi>\z@}\fi +% {\@firstoftwo}{\@secondoftwo}% +% }{\@secondoftwo}} +% +% \def\@text@composite@x#1#2{% +% \ifx#1\relax +% #2% +% \else\pltx@isletter{#1}{#1}{% +% \begingroup +% \setbox\z@\hbox\bgroup% +% \ltj@yablshift\z@ \ltj@tablshift\z@ +% #1% +% \@tempcntb\directlua{luatexja.pltx_composite_last_node_char()}%) +% \xdef\pltx@composite@temp{\noexpand\@tempcntb=\the\@tempcntb\relax}% +% \aftergroup\pltx@composite@temp +% \egroup +% \ifnum\ltjgetparameter{direction}=3 % +% \@tempdima=\ltj@tablshift sp\else\@tempdima=\ltj@yablshift sp\fi +% \ifnum\@tempcntb<\z@\@tempcnta\z@\else +% \@tempcnta=\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{\@tempcntb}}\relax +% \ifnum\@tempcnta=\z@\@tempdima\z@\fi +% \fi +% \ifnum\@tempcnta>\z@ +% \ifodd\ltjgetparameter{alxspmode}{\@tempcntb}\else\leavevmode\hbox{}\fi +% \begingroup\mathsurround\z@$% +% \hbox{\lower\@tempdima\box\z@} +% $\endgroup% +% \ifnum\ltjgetparameter{alxspmode}{\@tempcntb}<2\hbox{}\fi +% \else +% \ifdim\@tempdima=\z@{\ltj@yablshift\z@ \ltj@tablshift\z@#1}% +% \else\lower\@tempdima\box\z@\fi +% \fi +% \endgroup}% +% \fi +% } + +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-array.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-array.sty new file mode 100644 index 0000000000..989fd8ce9d --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-array.sty @@ -0,0 +1,26 @@ +% +% lltjp-array.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjp-array}[2018/03/29 Patch to array for LuaTeX-ja] + +\RequirePackage{etoolbox,array} + +\patchcmd\insert@column{% + \ignorespaces\@sharp\unskip +}{% + \ltj@sharp +}{}{} + +\@ifpackageloaded{lltjext}{}{% +%% remove extra \xkanjiskip (pLaTeX2e 2016/04/17) +\def\@tabular{% + \leavevmode \null + \hbox \bgroup $\col@sep\tabcolsep \let\d@llarbegin\begingroup + \let\d@llarend\endgroup + \@tabarray} +\def\endtabular{\endarray $\egroup\null} +\expandafter \let \csname endtabular*\endcsname = \endtabular +} +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-fontspec.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-fontspec.sty new file mode 100644 index 0000000000..6f469fc08f --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-fontspec.sty @@ -0,0 +1,155 @@ +% +% lltjp-fontspec.sty 2018-08-24 +% + +\NeedsTeXFormat{LaTeX2e} + +\RequirePackage{fontspec} +\ExplSyntaxOn + +% <= v2.6g uses \l__fontspec_nfss_enc_tl instead of \g__fontspec_nfss_enc_tl +\ifdefined \g__fontspec_nfss_enc_tl \else + \def \g__fontspec_nfss_enc_tl { \l__fontspec_nfss_enc_tl } +\fi + +%%%%%%%% fontspec v2.5c overwrites \rmfamily etc. in \setmainfont +\@ifpackagelater{fontspec}{2018/07/29}{ %% 2.6h or later +\cs_set:Nn \__fontspec_main_setmainfont:nn + { + \fontspec_set_family:Nnn \l__fontspec_rmfamily_family_tl {#1} {#2} + \tl_set_eq:NN \rmdefault \l__fontspec_rmfamily_family_tl + \use:x + { + \exp_not:n { \DeclareRobustCommand \rmfamily } + { + \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl } + \exp_not:N \fontfamily { \l__fontspec_rmfamily_family_tl } + \exp_not:N\if@ltj@match@family\exp_not:N\kanjifamily\exp_not:N\mcdefault\exp_not:N\fi%%% + \exp_not:N \selectfont + } + } + \str_if_eq_x:nnT {\familydefault} {\rmdefault} + { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } + \__fontspec_setmainfont_hook:nn {#1} {#2} + \normalfont + } +\cs_set:Nn \__fontspec_main_setsansfont:nn + { + \fontspec_set_family:Nnn \l__fontspec_sffamily_family_tl {#1} {#2} + \tl_set_eq:NN \sfdefault \l__fontspec_sffamily_family_tl + \use:x + { + \exp_not:n { \DeclareRobustCommand \sffamily } + { + \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl } + \exp_not:N \fontfamily { \l__fontspec_sffamily_family_tl } + \exp_not:N\if@ltj@match@family\exp_not:N\kanjifamily\exp_not:N\gtdefault\exp_not:N\fi%%% + \exp_not:N \selectfont + } + } + \str_if_eq_x:nnT {\familydefault} {\sfdefault} + { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } + \__fontspec_setsansfont_hook:nn {#1} {#2} + \normalfont + } +\cs_set:Nn \__fontspec_main_setmonofont:nn + { + \fontspec_set_family:Nnn \l__fontspec_ttfamily_family_tl {#1} {#2} + \tl_set_eq:NN \ttdefault \l__fontspec_ttfamily_family_tl + \use:x + { + \exp_not:n { \DeclareRobustCommand \ttfamily } + { + \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl } + \exp_not:N \fontfamily { \l__fontspec_ttfamily_family_tl } + \exp_not:N\if@ltj@match@family\exp_not:N\kanjifamily\exp_not:N\jttdefault\exp_not:N\fi%%% + \exp_not:N \selectfont + } + } + \str_if_eq_x:nnT {\familydefault} {\ttdefault} + { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } + \__fontspec_setmonofont_hook:nn {#1} {#2} + \normalfont + } +}{ %% <= 2.6g +\DeclareDocumentCommand \setmainfont { O{} m O{} } + { + \fontspec_set_family:Nnn \g__fontspec_rmfamily_family {#1,#3} {#2} + \tl_set_eq:NN \rmdefault \g__fontspec_rmfamily_family + \use:x { \exp_not:n { \DeclareRobustCommand \rmfamily } + { + \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl } + \exp_not:N \fontfamily { \g__fontspec_rmfamily_family } + \exp_not:N\if@ltj@match@family\exp_not:N\kanjifamily\exp_not:N\mcdefault\exp_not:N\fi%%% + \exp_not:N \selectfont + } + } + \str_if_eq_x:nnT {\familydefault} {\rmdefault} + { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } + \normalfont + \ignorespaces + } +\DeclareDocumentCommand \setsansfont { O{} m O{} } + { + \fontspec_set_family:Nnn \g__fontspec_sffamily_family {#1,#3} {#2} + \tl_set_eq:NN \sfdefault \g__fontspec_sffamily_family + \use:x { \exp_not:n { \DeclareRobustCommand \sffamily } + { + \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl } + \exp_not:N \fontfamily { \g__fontspec_sffamily_family } + \exp_not:N\if@ltj@match@family\exp_not:N\kanjifamily\exp_not:N\gtdefault\exp_not:N\fi%%% + \exp_not:N \selectfont + } + } + \str_if_eq_x:nnT {\familydefault} {\sfdefault} + { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } + \normalfont + \ignorespaces + } +\DeclareDocumentCommand \setmonofont { O{} m O{} } + { + \fontspec_set_family:Nnn \g__fontspec_ttfamily_family {#1,#3} {#2} + \tl_set_eq:NN \ttdefault \g__fontspec_ttfamily_family + \use:x { \exp_not:n { \DeclareRobustCommand \ttfamily } + { + \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl } + \exp_not:N \fontfamily { \g__fontspec_ttfamily_family } + \exp_not:N\if@ltj@match@family\exp_not:N\kanjifamily\exp_not:N\jttdefault\exp_not:N\fi%%% + \exp_not:N \selectfont + } + } + \str_if_eq_x:nnT {\familydefault} {\ttdefault} + { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } + \normalfont + \ignorespaces + } +} + +\cs_set:Nn \fontspec_visible_space: + { + \__fontspec_primitive_font_glyph_if_exist:NnTF \font {"2423} + { \ltjalchar"2423\scan_stop: } + { \fontspec_visible_space_fallback: } + } + +\AtBeginDocument{ + \cs_if_exist:NF \verbvisiblespace { + % >= LaTeX2e <2018-12-01> does not need the following patch + \def\verb + { + \relax\ifmmode\hbox\else\leavevmode\fi % same as lltjcore + \bgroup + \verb@eol@error \let\do\@makeother \dospecials + \verbatim@font\@noligs + \@ifstar\__fontspecsverb\@verb + } + } +} +\cs_set:Npn \emshape { \gtfamily \itshape } +\cs_set:Npn \eminnershape { \mcfamily \upshape } + +\ExplSyntaxOff +\expandafter\patchcmd\csname TU\string\textasteriskcentered\endcsname{\char}{\ltjalchar}{}{} + +\endinput + diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-footmisc.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-footmisc.sty new file mode 100644 index 0000000000..f74c496308 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-footmisc.sty @@ -0,0 +1,58 @@ +% +% lltjp-footmiscs.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjp-footmisc}[2017/05/05 Patch to footmisc for LuaTeX-ja] +\RequirePackage{footmisc} + +\let \if@tempswa \ifFN@bottom +\ifFN@para \@tempswatrue \fi +\if@tempswa + \ifFN@bottom + \toks@{\setbox\@outputbox \box\@cclv + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + \ifvoid\footins + \else + \setbox\@outputbox \vbox\bgroup + \boxmaxdepth\@maxdepth + \unvbox\@outputbox + \vfill\relax + } + \the\FN@temptoken + \toks@\expandafter{\the\toks@\egroup\fi} + \else + \toks@{\ifvoid\footins + \setbox\@outputbox\box\@cclv + \else + \setbox\@outputbox \vbox\bgroup + \boxmaxdepth\@maxdepth + \unvbox\@cclv + } + \the\FN@temptoken + \toks@\expandafter{\the\toks@ + \egroup + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global\let\@midlist\@empty + \@combinefloats + }% + \fi + \toks@\expandafter{\the\toks@ + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht{% + \@texttop \dimen@\dp\@outputbox + \unvbox\@outputbox + \ifnum\ltjgetparameter{direction}=3 \vbox{\hskip\z@}\fi %%% LuaTeX-ja + \vskip -\dimen@\@textbottom + }% + \fi + \global\maxdepth\@maxdepth + } + \edef\@makecol{\the\toks@} +\fi +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-geometry.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-geometry.sty new file mode 100644 index 0000000000..678556e55e --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-geometry.sty @@ -0,0 +1,513 @@ +% +% lltjp-geometry.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjp-geometry}[2018/01/19 Patch to geometry for LuaTeX-ja with vertical writing mode] +\ifdefined\if@ltj@@geometry@tate\expandafter\endinput\fi +\newif\if@ltj@@geometry@tate +\newif\if@ltj@@geometry@forceoff +\@ltj@@geometry@tatefalse +\@ltj@@geometry@forceofffalse +\DeclareOption{force}{\@ltj@@geometry@tatetrue} +\DeclareOption{disable}{\@ltj@@geometry@forceofftrue} + +\ProcessOptions\relax + +\RequirePackage{ifluatex} +\ifluatex + \ifdefined\luatexjaLoaded\else + \PackageError{lltjp-geometry}{% + lltjp-geometry does not work without luatexja. + }{} +\fi +\else % pTeX +\def \AtBeginDvi #1{% + \global \setbox \@begindvibox + \vbox{\yoko\unvbox \@begindvibox #1}% +} +\fi + +\RequirePackage{filehook} +\RequirePackage{etoolbox} +\newif\ifGm@ltj@layoutswitch +\let\orig@PackageWarningNoLine=\PackageWarningNoLine +% define ifGm@swap@papersize if it is undefined +\expandafter\newif\csname ifGm@swap@papersize\endcsname + +\AtBeginOfPackageFile{geometry}{% + \edef\Gm@ltj@topskip{\the\topskip} + \edef\Gm@ltj@headsep{\the\headsep} + \edef\Gm@ltj@footskip{\the\footskip} +\ifluatex + \ifnum\ltjgetparameter{direction}=3 \@ltj@@geometry@tatetrue\fi +\else + \@gobble\iftrue\csname iftdir\endcsname\@ltj@@geometry@tatetrue\fi +\fi +\patchcmd\@begindocumenthook{\tate}{\tate}{\@ltj@@geometry@tatetrue}{}% +\if@ltj@@geometry@tate + \if@ltj@@geometry@forceoff + \@ltj@@geometry@tatefalse + \else + \let\PackageWarningNoLine\@gobbletwo% 警告抑止 + \fi +\fi +} +\AtEndOfPackageFile{geometry}{% +\let\PackageWarningNoLine=\orig@PackageWarningNoLine +\if@ltj@@geometry@tate + \let\PackageWarningNoLine=\orig@PackageWarningNoLine +%%% ここからパッチ開始 + +% TODO: +% * pTeX, LuaTeX ともに truedimen が正しく動作しない +% * pTeX resetpaper が正しく動作しない +% +% `h', `v' は「水平」「垂直」を意味するが: +% ユーザー側では「紙の物理的な水平方向」「物理的な垂直方向」を, +% しかしパッケージ内部処理では「字送り方向」「行送り方向」を表す. +% そのため,key-value interface 内で h, v の交換を行う必要がある. + +% twoside 指定時は,lmargin は小口側,rmargin はノド側の余白を指す. +% また,bindingoffset 偶数ページを右に,奇数ページを左にずらす. +\define@key{Gm}{hdivide}{\Gm@parse@divide{#1}{lmargin}{height}{rmargin}}% + +\define@key{Gm}{vscale}{\Gm@hbodytrue\edef\Gm@hscale{#1}}% +\define@key{Gm}{hscale}{\Gm@vbodytrue\edef\Gm@vscale{#1}}% +\define@key{Gm}{vdivide}{\Gm@parse@divide{#1}{tmargin}{width}{bmargin}}% +\define@key{Gm}{divide}{\Gm@parse@divide{#1}{tmargin}{width}{bmargin}% + \Gm@parse@divide{#1}{lmargin}{height}{rmargin}}% +\define@key{Gm}{vmargin}{\Gm@branch{#1}{tmargin}{bmargin}}% +\define@key{Gm}{hmargin}{\Gm@branch{#1}{lmargin}{rmargin}}% +\define@key{Gm}{margin}{\Gm@branch{#1}{tmargin}{lmargin}% + \Gm@branch{#1}{bmargin}{rmargin}}% +\define@key{Gm}{headsep}{\Gm@defbylen{ltj@headsep}{#1}}% +\define@key{Gm}{footskip}{\Gm@defbylen{ltj@footskip}{#1}}% +\let\KV@Gm@foot\KV@Gm@footskip +\define@key{Gm}{vmarginratio}{\edef\Gm@hmarginratio{#1}}% +\define@key{Gm}{hmarginratio}{\edef\Gm@vmarginratio{#1}}% +\define@key{Gm}{nohead}[true]{\Gm@doifelse{nohead}{#1}% + {\Gm@setlength\headheight\z@\Gm@defbylen{ltj@headsep}\z@}{}}% +\define@key{Gm}{nofoot}[true]{\Gm@doifelse{nofoot}{#1}% + {\Gm@defbylen{ltj@footskip}\z@}{}}% +\define@key{Gm}{noheadfoot}[true]{\Gm@doifelse{noheadfoot}{#1}% + {\Gm@setlength\headheight\z@\Gm@defbylen{ltj@headsep}\z@ + \Gm@defbylen{ltj@footskip}\z@}{}}% +\define@key{Gm}{layoutwidth}{\Gm@layouttrue\Gm@setlength\Gm@layoutheight{#1}}% +\define@key{Gm}{layoutheight}{\Gm@layouttrue\Gm@setlength\Gm@layoutwidth{#1}}% +\define@key{Gm}{layoutsize}{\Gm@branch{#1}{layoutwidth}{layoutheight}}% +\define@key{Gm}{layout}{\Gm@layouttrue\@nameuse{Gm@#1}{Gm@layout}% + \Gm@setlength\@tempdima{\Gm@layoutheight}% + \Gm@setlength\Gm@layoutheight{\Gm@layoutwidth}% + \Gm@setlength\Gm@layoutwidth{\@tempdima}% +}% + +% \@mparswitch は傍注の出力位置を左右ページで変えるスイッチだが, +% geometry.sty はこれを左右ページのレイアウトを変えるか否かの判定にも使っている. +% 縦組クラスの場合は \@mparswitch は常に偽でないとおかしなことになるので +% \@mparswitch -> \Gm@ltj@layoutswitch と名称変更する. + +\let\Gm@ltj@layoutswitch\@mparswitch +\@mparswitchfalse +\define@key{Gm}{twoside}[true]{\Gm@doifelse{twoside}{#1}% + {\@twosidetrue\Gm@ltj@layoutswitchtrue}{\@twosidefalse\Gm@ltj@layoutswitchfalse}}% +\define@key{Gm}{asymmetric}[true]{\Gm@doifelse{asymmetric}{#1}% + {\@twosidetrue\Gm@ltj@layoutswitchfalse}{}}% + +% includemp 指定時は,\headsep (if reversemp || twocolumn) や, +% \footskip (if !reversemp || twocolumn) を傍注幅だけ増加させる. + +% h <-> v +\def\Gm@Dhratio{2:3}% = top:bottom default +\def\Gm@Dvratio{1:1}% = left:right default for oneside +\def\Gm@Dvratiotwo{3:2}% = inner:outer default for twoside. +\ifGm@swap@papersize + % geometry.sty ロード時に landscape オプションが指定されていた場合, + % それによって用紙サイズの縦横が入れ替わってしまっているので補正する. + \setlength\@tempdima{\paperwidth}% + \setlength\paperwidth{\paperheight}% + \setlength\paperheight{\@tempdima}% +\fi + +% save length +\def\Gm@save{% + \Gm@savelength{paperwidth}% + \Gm@savelength{paperheight}% + \Gm@savelength{textwidth}% + \Gm@savelength{textheight}% + \Gm@savelength{evensidemargin}% + \Gm@savelength{oddsidemargin}% + \Gm@savelength{topmargin}% + \Gm@savelength{headheight}% + %\Gm@savelength{headsep}% + \Gm@savelength{topskip}% + %\Gm@savelength{footskip}% + \Gm@savelength{baselineskip}% + \Gm@savelength{marginparwidth}% + \Gm@savelength{marginparsep}% + \Gm@savelength{columnsep}% + \Gm@savelength{hoffset}% + \Gm@savelength{voffset} + \Gm@savelength{Gm@layoutwidth}% + \Gm@savelength{Gm@layoutheight}% + \Gm@savelength{Gm@layouthoffset}% + \Gm@savelength{Gm@layoutvoffset}% + \Gm@saveboolean{@twocolumn}% + \Gm@saveboolean{@twoside}% + \Gm@saveboolean{Gm@ltj@layoutswitch}% + \Gm@saveboolean{@reversemargin}}% + +% frame +\ifluatex + \def\Gm@pageframe@cmd{\vb@xt@\z@} +\else + \def\Gm@pageframe@cmd{\vb@xt@\z@\bgroup\yoko\aftergroup\egroup} +\fi +\renewcommand*{\Gm@pageframes}{% + \Gm@pageframe@cmd{% + \ifGm@showcrop + \vb@xt@\z@{\vskip-1\Gm@truedimen in\vskip\Gm@layoutvoffset% + \hb@xt@\z@{\hskip-1\Gm@truedimen in\hskip\Gm@layouthoffset% + \vb@xt@\Gm@layoutwidth{% + \let\protect\relax + \hb@xt@\Gm@layoutheight{\Gm@cropmark(-1,1,-3,3)\hfil\Gm@cropmark(1,1,3,3)}% + \vfil + \hb@xt@\Gm@layoutheight{\Gm@cropmark(-1,-1,-3,-3)\hfil\Gm@cropmark(1,-1,3,-3)}}% + \hss}% + \vss}% + \fi% + \ifGm@showframe + \if@twoside + \ifodd\count\z@ + \let\@themargin\oddsidemargin + \else + \let\@themargin\evensidemargin + \fi + \fi + \moveright\@themargin% + \vb@xt@\z@{% + \vskip\topmargin\vb@xt@\z@{\vss\Gm@hrule}% + \vskip\headheight\vb@xt@\z@{\vss\Gm@hruled}% + \vskip\headsep\vb@xt@\z@{\vss\Gm@hrule}% + \if@reversemargin\vb@xt@\z@{% + \vss\vb@xt@\z@{\vss\Gm@hrule}% + \vskip\marginparwidth\vb@xt@\z@{\vss\Gm@hrule}% + \vskip\marginparsep + }\fi + \hb@xt@\textwidth{\llap{\Gm@vrule}\hfil\Gm@vrule}% + \vb@xt@\z@{\vss\Gm@hruled}% + \unless\if@reversemargin\vb@xt@\z@{% + \vskip\marginparsep\vb@xt@\z@{\vss\Gm@hrule}% + \vskip\marginparwidth\vb@xt@\z@{\vss\Gm@hruled}\vss% + }\fi% + \vskip\footskip\vb@xt@\z@{\vss\Gm@hruled}% + \vss}% + \fi% + }} +\def\Gm@detall#1#2#3#4{% + \@tempcnta\z@ + \if#1h + \let\Gm@mratio\Gm@hmarginratio + \edef\Gm@Dmratio{\Gm@Dhratio}% + \else + \let\Gm@mratio\Gm@vmarginratio + \edef\Gm@Dmratio{\if@twoside\Gm@Dvratiotwo\else\Gm@Dvratio\fi}% + \fi + \if#1h + \ifx\Gm@tmargin\@undefined\else\advance\@tempcnta4\relax\fi + \ifGm@hbody\advance\@tempcnta2\relax\fi + \ifx\Gm@bmargin\@undefined\else\advance\@tempcnta1\relax\fi + \Gm@cnth\@tempcnta + \else + \ifx\Gm@lmargin\@undefined\else\advance\@tempcnta4\relax\fi + \ifGm@vbody\advance\@tempcnta2\relax\fi + \ifx\Gm@rmargin\@undefined\else\advance\@tempcnta1\relax\fi + \Gm@cntv\@tempcnta + \fi + \ifcase\@tempcnta + \if#1h + \Gm@defbylen{width}{\Gm@Dhscale\Gm@layoutwidth}% + \else + \Gm@defbylen{height}{\Gm@Dvscale\Gm@layoutheight}% + \fi + \Gm@detiiandiii{#2}{#3}{#4}% + \or + \ifx\Gm@mratio\@undefined + \if#1h + \Gm@defbylen{width}{\Gm@Dhscale\Gm@layoutwidth}% + \else + \Gm@defbylen{height}{\Gm@Dvscale\Gm@layoutheight}% + \fi + \setlength\@tempdimc{\@nameuse{Gm@#4}}% + \Gm@detiiandiii{#2}{#3}{#4}% + \expandafter\let\csname Gm@#2\endcsname\@undefined + \Gm@defbylen{#4}{\@tempdimc}% + \else + \Gm@setbyratio[f]{#1}{#4}{#3}% + \fi + \Gm@detiv{#2}{#3}{#4}{#2}% + \or\Gm@detiiandiii{#2}{#3}{#4}% + \or\Gm@detiv{#2}{#2}{#4}{#3}% + \or + \ifx\Gm@mratio\@undefined + \if#1h + \Gm@defbylen{width}{\Gm@Dhscale\Gm@layoutwidth}% + \else + \Gm@defbylen{height}{\Gm@Dvscale\Gm@layoutheight}% + \fi + \setlength\@tempdimc{\@nameuse{Gm@#3}}% + \Gm@detiiandiii{#2}{#4}{#3}% + \expandafter\let\csname Gm@#2\endcsname\@undefined + \Gm@defbylen{#3}{\@tempdimc}% + \else + \Gm@setbyratio[b]{#1}{#3}{#4}% + \fi + \Gm@detiv{#2}{#3}{#4}{#2}% + \or\Gm@detiv{#2}{#3}{#4}{#2}% + \or\Gm@detiv{#2}{#2}{#3}{#4}% + \or\Gm@warning{Over-specification in `#1'-direction.% + ^^J\@spaces `#2' (\@nameuse{Gm@#2}) is ignored}% + \Gm@detiv{#2}{#3}{#4}{#2}% + \else\fi}% +\def\Gm@clean{% + \ifnum\Gm@cnth<4\let\Gm@tmargin\@undefined\fi + \ifodd\Gm@cnth\else\let\Gm@bmargin\@undefined\fi + \ifnum\Gm@cntv<4\let\Gm@lmargin\@undefined\fi + \ifodd\Gm@cntv\else\let\Gm@rmargin\@undefined\fi + \ifGm@hbody\else + \let\Gm@hscale\@undefined + \let\Gm@width\@undefined + \let\Gm@textwidth\@undefined + \fi + \ifGm@vbody\else + \let\Gm@vscale\@undefined + \let\Gm@height\@undefined + \let\Gm@textheight\@undefined + \fi + }% +\def\Gm@adjustpaper{% + \ifdim\paperwidth>\p@\else + \PackageError{geometry}{% + \string\paperwidth\space(\the\paperwidth) too short}{% + Set a paper type (e.g., `a4paper').}% + \fi + \ifdim\paperheight>\p@\else + \PackageError{geometry}{% + \string\paperheight\space(\the\paperheight) too short}{% + Set a paper type (e.g., `a4paper').}% + \fi + \ifGm@swap@papersize + \setlength\@tempdima{\paperwidth}% + \setlength\paperwidth{\paperheight}% + \setlength\paperheight{\@tempdima}% + \fi + \ifGm@layout\else + \setlength\Gm@layoutwidth{\paperheight}% + \setlength\Gm@layoutheight{\paperwidth}% + \fi}% +\def\Gm@adjustbody{ + \ifGm@hbody + \ifx\Gm@width\@undefined + \ifx\Gm@hscale\@undefined + \Gm@defbylen{width}{\Gm@Dhscale\Gm@layoutwidth}% + \else + \Gm@defbylen{width}{\Gm@hscale\Gm@layoutwidth}% + \fi + \fi + \ifx\Gm@textwidth\@undefined\else + \setlength\@tempdima{\Gm@textwidth}% + \ifGm@includemp + \advance\@tempdima\Gm@wd@mp + \fi + \ifGm@includehead + \addtolength\@tempdima{\headheight}% + \addtolength\@tempdima{\headsep}% + \fi + \ifGm@includefoot + \addtolength\@tempdima{\footskip}% + \fi + \edef\Gm@width{\the\@tempdima}% + \fi + \fi + \ifGm@vbody + \ifx\Gm@height\@undefined + \ifx\Gm@vscale\@undefined + \Gm@defbylen{height}{\Gm@Dvscale\Gm@layoutheight}% + \else + \Gm@defbylen{height}{\Gm@vscale\Gm@layoutheight}% + \fi + \fi + \setlength\topskip\Gm@ltj@topskip + \ifx\Gm@lines\@undefined\else + \@tempdima=\f@size\p@ \@tempdima=.5\@tempdima + \ifluatex + \advance\@tempdima\ltjgetparameter{talbaselineshift}% + \else + \advance\@tempdima\tbaselineshift + \fi + \ifdim\maxdepth<\@tempdima + \PackageWarningNoLine{lltjp-geometry}% + {\noexpand\maxdepth was changed from \the\maxdepth\space + to \the\@tempdima} + \maxdepth\@tempdima + \fi + \setbox\z@=\hbox{\tate% next \ifdim must be executed in tate dir. + \ifdim\topskip<\ht\tstrutbox + \@tempdima\topskip + \global\topskip\ht\tstrutbox + \PackageWarningNoLine{lltjp-geometry}% + {\noexpand\topskip was changed from \the\@tempdima\space + to \the\topskip} + \fi}% + \setlength\@tempdima{\baselineskip}% + \multiply\@tempdima\Gm@lines + \addtolength\@tempdima{\topskip}% + \addtolength\@tempdima{-\baselineskip}% + \edef\Gm@textheight{\the\@tempdima}% + \fi + \ifx\Gm@textheight\@undefined\else + \edef\Gm@height{\Gm@textheight}% + \fi + \fi}% + +\def\Gm@adjustmp{% + \ifGm@includemp + \@tempdimb\marginparwidth + \advance\@tempdimb\marginparsep + \Gm@wd@mp\@tempdimb + \if@twocolumn + \Gm@wd@mp2\@tempdimb + \fi + \fi}% +\def\Gm@@process{% + \Gm@expandlengths + \Gm@adjustpaper + \addtolength\Gm@layoutheight{-\Gm@bindingoffset}% + \Gm@adjustmp + \Gm@adjustbody + \Gm@detall{h}{width}{tmargin}{bmargin}% + \Gm@detall{v}{height}{lmargin}{rmargin}% + \setlength\textwidth{\Gm@width}% + \setlength\textheight{\Gm@height}% + \setlength\headsep{\Gm@ltj@headsep}% + \setlength\footskip{\Gm@ltj@footskip}% + \setlength\topmargin{\Gm@tmargin}% + \setlength\oddsidemargin{\Gm@lmargin}% + \addtolength\oddsidemargin{-1\Gm@truedimen in}% + \ifGm@ltj@layoutswitch + \setlength\evensidemargin{\Gm@rmargin}% + \addtolength\evensidemargin{-1\Gm@truedimen in}% + \else + \evensidemargin\oddsidemargin + \fi + \advance\evensidemargin\Gm@bindingoffset + \addtolength\topmargin{-1\Gm@truedimen in}% + \ifGm@includehead + \addtolength\textwidth{-\headheight}% + \addtolength\textwidth{-\headsep}% + \else + \addtolength\topmargin{-\headheight}% + \addtolength\topmargin{-\headsep}% + \fi + \ifGm@includefoot + \addtolength\textwidth{-\footskip}% + \fi + \ifGm@includemp + \advance\textwidth-\Gm@wd@mp + \if@twocolumn + \advance\headsep.5\Gm@wd@mp + \advance\footskip.5\Gm@wd@mp + \else\if@reversemargin + \advance\headsep\Gm@wd@mp + \else + \advance\footskip\Gm@wd@mp + \fi\fi + \fi + \ifGm@heightrounded + \setlength\@tempdima{\textheight}% + \addtolength\@tempdima{-\topskip}% + \@tempcnta\@tempdima + \@tempcntb\baselineskip + \divide\@tempcnta\@tempcntb + \setlength\@tempdimb{\baselineskip}% + \multiply\@tempdimb\@tempcnta + \advance\@tempdima-\@tempdimb + \multiply\@tempdima\tw@ + \ifdim\@tempdima>\baselineskip + \addtolength\@tempdimb{\baselineskip}% + \fi + \addtolength\@tempdimb{\topskip}% + \textheight\@tempdimb + \fi + \advance\oddsidemargin\Gm@layouthoffset% + \advance\evensidemargin\Gm@layouthoffset% + \advance\topmargin\Gm@layoutvoffset% + \addtolength\Gm@layoutheight{\Gm@bindingoffset}% +}% end of \Gm@@process +% log +\def\Gm@logcontent#1{% + *geometry* verbose mode - [ #1 ] result:^^J% + \ifGm@pass * pass: disregarded the geometry package!^^J% + \else + * driver: \if\Gm@driver<none>\else\Gm@driver\fi^^J% + * paper: \ifx\Gm@paper\@undefined<default>\else\Gm@paper\fi^^J% + * layout: \ifGm@layout<custom>\else<same size as paper>\fi^^J% + \ifGm@layout + * layout(width,height): (\the\Gm@layoutwidth,\the\Gm@layoutheight)^^J% + \fi + * layoutoffset:(h,v)=(\the\Gm@layouthoffset,\the\Gm@layoutvoffset)^^J% + \@ifundefined{Gm@lines}{}{* lines: \Gm@lines^^J}% + \@ifundefined{Gm@hmarginratio}{}{* hratio: \Gm@hmarginratio^^J}% + \@ifundefined{Gm@vmarginratio}{}{* vratio: \Gm@vmarginratio^^J}% + \ifdim\Gm@bindingoffset=\z@\else + * bindingoffset: \the\Gm@bindingoffset^^J\fi + * modes: % + \Gm@showbool{landscape}% + \Gm@showbool{includehead}% + \Gm@showbool{includefoot}% + \Gm@showbool{includemp}% + \if@twoside twoside\space\fi% + \ifGm@ltj@layoutswitch\else\if@twoside asymmetric\space\fi\fi% + \Gm@showbool{heightrounded}% + \ifx\Gm@truedimen\@empty\else truedimen\space\fi% + \Gm@showbool{showframe}% + \Gm@showbool{showcrop}% + ^^J% + * h-part:(L,W,R)=(\Gm@lmargin, \Gm@height, \Gm@rmargin)^^J% + * v-part:(T,H,B)=(\Gm@tmargin, \Gm@width, \Gm@bmargin)^^J% + \fi + \Gm@showdim{\paperwidth}% + \Gm@showdim{\paperheight}% + \Gm@showdim{\textwidth}% + \Gm@showdim{\textheight}% + \Gm@showdim{\oddsidemargin}% + \Gm@showdim{\evensidemargin}% + \Gm@showdim{\topmargin}% + \Gm@showdim{\headheight}% + \Gm@showdim{\headsep}% + \Gm@showdim{\topskip}% + \Gm@showdim{\footskip}% + \Gm@showdim{\marginparwidth}% + \Gm@showdim{\marginparsep}% + \Gm@showdim{\columnsep}% + * \string\skip\string\footins=\the\skip\footins^^J% + \Gm@showdim{\hoffset}% + \Gm@showdim{\voffset}% + \Gm@showdim{\mag}% + * \string\@twocolumn\if@twocolumn true\else false\fi^^J% + * \string\@twoside\if@twoside true\else false\fi^^J% + * \string\@mparswitch\if@mparswitch true\else false\fi^^J% + * \string\@reversemargin\if@reversemargin true\else false\fi^^J% + * (1in=72.27pt=25.4mm, 1cm=28.453pt)^^J}% + + +\Gm@initall +\Gm@processconfig +\ProcessOptionsKV[c]{Gm}% +\Gm@setdefaultpaper +\ProcessOptionsKV[p]{Gm}% +\Gm@process + +%%% 終了 +\fi} +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-listings.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-listings.sty new file mode 100644 index 0000000000..13f75e302e --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-listings.sty @@ -0,0 +1,440 @@ +% +% lltjp-listings.sty 2018-09-17 +% + +\NeedsTeXFormat{LaTeX2e} +\RequirePackage{listings,luatexbase-cctb} + +%%%%%%%%%%%%%%%% Japanese support +%% whether letter-space in a fixed mode box is doubled or not +\newif\if@ltj@lst@double +\lst@Key{doubleletterspace}f[t]{\lstKV@SetIf{#1}\if@ltj@lst@double} + +%% IVS support +\newif\if@ltj@lst@vsraw +\def\ltj@lst@vscmd{} +\lst@Key{vsraw}f[t]{\lstKV@SetIf{#1}\if@ltj@lst@vsraw} +\lst@Key{vscmd}\relax{\def\ltj@lst@vscmd{#1}} + +% 既定の IVS 出力コマンド +\def\ltjlistingsvsstdcmd#1{\@tempdima=\f@size pt% + \smash{\raisebox{.35\@tempdima}{\tt% + \fboxsep=.1\@tempdima\fbox{\fontsize{.5\@tempdima}{\z@}\selectfont + \oalign{\hss VS\hss\crcr\hss#1\hss\crcr}}}}} +\def\ltj@lst@vscmd{\ltjlistingsvsstdcmd} + +% override \lst@FillFixed@ +% \ltj@hst@hss is \ltj@lst@hss@ivs or \ltj@lst@hss@normal, +% according to vsraw = true or not. +\def\lst@FillFixed@#1{% + \ifx\@empty#1\else\ltj@lst@hss#1\expandafter\lst@FillFixed@\fi} + +\directlua{ + local cat_str = luatexbase.catcodetables['string'] + local cat_lp = luatexbase.catcodetables['latex-package'] + local ubyte = unicode.utf8.byte + local spccmd = string.char(0x5C) .. 'ltj@lst@hss@normal' + luatexja.listings = {} + function luatexja.listings.althss(t) + t = ubyte(t) + if not (t>=0xE0100 and t<0xE01F0) then + tex.sprint(cat_lp, spccmd) + end + end +} +\def\ltj@lst@hss@ivs#1{% + \directlua{luatexja.listings.althss('\luatexluaescapestring{#1}')}#1% +} +\def\ltj@lst@hss@double{\lst@hss\lst@hss} + +% lowest level +\newif\if@ltj@lst@kanji +\lst@AddToHook{InitVars}{\@ltj@lst@kanjifalse} + +\def\lst@AppendLetter{% + \ltj@lst@setletterflag\lst@Append} +\def\lst@AppendOther{% + \lst@ifletter\lst@Output\lst@letterfalse\fi\@ltj@lst@kanjifalse + \futurelet\lst@lastother\lst@Append} + +\def\ltj@lst@setletterflag{% + \lst@ifletter + \if@ltj@lst@kanji\lst@Output\@ltj@lst@kanjifalse\fi + \else + \lst@lettertrue\if@ltj@lst@kanji\@ltj@lst@kanjifalse\else\lst@OutputOther\fi + \fi} + +\def\ltj@lst@setkanjiflag{% + \lst@ifletter + \lst@Output + \else + \if@ltj@lst@kanji\else\lst@OutputOther\fi\lst@lettertrue + \fi\@ltj@lst@kanjitrue} + +\def\ltj@lst@setopenflag{% + \lst@ifletter + \lst@letterfalse\lst@Output + \else + \if@ltj@lst@kanji\else\lst@OutputOther\fi + \fi\@ltj@lst@kanjitrue} + +\def\ltj@lst@setcloseflag{% + \lst@ifletter\else\lst@lettertrue\fi\@ltj@lst@kanjitrue} + +% Processing Japanese characters +\def\ltj@lst@ProcessJALetter#1{% + \lst@whitespacefalse + \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{`#1}}=0 + \ifnum\ltjgetparameter{postbreakpenalty}{`#1}>0 + \ltj@lst@setopenflag % 開き括弧類 + \else + \ifnum\ltjgetparameter{prebreakpenalty}{`#1}>0 + \ltj@lst@setcloseflag % 閉じ括弧類,句読点 + \else + \ltj@lst@setkanjiflag % 通常の和文文字 + \fi\fi + \advance\lst@length\@ne % 和文文字は通常の2倍の幅 + \else + \ltj@lst@setletterflag + \fi + \lst@Append#1} + +% 半角カナ処理命令 +\def\ltj@lst@ProcessJALetterHalf#1{% + \lst@whitespacefalse + \ifnum\ltjgetparameter{jacharrange}{\ltjgetparameter{chartorange}{`#1}}=0 + \ifnum\ltjgetparameter{postbreakpenalty}{`#1}>0 + \ltj@lst@setopenflag % 開き括弧類 + \else + \ifnum\ltjgetparameter{prebreakpenalty}{`#1}>0 + \ltj@lst@setcloseflag % 閉じ括弧類 + \else + \ltj@lst@setkanjiflag % 通常の和文文字 + \fi\fi + % 半角カナは欧文文字と同じ幅 + \else + \ltj@lst@setletterflag + \fi + \lst@Append#1} + +% 漢字用異体字セレクタ命令 +\def\ltj@lst@ProcessIVS#1{% + \lst@whitespacefalse + \if@ltj@lst@vsraw + \lst@Append#1\advance\lst@length\m@ne + \else + \lst@TrackNewLines\lst@OutputLostSpace \lst@PrintToken + \setbox\@tempboxa\hbox to 2\lst@width{\hss + \expandafter\expandafter\expandafter\ltj@lst@vscmd + \expandafter{\the\numexpr`#1-"E00EF\relax}%" + \hss}% + \lst@CalcLostSpaceAndOutput\lst@whitespacefalse + \fi +} + +% Variation Selector +\def\ltj@lst@ProcessVS#1{% + \lst@whitespacefalse + \if@ltj@lst@vsraw + \lst@Append#1\advance\lst@length\m@ne + \else + \lst@TrackNewLines\lst@OutputLostSpace \lst@PrintToken + \setbox\@tempboxa\hbox to 2\lst@width{\hss + \expandafter\expandafter\expandafter\ltj@lst@vscmd + \expandafter{\the\numexpr`#1-"FDFF\relax}%" + \hss}% + \lst@CalcLostSpaceAndOutput\lst@whitespacefalse + \fi +} + + +% 半角カナ,異体字セレクタはアクティブ化 +\def\ltj@@listing@jpsetN#1#2#3{% for (not large) range + \@tempcnta=\numexpr#1-1\relax\@tempcntb=\numexpr 1+#2\relax + \loop \global\advance\@tempcnta\@ne\ifnum\@tempcnta<\@tempcntb\relax + \ltj@@listing@jpsetN@{\@tempcnta}{#3}\repeat +} + +\def\ltj@@listing@jpsetN@#1#2{{% + \@tempcnta=#1 \lccode`\~=\@tempcnta \lccode`\/=\@tempcnta + \lowercase{\gdef\@temp{\gdef~{#2/}}}}% + \@temptokena\expandafter\expandafter\expandafter\expandafter% + \expandafter\expandafter\expandafter{\expandafter\expandafter% + \expandafter\the\expandafter\@temptokena\@temp}% +} +\@temptokena{} +\ltj@@listing@jpsetN{65377}{65439}{\ltj@lst@ProcessJALetterHalf} +\ltj@@listing@jpsetN{65024}{65039}{\ltj@lst@ProcessVS} +\ltj@@listing@jpsetN{917760}{917999}{\ltj@lst@ProcessIVS} +\xdef\ltj@@listing@jpcmd{\the\@temptokena}\@temptokena{} + +% catcode 対策 +\newluatexcatcodetable\CatcodeTableLTJlistings +\setluatexcatcodetable\CatcodeTableLTJlistings{% + \luatexcatcodetable\CatcodeTableLaTeXAtLetter + \catcode\ltjlineendcomment=13%" + \SetCatcodeRange{"FF61}{"FF9F}{13}% 半角カナ + \SetCatcodeRange{"E0100}{"E01EF}{13}% 漢字用異体字セレクタ + \SetCatcodeRange{"FE00}{"FE0F}{13}% Variation Selector +} + +% redefine \lstinline and its inner commands to support Japanese characters +\renewcommand\lstinline[1][]{% + \leavevmode\bgroup % \hbox\bgroup --> \bgroup + \def\lst@boxpos{b}% + \lsthk@PreSet\lstset{flexiblecolumns,#1}% + \lsthk@TextStyle + \@ifnextchar\bgroup \ltj@lst@InlineG \ltj@lstinline@} +\def\ltj@lstinline@#1{% + \edef\ltj@lst@temp{\the\catcode`#1}\lst@Init\relax\catcode`#1\ltj@lst@temp + \lst@InlineJ#1} +\def\ltj@lst@InlineG{% + \lst@Init\relax\edef\ltj@lst@temp{\the\catcode`\}}\catcode`\}=2 \catcode`\ =12\relax + \let\lst@arg\@empty\afterassignment\ltj@lst@InlineG@@\@temptokena} +\def\ltj@lst@InlineG@@{% + \catcode`\}=\ltj@lst@temp% + \expandafter\expandafter\expandafter\lst@InsideConvert% + \expandafter{\the\@temptokena}\lst@arg\lst@DeInit\egroup} + +%%%%%%%%%%%%%%%% \lstMakeShortInline +\patchcmd\lstMakeShortInline@{\lst@shortinlinedef#1}{\lst@shortinlinedef~}{}{} + +% We redefine \lst@BeginDropInput, since now we have +% two additional `process macros'. +\def\lst@BeginDropInput#1{% + \lst@EnterMode{#1}% + {\lst@modetrue + \let\lst@OutputBox\@gobble + \let\lst@ifdropinput\iftrue + \let\lst@ProcessLetter\@gobble + \let\lst@ProcessDigit\@gobble + \let\lst@ProcessOther\@gobble + \let\lst@ProcessSpace\@empty + \let\lst@ProcessTabulator\@empty + \let\lst@ProcessFormFeed\@empty + \let\ltj@lst@ProcessJALetter\@gobble % added + \let\ltj@lst@ProcessJALetterHalf\@gobble % added +}} + +\directlua{ + local utfchar, getcount = unicode.utf8.char, tex.getcount + luatexja.listings.insert_cb = function() + if not luatexja.listings.patched then + luatexja.listings.patched = 1 + luatexbase.add_to_callback('process_input_buffer', + function(buf) + local ret = '' + for i = 1, utf.len(buf) do + local c = utf.sub(buf, i, i) + local cu = utf.byte(c) + if cu >= 0x80 and tex.getcatcode(cu) \string~= 13 then + ret = ret .. utfchar(getcount('ltjlineendcomment')) + end + ret = ret .. c + end + return ret + end, 'ltj.listings_unicode', 1) + end + end + luatexja.listings.remove_cb = function() + if luatexja.listings.patched then + luatexja.listings.patched = nil + luatexbase.remove_from_callback('process_input_buffer', + 'ltj.listings_unicode')% + end + end} + +% hook! +\lst@AddToHook{Init}{% + \luatexcatcodetable\CatcodeTableLTJlistings\ltj@@listing@jpcmd + \lccode`\~=\ltjlineendcomment\lowercase{\def~{\ltj@lst@ProcessJALetter}}%" + \directlua{luatexja.listings.insert_cb()}% + \if@ltj@lst@double + \let\ltj@lst@hss@normal=\ltj@lst@hss@double + \else + \let\ltj@lst@hss@normal=\lst@hss + \fi + \if@ltj@lst@vsraw + \let\ltj@lst@hss=\ltj@lst@hss@ivs + \else + \let\ltj@lst@hss=\ltj@lst@hss@normal + \fi +} + +\def\ltj@lst@MakeActive#1{% + \let\lst@temp\@empty \ltj@lst@MakeActive@#1\relax} +\begingroup +\catcode`\^^A=12 +\catcode`\^^@=\active +\lccode`\$=\ltjlineendcomment \catcode`\$=13 %" +\lowercase{% +\gdef\ltj@lst@MakeActive@#1{\let\lst@next\relax% + \ifx#1\relax + \else\let\lst@next\ltj@lst@MakeActive@ + \ifnum`#1>127 + \lccode`\^^A=`#1 + \lowercase{\lst@lAddTo\lst@temp{$^^A}}%$ + \else + \lccode`\^^@=`#1 + \lowercase{\lst@lAddTo\lst@temp{^^@}}% + \fi\fi\lst@next}} +\endgroup + + +\begingroup \lccode`\~=`\ \relax \lowercase{% +\gdef\lst@InsideConvert@#1 #2{% + \ltj@lst@MakeActive{#1}% + \ifx\@empty#2% + \lst@lExtend\lst@arg{\lst@temp}% + \else + \lst@lExtend\lst@arg{\lst@temp~}% + \expandafter\lst@InsideConvert@ + \fi#2} +}\endgroup + +\lst@AddToHook{ExitVars}{% + \directlua{luatexja.listings.remove_cb()}% +} + +% 白線対策 +\newif\ifltj@lst@frame@top +\newdimen\ltj@lst@frame@lslimit +\gdef\lst@frameInit{% + \ltj@lst@frame@toptrue + \ifx\lst@framelshape\@empty \let\lst@frameL\@empty \fi + \ifx\lst@framershape\@empty \let\lst@frameR\@empty \fi + \def\lst@framevrule{\vrule\@width\lst@framerulewidth\relax}% + \lst@ifframeround + \lst@frameCalcDimA\z@ \@getcirc\@tempdima + \@tempdimb\@tempdima \divide\@tempdimb\tw@ + \advance\@tempdimb -\@wholewidth + \edef\lst@frametextsep{\the\@tempdimb}% + \edef\lst@framerulewidth{\the\@wholewidth}% + \lst@frameCalcDimA\@ne \@getcirc\@tempdima + \@tempdimb\@tempdima \divide\@tempdimb\tw@ + \advance\@tempdimb -\tw@\@wholewidth + \advance\@tempdimb -\lst@frametextsep + \edef\lst@rulesep{\the\@tempdimb}% + \fi + \lst@frameMakeBoxV\lst@framebox{\ht\strutbox}{\dp\strutbox}% + %%%% ここから + \@tempdima\z@ + \ifdim\ht\strutbox<\cht\@tempdima=\dimexpr\cht-\ht\strutbox\relax\fi + \ifdim\dp\strutbox<\cdp\@tempdima=\dimexpr\cdp-\dp\strutbox\relax\fi + \ltj@lst@frame@lslimit=-\@tempdima + \def\lst@framelr{% + \ifltj@lst@frame@top\ltj@lst@frame@topfalse\else\lineskiplimit\ltj@lst@frame@lslimit\fi + \copy\lst@framebox}% + %%%% ここまで + \ifx\lst@frametshape\@empty\else + \lst@frameH T\lst@frametshape + \ifvoid\z@\else + \par\lst@parshape + \@tempdima-\baselineskip \advance\@tempdima\ht\z@ + \ifdim\prevdepth<\@cclvi\p@\else + \advance\@tempdima\prevdepth + \fi + \ifdim\@tempdima<\z@ + \vskip\@tempdima\vskip\lineskip + \fi + \noindent\box\z@\par + \lineskiplimit\maxdimen \lineskip\z@ + \fi + \lst@frameSpreadV\lst@framextopmargin + \fi} + + + +%%%%%%%%%%%%%%%% escape to \LaTeX +\lstloadaspects{escape} +\gdef\lst@Escape#1#2#3#4{% + \lst@CArgX #1\relax\lst@CDefX + {}% + {\lst@ifdropinput\else + \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken + \lst@InterruptModes + \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}% + \ifx\^^M#2% + \lst@CArg #2\relax\lst@ActiveCDefX + {}% + {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes}% + {\lst@MProcessListing}% + \else + \lst@CArg #2\relax\lst@ActiveCDefX + {}% + {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes + \lst@newlines\z@ \lst@whitespacefalse}% + {}% + \fi% + \ltj@lst@escape@setup#2% + #3\catcode\ltjlineendcomment=9\lst@escapebegin\expandafter\lst@next%" + \fi}% + {}} +\def\ltj@lst@emptygrp{{}} +\def\ltj@lst@escape@setup#1{% + \begingroup\lccode`\~=`#1\lowercase{% + \gdef\lst@next##1~{% + \let\lst@arg\@empty\ltj@lst@remove@jacmd{##1}% + \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter + \scantokens\expandafter\expandafter\expandafter{\expandafter\ltj@lst@emptygrp\lst@arg\empty}% + ~}% + }\endgroup +} +\begingroup + \lccode`\|=\ltjlineendcomment \lowercase{%" + \gdef\ltj@lst@remove@jacmd#1{% + \expandafter\ltj@lst@remove@jacmd@\detokenize{#1}|\@nil|} + \gdef\ltj@lst@remove@jacmd@#1|{% + \ifx#1\@nil\else + \lst@lAddTo\lst@arg{#1}% + \expandafter\ltj@lst@remove@jacmd@ + \fi}} +\endgroup + +%%%%%%%%%%%%%%%% texcl +\lst@AddToHook{AfterBeginComment} + {\ifnum\lst@mode=\lst@TeXLmode + \catcode`\^^M=13\relax + \catcode\ltjlineendcomment=9\relax + \fi} + +%%%%%%%%%%%%%%%% +\lstloadaspects{writefile} +\begingroup \catcode`\^^I=11 +\gdef\lst@WFBegin#1#2{% + \begingroup + \let\lst@OutputBox#1% + \def\lst@Append##1{% + \advance\lst@length\@ne + \expandafter\lst@token\expandafter{\the\lst@token##1}% + \ifx ##1\lst@outputspace \else + \lst@WFAppend##1% + \fi}% + \lst@lAddTo\lst@PreGotoTabStop{\lst@WFAppend{^^I}}% + \lst@lAddTo\lst@ProcessSpace{\lst@WFAppend{ }}% + \def\ltj@lst@ProcessIVS##1{\lst@whitespacefalse\lst@Append##1}% + \def\ltj@lst@ProcessVS##1{\lst@whitespacefalse\lst@Append##1}% + \let\lst@DeInit\lst@WFDeInit + \let\lst@MProcessListing\lst@WFMProcessListing + \lst@WFifopen\else + \immediate\openout\lst@WF=#2\relax + \global\let\lst@WFifopen\iftrue + \@gobbletwo\fi\fi + \fi} +\endgroup + + +% \begin{修正事項}{1.3} from jlisting.sty +% ちょっとした修正 +\gdef\lst@breakProcessOther#1{\lst@ProcessOther#1} +% ソースコード目次における文字と番号の空き +\let \l@lstlisting = \l@figure + +%%%% +% キャプションとソースコード目次に対する日本語対応 +%\def\lstlistingname{ソースコード} +%\def\lstlistlistingname{ソースコード目次} +% \end{修正事項} +%%%% + +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-microtype.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-microtype.sty new file mode 100644 index 0000000000..db2fac8481 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-microtype.sty @@ -0,0 +1,67 @@ +% +% lltjp-microtype.sty 2019-08-12 +% +% (Work in Progress) +% +\NeedsTeXFormat{LaTeX2e} + +\RequirePackage{etoolbox} +\makeatletter + +\def\MT@register@font{% + \xdef\MT@font@list{\expandonce{\MT@font@list\MT@font},}% !!! +} +\def\MT@register@subst@font{\MT@exp@one@n\MT@in@clist\font@name\MT@font@list + \ifMT@inlist@\else + \xdef\MT@font@list{\expandonce{\MT@font@list\font@name},}% !!! + \fi} +\let\ltj@MT@tracking@\MT@tracking@ +\def\MT@tracking@{% + \MT@exp@one@n\MT@in@clist\MT@font\MT@tr@font@list + \ifMT@inlist@\else + \MT@maybe@do{tr}% + \ifMT@do\else + \xdef\MT@tr@font@list{\expandonce{\MT@tr@font@list\MT@font,}}% !!! + \fi + \fi +} +\ifx\MT@tracking\ltj@MT@tracking@\let\MT@tracking\MT@tracking@\fi + + +%\endinput +\begingroup + \catcode`\/=\z@ + /MT@map@tlist@n{/\LτJCHAREX}/@makeother /lccode`/τ=`/t + /lowercase{% + /def/x{/endgroup + /def/MT@charstring{\CHAR"}% + /def/MT@is@char##1\CHAR"##2##3##4/relax{% + %/message{MIC <##1><##2><##3><##4>}% + /ifx/relax##4/relax + /expandafter/MT@is@char@ltja/MT@strip@prefix##1>/relax\LτJALCHAR\LτJALCHAR/relax + /else + /ifx/relax##1/relax + /if##3\/relax + /edef/MT@char@{/number"##2}% + /MT@ifstreq/MT@charstring{##3##4}/relax/MT@norestfalse + /else + /edef/MT@char@{/number"##2##3}% + /MT@ifstreq/MT@charstring{##4}/relax + {/MT@is@xchar##2##3|##4\CHAR"/relax}% + /fi + /fi + /fi + }% + /def/MT@ltjs@drop@##1>##2/relax{##1}% + /def/MT@is@char@ltja##1\LτJALCHAR##2\LτJALCHAR##3/relax{% + %/typeout{MICLTJA <##1><##2><##3>}% + /ifx/relax##1/relax + /ifx/relax##2/relax/else + /edef/MT@char@{/expandafter/number/MT@ltjs@drop@##2>/relax}% + /fi + /fi + }% + }% + } +/x +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-preview.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-preview.sty new file mode 100644 index 0000000000..00602884ea --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-preview.sty @@ -0,0 +1,22 @@ +% +% lltjp-preview.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjp-preview}[2018/01/20 Patch to preview for LuaTeX-ja] + +\RequirePackage{etoolbox,preview} +\newbox\ltj@preview@box + +\patchcmd\pr@endbox{% + \pr@ship@end +}{% + \setbox\ltj@preview@box=\box\AtBeginShipoutBox + \setbox\AtBeginShipoutBox=\vbox{\yoko\box\pr@box}% + \directlua{luatexja.direction.finalize()}% + \setbox\pr@box=\box\AtBeginShipoutBox + \setbox\AtBeginShipoutBox=\box\ltj@preview@box + \pr@ship@end +}{}{} + +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-siunitx.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-siunitx.sty new file mode 100644 index 0000000000..c6bebc36cd --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-siunitx.sty @@ -0,0 +1,96 @@ +% +% lltjp-siunitx.sty 2019-06-06 +% + +\NeedsTeXFormat{LaTeX2e} + +\RequirePackage{siunitx} +\makeatletter +\ExplSyntaxOn +\cs_generate_variant:Nn \tl_if_in:NnT { coT } +\cs_new:Nn \__ltj_siunix_patch_inner:n { + \cs_if_exist:cT { #1_tl } { + \tl_if_in:coT { #1_tl } { \tex_char:D } { + \tl_replace_all:cnn { #1_tl } { \tex_char:D } { \ltjalchar } + } + } +} +\cs_new:Nn \__ltj_siunix_patch_inner_math:n { + \__ltj_siunix_patch_inner:n { l__siunitx_#1_math } + \__ltj_siunix_patch_inner:n { l__siunitx_#1_text } +} +\AtBeginDocument { + \__ltj_siunix_patch_inner:n { c__siunitx_minus } + \__ltj_siunix_patch_inner:n { c__siunitx_mu } + \__ltj_siunix_patch_inner_math:n { angstrom } + \__ltj_siunix_patch_inner_math:n { arcminute } + \__ltj_siunix_patch_inner_math:n { arcsecond } + \__ltj_siunix_patch_inner_math:n { ohm } +} + +%%%% new table column: S and s +\bool_new:N \l__ltj_siunitx_table_collect_relax_bool +\cs_set_protected:Npn \__siunitx_table_collect_begin_s: { + \bool_set_false:N \l__ltj_siunitx_table_collect_relax_bool + \cs_set_eq:NN \__siunitx_table_collect_token:N + \__siunitx_table_collect_token_s:N + \cs_set_eq:NN \__siunitx_table_print: \__siunitx_table_print_s: + \__siunitx_table_collect_init_s: + \__siunitx_table_collect_get: +} + +\cs_set_protected:Npn \__siunitx_table_collect_not_braced:N #1 + { + \token_if_eq_meaning:NNTF #1 \tex_relax:D { + \bool_if:NTF \l__ltj_siunitx_table_collect_relax_bool { + \__siunitx_table_collect_not_braced_aux_i:N #1 + } { + \bool_set_true:N \l__ltj_siunitx_table_collect_relax_bool + } + } { + \token_if_eq_meaning:NNF #1 \ltjfakeboxbdd { + \token_if_eq_meaning:NNF #1 \pltx@next@inhibitglue { + \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D + { + \token_if_eq_meaning:NNF #1 \tex_unskip:D + { \__siunitx_table_collect_not_braced_aux_i:N #1 } + } + }}} + \__siunitx_table_collect_next: + } + +\AtBeginDocument + { + \@ifpackageloaded { mdwtab } + { + \cs_set_protected:Npn \__siunitx_table_collect_not_braced:N #1 + { + \token_if_eq_meaning:NNTF #1 \tex_relax:D { + \bool_if:NTF \l__ltj_siunitx_table_collect_relax_bool { + \__siunitx_table_collect_not_braced_aux_i:N #1 + } { + \bool_set_true:N \l__ltj_siunitx_table_collect_relax_bool + } + } { + \token_if_eq_meaning:NNF #1 \ltjfakeboxbdd { + \token_if_eq_meaning:NNF #1 \pltx@next@inhibitglue { + \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D + { + \token_if_eq_meaning:NNF #1 \tex_unskip:D + { + \token_if_eq_meaning:NNF #1 \tab@setcr + { + \token_if_eq_meaning:NNF #1 \@maybe@unskip + { \__siunitx_table_collect_not_braced_aux_i:N #1 } + } + } + } + }}} + \__siunitx_table_collect_next: + } + } + { } + } + +\ExplSyntaxOff +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-stfloats.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-stfloats.sty new file mode 100644 index 0000000000..e7535bd7e1 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-stfloats.sty @@ -0,0 +1,27 @@ +% +% lltjp-stfloats.sty 2017-05-05 +% + +\NeedsTeXFormat{LaTeX2e} + +\RequirePackage{stfloats} +\RequirePackage{etoolbox} + +\newif\ifltj@stfloats@fnbelowfloat +\let\ltj@fn@makecol=\fn@makecol +\ifx\@makecol\ltj@fn@makecol\ltj@stfloats@fnbelowfloattrue\fi % \fnbelowfloat 発行済 +\let\ltj@fn@makecol=\relax +\global\let\org@makecol\ltj@orig@makecol + +\patchcmd\fn@makecol{\vskip -\dimen@\@textbottom}% + {\ifnum\ltjgetparameter{direction}=4\else\vbox{\hskip\z@}\fi %%% LuaTeX-ja + \vskip -\dimen@ + \ifltj@ftn@unvboxed\iffnfixbottom\else\@textbottom\fi\else\@textbottom\fi}{}{} +\patchcmd\fn@makecol{\vskip\skip\footins}{\iffnfixbottom\vskip\z@\@plus.0001fil\fi\vskip\skip\footins}{}{} +\patchcmd\fn@makecol{\ifvoid\footins}{\ifvoid\footins\ltj@ftn@unvboxedfalse}{}{} +\patchcmd\fn@makecol{\setbox\@outputbox \vbox}{\ltj@ftn@unvboxedtrue\setbox\@outputbox \vbox}{}{} + +\ifltj@stfloats@fnbelowfloat + \global\let\@makecol\fn@makecol +\fi +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-tascmac.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-tascmac.sty new file mode 100644 index 0000000000..d0ac424701 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-tascmac.sty @@ -0,0 +1,142 @@ +% +% lltjp-tascmac.sty +% based on tascmac.sty [2016/04/15 v2.0b (community edition)] +% \tbaselineshift=\z@ ==> \ltj@tablshift=\z@ +% \ybaselineshift=\z@ ==> \ltj@yablshift=\z@ +% \dimen...=\tbaselineshift ==> \dimen...=\ltj@tablshift sp +% \dimen...=\ybaselineshift ==> \dimen...=\ltj@yablshift sp + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjp-tascmac}[2017/12/23 Patch to (t)ascmac for LuaTeX-ja] + +\RequirePackage{tascmac} + +%% use Type1 font for ascgrp +\pdfextension mapline{+ascgrp <ascgrp.pfb} + +%% oval command +\def\ascmac@parse@ovarg#1{% + \ifnum\ltjgetparameter{direction}=3\relax + \def\ascmac@ovarg{}% + \@tfor\reserved@a:=#1\do{% + \if l\reserved@a \edef\ascmac@ovarg{\ascmac@ovarg t}% + \else\if t\reserved@a \edef\ascmac@ovarg{\ascmac@ovarg r}% + \else\if r\reserved@a \edef\ascmac@ovarg{\ascmac@ovarg b}% + \else\if b\reserved@a \edef\ascmac@ovarg{\ascmac@ovarg l}% + \fi\fi\fi\fi}% + \else + \def\ascmac@ovarg{#1}% + \fi +} + +%% boxnote environment +\def\boxnote{\par\vspace{.3\baselineskip}% + \@saveybaselineshift\ltj@yablshift sp\ltj@yablshift\z@ + \@savetbaselineshift\ltj@tablshift sp\ltj@tablshift\z@ + \setbox\@nbox=\hbox{\@ascgrp\vrule width1.08pt depth35pt b\hss a\hss b} + \@whiledim \wd\@nbox<\hsize \do{ + \setbox\@nbox=\hbox{\@ascgrp\unhbox\@nbox \hss a\hss b}} + \setbox\@nbox=\hbox to\hsize{\@ascgrp\unhbox\@nbox \hss a\hss b% + \vrule width1.08pt depth35pt} + \@bw=\wd\@nbox\advance\@bw -40pt + \begin{lrbox}{\@nbody}\begin{minipage}{\@bw}% (KN:1998/02/27) + \ltj@yablshift\@saveybaselineshift \ltj@tablshift\@savetbaselineshift}% + +%% screen environment +\def\screen{% + \@saveybaselineshift\ltj@yablshift sp\ltj@yablshift\z@ + \@savetbaselineshift\ltj@tablshift sp\ltj@tablshift\z@ + \@ifnextchar[{\@screen}{\@screen[0]}} +\def\@screen[#1]{\ifcase#1\def\@r{20}\def\@s{9.8pt}\def\@sx{10pt}\or + \def\@r{18}\def\@s{8.8pt}\def\@sx{9pt}\or + \def\@r{16}\def\@s{7.8pt}\def\@sx{8pt}\or + \def\@r{14}\def\@s{6.8pt}\def\@sx{7pt}\or + \def\@r{12}\def\@s{5.8pt}\def\@sx{6pt}\or + \def\@r{10}\def\@s{4.8pt}\def\@sx{5pt}\or + \def\@r{8}\def\@s{3.8pt}\def\@sx{4pt}\or + \def\@r{6}\def\@s{2.8pt}\def\@sx{3pt}\else + \def\@r{4}\def\@s{1.8pt}\def\@sx{2pt}\fi + \par\vspace{.3\baselineskip}\@scw\linewidth \advance\@scw -\@r pt + \setbox\scb@x=\hbox to\@scw\bgroup\begin{minipage}{\@scw}% (KN:1998/02/27) + \ltj@yablshift\@saveybaselineshift \ltj@tablshift\@savetbaselineshift}% + +%% itembox environment +\def\@itembox[#1]#2{% + \@saveybaselineshift\ltj@yablshift sp\ltj@yablshift\z@ + \@savetbaselineshift\ltj@tablshift sp\ltj@tablshift\z@ + \par\vspace{.3\baselineskip}% + \setbox\@iboxstr=\hbox{% + \ltj@yablshift\@saveybaselineshift \ltj@tablshift\@savetbaselineshift #2}% + \@itemh\ht\@iboxstr\advance\@itemh\dp\@iboxstr + \vspace{.5\@itemh}\bgroup\@scw\linewidth + \advance\@scw-20pt\@iboxpos={#1}% + \setbox\scb@x=\hbox to\@scw\bgroup\begin{minipage}{\@scw}% + \ltj@yablshift\@saveybaselineshift + \ltj@tablshift\@savetbaselineshift + \vspace*{.5\@itemh}}% + +%% \keytop +\def\@keytop[#1]#2{% + {\setbox0=\hbox{\shortstack{#2}}\ltj@yablshift\z@\ltj@tablshift\z@% + \dimen0=\wd0\advance\dimen0 5pt\dimen1=\dp0\advance\dimen1 2.5pt% + \setbox\scscb@x=\hbox to\dimen0{% + \@scw\wd0\hfil\vtop{\offinterlineskip + \thinlines\setlength{\unitlength}{1pt}\hrule\kern2.3pt\@hobox{tl}{tr}5% + \kern-2.4pt\box0\@hobox{bl}{br}5\kern-.4pt\hrule}\hfil}% + \dimen0=\dp\scscb@x\advance\dimen0 -.4pt + \setbox0=\vbox{\hbox{\hbox to.2pt{\vtop to\dimen0{\@vrf@{2.3pt}{.4pt}}\hss}% + \box\scscb@x\hbox to.2pt{\hss\vtop to\dimen0{\@vrf@{2.3pt}{.4pt}}}}}% + \if #1c\mbox{}$\vcenter{\box0}$\mbox{}\else + \if #1t\else\if #1b\boxmaxdepth=0pt\else + \boxmaxdepth=\dimen1\fi\fi \mbox{}\vbox{\box0}\fi}} + +%% \mask +\def\mask#1#2{{\setbox\@bwsp=\hbox{#1}% + \setbox0=\hbox{\ltj@yablshift\z@\ltj@tablshift\z@ \@ascgrp#2}% + \dimen0=\wd\@bwsp\dimen1=\ht\@bwsp\advance\dimen1\dp\@bwsp\dimen2=-\dimen1 + \setdim@{\dimen0}{\wd0}\setdim@{\dimen1}{\ht0}% + \setbox\@@bwsp=\hbox to\dimen0{\leaders + \vtop to\dimen1{\leaders\box0\vfil}\hfil}% + \advance\dimen2\dp\@@bwsp\divide\dimen2 2 + \advance\dimen2\dp\@bwsp\boxmaxdepth=\dimen2 + \setbox\@@bwsp=\vbox{\box\@@bwsp}% + \mbox{}\hbox to\wd\@@bwsp{\hbox to0pt{\box\@@bwsp\hss}\hss\unhbox\@bwsp\hss}}} + +%% \maskbox +\def\Maskbox#1#2#3#4#5#6{{% + \setbox0=\hbox{\ltj@yablshift\z@\ltj@tablshift\z@ \@ascgrp#3}% + \dimen0=#1\@setdim{\dimen0}{\wd0}\dimen1=#2\@setdim{\dimen1}{\ht0}% + \ifx#4c\skip0=0pt plus1fil\skip1=\skip0\fi + \ifx#4r\skip0=0pt plus1fil\skip1=0pt\fi + \ifx#4l\skip1=0pt plus1fil\skip0=0pt\fi + \leavevmode + \hbox{\hbox to0pt{\hbox to\dimen0{\leaders\vbox to\dimen1{\leaders + \box0\vfil}\hfil}\hss}% + \vrule width#5\vbox to\dimen1{\hrule height#5\vfil + \dimen3=#5\advance\dimen0-2\dimen3\advance\dimen0 .15pt + \hbox to\dimen0{\hskip\skip0\relax#6\hskip\skip1}% + \vfil\hrule height#5}\vrule width#5}}} + +%% shadebox environment +\def\shadebox{\par\vspace{.3\baselineskip}% + \@saveybaselineshift\ltj@yablshift sp\ltj@yablshift\z@ + \@savetbaselineshift\ltj@tablshift sp\ltj@tablshift\z@ + \dimen0\linewidth \advance\dimen0-20pt + \advance\dimen0-2\fboxrule \advance\dimen0-\shaderule + \setbox\@tempboxa=\hbox\bgroup\minipage{\dimen0}% + \ltj@yablshift\@saveybaselineshift \ltj@tablshift\@savetbaselineshift} + +%% \yen +% +% \changes{1996/03/13}{v1.1}{Append \cs{leavevmode} in +% \cs{yen}, \cs{return}, \cs{Return} command.} +% +\def\yen{\leavevmode\hbox{\yoko% +\setbox0=\hbox{Y}Y\kern-.97\wd0\vbox{\hrule height.1ex width.98\wd0 +\kern.33ex\hrule height.1ex width.98\wd0\kern.45ex}}} +% +%% return-key +\def\return{\leavevmode\hbox{\yoko\@ascgrp\char"20}} +\def\Return{\leavevmode\hbox{\yoko\@ascgrp @}} + +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-unicode-math.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-unicode-math.sty new file mode 100644 index 0000000000..d8c4055d14 --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-unicode-math.sty @@ -0,0 +1,87 @@ +% +% lltjp-unicode-math.sty 2018-10-09 +% + +\NeedsTeXFormat{LaTeX2e} + +\RequirePackage{unicode-math,etoolbox} + +\ExplSyntaxOn + +\cs_set:Nn \__um_define_math_chars: { + \group_begin: + \cs_set:Npn \__um_sym:nnn ##1##2##3 + { + \ltjsetmathletter{ ##1 } + \tl_if_in:nnT + { \mathord \mathalpha \mathbin \mathrel \mathpunct \mathop \mathfence } + {##3} + { + \exp_last_unbraced:NNx \cs_gset_eq:NN ##2 { \char_generate:nn {##1} {12} } + } + } + \__um_input_math_symbol_table: + \group_end: +} +\unless\ifltj@disablejfam +\cs_set:Npn \use@mathgroup #1 #2 +{ + %\typeout{UM <#1><#2>} + \mode_if_math:T % <- not sure + { + \math@bgroup + \cs_if_eq:cNF {M@\f@encoding} #1 {#1} + \__um_switchto_literal: + \ltj@tempcnta=#2 \expandafter\ltj@@mathJapaneseFonts\string#1\relax% + \ifin@ \jfam #2 \relax \else \mathgroup #2 \relax \fi + \math@egroup + } +} +\fi + +\ifcsname jsc@mag@xrealtrue \endcsname \else + \expandafter\expandafter\expandafter \ExplSyntaxOff \expandafter \endinput +\fi +\ifjsc@mag@xreal + \cs_if_exist:cTF { ltjs@orig@get@external@font } { + % ltjsclasses: use lua + \cs_new:Nn \lltjp_um_unmag_fsize: + { + \cs_gset:Nx \lltjp_um_f@size: {\directlua{luatexja.ltjs_unmagnify_fsize(\f@size)}} + \cs_gset:Nx \lltjp_um_sf@size: {\directlua{luatexja.ltjs_unmagnify_fsize(\sf@size)}} + \cs_gset:Nx \lltjp_um_ssf@size: {\directlua{luatexja.ltjs_unmagnify_fsize(\ssf@size)}} + } + }{ + % bxjscls: use \jsc@preadjust@extract@font + \cs_new:Nn \lltjp_um_unmag_fsize: + { + \group_begin: + \jsc@preadjust@extract@font + \cs_gset_eq:NN \lltjp_um_f@size: \f@size + \group_end: + \group_begin: + \cs_set_eq:NN \f@size \sf@size \jsc@preadjust@extract@font + \cs_gset_eq:NN \lltjp_um_sf@size: \f@size + \group_end: + \group_begin: + \cs_set_eq:NN \f@size \ssf@size \jsc@preadjust@extract@font + \cs_gset_eq:NN \lltjp_um_ssf@size: \f@size + \group_end: + } + } + \pretocmd { \__um_fontspec_select_font: } { + \cs_set_eq:NN \lltjp_um_orig_fsize: \f@size + \lltjp_um_unmag_fsize: + \cs_set_eq:NN \f@size \lltjp_um_f@size: + \cs_set_eq:NN \tf@size \lltjp_um_f@size: + \cs_set_eq:NN \sf@size \lltjp_um_sf@size: + \cs_set_eq:NN \ssf@size \lltjp_um_ssf@size: + } {} {} + \apptocmd { \__um_fontspec_select_font: } { + \cs_set_eq:NN \f@size \lltjp_um_orig_fsize: + } {} {} +\fi + +\ExplSyntaxOff + +\endinput diff --git a/macros/luatex/generic/luatexja/src/patches/lltjp-xunicode.sty b/macros/luatex/generic/luatexja/src/patches/lltjp-xunicode.sty new file mode 100644 index 0000000000..3d6e49fbaa --- /dev/null +++ b/macros/luatex/generic/luatexja/src/patches/lltjp-xunicode.sty @@ -0,0 +1,99 @@ +% +% lltjp-xunicode.sty +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{lltjp-xunicode}[2017/05/05 Patch to xunicode for LuaTeX-ja] + +\def\XeTeXpicfile{} +\RequirePackage{xunicode} +{\catcode`\"=12 +\gdef\check@hexcom@digits@#1#2#3#4#5@!@#6#7#8{% + \ifx @#4\relax + \UTFacc@warning@{insufficient hex digits #7 for #6-\string#8}% + \else + \ifcat \active\noexpand#8% + \ifx\add@flag\@ne % + \expandafter\def\csname\UTFencname\string#8\endcsname{\ltjalchar"#1#2#3#4\relax}% + \ifx\unDeFiNed@#8% + \ifx\cf@encoding\UTFencname + \DeclareTextCommand{#8}{OT1}{\undefined}% + \else + \DeclareTextCommand{#8}{\cf@encoding}{\undefined}% + \fi + \else {% macro #8 exists already ... + \let\protect\noexpand + \edef\UTF@testi{#8}\def\UTF@testii{#8}% + \ifx\UTF@testi\UTF@testii\aftergroup\UTF@ignore + \else\aftergroup\UTF@doit\fi + }% + \iffalse + % ... but when it isn't robust, make it so + \expandafter\let\csname?-\string#8\endcsname#8\relax + \edef\next@UTF@{{\cf@encoding}% + {\expandafter\noexpand\csname?-\string#8\endcsname}}% + \expandafter\DeclareTextCommand\expandafter + {\expandafter#8\expandafter}\next@UTF@ + \fi + \fi % + \else % \add@flag \z@ + \expandafter\global\expandafter + \let\csname\UTFencname\string#8\endcsname\relax + \fi % end of \add@flag switch + \else % not active catcode --- shouldn't happen + % \typeout{*** did you really mean #8 ? ***}% + \ifx\add@flag\@ne % + \edef\tmp@name{\expandafter\string\csname\UTFencname\endcsname + \expandafter\string\csname#8\endcsname}% + \expandafter\def\csname\tmp@name\endcsname{\ltjalchar"#1#2#3#4\relax}% + \ifx\cf@encoding\UTFencname + \expandafter\DeclareTextCommand\expandafter + {\csname#8\endcsname}{OT1}{\undefined}% + \else + \expandafter\DeclareTextCommand\expandafter + {\csname#8\endcsname}{\cf@encoding}{\undefined}% + \fi + \else % \add@flag \z@ + \expandafter\global\expandafter\let\csname#8\endcsname\relax + \fi % end of \add@flag switch + \fi % end of \ifcat + \fi} +\gdef\check@hex@digits@#1#2#3#4#5@!@#6#7#8#9{% + \ifx @#4\relax + \UTFacc@warning@{insufficient hex digits #7 for #6-\string#8#9}% + \else + \def\UTFchar{\ltjalchar"#1#2#3#4\relax}% + \expandafter\expandafter\expandafter\declare@utf@composite + \expandafter\expandafter\expandafter + {\expandafter\csname#6\endcsname}{\UTFchar}{#8}{#9}\relax + \fi} +\gdef\add@UTF@accent#1#2#3{\ifx\relax#2\relax\ltjalchar"#3\else + \ifx\ #2\relax\ltjalchar"#3\else + \expandafter\ifx\UTF@space#2\relax\ltjalchar"#3\else + \ifx~#2\ltjalchar"#3\else#2\ltjalchar"#1\fi\fi\fi\fi\relax} +\gdef\add@UTF@accents#1#2#3{#2\ltjalchar"#1\ltjalchar"#3\relax} +} +% If unicode-math is already loaded, the following error occurs: +% ! Undefined control sequence. +% \hbar ->\hslash +% Therefore temporarily set \hbar=\relax. +\let\ltj@tmpa\hbar +\let\hbar\relax + +\let\ltj@tmpb\iftipaonetoken +\let\iftipaonetoken\relax +%\typeout{UTFencname: \UTFencname} +\let\ltj@temp=\@temp +\edef\@temp{\noexpand\ReloadXunicode{\UTFencname}}\@temp +\makeatletter +\let\@temp=\ltj@temp\let\ltj@temp\relax +\let\hbar\ltj@tmpa +\let\iftipaonetoken\ltj@tmpb +\let\ltj@tmpb\relax % no more an if-token + +%% ticket 30501 +{\catcode`\!0\catcode`\\11!catcode`!2 11!catcode`!?11!catcode`!-11 + !expandafter!gdef!csname!UTFencname \nobreakspace!endcsname{!?-\nobreakspace}% +} + +\endinput diff --git a/macros/luatex/generic/luatexja/tool/blocks2defcharrange.rb b/macros/luatex/generic/luatexja/tool/blocks2defcharrange.rb new file mode 100644 index 0000000000..186d0ba94d --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/blocks2defcharrange.rb @@ -0,0 +1,25 @@ +#! /usr/bin/ruby + +# The following script converts Blocks.txt +# (http://unicode.org/Public/UNIDATA/Blocks.txt) +# to the character range definitions of LuaTeX-ja. + +# USAGE: ruby blocks2defcharrange.rb > unicodeBlocks.tex + +count = 1 +open("Blocks.txt", "r").each_line {|line| + if line =~ /#/ + line = $` + end + if line =~ /^\s*$/ + next + end + if line =~ /([0-9a-f]+)\.\.([0-9a-f]+); (.*)/i + bcharcode = $1 + echarcode = $2 + blockname = $3 + print "\\defcharrange{", count + print "}{\"", bcharcode, "-\"", echarcode, "} % ", blockname, "\n" + count += 1 + end +} diff --git a/macros/luatex/generic/luatexja/tool/chars2defcharrange.rb b/macros/luatex/generic/luatexja/tool/chars2defcharrange.rb new file mode 100644 index 0000000000..21f6e7728c --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/chars2defcharrange.rb @@ -0,0 +1,51 @@ +#! /usr/bin/ruby +# -*- coding: utf-8 -*- + +# The following script converts a set of chars except "\s", as Ruby defines, +# to the character range definition of LuaTeX-ja. + +# USAGE: ruby __FILE__ ifile rangeNo [> ofile] + +# Example (in Japanese) +# 教育漢字リスト (http://www.aozora.gr.jp/kanji_table/kyouiku_list.zip) +# に対して適用したいとき. +# 1. kyoikukanji.txt に対して,コメント部分の先頭に # をつける編集を加える; +# 2. ruby chars2defcharrange.rb kyoikukanji.txt 210 > kyoikukanjiChars.tex +# を実行する. + +def print_usage() + print "USAGE: ruby ", __FILE__, "ifile rangeNo [> ofile]\n" +end + +if __FILE__ == $0 + # コマンドライン引数の処理 + if ARGV.length < 2 + print_usage() + exit + end + ifile = ARGV[0] + rangeNo = ARGV[1] + + # 対象文字列の作成 + string = "" + open(ifile, "r").each_line{|line| + if line =~ /#/ + line = $` + end + line.gsub!(/\s/){} + string += line + } + + # 10 進 unicode code point 配列に変換 + decs = string.unpack("U*") + + # print + print "\defcharrange{", rangeNo, "}{" + decs.each_with_index{|code, index| + if index != 0 + print "," + end + print "\"", code.to_s(16) + } + print "}\n" +end diff --git a/macros/luatex/generic/luatexja/tool/function_uax50.lua b/macros/luatex/generic/luatexja/tool/function_uax50.lua new file mode 100644 index 0000000000..d345284535 --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/function_uax50.lua @@ -0,0 +1,50 @@ +kpse.set_program_name('luatex') +dofile(kpse.find_file('lualibs.lua')) + +local function toX(a) return string.format('0x%X',a) end + +local uax_revision = '12.1.0' +print(' -- UAX#50 for Unicode ' .. uax_revision) +local fh = io.open('VerticalOrientation-' .. uax_revision .. '.txt') +local t = {} + +for c in fh:lines() do + if c:match('(%x+)%.%.(%x+)%s+;%sT-[rR]') then + local b, e = c:match('(%x+)%.%.(%x+)%s+;') + b, e = tonumber(b,16), tonumber(e,16) + for i=b,e do t[i]=true end + elseif c:match('(%x+)%s+;%sT-[rR]') then + local b = c:match('(%x+)%s+;') + t[tonumber(b,16)]=true + end +end + +fh:close() +local t2={} +local b, v = 0, t[0] +for i=0,0x10ffff do + if t[i]~=v then + table.insert(t2,b); b, v=i, t[i] + end +end +table.insert(t2,b) + +print(' -- t[0] = ' .. tostring(t[0])) +print(table.serialize(t2,' local t')) + +--[[ +for i,v in ipairs(t2) do + print(i, toX(v[1]) .. ' ≦x< ' .. toX(v[2]), v[3]) +end +]] + +print([[ local function rotate_in_uax50(i) + local lo, hi = 1, #t + while lo < hi do + local mi = math.ceil((lo+hi)/2) + if t[mi]<=i then lo=mi else hi=mi-1 end + end + return lo%2==1 + end +]]) + diff --git a/macros/luatex/generic/luatexja/tool/ivslist.tex b/macros/luatex/generic/luatexja/tool/ivslist.tex new file mode 100644 index 0000000000..0e0a712461 --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/ivslist.tex @@ -0,0 +1,58 @@ +%#!lualatex +\documentclass{article} +\batchmode +\usepackage{luaotfload,booktabs,array,luacode,longtable} +\usepackage[scale=0.8]{geometry} +\errorstopmode + +\ifdefined\myfontname\else +{\newlinechar=`@ +\message{@Name of the font to test = } +\read-1 to\myfontname \global\let\myfontname\myfontname +\message{@}} +\fi +\font\test=\myfontname\space at 12pt +{\test\begin{luacode} + ident = fonts.hashes.identifiers[font.current()] +\end{luacode} +} + + +\def\FMT#1#2{{\oalign{\test\char#1\crcr\rm\tiny\hss#2\hss\crcr}}} +\def\OUT#1{\leavevmode\hbox to 7em{{\test\char"#1}\ ({\tt U+#1})\hss}}%" +\begin{document} +{\noindent\Large\bf \myfontname\\\null\hfill (% + \directlua{tex.sprint(ident.fullname)}% +)} + +\bigskip +\baselineskip18pt + +\begin{luacode} +local t = ident.shared.rawdata +t = t and t.resources +t = t and t.variants +local ivs, ivsi = {}, {} +for i,v in pairs(t) do + if i>=0xE0100 then + for j,w in pairs(v) do + if not ivs[j] then table.insert(ivsi,j); ivs[j]=ivs[j] or {}; end + table.insert(ivs[j],{i-0xE0100,w}) + end + end +end +local sort = table.sort +local sortfn = function (a,b) return a[1]<b[1] end +sort(ivsi) +for _,v in pairs(ivsi) do + sort(ivs[v], sortfn) + tex.sprint('\\OUT{' .. string.format('%X', v) .. '}\\ ') + for _, cn in pairs(ivs[v]) do + tex.sprint('\\FMT{' .. tostring(cn[2]) .. '}{' .. cn[1] .. '}' ) + end + tex.sprint('\\par') +end +\end{luacode} + + +\end{document}
\ No newline at end of file diff --git a/macros/luatex/generic/luatexja/tool/jfm-convert.lua b/macros/luatex/generic/luatexja/tool/jfm-convert.lua new file mode 100755 index 0000000000..66b73a02cd --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/jfm-convert.lua @@ -0,0 +1,281 @@ +#!/usr/bin/env texlua + +local stderr = io.stderr +local function show_usage(s) + stderr:write('Error: ' .. s .. '\n'); + stderr:write('Usage: jfm-convert [-J|-U] <ptex_jfm>\n'); + stderr:write('-J: JIS mode, -U: UCS mode \n'); + stderr:write(' * The output will be written to stdout.\n'); + stderr:write(' * I do not read virtual fonts which corresponded to <ptex_jfm>.\n'); + stderr:write(" You will need to adjust 'align', 'left', 'down' entries by hand.\n"); + stderr:write(" * In JIS mode, characters which are not included in JIS X 0208\n"); + stderr:write(" (e.g., 0x2257) are written as 0x202577.\n"); + os.exit(1) +end + +require('unicode'); local uchar = unicode.utf8.char +kpse.set_program_name('luatex') +jisx0208 = require('ltj-jisx0208.lua').table_jisx0208_uptex +local function pass_ucs(s) + return "'" .. uchar(s) .. "'" +end +local function jis_to_ucs(s) + local a = jisx0208[s-0x2020] + return a and pass_ucs(a) or string.format('0x%X',s+0x200000) +end + +-------- 引数解釈 -------- + +require('unicode') +local filename +local mode + +for i=1,#arg do + if arg[i]=='-u' or arg[i]=='-U' then + mode = pass_ucs + elseif arg[i]=='-j' or arg[i]=='-J' then + mode = jis_to_ucs + elseif filename then + show_usage('Multiple JFM files.') + else + filename = arg[i] + end +end + +if not filename then show_usage('Missing JFM file argument.') end +kpse.set_program_name('ptex') +local nf = kpse.find_file(filename, 'tfm') +if not nf then show_usage("JFM file can't be opened: " .. filename) end + +-------- OPEN -------- + +local jfm_ptex = io.open(nf, 'rb') +local function get_word() + local d = table.pack(string.byte(jfm_ptex:read(4),1,4)) + return d[1]*16777216+d[2]*65536+d[3]*256+d[4] +end +local function get_signed_word() + local d = get_word() + return (d>=2147483648) and -(4294967296-d) or d +end +local extract = bit32.extract +local function get_two() + local d = get_word() + return extract(d,16,16), extract(d,0,16) +end +local function get_four() + local d = get_word() + return extract(d,24,8), extract(d,16,8), extract(d,8,8), extract(d,0,8) +end + +local id, nt = get_two() +local lf, lh = get_two() +local bc, ec = get_two() +local nw, nh = get_two() +local nd, ni = get_two() +local nl, nk = get_two() +local ng, np = get_two() + +if bc~=0 or + lf~= 7 + lh + nt + (ec - bc + 1) + nw + nh + nd + ni + nl + nk + ng + np or + (id~=11 and id~=9) then + stderr:write('Bad JFM "' .. filename .. '".\n'); jfm_ptex:close(); os.exit(1) +end + +local result = {} +result.dir = (id==11) and 'yoko' or 'tate' + +-------- HEADER -------- + +_ = get_word() -- checksum, unused +local designsize = get_word()/1048576 -- ignored + +local encoding +if lh>=3 then + encoding = '' + for i=1,math.min(10,lh-2) do encoding = encoding .. jfm_ptex:read(4) end + encoding = encoding:sub(2, 1+string.byte(encoding)) +end +if not encoding then encoding = 'UNSPECIFIED' end + +local family = '' +if lh>=13 then + for i=1,math.min(5,lh-12) do family = family .. jfm_ptex:read(4) end + family = family:sub(2, 1+string.byte(family)) +end + +local face = 0 +if lh>=18 then + _, _, _, face = get_four() + for i=1,lh-19 do jfm_ptex:read(4) end -- ignored +end + +-------- CHAR_TYPE -------- +result[0] = {} +local all_ctype = {} +for i=1,nt do + local ccode, ctype = get_two() + if ccode~=0 then + all_ctype[#all_ctype+1] = ccode + end + if ctype~=0 then + if not result[ctype] then result[ctype] = {} end + if not result[ctype].chars then result[ctype].chars = {} end + local t = result[ctype].chars + t[#t+1] = ccode + end +end + +-------- CHAR_INFO -------- +for i=0,ec do + if not result[i] then result[i] = {} end + local t, info = result[i], get_word() + t.align, t.left, t.down = 'left', 0, 0 + t.width = extract(info, 24, 8) + t.height = extract(info, 20, 4) + t.depth = extract(info, 16, 4) + t.italic = extract(info, 10, 6) + t.tag = extract(info, 8, 2) + t.rem = extract(info, 0, 8) +end + +local wi, hi, di, ii = {}, {}, {}, {} +for i=0,nw-1 do wi[i] = get_signed_word() end +for i=0,nh-1 do hi[i] = get_signed_word() end +for i=0,nd-1 do di[i] = get_signed_word() end +for i=0,ni-1 do ii[i] = get_signed_word() end + + +-------- GLUE/KERN -------- + +local gk_table = {} +for i=0,nl-1 do gk_table[i] = table.pack(get_four()) end + +local kerns = {} +for i=0,nk-1 do kerns[i] = get_signed_word() end + +local glues = {} +for i=0,ng/3-1 do glues[i] = { get_signed_word(), get_signed_word(), get_signed_word() } end + + +-------- PARAM -------- +local param = {} +for i=1,math.min(9, np) do param[i] = get_word() end +local zw = param[6] +result.kanjiskip = { + param[2]/zw, param[3]/zw, param[4]/zw +} +result.xkanjiskip = { + param[7]/zw, param[8]/zw, param[9]/zw +} +result.zw, result.zh = 1.0, param[5]/zw + + + +-------- 各種 index の解決 -------- +for i=0,ec do + local t = result[i] + t.width = wi[t.width]/zw + t.height = hi[t.height]/zw + t.depth = di[t.depth]/zw + t.italic = ii[t.italic]/zw + if t.tag==1 then + local j = t.rem + while j do + local gkp = gk_table[j] + j = (gkp[1]<128) and j+gkp[1]+1 or nil + if gkp[3]<128 then + if not t.glue then t.glue = {} end + t.glue[gkp[2]] = { + glues[gkp[4]][1]/zw, + glues[gkp[4]][2]/zw, + glues[gkp[4]][3]/zw, + } + else + if not t.kern then t.kern = {} end + t.kern[gkp[2]] = kerns[gkp[4]]/zw + end + end + end + t.tag, t.rem = nil, nil +end + +jfm_ptex:close() + + +-------- モード判定 -------- +if not mode then + mode = jis_to_ucs + for i=1, #all_ctype do + if not jisx0208[all_ctype[i]-0x2020] then + mode = pass_ucs; break + end + end +end + +-------- 出力 -------- +local function S(a) + if type(a)=='number' then + return tostring(math.floor(a*1000000+0.5)/1000000) + elseif type(a)=='table' then -- glue + return '{ ' .. S(a[1]) .. ', ' .. S(a[2]) .. ', ' .. S(a[3]) .. '},' + elseif type(a)=='string' then + return "'" .. a .. "'" + else + tostring(a) + end +end + +print('-- -*- coding: utf-8 -*-') +print('-- converted from ' .. filename .. ' by jfm_convert.lua') +print('-- assumed encoding: ' .. (mode==jis_to_ucs and 'JIS' or 'UCS') .. '\n') +print('luatexja.jfont.define_jfm {') +print(' -- original design size = ' .. S(designsize)) +print(' -- original encoding = (' .. encoding .. ')') +print(' -- original family = (' .. family .. ')') +print(" dir = " .. S(result.dir) .. ",") +print(' zw = ' .. S(result.zw) .. ', zh = ' .. S(result.zh) .. ', ') +print(' kanjiskip = ' .. S(result.kanjiskip)) +print(' xkanjiskip = ' .. S(result.xkanjiskip)) +for i=0, ec do + local t = result[i] + print(' [' .. tostring(i) .. '] = {') + if t.chars then + print(' chars = {') + local d = ' ' + for j=1,#(t.chars) do + d = d .. mode(t.chars[j]) .. ', ' + if j%8==0 and j<#(t.chars) then + d = d .. '\n ' + end + end + print(d) + print(' },') + end + print(' align = ' .. S(t.align) .. ', left = ' .. S(0.0) + .. ', down = ' .. S(0.0) .. ', ') + print(' width = ' .. S(t.width) .. ', height = ' .. S(t.height) + .. ', depth = ' .. S(t.depth) .. ', italic = ' .. S(t.italic) .. ',') + if t.glue then + print(' glue = {') + local gi = {} + for m,_ in pairs(t.glue) do gi[#gi+1]=m end + table.sort(gi) + for _,m in ipairs(gi) do + print(' [' .. tostring(m) .. '] = ' .. S(t.glue[m])) + end + print(' },') + end + if t.kern then + print(' kern = {') + local gi = {} + for m,_ in pairs(t.kern) do gi[#gi+1]=m end + table.sort(gi) + for _,m in ipairs(gi) do + print(' [' .. tostring(m) .. '] = ' .. S(t.kern[m]) .. ',') + end + print(' },') + end + print(' },') +end +print('}') diff --git a/macros/luatex/generic/luatexja/tool/jfm-readable.rb b/macros/luatex/generic/luatexja/tool/jfm-readable.rb new file mode 100644 index 0000000000..d60ad2efa5 --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/jfm-readable.rb @@ -0,0 +1,25 @@ +#! /usr/bin/ruby +# -*- coding: utf-8 -*- + +# The following script converts Unicode codepoints as 0x???? to real characters. + +# USAGE: ruby __FILE__ ifile [> ofile] + +def print_usage() + print "USAGE: ruby ", __FILE__, "ifile [> ofile]\n" +end + +if __FILE__ == $0 + # コマンドライン引数の処理 + if ARGV.length < 1 + print_usage() + exit + end + ifile = ARGV[0] + + print "-- -*- coding: utf-8 -*-\n" + open(ifile, "r").each_line{|line| + line.gsub!(/0x[0-9a-fA-F]*/){|s| s.to_s + "(" + [s.to_i(0)].pack("U*") + ")"} + print line + } +end diff --git a/macros/luatex/generic/luatexja/tool/kyoikukanji.txt b/macros/luatex/generic/luatexja/tool/kyoikukanji.txt new file mode 100644 index 0000000000..76c48a6fd7 --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/kyoikukanji.txt @@ -0,0 +1,19 @@ +#教育漢字・学年別漢字配当表 + +#★第一学年★(80字) +一 右 雨 円 王 音 下 火 花 貝 学 気 九 休 玉 金 空 月 犬 見 五 口 校 左 三 山 子 四 糸 字 耳 七 車 手 十 出 女 小 上 森 人 水 正 生 青 夕 石 赤 千 川 先 早 草 足 村 大 男 竹 中 虫 町 天 田 土 二 日 入 年 白 八 百 文 木 本 名 目 立 力 林 六 + +#★第二学年★(160字) +引 羽 雲 園 遠 何 科 夏 家 歌 画 回 会 海 絵 外 角 楽 活 間 丸 岩 顔 汽 記 帰 弓 牛 魚 京 強 教 近 兄 形 計 元 言 原 戸 古 午 後 語 工 公 広 交 光 考 行 高 黄 合 谷 国 黒 今 才 細 作 算 止 市 矢 姉 思 紙 寺 自 時 室 社 弱 首 秋 週 春 書 少 場 色 食 心 新 親 図 数 西 声 星 晴 切 雪 船 線 前 組 走 多 太 体 台 地 池 知 茶 昼 長 鳥 朝 直 通 弟 店 点 電 刀 冬 当 東 答 頭 同 道 読 内 南 肉 馬 売 買 麦 半 番 父 風 分 聞 米 歩 母 方 北 毎 妹 万 明 鳴 毛 門 夜 野 友 用 曜 来 里 理 話 + +#★第三学年★(200字) +悪 安 暗 医 委 意 育 員 院 飲 運 泳 駅 央 横 屋 温 化 荷 界 開 階 寒 感 漢 館 岸 起 期 客 究 急 級 宮 球 去 橋 業 曲 局 銀 区 苦 具 君 係 軽 血 決 研 県 庫 湖 向 幸 港 号 根 祭 皿 仕 死 使 始 指 歯 詩 次 事 持 式 実 写 者 主 守 取 酒 受 州 拾 終 習 集 住 重 宿 所 暑 助 昭 消 商 章 勝 乗 植 申 身 神 真 深 進 世 整 昔 全 相 送 想 息 速 族 他 打 対 待 代 第 題 炭 短 談 着 注 柱 丁 帳 調 追 定 庭 笛 鉄 転 都 度 投 豆 島 湯 登 等 動 童 農 波 配 倍 箱 畑 発 反 坂 板 皮 悲 美 鼻 筆 氷 表 秒 病 品 負 部 服 福 物 平 返 勉 放 味 命 面 問 役 薬 由 油 有 遊 予 羊 洋 葉 陽 様 落 流 旅 両 緑 礼 列 練 路 和 + +#★第四学年★(200字) +愛 案 以 衣 位 囲 胃 印 英 栄 塩 億 加 果 貨 課 芽 改 械 害 街 各 覚 完 官 管 関 観 願 希 季 紀 喜 旗 器 機 議 求 泣 救 給 挙 漁 共 協 鏡 競 極 訓 軍 郡 径 型 景 芸 欠 結 建 健 験 固 功 好 候 航 康 告 差 菜 最 材 昨 札 刷 殺 察 参 産 散 残 士 氏 史 司 試 児 治 辞 失 借 種 周 祝 順 初 松 笑 唱 焼 象 照 賞 臣 信 成 省 清 静 席 積 折 節 説 浅 戦 選 然 争 倉 巣 束 側 続 卒 孫 帯 隊 達 単 置 仲 貯 兆 腸 低 底 停 的 典 伝 徒 努 灯 堂 働 特 得 毒 熱 念 敗 梅 博 飯 飛 費 必 票 標 不 夫 付 府 副 粉 兵 別 辺 変 便 包 法 望 牧 末 満 未 脈 民 無 約 勇 要 養 浴 利 陸 良 料 量 輪 類 令 冷 例 歴 連 老 労 録 + +#★第五学年★(185字) +圧 移 因 永 営 衛 易 益 液 演 応 往 桜 恩 可 仮 価 河 過 賀 快 解 格 確 額 刊 幹 慣 眼 基 寄 規 技 義 逆 久 旧 居 許 境 均 禁 句 群 経 潔 件 券 険 検 限 現 減 故 個 護 効 厚 耕 鉱 構 興 講 混 査 再 災 妻 採 際 在 財 罪 雑 酸 賛 支 志 枝 師 資 飼 示 似 識 質 舎 謝 授 修 述 術 準 序 招 承 証 条 状 常 情 織 職 制 性 政 勢 精 製 税 責 績 接 設 舌 絶 銭 祖 素 総 造 像 増 則 測 属 率 損 退 貸 態 団 断 築 張 提 程 適 敵 統 銅 導 徳 独 任 燃 能 破 犯 判 版 比 肥 非 備 俵 評 貧 布 婦 富 武 復 複 仏 編 弁 保 墓 報 豊 防 貿 暴 務 夢 迷 綿 輸 余 預 容 略 留 領 + +#★第六学年★(181字) +異 遺 域 宇 映 延 沿 我 灰 拡 革 閣 割 株 干 巻 看 簡 危 机 揮 貴 疑 吸 供 胸 郷 勤 筋 系 敬 警 劇 激 穴 絹 権 憲 源 厳 己 呼 誤 后 孝 皇 紅 降 鋼 刻 穀 骨 困 砂 座 済 裁 策 冊 蚕 至 私 姿 視 詞 誌 磁 射 捨 尺 若 樹 収 宗 就 衆 従 縦 縮 熟 純 処 署 諸 除 将 傷 障 城 蒸 針 仁 垂 推 寸 盛 聖 誠 宣 専 泉 洗 染 善 奏 窓 創 装 層 操 蔵 臓 存 尊 宅 担 探 誕 段 暖 値 宙 忠 著 庁 頂 潮 賃 痛 展 討 党 糖 届 難 乳 認 納 脳 派 拝 背 肺 俳 班 晩 否 批 秘 腹 奮 並 陛 閉 片 補 暮 宝 訪 亡 忘 棒 枚 幕 密 盟 模 訳 郵 優 幼 欲 翌 乱 卵 覧 裏 律 臨 朗 論 diff --git a/macros/luatex/generic/luatexja/tool/kyoikukanjiChars.tex b/macros/luatex/generic/luatexja/tool/kyoikukanjiChars.tex new file mode 100644 index 0000000000..623d4fb8e7 --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/kyoikukanjiChars.tex @@ -0,0 +1 @@ +\ltjdefcharrange{210}{"4E00,"53F3,"96E8,"5186,"738B,"97F3,"4E0B,"706B,"82B1,"8C9D,"5B66,"6C17,"4E5D,"4F11,"7389,"91D1,"7A7A,"6708,"72AC,"898B,"4E94,"53E3,"6821,"5DE6,"4E09,"5C71,"5B50,"56DB,"7CF8,"5B57,"8033,"4E03,"8ECA,"624B,"5341,"51FA,"5973,"5C0F,"4E0A,"68EE,"4EBA,"6C34,"6B63,"751F,"9752,"5915,"77F3,"8D64,"5343,"5DDD,"5148,"65E9,"8349,"8DB3,"6751,"5927,"7537,"7AF9,"4E2D,"866B,"753A,"5929,"7530,"571F,"4E8C,"65E5,"5165,"5E74,"767D,"516B,"767E,"6587,"6728,"672C,"540D,"76EE,"7ACB,"529B,"6797,"516D,"5F15,"7FBD,"96F2,"5712,"9060,"4F55,"79D1,"590F,"5BB6,"6B4C,"753B,"56DE,"4F1A,"6D77,"7D75,"5916,"89D2,"697D,"6D3B,"9593,"4E38,"5CA9,"9854,"6C7D,"8A18,"5E30,"5F13,"725B,"9B5A,"4EAC,"5F37,"6559,"8FD1,"5144,"5F62,"8A08,"5143,"8A00,"539F,"6238,"53E4,"5348,"5F8C,"8A9E,"5DE5,"516C,"5E83,"4EA4,"5149,"8003,"884C,"9AD8,"9EC4,"5408,"8C37,"56FD,"9ED2,"4ECA,"624D,"7D30,"4F5C,"7B97,"6B62,"5E02,"77E2,"59C9,"601D,"7D19,"5BFA,"81EA,"6642,"5BA4,"793E,"5F31,"9996,"79CB,"9031,"6625,"66F8,"5C11,"5834,"8272,"98DF,"5FC3,"65B0,"89AA,"56F3,"6570,"897F,"58F0,"661F,"6674,"5207,"96EA,"8239,"7DDA,"524D,"7D44,"8D70,"591A,"592A,"4F53,"53F0,"5730,"6C60,"77E5,"8336,"663C,"9577,"9CE5,"671D,"76F4,"901A,"5F1F,"5E97,"70B9,"96FB,"5200,"51AC,"5F53,"6771,"7B54,"982D,"540C,"9053,"8AAD,"5185,"5357,"8089,"99AC,"58F2,"8CB7,"9EA6,"534A,"756A,"7236,"98A8,"5206,"805E,"7C73,"6B69,"6BCD,"65B9,"5317,"6BCE,"59B9,"4E07,"660E,"9CF4,"6BDB,"9580,"591C,"91CE,"53CB,"7528,"66DC,"6765,"91CC,"7406,"8A71,"60AA,"5B89,"6697,"533B,"59D4,"610F,"80B2,"54E1,"9662,"98F2,"904B,"6CF3,"99C5,"592E,"6A2A,"5C4B,"6E29,"5316,"8377,"754C,"958B,"968E,"5BD2,"611F,"6F22,"9928,"5CB8,"8D77,"671F,"5BA2,"7A76,"6025,"7D1A,"5BAE,"7403,"53BB,"6A4B,"696D,"66F2,"5C40,"9280,"533A,"82E6,"5177,"541B,"4FC2,"8EFD,"8840,"6C7A,"7814,"770C,"5EAB,"6E56,"5411,"5E78,"6E2F,"53F7,"6839,"796D,"76BF,"4ED5,"6B7B,"4F7F,"59CB,"6307,"6B6F,"8A69,"6B21,"4E8B,"6301,"5F0F,"5B9F,"5199,"8005,"4E3B,"5B88,"53D6,"9152,"53D7,"5DDE,"62FE,"7D42,"7FD2,"96C6,"4F4F,"91CD,"5BBF,"6240,"6691,"52A9,"662D,"6D88,"5546,"7AE0,"52DD,"4E57,"690D,"7533,"8EAB,"795E,"771F,"6DF1,"9032,"4E16,"6574,"6614,"5168,"76F8,"9001,"60F3,"606F,"901F,"65CF,"4ED6,"6253,"5BFE,"5F85,"4EE3,"7B2C,"984C,"70AD,"77ED,"8AC7,"7740,"6CE8,"67F1,"4E01,"5E33,"8ABF,"8FFD,"5B9A,"5EAD,"7B1B,"9244,"8EE2,"90FD,"5EA6,"6295,"8C46,"5CF6,"6E6F,"767B,"7B49,"52D5,"7AE5,"8FB2,"6CE2,"914D,"500D,"7BB1,"7551,"767A,"53CD,"5742,"677F,"76AE,"60B2,"7F8E,"9F3B,"7B46,"6C37,"8868,"79D2,"75C5,"54C1,"8CA0,"90E8,"670D,"798F,"7269,"5E73,"8FD4,"52C9,"653E,"5473,"547D,"9762,"554F,"5F79,"85AC,"7531,"6CB9,"6709,"904A,"4E88,"7F8A,"6D0B,"8449,"967D,"69D8,"843D,"6D41,"65C5,"4E21,"7DD1,"793C,"5217,"7DF4,"8DEF,"548C,"611B,"6848,"4EE5,"8863,"4F4D,"56F2,"80C3,"5370,"82F1,"6804,"5869,"5104,"52A0,"679C,"8CA8,"8AB2,"82BD,"6539,"68B0,"5BB3,"8857,"5404,"899A,"5B8C,"5B98,"7BA1,"95A2,"89B3,"9858,"5E0C,"5B63,"7D00,"559C,"65D7,"5668,"6A5F,"8B70,"6C42,"6CE3,"6551,"7D66,"6319,"6F01,"5171,"5354,"93E1,"7AF6,"6975,"8A13,"8ECD,"90E1,"5F84,"578B,"666F,"82B8,"6B20,"7D50,"5EFA,"5065,"9A13,"56FA,"529F,"597D,"5019,"822A,"5EB7,"544A,"5DEE,"83DC,"6700,"6750,"6628,"672D,"5237,"6BBA,"5BDF,"53C2,"7523,"6563,"6B8B,"58EB,"6C0F,"53F2,"53F8,"8A66,"5150,"6CBB,"8F9E,"5931,"501F,"7A2E,"5468,"795D,"9806,"521D,"677E,"7B11,"5531,"713C,"8C61,"7167,"8CDE,"81E3,"4FE1,"6210,"7701,"6E05,"9759,"5E2D,"7A4D,"6298,"7BC0,"8AAC,"6D45,"6226,"9078,"7136,"4E89,"5009,"5DE3,"675F,"5074,"7D9A,"5352,"5B6B,"5E2F,"968A,"9054,"5358,"7F6E,"4EF2,"8CAF,"5146,"8178,"4F4E,"5E95,"505C,"7684,"5178,"4F1D,"5F92,"52AA,"706F,"5802,"50CD,"7279,"5F97,"6BD2,"71B1,"5FF5,"6557,"6885,"535A,"98EF,"98DB,"8CBB,"5FC5,"7968,"6A19,"4E0D,"592B,"4ED8,"5E9C,"526F,"7C89,"5175,"5225,"8FBA,"5909,"4FBF,"5305,"6CD5,"671B,"7267,"672B,"6E80,"672A,"8108,"6C11,"7121,"7D04,"52C7,"8981,"990A,"6D74,"5229,"9678,"826F,"6599,"91CF,"8F2A,"985E,"4EE4,"51B7,"4F8B,"6B74,"9023,"8001,"52B4,"9332,"5727,"79FB,"56E0,"6C38,"55B6,"885B,"6613,"76CA,"6DB2,"6F14,"5FDC,"5F80,"685C,"6069,"53EF,"4EEE,"4FA1,"6CB3,"904E,"8CC0,"5FEB,"89E3,"683C,"78BA,"984D,"520A,"5E79,"6163,"773C,"57FA,"5BC4,"898F,"6280,"7FA9,"9006,"4E45,"65E7,"5C45,"8A31,"5883,"5747,"7981,"53E5,"7FA4,"7D4C,"6F54,"4EF6,"5238,"967A,"691C,"9650,"73FE,"6E1B,"6545,"500B,"8B77,"52B9,"539A,"8015,"9271,"69CB,"8208,"8B1B,"6DF7,"67FB,"518D,"707D,"59BB,"63A1,"969B,"5728,"8CA1,"7F6A,"96D1,"9178,"8CDB,"652F,"5FD7,"679D,"5E2B,"8CC7,"98FC,"793A,"4F3C,"8B58,"8CEA,"820E,"8B1D,"6388,"4FEE,"8FF0,"8853,"6E96,"5E8F,"62DB,"627F,"8A3C,"6761,"72B6,"5E38,"60C5,"7E54,"8077,"5236,"6027,"653F,"52E2,"7CBE,"88FD,"7A0E,"8CAC,"7E3E,"63A5,"8A2D,"820C,"7D76,"92AD,"7956,"7D20,"7DCF,"9020,"50CF,"5897,"5247,"6E2C,"5C5E,"7387,"640D,"9000,"8CB8,"614B,"56E3,"65AD,"7BC9,"5F35,"63D0,"7A0B,"9069,"6575,"7D71,"9285,"5C0E,"5FB3,"72EC,"4EFB,"71C3,"80FD,"7834,"72AF,"5224,"7248,"6BD4,"80A5,"975E,"5099,"4FF5,"8A55,"8CA7,"5E03,"5A66,"5BCC,"6B66,"5FA9,"8907,"4ECF,"7DE8,"5F01,"4FDD,"5893,"5831,"8C4A,"9632,"8CBF,"66B4,"52D9,"5922,"8FF7,"7DBF,"8F38,"4F59,"9810,"5BB9,"7565,"7559,"9818,"7570,"907A,"57DF,"5B87,"6620,"5EF6,"6CBF,"6211,"7070,"62E1,"9769,"95A3,"5272,"682A,"5E72,"5DFB,"770B,"7C21,"5371,"673A,"63EE,"8CB4,"7591,"5438,"4F9B,"80F8,"90F7,"52E4,"7B4B,"7CFB,"656C,"8B66,"5287,"6FC0,"7A74,"7D79,"6A29,"61B2,"6E90,"53B3,"5DF1,"547C,"8AA4,"540E,"5B5D,"7687,"7D05,"964D,"92FC,"523B,"7A40,"9AA8,"56F0,"7802,"5EA7,"6E08,"88C1,"7B56,"518A,"8695,"81F3,"79C1,"59FF,"8996,"8A5E,"8A8C,"78C1,"5C04,"6368,"5C3A,"82E5,"6A39,"53CE,"5B97,"5C31,"8846,"5F93,"7E26,"7E2E,"719F,"7D14,"51E6,"7F72,"8AF8,"9664,"5C06,"50B7,"969C,"57CE,"84B8,"91DD,"4EC1,"5782,"63A8,"5BF8,"76DB,"8056,"8AA0,"5BA3,"5C02,"6CC9,"6D17,"67D3,"5584,"594F,"7A93,"5275,"88C5,"5C64,"64CD,"8535,"81D3,"5B58,"5C0A,"5B85,"62C5,"63A2,"8A95,"6BB5,"6696,"5024,"5B99,"5FE0,"8457,"5E81,"9802,"6F6E,"8CC3,"75DB,"5C55,"8A0E,"515A,"7CD6,"5C4A,"96E3,"4E73,"8A8D,"7D0D,"8133,"6D3E,"62DD,"80CC,"80BA,"4FF3,"73ED,"6669,"5426,"6279,"79D8,"8179,"596E,"4E26,"965B,"9589,"7247,"88DC,"66AE,"5B9D,"8A2A,"4EA1,"5FD8,"68D2,"679A,"5E55,"5BC6,"76DF,"6A21,"8A33,"90F5,"512A,"5E7C,"6B32,"7FCC,"4E71,"5375,"89A7,"88CF,"5F8B,"81E8,"6717,"8AD6,} diff --git a/macros/luatex/generic/luatexja/tool/ltj-unicode-ccfix_make2.pl b/macros/luatex/generic/luatexja/tool/ltj-unicode-ccfix_make2.pl new file mode 100755 index 0000000000..f55962956d --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/ltj-unicode-ccfix_make2.pl @@ -0,0 +1,107 @@ +#!/usr/bin/env perl + +# create ltj-unicode-ccfix.tex by processing Unicode data file +# LineBreak.txt + +# modified from unicode-char-prep.pl (part of the XeTeX typesetting system). +# original copyright is as follows: +# +# /****************************************************************************\ +# Part of the XeTeX typesetting system +# Copyright (c) 1994-2008 by SIL International +# Copyright (c) 2009 by Jonathan Kew +# +# SIL Author(s): Jonathan Kew +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE +# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the copyright holders +# shall not be used in advertising or otherwise to promote the sale, +# use or other dealings in this Software without prior written +# authorization from the copyright holders. +# \****************************************************************************/ + +die "usage: perl $0 LineBreak.txt > unicode-letters.tex\n" + unless $#ARGV == 0; + +sub parse_unidata { + my (@u) = @_; + $lccode{$u[0]} = $u[13] if $u[13] ne ''; + $lccode{$u[0]} = $u[0] if $u[13] eq '' and ($u[2] =~ /^L/ or $u[12] ne ''); + $uccode{$u[0]} = $u[12] if $u[12] ne ''; + $uccode{$u[0]} = $u[0] if $u[12] eq '' and ($u[2] =~ /^L/ or $u[13] ne ''); + if ($u[2] =~ /^L/) { + push(@letters, $u[0]); + } + elsif ($u[2] =~ /^M/) { + push(@marks, $u[0]); + } + elsif (exists $lccode{$u[0]} or exists $uccode{$u[0]}) { + push(@casesym, $u[0]); + } +} + + +my ($start, $end); +$date = `date`; +chomp $date; +print << "__EOT__"; +-- Do not edit this file! +-- Created from LineBreak.txt by ltj-unicode-ccfix_make.pl on $date. +-- In case of errors, fix the Perl script instead. +__EOT__ + +%lineBreakClass = ( + 'ID' => 1, # ideograph +); + + +print << '__EOT__'; +local tex_catcode = tex.setcatcode +local tex_getcc = tex.getcatcode +local function set_letter(b,e) + if tex_getcc(b)~=11 then + for i=b,e do tex_catcode('global', i, 11) end + end +end +__EOT__ + +open LineBreak, $ARGV[0] or die "can't read $ARGV[0]"; +while (<LineBreak>) { + chomp; + s/ *#.*//; + s/ +$//; + if (m/([0-9A-F]{4,6})(?:\.\.([0-9A-F]{4,6}))?;(..)/) { + $s = $1; + $e = $2; + $lb = $3; + $e = $s if $e eq ''; + if (exists $lineBreakClass{$lb}) { + if ($lineBreakClass{$lb} == 1) { + # ideographs: set whole range to class 1 + print "set_letter(0x$s,0x$e)\n"; + } + } + } +} +close LineBreak; + +print << '__EOT__'; +__EOT__ diff --git a/macros/luatex/generic/luatexja/tool/otf-AdobeMingStd-Light.txt b/macros/luatex/generic/luatexja/tool/otf-AdobeMingStd-Light.txt new file mode 100644 index 0000000000..21ef023c47 --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/otf-AdobeMingStd-Light.txt @@ -0,0 +1,13 @@ +aalt Access All Alternates +ccmp Glyph Composition/Decomposition +cpct <unknown feature> +dlig Discretionary Ligatures +fwid Full Widths +halt Alternate Half Widths +hwid Half Widths +liga Standard Ligatures +nalt Alternate Annotation Forms +pwid Proportional Widths +vert Vertical Writing +vhal Alternate Vertical Half Metrics +vrt2 Vertical Alternates and Rotation diff --git a/macros/luatex/generic/luatexja/tool/otf-AdobeMyungjoStd-Medium.txt b/macros/luatex/generic/luatexja/tool/otf-AdobeMyungjoStd-Medium.txt new file mode 100644 index 0000000000..d2c7a22d15 --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/otf-AdobeMyungjoStd-Medium.txt @@ -0,0 +1,13 @@ +aalt Access All Alternates +dlig Discretionary Ligatures +fwid Full Widths +halt Alternate Half Widths +hngl Hangul +hwid Half Widths +nalt Alternate Annotation Forms +pwid Proportional Widths +sinf Scientific Inferiors +sups Superscript +vert Vertical Writing +vhal Alternate Vertical Half Metrics +vrt2 Vertical Alternates and Rotation diff --git a/macros/luatex/generic/luatexja/tool/otf-AdobeSongStd-Light.txt b/macros/luatex/generic/luatexja/tool/otf-AdobeSongStd-Light.txt new file mode 100644 index 0000000000..7bbdc3666d --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/otf-AdobeSongStd-Light.txt @@ -0,0 +1,12 @@ +aalt Access All Alternates +cpct <unknown feature> +dlig Discretionary Ligatures +fwid Full Widths +halt Alternate Half Widths +hwid Half Widths +nalt Alternate Annotation Forms +pwid Proportional Widths +trad Traditional Forms +vert Vertical Writing +vhal Alternate Vertical Half Metrics +vrt2 Vertical Alternates and Rotation diff --git a/macros/luatex/generic/luatexja/tool/otf-KozMinPr6N-Regular.txt b/macros/luatex/generic/luatexja/tool/otf-KozMinPr6N-Regular.txt new file mode 100644 index 0000000000..04b027baa2 --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/otf-KozMinPr6N-Regular.txt @@ -0,0 +1,38 @@ +aalt Access All Alternates +afrc Alternative Fractions +ccmp Glyph Composition/Decomposition +dlig Discretionary Ligatures +dnom Denominators +expt Expert Forms +frac Fractions +fwid Full Widths +halt Alternate Half Widths +hkna Horizontal Kana Alternates +hojo <unknown feature> +hwid Half Widths +ital Italics +jp78 JIS78 Forms +jp83 JIS83 Forms +jp90 JIS90 Forms +kern Kerning +liga Standard Ligatures +nalt Alternate Annotation Forms +nlck NLC Kanji Forms +numr Numerators +palt Proportional Alternate Widths +pkna <unknown feature> +pwid Proportional Widths +qwid Quarter Widths +ruby Ruby Notation Forms +sinf Scientific Inferiors +subs Subscript +sups Superscript +trad Traditional Forms +twid Third Widths +vert Vertical Writing +vhal Alternate Vertical Half Metrics +vkna Vertical Kana Alternates +vkrn Vertical Kerning +vpal Proportional Alternate Vertical Metrics +vrt2 Vertical Alternates and Rotation +zero Slashed Zero diff --git a/macros/luatex/generic/luatexja/tool/table_ivd_aj1.lua b/macros/luatex/generic/luatexja/tool/table_ivd_aj1.lua new file mode 100644 index 0000000000..cf898a47b2 --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/table_ivd_aj1.lua @@ -0,0 +1,32 @@ +print([[ +return { +version = 2, +table_ivd_aj1 = {]]) + +local f = io.open('IVD_Sequences.txt') +local t, maxcid = {}, 0 +local s = f:read() +while s do + if s:match('#') then + print('-- ' .. s) + elseif s:match('Adobe.Japan.') then + local c1,c2,c3 = s:match('(%x+)%s+(%x+);%s+Adobe.Japan.;%s+CID%+(%d+)') + c1, c2, c3 = tonumber(c1, 16), tonumber(c2, 16), tonumber(c3) + if c2 and c2>=0xE0100 then + c2 = c2 - 0xE00FF + if maxcid<c3 then maxcid = c3 end + t[c3] = c2*0x200000+c1 + end + end + s = f:read() +end +f:close() + +for i=1,maxcid do + print(' ' .. tostring(t[i] or false) .. ',') +end + + +-- ( echo 'luatexja.otf.ivd_aj1 = {' ; grep 'Adobe-Japan1' IVD_Sequences.txt|sed 's/\([0-9A-F][0-9A-F]*\) \([0-9A-F][0-9A-F]*\)\;.*CID.\([0-9][0-9]*\)$/[\3]=\{0x\1,0x\2\},/' ; echo '}' ) +print([[}}]]) + diff --git a/macros/luatex/generic/luatexja/tool/table_jisx0208.lua b/macros/luatex/generic/luatexja/tool/table_jisx0208.lua new file mode 100644 index 0000000000..f3de6b982e --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/table_jisx0208.lua @@ -0,0 +1,112 @@ +%#! euptex +% cat jisx0208table.log | tr -s '\n' > ../src/luatexja/jisx0208.lua +% の後,少々修正 +\catcode`\!=1 +\catcode`\?=2 + +\catcode`@11 +\def\@firstoftwo#1#2{#1} +\def\@secondoftwo#1#2{#2} +\def\ifnumcomp#1#2#3{% + \ifnum\numexpr#1\relax#2\numexpr#3\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\def\truncdiv#1#2{% + \ifnumcomp{#1}<{(#1)/(#2)*(#2)}{% + \numexpr(#1)/(#2)-1% + }{% + \numexpr(#1)/(#2)% + }% +} +\def\hex#1{% + \ifnumcomp{#1}<0{}{\hn@i{#1}{}}% +} +\def\hn@i#1#2{% + \ifnumcomp{#1}<{16} + {% + \hn@digit{#1}#2% + }{% + \expandafter\hn@ii\expandafter{% + \the\numexpr\truncdiv{#1}{16}% + }{#1}{#2}% + }% +} +\def\hn@ii#1#2#3{% + \expandafter\hn@i\expandafter{% + \number\numexpr#1\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\expandafter}% + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter{% + \hn@digit{(#2)-16*(#1)}#3}% +} +\begingroup +\catcode`012\catcode`112\catcode`212\catcode`312\catcode`412 +\catcode`512\catcode`612\catcode`712\catcode`812\catcode`912 +\catcode`A12\catcode`B12\catcode`C12\catcode`D12\catcode`E12 +\catcode`F12 +\gdef\hn@digit#1{% + \ifcase\numexpr#1\relax 0% + \or \expandafter 1% + \or \expandafter 2% + \or \expandafter 3% + \or \expandafter 4% + \or \expandafter 5% + \or \expandafter 6% + \or \expandafter 7% + \or \expandafter 8% + \or \expandafter 9% + \or \expandafter A% + \or \expandafter B% + \or \expandafter C% + \or \expandafter D% + \or \expandafter E% + \or \expandafter F% + \fi +} +\endgroup + + +\catcode`\{=12 +\catcode`\}=12 +\def\folio!? + +\newcount\ku +\newcount\ten +\newcount\tmp +\newcount\tmpa +\newcount\tmpb +\font\tt=cmtt10 at 10pt\tt\baselineskip=12pt\parindent=0pt\parskip=0pt + +\catcode`\_=12 +\message!^^Jluatexbase.provides_module({? +\message!^^J name = 'luatexja.jisx0208'})? +\message!^^Jmodule('luatexja.jisx0208', package.seeall)? +\message!^^Jtable_jisx0208_uptex = {? + +\ku=1 +\loop + \tmp=\ku \multiply\tmp"100 \advance\tmp"2020 %" + ! \ten=1 + \loop + \advance\tmp1 + \tmpa=\jis\tmp \tmpb=\tmp\advance\tmpb-"2020%" + \ifnum\tmpa=0\else + \ifnum\tmpa>256 + \kansujichar1=\tmpa + \message!^^J [0x\hex\tmpb] = 0x\hex\tmpa, --(\kansuji1)? + \else + \message!^^J [0x\hex\tmpb] = 0x\hex\tmpa, ? + \fi + \fi + \advance\ten 1 + \ifnum\ten<95\relax\repeat + ? + \advance\ku 1 +\ifnum\ku<95\relax\repeat + +\message!^^J}? + +\end diff --git a/macros/luatex/generic/luatexja/tool/unicodeBlocks.tex b/macros/luatex/generic/luatexja/tool/unicodeBlocks.tex new file mode 100644 index 0000000000..afdd0620da --- /dev/null +++ b/macros/luatex/generic/luatexja/tool/unicodeBlocks.tex @@ -0,0 +1,210 @@ +% based on Unicode blocks Blocks-6.0.0.txt +\ltjdefcharrange{1}{"0000-"007F} % Basic Latin +\ltjdefcharrange{2}{"0080-"00FF} % Latin-1 Supplement +\ltjdefcharrange{3}{"0100-"017F} % Latin Extended-A +\ltjdefcharrange{4}{"0180-"024F} % Latin Extended-B +\ltjdefcharrange{5}{"0250-"02AF} % IPA Extensions +\ltjdefcharrange{6}{"02B0-"02FF} % Spacing Modifier Letters +\ltjdefcharrange{7}{"0300-"036F} % Combining Diacritical Marks +\ltjdefcharrange{8}{"0370-"03FF} % Greek and Coptic +\ltjdefcharrange{9}{"0400-"04FF} % Cyrillic +\ltjdefcharrange{10}{"0500-"052F} % Cyrillic Supplement +\ltjdefcharrange{11}{"0530-"058F} % Armenian +\ltjdefcharrange{12}{"0590-"05FF} % Hebrew +\ltjdefcharrange{13}{"0600-"06FF} % Arabic +\ltjdefcharrange{14}{"0700-"074F} % Syriac +\ltjdefcharrange{15}{"0750-"077F} % Arabic Supplement +\ltjdefcharrange{16}{"0780-"07BF} % Thaana +\ltjdefcharrange{17}{"07C0-"07FF} % NKo +\ltjdefcharrange{18}{"0800-"083F} % Samaritan +\ltjdefcharrange{19}{"0840-"085F} % Mandaic +\ltjdefcharrange{20}{"0900-"097F} % Devanagari +\ltjdefcharrange{21}{"0980-"09FF} % Bengali +\ltjdefcharrange{22}{"0A00-"0A7F} % Gurmukhi +\ltjdefcharrange{23}{"0A80-"0AFF} % Gujarati +\ltjdefcharrange{24}{"0B00-"0B7F} % Oriya +\ltjdefcharrange{25}{"0B80-"0BFF} % Tamil +\ltjdefcharrange{26}{"0C00-"0C7F} % Telugu +\ltjdefcharrange{27}{"0C80-"0CFF} % Kannada +\ltjdefcharrange{28}{"0D00-"0D7F} % Malayalam +\ltjdefcharrange{29}{"0D80-"0DFF} % Sinhala +\ltjdefcharrange{30}{"0E00-"0E7F} % Thai +\ltjdefcharrange{31}{"0E80-"0EFF} % Lao +\ltjdefcharrange{32}{"0F00-"0FFF} % Tibetan +\ltjdefcharrange{33}{"1000-"109F} % Myanmar +\ltjdefcharrange{34}{"10A0-"10FF} % Georgian +\ltjdefcharrange{35}{"1100-"11FF} % Hangul Jamo +\ltjdefcharrange{36}{"1200-"137F} % Ethiopic +\ltjdefcharrange{37}{"1380-"139F} % Ethiopic Supplement +\ltjdefcharrange{38}{"13A0-"13FF} % Cherokee +\ltjdefcharrange{39}{"1400-"167F} % Unified Canadian Aboriginal Syllabics +\ltjdefcharrange{40}{"1680-"169F} % Ogham +\ltjdefcharrange{41}{"16A0-"16FF} % Runic +\ltjdefcharrange{42}{"1700-"171F} % Tagalog +\ltjdefcharrange{43}{"1720-"173F} % Hanunoo +\ltjdefcharrange{44}{"1740-"175F} % Buhid +\ltjdefcharrange{45}{"1760-"177F} % Tagbanwa +\ltjdefcharrange{46}{"1780-"17FF} % Khmer +\ltjdefcharrange{47}{"1800-"18AF} % Mongolian +\ltjdefcharrange{48}{"18B0-"18FF} % Unified Canadian Aboriginal Syllabics Extended +\ltjdefcharrange{49}{"1900-"194F} % Limbu +\ltjdefcharrange{50}{"1950-"197F} % Tai Le +\ltjdefcharrange{51}{"1980-"19DF} % New Tai Lue +\ltjdefcharrange{52}{"19E0-"19FF} % Khmer Symbols +\ltjdefcharrange{53}{"1A00-"1A1F} % Buginese +\ltjdefcharrange{54}{"1A20-"1AAF} % Tai Tham +\ltjdefcharrange{55}{"1B00-"1B7F} % Balinese +\ltjdefcharrange{56}{"1B80-"1BBF} % Sundanese +\ltjdefcharrange{57}{"1BC0-"1BFF} % Batak +\ltjdefcharrange{58}{"1C00-"1C4F} % Lepcha +\ltjdefcharrange{59}{"1C50-"1C7F} % Ol Chiki +\ltjdefcharrange{60}{"1CD0-"1CFF} % Vedic Extensions +\ltjdefcharrange{61}{"1D00-"1D7F} % Phonetic Extensions +\ltjdefcharrange{62}{"1D80-"1DBF} % Phonetic Extensions Supplement +\ltjdefcharrange{63}{"1DC0-"1DFF} % Combining Diacritical Marks Supplement +\ltjdefcharrange{64}{"1E00-"1EFF} % Latin Extended Additional +\ltjdefcharrange{65}{"1F00-"1FFF} % Greek Extended +\ltjdefcharrange{66}{"2000-"206F} % General Punctuation +\ltjdefcharrange{67}{"2070-"209F} % Superscripts and Subscripts +\ltjdefcharrange{68}{"20A0-"20CF} % Currency Symbols +\ltjdefcharrange{69}{"20D0-"20FF} % Combining Diacritical Marks for Symbols +\ltjdefcharrange{70}{"2100-"214F} % Letterlike Symbols +\ltjdefcharrange{71}{"2150-"218F} % Number Forms +\ltjdefcharrange{72}{"2190-"21FF} % Arrows +\ltjdefcharrange{73}{"2200-"22FF} % Mathematical Operators +\ltjdefcharrange{74}{"2300-"23FF} % Miscellaneous Technical +\ltjdefcharrange{75}{"2400-"243F} % Control Pictures +\ltjdefcharrange{76}{"2440-"245F} % Optical Character Recognition +\ltjdefcharrange{77}{"2460-"24FF} % Enclosed Alphanumerics +\ltjdefcharrange{78}{"2500-"257F} % Box Drawing +\ltjdefcharrange{79}{"2580-"259F} % Block Elements +\ltjdefcharrange{80}{"25A0-"25FF} % Geometric Shapes +\ltjdefcharrange{81}{"2600-"26FF} % Miscellaneous Symbols +\ltjdefcharrange{82}{"2700-"27BF} % Dingbats +\ltjdefcharrange{83}{"27C0-"27EF} % Miscellaneous Mathematical Symbols-A +\ltjdefcharrange{84}{"27F0-"27FF} % Supplemental Arrows-A +\ltjdefcharrange{85}{"2800-"28FF} % Braille Patterns +\ltjdefcharrange{86}{"2900-"297F} % Supplemental Arrows-B +\ltjdefcharrange{87}{"2980-"29FF} % Miscellaneous Mathematical Symbols-B +\ltjdefcharrange{88}{"2A00-"2AFF} % Supplemental Mathematical Operators +\ltjdefcharrange{89}{"2B00-"2BFF} % Miscellaneous Symbols and Arrows +\ltjdefcharrange{90}{"2C00-"2C5F} % Glagolitic +\ltjdefcharrange{91}{"2C60-"2C7F} % Latin Extended-C +\ltjdefcharrange{92}{"2C80-"2CFF} % Coptic +\ltjdefcharrange{93}{"2D00-"2D2F} % Georgian Supplement +\ltjdefcharrange{94}{"2D30-"2D7F} % Tifinagh +\ltjdefcharrange{95}{"2D80-"2DDF} % Ethiopic Extended +\ltjdefcharrange{96}{"2DE0-"2DFF} % Cyrillic Extended-A +\ltjdefcharrange{97}{"2E00-"2E7F} % Supplemental Punctuation +\ltjdefcharrange{98}{"2E80-"2EFF} % CJK Radicals Supplement +\ltjdefcharrange{99}{"2F00-"2FDF} % Kangxi Radicals +\ltjdefcharrange{100}{"2FF0-"2FFF} % Ideographic Description Characters +\ltjdefcharrange{101}{"3000-"303F} % CJK Symbols and Punctuation +\ltjdefcharrange{102}{"3040-"309F} % Hiragana +\ltjdefcharrange{103}{"30A0-"30FF} % Katakana +\ltjdefcharrange{104}{"3100-"312F} % Bopomofo +\ltjdefcharrange{105}{"3130-"318F} % Hangul Compatibility Jamo +\ltjdefcharrange{106}{"3190-"319F} % Kanbun +\ltjdefcharrange{107}{"31A0-"31BF} % Bopomofo Extended +\ltjdefcharrange{108}{"31C0-"31EF} % CJK Strokes +\ltjdefcharrange{109}{"31F0-"31FF} % Katakana Phonetic Extensions +\ltjdefcharrange{110}{"3200-"32FF} % Enclosed CJK Letters and Months +\ltjdefcharrange{111}{"3300-"33FF} % CJK Compatibility +\ltjdefcharrange{112}{"3400-"4DBF} % CJK Unified Ideographs Extension A +\ltjdefcharrange{113}{"4DC0-"4DFF} % Yijing Hexagram Symbols +\ltjdefcharrange{114}{"4E00-"9FFF} % CJK Unified Ideographs +\ltjdefcharrange{115}{"A000-"A48F} % Yi Syllables +\ltjdefcharrange{116}{"A490-"A4CF} % Yi Radicals +\ltjdefcharrange{117}{"A4D0-"A4FF} % Lisu +\ltjdefcharrange{118}{"A500-"A63F} % Vai +\ltjdefcharrange{119}{"A640-"A69F} % Cyrillic Extended-B +\ltjdefcharrange{120}{"A6A0-"A6FF} % Bamum +\ltjdefcharrange{121}{"A700-"A71F} % Modifier Tone Letters +\ltjdefcharrange{122}{"A720-"A7FF} % Latin Extended-D +\ltjdefcharrange{123}{"A800-"A82F} % Syloti Nagri +\ltjdefcharrange{124}{"A830-"A83F} % Common Indic Number Forms +\ltjdefcharrange{125}{"A840-"A87F} % Phags-pa +\ltjdefcharrange{126}{"A880-"A8DF} % Saurashtra +\ltjdefcharrange{127}{"A8E0-"A8FF} % Devanagari Extended +\ltjdefcharrange{128}{"A900-"A92F} % Kayah Li +\ltjdefcharrange{129}{"A930-"A95F} % Rejang +\ltjdefcharrange{130}{"A960-"A97F} % Hangul Jamo Extended-A +\ltjdefcharrange{131}{"A980-"A9DF} % Javanese +\ltjdefcharrange{132}{"AA00-"AA5F} % Cham +\ltjdefcharrange{133}{"AA60-"AA7F} % Myanmar Extended-A +\ltjdefcharrange{134}{"AA80-"AADF} % Tai Viet +\ltjdefcharrange{135}{"AB00-"AB2F} % Ethiopic Extended-A +\ltjdefcharrange{136}{"ABC0-"ABFF} % Meetei Mayek +\ltjdefcharrange{137}{"AC00-"D7AF} % Hangul Syllables +\ltjdefcharrange{138}{"D7B0-"D7FF} % Hangul Jamo Extended-B +\ltjdefcharrange{139}{"D800-"DB7F} % High Surrogates +\ltjdefcharrange{140}{"DB80-"DBFF} % High Private Use Surrogates +\ltjdefcharrange{141}{"DC00-"DFFF} % Low Surrogates +\ltjdefcharrange{142}{"E000-"F8FF} % Private Use Area +\ltjdefcharrange{143}{"F900-"FAFF} % CJK Compatibility Ideographs +\ltjdefcharrange{144}{"FB00-"FB4F} % Alphabetic Presentation Forms +\ltjdefcharrange{145}{"FB50-"FDFF} % Arabic Presentation Forms-A +\ltjdefcharrange{146}{"FE00-"FE0F} % Variation Selectors +\ltjdefcharrange{147}{"FE10-"FE1F} % Vertical Forms +\ltjdefcharrange{148}{"FE20-"FE2F} % Combining Half Marks +\ltjdefcharrange{149}{"FE30-"FE4F} % CJK Compatibility Forms +\ltjdefcharrange{150}{"FE50-"FE6F} % Small Form Variants +\ltjdefcharrange{151}{"FE70-"FEFF} % Arabic Presentation Forms-B +\ltjdefcharrange{152}{"FF00-"FFEF} % Halfwidth and Fullwidth Forms +\ltjdefcharrange{153}{"FFF0-"FFFF} % Specials +\ltjdefcharrange{154}{"10000-"1007F} % Linear B Syllabary +\ltjdefcharrange{155}{"10080-"100FF} % Linear B Ideograms +\ltjdefcharrange{156}{"10100-"1013F} % Aegean Numbers +\ltjdefcharrange{157}{"10140-"1018F} % Ancient Greek Numbers +\ltjdefcharrange{158}{"10190-"101CF} % Ancient Symbols +\ltjdefcharrange{159}{"101D0-"101FF} % Phaistos Disc +\ltjdefcharrange{160}{"10280-"1029F} % Lycian +\ltjdefcharrange{161}{"102A0-"102DF} % Carian +\ltjdefcharrange{162}{"10300-"1032F} % Old Italic +\ltjdefcharrange{163}{"10330-"1034F} % Gothic +\ltjdefcharrange{164}{"10380-"1039F} % Ugaritic +\ltjdefcharrange{165}{"103A0-"103DF} % Old Persian +\ltjdefcharrange{166}{"10400-"1044F} % Deseret +\ltjdefcharrange{167}{"10450-"1047F} % Shavian +\ltjdefcharrange{168}{"10480-"104AF} % Osmanya +\ltjdefcharrange{169}{"10800-"1083F} % Cypriot Syllabary +\ltjdefcharrange{170}{"10840-"1085F} % Imperial Aramaic +\ltjdefcharrange{171}{"10900-"1091F} % Phoenician +\ltjdefcharrange{172}{"10920-"1093F} % Lydian +\ltjdefcharrange{173}{"10A00-"10A5F} % Kharoshthi +\ltjdefcharrange{174}{"10A60-"10A7F} % Old South Arabian +\ltjdefcharrange{175}{"10B00-"10B3F} % Avestan +\ltjdefcharrange{176}{"10B40-"10B5F} % Inscriptional Parthian +\ltjdefcharrange{177}{"10B60-"10B7F} % Inscriptional Pahlavi +\ltjdefcharrange{178}{"10C00-"10C4F} % Old Turkic +\ltjdefcharrange{179}{"10E60-"10E7F} % Rumi Numeral Symbols +\ltjdefcharrange{180}{"11000-"1107F} % Brahmi +\ltjdefcharrange{181}{"11080-"110CF} % Kaithi +\ltjdefcharrange{182}{"12000-"123FF} % Cuneiform +\ltjdefcharrange{183}{"12400-"1247F} % Cuneiform Numbers and Punctuation +\ltjdefcharrange{184}{"13000-"1342F} % Egyptian Hieroglyphs +\ltjdefcharrange{185}{"16800-"16A3F} % Bamum Supplement +\ltjdefcharrange{186}{"1B000-"1B0FF} % Kana Supplement +\ltjdefcharrange{187}{"1D000-"1D0FF} % Byzantine Musical Symbols +\ltjdefcharrange{188}{"1D100-"1D1FF} % Musical Symbols +\ltjdefcharrange{189}{"1D200-"1D24F} % Ancient Greek Musical Notation +\ltjdefcharrange{190}{"1D300-"1D35F} % Tai Xuan Jing Symbols +\ltjdefcharrange{191}{"1D360-"1D37F} % Counting Rod Numerals +\ltjdefcharrange{192}{"1D400-"1D7FF} % Mathematical Alphanumeric Symbols +\ltjdefcharrange{193}{"1F000-"1F02F} % Mahjong Tiles +\ltjdefcharrange{194}{"1F030-"1F09F} % Domino Tiles +\ltjdefcharrange{195}{"1F0A0-"1F0FF} % Playing Cards +\ltjdefcharrange{196}{"1F100-"1F1FF} % Enclosed Alphanumeric Supplement +\ltjdefcharrange{197}{"1F200-"1F2FF} % Enclosed Ideographic Supplement +\ltjdefcharrange{198}{"1F300-"1F5FF} % Miscellaneous Symbols And Pictographs +\ltjdefcharrange{199}{"1F600-"1F64F} % Emoticons +\ltjdefcharrange{200}{"1F680-"1F6FF} % Transport And Map Symbols +\ltjdefcharrange{201}{"1F700-"1F77F} % Alchemical Symbols +\ltjdefcharrange{202}{"20000-"2A6DF} % CJK Unified Ideographs Extension B +\ltjdefcharrange{203}{"2A700-"2B73F} % CJK Unified Ideographs Extension C +\ltjdefcharrange{204}{"2B740-"2B81F} % CJK Unified Ideographs Extension D +\ltjdefcharrange{205}{"2F800-"2FA1F} % CJK Compatibility Ideographs Supplement +\ltjdefcharrange{206}{"E0000-"E007F} % Tags +\ltjdefcharrange{207}{"E0100-"E01EF} % Variation Selectors Supplement +\ltjdefcharrange{208}{"F0000-"FFFFF} % Supplementary Private Use Area-A +\ltjdefcharrange{209}{"100000-"10FFFF} % Supplementary Private Use Area-B |