• R/O
  • HTTP
  • SSH
  • HTTPS

luatexja: コミット

ソースコードの管理場所


コミットメタ情報

リビジョン1925336f0bdb2330c354ab0c6e93bd2cd943c5d9 (tree)
日時2019-05-04 17:53:39
作者Hironori Kitagawa <h_kitagawa2001@yaho...>
コミッターHironori Kitagawa

ログメッセージ

documentation and \UTF

変更サマリ

差分

--- a/doc/luatexja.dtx
+++ b/doc/luatexja.dtx
@@ -2410,7 +2410,7 @@ However, the penalty inserted after it is 10 which is the \Param{postbreakpenalt
24102410 ``ア'', not 20.
24112411 %</en>
24122412 %<*ja>
2413-\subsection{禁則処理関連パラメータとOpenTypeのfont feature}
2413+\subsection{禁則処理関連パラメータとOpenType機能}
24142414 禁則処理や \Param{kanjiskip}, \Param{xkanjiskip} の挿入に関連したパラメータのうち
24152415 \begin{quote}
24162416 \Param{jaxspmode},~\Param{alxspmode}, \Param{prebreakpenalty},
@@ -2419,8 +2419,8 @@ However, the penalty inserted after it is 10 which is the \Param{postbreakpenalt
24192419 は,文字コードごとに設定する量である.
24202420
24212421 \Pkg{fontspec}パッケージを使う(\ref{ssec:fontspec}節)場合など,
2422-各種のOpenType featureを適用することもあると思うが,前段落に述べたパラメータ類は,
2423-\emph{OpenType featureの適用前の文字コードによって適用される.}
2422+各種のOpenType機能を適用することもあると思うが,前段落に述べたパラメータ類は,
2423+\emph{OpenType機能の適用前の文字コードによって適用される.}
24242424 例えば,以下の例において10行目の「ア」は,\verb+hwid+ featureの適用により半角カタカナの「ア」
24252425 に置き換わる.しかし,その直後に挿入される \Param{postbreakpenalty}は,置換前の「ア」に対する値10である.
24262426 %</ja>
@@ -3561,7 +3561,7 @@ NFSS2用の命令(\ref{ssec:chgfnt}節,\ref{ssec:nfsspat}節)における
35613561
35623562 %<*ja>
35633563 \paragraph{\texttt{extend}と\texttt{slant}}
3564-OpenType font featureと見かけ上同じような形式で指定できるものに,
3564+OpenType機能と見かけ上同じような形式で指定できるものに,
35653565 \begin{description}
35663566 \item[\texttt{extend=}<extend>] 横方向に<extend>倍拡大する.
35673567 \item[\texttt{slant=}<slant>] <slant>に指定された割合だけ傾ける.
@@ -3646,7 +3646,7 @@ This functionality is disabled by \texttt{-ltjksp} specification.
36463646
36473647 %<en>\subsection{\cs{tfont}}
36483648 %<ja>\subsection{\cs{tfont} 命令}
3649-
3649+\label{ssec:tfont}
36503650
36513651 \begin{comment}
36523652 {\catcode`\<=12\catcode`\>=12
@@ -3755,7 +3755,7 @@ A font defined by~\cs{tfont} differs the following points from that by~\cs{jfont
37553755 以下の点が \cs{jfont} による横組用和文フォントとは異なる:
37563756 \begin{itemize}
37573757 \item 明示的に \texttt{vert}, \texttt{vrt2}(のいずれか)の
3758- 有効・無効を指定した場合を除き,自動的に OpenType feature~\texttt{vrt2} の有効化が
3758+ 有効・無効を指定した場合を除き,自動的に OpenType機能 \texttt{vrt2} の有効化が
37593759 指定されたものとみなされる
37603760 \footnote{もしフォントが\texttt{vrt2}を定義していなかった場合,代わりに
37613761 \texttt{vert}を用いる.}.
@@ -3935,7 +3935,7 @@ Identity-Hとなり,PDFの標準規格ISO32000-1:2008~(\cite{pdfstd})に非準
39353935 ので注意してほしい.
39363936
39373937 \emph{\texttt{psft} プリフィックスの下では
3938-\texttt{+jp90} などのOpenType font featureの効力はない.
3938+\texttt{+jp90} などのOpenType機能の効力はない.
39393939 非埋込フォントをPDFに使用すると,実際にどのようなフォントが
39403940 表示に用いられるか予測できないからである.}\
39413941 \texttt{extend} と \texttt{slant} 指定は単なる変形のため
@@ -4650,7 +4650,7 @@ applying font features by \Pkg{luaotfload}}.
46504650 \item JFMによれば,この「ヒ」のグリフの文字クラスは2000である.
46514651 \item 以上により文字クラス2000とみなされるため,結果として「ヒ」の幅は半角だと認識される.
46524652 \end{enumerate}
4653-この例は,\emph{文字クラスの決定はfont featureの適用によるグリフ置換の結果に基づく}ことを
4653+この例は,\emph{文字クラスの決定はOpenType機能の適用によるグリフ置換の結果に基づく}ことを
46544654 示している.
46554655 %</ja>
46564656
@@ -6935,7 +6935,9 @@ CID番号が<number>の文字を出力する.
69356935 もし現在の和文フォントがAdobe-Japan1,~Adobe-GB1, Adobe-CNS1, Adobe-Korea1,~Adobe-KRの
69366936 いずれのCID-keyed fontでもない場合,<number>はAdobe-Japan1のCID番号であると解釈し
69376937 「適切なグリフ」\footnote{%
6938- 例えばフォントにIVDコレクションAdobe-Japan1が含まれていれば,その情報を用いて
6938+ 特に縦組用グリフのCID番号を指定した場合は(LuaTeX-ja 20190504.0以降では若干改良されているが)
6939+ 意図しない結果になる可能性が高い.
6940+ また,フォントにIVDコレクションAdobe-Japan1が含まれていれば,その情報を用いて
69396941 グリフを選択する.
69406942 }を出力する.
69416943 %</ja>
@@ -6985,12 +6987,20 @@ ordinary characters in the following points:
69856987 \item 常に\textbf{JAchar}として扱われる.
69866988 %</ja>
69876989 %<*en>
6988-\item Processing codes for supporting OpenType features (\textit{e.g.},
6990+\item In vertical direction, \texttt{vert}/\texttt{vrt2} feature are automatically applied to
6991+ characters by \cs{UTF}, regardless these feature are not activated in current Japanese font.
6992+%</en>
6993+%<*ja>
6994+\item 縦組時には,現在の縦組用和文フォントで \texttt{vert}/\texttt{vrt2} 機能が
6995+ 有効か無効かを問わず,\cs{UTF} で出力される文字にはこれらのOpenType機能が働いた字形になる.
6996+%</ja>
6997+%<*en>
6998+\item Processing codes for supporting other OpenType features (for example,
69896999 glyph replacement and kerning) by the \Pkg{luaotfload} package
69907000 is not performed to these characters.
69917001 %</en>
69927002 %<*ja>
6993-\item OpenType機能(例えばグリフ置換やカーニング)をサポートするための
7003+\item その他のOpenType機能(例えばグリフ置換やカーニング)をサポートするための
69947004 \Pkg{luaotfload}パッケージのコードはこれらの文字には働かない.
69957005 %</ja>
69967006 \end{itemize}
@@ -7163,7 +7173,8 @@ for making the difference obvious.}
71637173 \item \cs{prevdepth}の値とその$h'$の深さの値が一致している
71647174 \end{itemize}
71657175 場合にのみ発動するようにしている.
7166- \item 行の中身に水平ボックス$h''$が入ってくることもあるが,その場合は$h''$の中身までは参照しない.
7176+ \item 行の中身に水平ボックス$h''$が入ってくることもあるが,その場合は$h''$の中身の高さ・深さまでは
7177+ 参照せず,あくまでも$h''$自身の高さ・深さのみを参照する.
71677178 参照するようにしてしまうと,\cs{smash}など手動で行った高さ・深さ調整の意味がなくなってしまうからである.
71687179 \end{itemize}
71697180
@@ -7803,7 +7814,7 @@ characters designed for ruby.
78037814 %<*ja>
78047815 横組・縦組専用仮名を用いる.また,\cs{rubyfamily} でルビ用仮名が使用可能となる\footnote{%
78057816 \cs{rubyfamily}とはいいつつ,実際にはフォントファミリを切り替えるのではない(通常では
7806- font featureの追加,\texttt{nfssonly} 指定時にはシェイプを \texttt{rb} に切り替え).
7817+ OpenType機能の有効化であり,\texttt{nfssonly} 指定時にはシェイプを \texttt{rb} に切り替える).
78077818 }.
78087819 %</ja>
78097820 \item[bold]
@@ -10724,53 +10735,6 @@ $|\textit{total}|$の分だけが,行中のグルーの伸び量,あるい
1072410735 %</ja>
1072510736
1072610737 %<*ja>
10727-\section{IVS対応}
10728-\verb+luatexja.otf.enable_ivs()+ を実行し,IVS対応を有効にした状態では,
10729-\verb+pre_linebreak_filter+ や \verb+hpack_filter+ コールバックには
10730-次の4つが順に実行される状態となっている:
10731-\begin{description}
10732-\item[\tt ltj.do\_ivs] \textit{glyph\_node}~$p$の直後に,異体字セレクタ(を表す\textit{glyph\_node})
10733-が連続した場合に,$p$のフォントに対応したが持つ「異体字情報」に従って出力するグリフを変える.
10734-
10735-しかし,単に$p.\textit{char}$を変更するだけでは,後から
10736-OpenType機能の適用(すぐ下)により置換される可能性がある.そのため,
10737-\cs{CID} や \cs{UTF} と同じように,\textit{glyph\_node}~$p$の代わりに
10738-\texttt{user\_id} が\textit{char\_by\_cid}であるようなuser-defined whatsitを用いている.
10739-\item[(\Pkg{luaotfload} によるfont featureの適用)]
10740-\item[\tt ltj.otf] \texttt{user\_id} が\textit{char\_by\_cid}であるようなuser-defined whatsitを
10741-きちんと\textit{glyph\_node}に変換する.この処理は,\cs{CID}, \cs{UTF}やIVSによる置換が,
10742-OpenType機能の適用で上書きされてしまうのを防止するためである.
10743-\item[\tt ltj.main\_process] \textbf{JAglue}の挿入処理(\ref{sec-jfmglue}章)と,
10744-JFMの指定に従って各\textbf{JAchar}の「寸法を補正」することを行う.
10745-\end{description}
10746-
10747-問題は各フォントの持っているIVS情報をどのように取得するか,である.
10748-\Pkg{luaotfload} はフォント番号<font\_number>の情報を\
10749-\texttt{fonts.hashes.identifiers[<font\_number>]} 以下に格納している.
10750-しかし,OpenTypeフォントのIVS情報は格納されていないようである%
10751-\footnote{TrueTypeフォントに関しては,
10752-\begin{center}
10753-\texttt{fonts.hashes.idenfiers[<font\_number>]%
10754- .resources.variants[<selector>][<base\_char>]}
10755-\end{center}
10756-に,<base\_char>番の文字の後に異体字セレクタ<selector>が続いた場合に
10757-出力すべきグリフが書かれてある.}.
10758-%例えば,小塚明朝Pr6N~Rでは,
10759-
10760-一方,\LuaTeX 内部の \texttt{fontloader} の返すテーブルには
10761-OpenTypeフォントでもTrueTypeフォントでもIVS情報が格納されている.
10762-具体的には……
10763-
10764-そのため,\LuaTeX-jaのIVS対応においては,\LuaTeX 内部の\
10765-\texttt{fontloader} を直接用いることで,フォントのIVS情報を取得している.
10766-20140114.0以降でキャッシュを用いるようにした要因はここにあり,
10767-\texttt{fontloader} の呼び出しでかなり時間を消費することから,
10768-%%% to_table を使わなくしたことで,メモリ使用量は減った
10769-IVS情報をキャッシュに保存することで2回目以降の実行時間を節約している.
10770-%</ja>
10771-
10772-
10773-%<*ja>
1077410738 \section{複数フォントの「合成」(未完)}
1077510739 \section{\LuaTeX-jaにおけるキャッシュ}
1077610740 \Pkg{luaotfload}パッケージが,各TrueType・OpenTypeフォントの情報を
@@ -11199,6 +11163,51 @@ direction~whatsit内部のノードリストに,\textit{dir\_box}として格
1119911163 }
1120011164 \]
1120111165 のようになる.
11166+
11167+\subsection{縦組用字形の取得}
11168+縦組時には,「\hbox to \zw{、}」(\texttt{U+3001})から「\ltjjachar"FE11」(\texttt{U+FE11})%"
11169+のように縦組用字形への置き換えに関係する処理は,以下のようになっている.
11170+ \begin{itemize}
11171+ \item 各縦組用和文フォントは読み込み時に以下の属性が設定される:
11172+ \begin{description}
11173+ \item[\textit{vert\_activated}] 真となるのは,
11174+ 明示的に \texttt{-vert} も \texttt{-vrt2} のいずれも指定されていないちょうどその時.
11175+ \item[\textit{auto\_enable\_vrt2}] 真となるのは,
11176+ \texttt{vert}, \texttt{vrt2}のいずれについても有効・無効が指定されていないちょうどその時.
11177+ \end{description}
11178+ \textit{vert\_activated}については\texttt{luatexja.define\_jfont}コールバックで渡される引数
11179+ \texttt{jfont\_info}から取得可能である.
11180+
11181+ \item \textit{auto\_enable\_vrt2}が真の場合は,現在のscript tagとlanguage system identifierの値で
11182+ \texttt{vrt2}機能が利用可能か調べる.利用可能ならば\texttt{vrt2}を,そうでなければ
11183+ \texttt{vert}を有効化する.
11184+ \item また,各和文フォント読み込み時には,
11185+ 「OpenType機能による置換以前に行う縦組形への置換」を格納したテーブル\textit{vform}も作成する.
11186+ \begin{enumerate}
11187+ \item \LuaTeX-jaには,「\hbox to \zw{、}」(\texttt{U+3001})→「\ltjjachar"FE11」(\texttt{U+FE11})といった
11188+ いくつかの置換がハードコードされている.そのような各置換$i\longmapsto v$に対して,
11189+ \begin{quote}
11190+ 置換元$i$が(あるscript, languageにおける)\texttt{vert}では置換対象でなく,
11191+ かつ置換先$v$がフォント内に存在する文字コードである
11192+ \end{quote}
11193+ ならば,$i\longmapsto v$を\textit{vform}に登録する.
11194+ \item \ref{ssec:tfont}節にある\texttt{jpotf}が指定された場合,
11195+ ……
11196+ \item もし\texttt{vert}も\texttt{vrt2}も現在のscript, languageでは有効にできない場合,
11197+ どこかのscript, languageにおける\texttt{vert}で定義されている
11198+ 置換$i\longmapsto v$をすべて\textit{vform}に登録する.
11199+ \end{enumerate}
11200+
11201+ あとで説明するように,\textit{vform}は\textit{vert\_activated}が真であるような縦組用和文フォントでしか
11202+ 利用されない.
11203+
11204+ \item 「現在の水平リスト」内の\textbf{JAchar}を(欧文フォントから)和文フォントへ置き換える処理において,
11205+ その時点での組方向が縦組であり,かつ処理対象の各ノードの縦組用フォントで
11206+ \textit{vert\_activated}が真である場合,\textit{vform}に従いグリフが置き換えられる.
11207+
11208+ \Pkg{luaotfload}が行う,OpenType機能に沿ったグリフ置換はこの後の処理となる.G
11209+ \end{itemize}
11210+
1120211211 %</ja>
1120311212
1120411213 \newpage
--- a/src/addons/luatexja-otf.sty
+++ b/src/addons/luatexja-otf.sty
@@ -90,7 +90,7 @@
9090 \protected\def\CID#1{\ifvmode\leavevmode\fi\ltj@tempcnta#1\relax\directlua{luatexja.otf.cid(\the\ltj@tempcnta)}\relax}
9191
9292 %% \UTF compatible with the OTF package for pLaTeX
93-\protected\def\UTF#1{\ifvmode\leavevmode\fi\directlua{luatexja.otf.append_jglyph(0x#1)}}
93+\protected\def\UTF#1{\ifvmode\leavevmode\fi\directlua{luatexja.otf.utf(0x#1)}}
9494
9595 %% Load ajmacros
9696 \ifltj@in@latex %<*LaTeX>
--- a/src/ltj-jfont.lua
+++ b/src/ltj-jfont.lua
@@ -43,7 +43,7 @@ luatexbase.create_callback("luatexja.load_jfm", "data", function (ft, jn) return
4343
4444 local jfm_file_name, jfm_var, jfm_ksp
4545 local defjfm_res
46-local jfm_dir, is_def_jfont, is_vert_enabled, auto_enable_vrt2
46+local jfm_dir, is_def_jfont, vert_activated, auto_enable_vrt2
4747
4848 local function norm_val(a)
4949 if (not a) or (a==0.) then
@@ -338,7 +338,7 @@ do
338338 chars = sz.chars, char_type = sz.char_type,
339339 kanjiskip = sz.kanjiskip, xkanjiskip = sz.xkanjiskip,
340340 chars_cbcache = {},
341- vert_activated = is_vert_enabled,
341+ vert_activated = vert_activated,
342342 }
343343 local t = identifiers[fn]
344344 if auto_enable_vrt2 then
@@ -434,11 +434,11 @@ do
434434 jfm_ksp = not (x=='-')
435435 end
436436 if jfm_dir == 'tate' then
437- is_vert_enabled = (not name:match('[:;]%-vert')) and (not name:match('[:;]%-vrt2'))
437+ vert_activated = (not name:match('[:;]%-vert')) and (not name:match('[:;]%-vrt2'))
438438 auto_enable_vrt2
439439 = (not name:match('[:;][+%-]?vert')) and (not name:match('[:;][+%-]?vrt2'))
440440 else
441- is_vert_enabled, auto_enable_vrt2 = nil, nil
441+ vert_activated, auto_enable_vrt2 = nil, nil
442442 end
443443 return name
444444 end
--- a/src/ltj-otf.lua
+++ b/src/ltj-otf.lua
@@ -138,10 +138,39 @@ local function append_jglyph(char)
138138 node_write(p)
139139 end
140140
141+local utf
142+do
143+ utf = function (ucs)
144+ local char = ucs
145+ if ltjd_get_dir_count()==dir_tate then
146+ local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate)
147+ and attr_curtfnt or attr_curjfnt)
148+ local t = identifiers[curjfnt_num]
149+ if t.resources.sequences then
150+ for _,i in pairs(t.resources.sequences) do
151+ if (i.order[1]=='vert' or i.order[1]=='vrt2')
152+ and i.type == 'gsub_single' and i.steps then
153+ for _,j in pairs(i.steps) do
154+ if type(j)=='table' then
155+ if type(j.coverage)=='table' then
156+ for i,k in pairs(j.coverage) do
157+ if i==char then return append_jglyph(k) end
158+ end
159+ end
160+ end
161+ end
162+ end
163+ end
164+ end
165+ end
166+ return append_jglyph(char)
167+ end
168+end
169+
141170 local cid
142171 do
143172 cid = function (key)
144- if key==0 then return append_jglyph(char) end
173+ if key==0 then return append_jglyph(0) end
145174 local curjfnt_num = tex_get_attr((ltjd_get_dir_count()==dir_tate)
146175 and attr_curtfnt or attr_curjfnt)
147176 local curjfnt = identifiers[curjfnt_num]
@@ -265,7 +294,7 @@ luatexja.otf = {
265294 append_jglyph = append_jglyph,
266295 enable_ivs = enable_ivs, -- 隠し機能: IVS
267296 disable_ivs = disable_ivs, -- 隠し機能: IVS
268- cid = cid,
297+ cid = cid, utf = utf,
269298 }
270299
271300
旧リポジトリブラウザで表示