OSDN Git Service

update manual
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Mon, 13 Mar 2023 01:47:52 +0000 (10:47 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Mon, 13 Mar 2023 01:47:52 +0000 (10:47 +0900)
doc/luatexja.dtx
src/ltj-inputbuf.lua
src/ltj-pretreat.lua
src/ltj-rmlgbm.lua

index 864306f..7045ebc 100644 (file)
@@ -3859,7 +3859,7 @@ JFM中における\texttt{kanjiskip\_natural}, \texttt{kanjiskip\_stretch},\
 「JFM由来のグルーの他に,\Param{kanjiskip}の自然長/伸び量/縮み量の一部が
 同じ場所に挿入される」という状況が起こりうる.
 この機能を無効化し,バージョン20150922.0以前と同じような組版を得るためには,
-他のOpenType機能と同じように\texttt{-ltjksp}指定を行えば良い(\autoref{fig:ltjksp}参照).
+他のOpenType機能と同じように\>\mbox{\texttt{-ltjksp}}\>指定を行えば良い(\autoref{fig:ltjksp}参照).
 なお,
 \begin{lstlisting}
  \jfont\G=HaranoAjiMincho-Regular:jfm=ujis;-ltjksp;+ltjksp at \zw
@@ -3875,7 +3875,7 @@ JFM中における\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,
+This functionality is disabled by \mbox{\texttt{-ltjksp}} specification,
 as shown in~\autoref{fig:ltjksp}.
 %</en>
 \begin{figure}
@@ -3888,10 +3888,56 @@ as shown in~\autoref{fig:ltjksp}.
 \G\leavevmode%
 \vrule\hbox to 15\zw{あ「い」う,えお}\vrule
 \end{LTXexample}
-\caption{\texttt{ltjksp} `feature''}
+\caption{\texttt{ltjksp} ``feature''}
 \label{fig:ltjksp}
 \end{figure}
 
+%<*ja>
+\paragraph{\texttt{ltjpci}「機能」}
+\label{pg:ltjpci}
+\Pkg{luaotfload}~v3.19以降では,標準でUnicode(文字から作られるノードたち)がNFCに正規化される
+ようになっている.これにより,ソース中でたとえば「か」と合成用濁点(\texttt{U+3099})を続けて入力した場合,
+両者それぞれからノードが生成されるが,結果的には「が」を表す1ノードになるわけである.
+
+しかし,NFCに正規化することで,
+たとえば「\UTF{FA19}」(\texttt{U+FA19})が「神」(\texttt{U+795E})にというふうに,
+CJK互換漢字がCJK統合漢字に変換されてしまうという問題がある.
+異体字セレクタを用いればこのようなことは起きないが,古くからあるフォントでは異体字セレクタをサポートしていない.
+
+以上の事情に対応するため,\LuaTeX-jaでは,標準で
+\emph{CJK互換漢字・CJK互換漢字補助の文字には\Pkg{luaotfload}パッケージによる処理は働かない}ようにしている.
+この機能を無効化するには,他のOpenType機能と同じように\texttt{-ltjpci}指定を行えば良い(\autoref{fig:ltjpci}参照).
+\texttt{ltjksp}と同様に,\texttt{-ltjpci}, \texttt{+ltjpci}を複数回指定した場合は,
+最後に指定したものが有効となる.
+%</ja>
+%<*en>
+\paragraph{\texttt{ltjpci} ``feature''}
+\label{pg:ltjpci}
+By default, The \Pkg{luaotfload} package (since v3.19) normalizes Unicode sequences to NFC.
+However, this normalization converts CJK compatibility ideographs to their canonical equivalents,
+such as ``\UTF{FA19}''~(\texttt{U+FA19}) to ``神''. One can use variation selectors,
+but old fonts does not support them.
+
+So, \emph{\LuaTeX-ja now protects CJK compatibility ideographs from processing
+ by the \Pkg{luaotfload} package by defualt}.
+This functionality is disabled by \mbox{\texttt{-ltjpci}} specification,
+as shown in~\autoref{fig:ltjpci}.
+%</en>
+\begin{figure}
+\begin{LTXexample}[width=12\zw]
+\def\TEST{\leavevmode\char"FA10\char"FA12\char"FA15
+  \char"FA19.か\char"3099.は\char"309A.\par}
+\jfont\A=HaranoAjiMincho-Regular:jfm=ujis; at 15pt
+\A\TEST % default
+\jfont\G=HaranoAjiMincho-Regular:jfm=ujis;-ltjpci at 15pt
+\G\TEST % ltjpci off
+\jfont\H=HaranoAjiMincho-Regular:jfm=ujis;-normalize at 15pt
+\H\TEST % normalization off
+\end{LTXexample}
+\caption{\texttt{ltjpci} ``feature''}
+\label{fig:ltjpci}
+\end{figure}
+
 %<en>\subsection{\cs{tfont}}
 %<ja>\subsection{\cs{tfont} 命令}
 \label{ssec:tfont}
 その行はそこで改行するようにした方がいいだろう.
 %</ja>
 
-\begin{table}[t]
-%<ja>  \caption{「基底文字+合成用濁点・半濁点」から合成済み文字への変換をサポートする組み合わせ}
-%<en>  \caption{Normalization of Kana Character Sequences with Combining (Semi)-voiced Sound Mark}\medskip
-  \label{tab:kana_composite}
-  \def\D#1{%
-    {\fboxsep0pt\fcolorbox{cyan}{white}%
-    {\hbox to 1\zw{\hss#1}}}} %"
-  \def\DC#1{\D{\unitlength=1\zw
-     \begin{picture}(1,0)
-       \put(0.5,0.38){\arc[0,15]{0.25}}\put(0.5,0.38){\arc[30,45]{0.25}}\put(0.5,0.38){\arc[60,75]{0.25}}
-       \put(0.5,0.38){\arc[90,105]{0.25}}\put(0.5,0.38){\arc[120,135]{0.25}}\put(0.5,0.38){\arc[150,165]{0.25}}
-       \put(0.5,0.38){\arc[180,195]{0.25}}\put(0.5,0.38){\arc[210,225]{0.25}}\put(0.5,0.38){\arc[240,255]{0.25}}
-       \put(0.5,0.38){\arc[270,285]{0.25}}\put(0.5,0.38){\arc[300,315]{0.25}}\put(0.5,0.38){\arc[330,345]{0.25}}
-     \end{picture}\llap{#1\kern-.7\zw}}}
-  \def\CDJ#1#2{$\mbox{\D{\char"#1}}+\mbox{\DC{゛}}\rightarrow \mbox{\D{\char"#2}}$}
-  \def\CHJ#1#2{$\mbox{\D{\char"#1}}+\mbox{\DC{゜}}\rightarrow \mbox{\D{\char"#2}}$}
-  \small\centering
-  \begin{tabular}{@{}llllll@{}}
-  \CDJ{3046}{3094}&
-  \CDJ{304B}{304C}&
-  \CDJ{304D}{304E}&
-  \CDJ{304F}{3050}&
-  \CDJ{3051}{3052}&
-  \CDJ{3053}{3054}\\
-  \CDJ{3055}{3056}&
-  \CDJ{3057}{3058}&
-  \CDJ{3059}{305A}&
-  \CDJ{305B}{305C}&
-  \CDJ{305D}{305E}&
-  \CDJ{305F}{3060}\\
-  \CDJ{3061}{3062}&
-  \CDJ{3064}{3065}&
-  \CDJ{3066}{3067}&
-  \CDJ{3068}{3069}&
-  \CDJ{306F}{3070}&
-  \CDJ{3072}{3073}\\
-  \CDJ{3075}{3076}&
-  \CDJ{3078}{3079}&
-  \CDJ{307B}{307C}&
-  \CDJ{309D}{309E}&
-  \CDJ{30A6}{30F4}&
-  \CDJ{30AB}{30AC}\\
-  \CDJ{30AD}{30AE}&
-  \CDJ{30AF}{30B0}&
-  \CDJ{30B1}{30B2}&
-  \CDJ{30B3}{30B4}&
-  \CDJ{30B5}{30B6}&
-  \CDJ{30B7}{30B8}\\
-  \CDJ{30B9}{30BA}&
-  \CDJ{30BB}{30BC}&
-  \CDJ{30BD}{30BE}&
-  \CDJ{30BF}{30C0}&
-  \CDJ{30C1}{30C2}&
-  \CDJ{30C4}{30C5}\\
-  \CDJ{30C6}{30C7}&
-  \CDJ{30C8}{30C9}&
-  \CDJ{30CF}{30D0}&
-  \CDJ{30D2}{30D3}&
-  \CDJ{30D5}{30D6}&
-  \CDJ{30D8}{30D9}\\
-  \CDJ{30DB}{30DC}&
-  \CDJ{30EF}{30F7}&
-  \CDJ{30F0}{30F8}&
-  \CDJ{30F1}{30F9}&
-  \CDJ{30F2}{30FA}&
-  \CDJ{30FD}{30FE}\\
-  \CHJ{306F}{3071}&
-  \CHJ{3072}{3074}&
-  \CHJ{3075}{3077}&
-  \CHJ{3078}{307A}&
-  \CHJ{307B}{307D}&
-  \CHJ{30CF}{30D1}\\
-  \CHJ{30D2}{30D4}&
-  \CHJ{30D5}{30D7}&
-  \CHJ{30D8}{30DA}&
-  \CHJ{30DB}{30DD}
-  \end{tabular}
-\end{table}
-%<*en>
-\subsection{Composition of Kana from Combining Character Sequences}
-In (u)\pTeX, Hiragana and Katakana in the NFD form%
-\footnote{namely, character sequences which contains
-  ``COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK''~(\texttt{U+3099}) and
- ``COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK''~(\texttt{U+309A}).}
-are normalized to precomposed characters before (u)\pTeX\ looks into the input line.
-Character sequences which are involved in this normalization are shown in \autoref{tab:kana_composite}.
-
-The above normalization process is also performed in \LuaTeX-ja version~20220103.0 or later, because
-fonts might not have these transformation as an OpenType feature.
-%</en>
-
 %<*ja>
-\subsection{濁点・半濁点付き仮名文字の正規化}
+\subsection{濁点・半濁点付き仮名の正規化→\Pkg{luaotfload}~v3.19以降ではそちらで}
 \TeX~Live~2016以降の(u)\pTeX では,合成用濁点(\texttt{U+3099})・合成用半濁点(\texttt{U+309A})を用いて
-表現された平仮名・片仮名を合成済み文字に変換する(具体的には\autoref{tab:kana_composite}の組み合わせ)という処理を行っている.
+表現された平仮名・片仮名を合成済み文字に変換するという処理を行っている.
 この処理を行っている要因としては,
 \begin{itemize}
   \item 無用なトラブルを避けるため.
@@ -10082,14 +10037,14 @@ fonts might not have these transformation as an OpenType feature.
   合成用濁点・半濁点は利用できない.そのため上記の変換処理はさらに前から行われていた.
 \end{itemize}
 
-一方,\LuaTeX(-ja)では入力の変換は基本的に行わず,文字の合成は使用しているフォントのOpenType機能に委ねるという立場である.
-しかし,\autoref{tab:kana_composite}に挙げた変換はUnicode正規化の範疇であり,この内容を持っているフォントは多くない.
-よって,前段落で述べた2つの理由(と\upTeX との互換性という意味も込めて)も考慮して,
-バージョン20220103.0以降では,\LuaTeX-jaは入力行に対して\autoref{tab:kana_composite}の変換を行う.
+\LuaTeX(-ja)では入力の変換は基本的に行わず,
+文字の合成は使用しているフォントのOpenType機能に委ねるという立場であったが,
+\Pkg{luaotfload}~v3.19以降では,標準でNFCへのUnicode正規化を行っている.
+そのため,バージョン2023****.0以降では,\LuaTeX-jaによる自前の変換\footnote{バージョン20220103.0で実装した.}は
+行わないようにしている.
 %</ja>
-  
-%<*ja>
 
+%<*ja>
 %<en>\section{Insertion of JFM glues, \Param{kanjiskip} and \Param{xkanjiskip}}
 %<ja>\section{JFMグルーの挿入,\Param{kanjiskip}と\Param{xkanjiskip}}
 \label{sec-jfmglue}
index dc6ec46..66a466e 100644 (file)
@@ -14,6 +14,10 @@ local ltjc_is_japanese_char_curlist = ltjc.is_japanese_char_curlist
 local cnt_lineend = luatexbase.registernumber 'ltjlineendcomment'
 local substituter
 do
+if tonumber(luaotfload.version) < 3.19 then
+    ltjb.package_info_no_line('luatexja',
+      'We are using luaotfload <v3.19, so I compose kana from combining character sequences manually'
+    )
     local uchar = utf.char
     local cd, cp = uchar(0x3099), uchar(0x309A)
     substituter = (utf.substituter or utf.subtituter)      -- typo in lualibs?
@@ -47,8 +51,10 @@ do
       ['ワ'..cd] = uchar(0x30F7), ['ヰ'..cd] = uchar(0x30F8),
       ['ヱ'..cd] = uchar(0x30F9), ['ヲ'..cd] = uchar(0x30FA),
     }
+else
+    substituter = function(s) return s end
+end
 end
-
 --- the following function is modified from jafontspec.lua (by K. Maeda).
 --- Instead of "%", we use U+FFFFF for suppressing spaces.
 --DEBUG require"socket"
index fc26f8d..43ecac8 100644 (file)
@@ -154,18 +154,18 @@ function set_box_stack_level(head, mode)
    ltjs_report_stack_level(getcount(cnt_stack) + box_set)
    for _,p  in pairs(wtd) do node_free(p) end
    if ltjs.list_dir == dir_tate then
-      for p, _, pc in traverse_glyph(to_direct(head)) do
+      for p in traverse_glyph(to_direct(head)) do
          if getlang(p)==lang_ja and has_attr(p, attr_icflag, 0) then
-            local pf = ltjf_replace_altfont(attr_curtfnt, pc, p)
+            local pf = ltjf_replace_altfont(attr_curtfnt, getchar(p), p)
             if ltjf_font_metric_table[pf].vert_activated then
-               pc = ltjf_font_metric_table[pf].vform[pc]; if pc then setchar(p,  pc) end
+               local pc = ltjf_font_metric_table[pf].vform[pc]; if pc then setchar(p,  pc) end
             end
          end
       end
    else
-      for p, _, pc in traverse_glyph(to_direct(head)) do
+      for p in traverse_glyph(to_direct(head)) do
          if getlang(p)==lang_ja and has_attr(p, attr_icflag, 0) then
-            ltjf_replace_altfont(attr_curjfnt, pc, p)
+            ltjf_replace_altfont(attr_curjfnt, getchar(p), p)
          end
       end
    end
index 33e5d28..18ac866 100644 (file)
@@ -235,8 +235,9 @@ do
          if head and luatexja.jfont.font_metric_table[fnum] and luatexja.jfont.font_metric_table[fnum].vert_activated then
             local vt = fontdata.ltj_vert_table
             local nh = is_node(head) and to_direct(head) or head
-            for n, f, c in traverse_glyph(head) do
-               if f==fnum then setchar(n, vt[c] or c) end
+            for n in traverse_glyph(head) do
+               local c = getchar(n)
+               if getfont(n)==fnum then setchar(n, vt[c] or c) end
             end
             return head, false
          end