JFMによって本来挿入されるグルーの他に
\Param{kanjiskip}分の空白を自然長(\texttt{kanjiskip\_natural}),伸び量(\texttt{kanjiskip\_stretch}),
-縮み量(\texttt{kanjiskip\_shrink})ごとに挿入する\footnote{本来\Param{xkanjiskip}が挿入される場所においては
- \Param{xkanjiskip}分の空白を自然長・伸び量・縮み量ごとに.追加できる.}%
+縮み量(\texttt{kanjiskip\_shrink})ごとに挿入する
+% \footnote{本来\Param{xkanjiskip}が挿入される場所においては\Param{xkanjiskip}分の空白を自然長・伸び量・縮み量ごとに}%
ための指定である.いずれも省略された場合のデフォルト値は0(追加しない)である.
例えば,\LuaTeX-jaの横組標準JFMの \texttt{jfm-ujis.lua} では,
\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}
+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.
\begin{cslist}
\item[\cs{ltjenableadjust[...]}]
\verb+...+ に指定したkey-valueリストに従い,「行末文字の位置調整」「優先順位付きの行長調整」
- 「『中身までみた』行送り計算」「段階的な行送り調整」を有効化/無効化する.
+ 「『中身までみた』行送り計算」「段階的な行送り調整」%「濁点・半濁点付き仮名文字の正規化」
+ を有効化/無効化する.
指定できるキーは以下の通り.
\begin{description}
\item[\texttt{lineend=[false,true,extended]}]
「中身までみた」行送り計算を無効化(\texttt{false}),または有効化(\texttt{true}).
\item[\texttt{linestep=[false,true]}]
段階的な行送り調整を無効化(\texttt{false}),または有効化(\texttt{true}).
+% \item[\texttt{composekana=[false,true]}]
+% 濁点・半濁点付き仮名文字の正規化を無効化(\texttt{false}),または有効化(\texttt{true}).
\end{description}
どのキーともキー名のみを指定した場合は値として\texttt{true}が指定されたものと扱われる.
その行はそこで改行するようにした方がいいだろう.
%</ja>
+\begin{table}[t]
+%<ja> \caption{「基底文字+合成用濁点・半濁点」から合成済み文字への変換をサポートする組み合わせ}
+%<en> \caption{Transformation of Kana Character Sequences with Combiing (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 transformed to precomposed charaters before (u)\pTeX\ looks into the input line.
+This transformation are shown in \autoref{tab:kana_composite}.
+
+This transformation is also performed in \LuaTeX-ja version~20220103.0 or later, because
+fonts might not have this transformation as an OpenType features.
+%</en>
+
+%<*ja>
+\subsection{濁点・半濁点付き仮名文字の正規化}
+\TeX~Live~2016以降の(u)\pTeX では,合成用濁点(\texttt{U+3099})・合成用半濁点(\texttt{U+309A})を用いて
+表現された平仮名・片仮名を合成済み文字に変換する(具体的には\autoref{tab:kana_composite}の組み合わせ)という処理を行っている.
+この処理を行っている要因としては,
+\begin{itemize}
+ \item 無用なトラブルを避けるため.
+ 濁点・半濁点付きの仮名文字が「合成用濁点・半濁点を使って入力されているか」「最初から合成済み文字で入力されているか」を
+ 見た目から判別することは難しい.
+ \item \pTeX との互換性のため.\pTeX は内部コードがJIS~X~0208の範囲に限られるため,
+ 合成用濁点・半濁点は利用できない.そのため上記の変換処理はさらに前から行われていた.
+\end{itemize}
+
+一方,\LuaTeX(-ja)では入力の変換は基本的に行わず,文字の合成は使用しているフォントのOpenType機能に委ねるという立場である.
+しかし,\autoref{tab:kana_composite}に挙げた変換はUnicode正規化の範疇であり,この内容を持っているフォントは多くない.
+よって,前段落で述べた2つの理由(と\upTeX との互換性という意味も込めて)も考慮して,
+バージョン20220103.0以降では,\LuaTeX-jaは入力行に対して\autoref{tab:kana_composite}の変換を行う.
+%</ja>
+
%<*ja>
%<en>\section{Insertion of JFM glues, \Param{kanjiskip} and \Param{xkanjiskip}}
\expandafter\let\csname ifltj@in@latex\expandafter\endcsname
\csname iftrue\endcsname
\NeedsTeXFormat{LaTeX2e}
- \ProvidesPackage{luatexja-adjust}[2021-12-27]
+ \ProvidesPackage{luatexja-adjust}[2022-01-03]
\fi %</LaTeX>
% Load core module if not yet.
\newcount\ltjadj@status@lp
\newcount\ltjadj@status@pr
\newcount\ltjadj@status@ls
-\newcount\ltjadj@status@cd
\let\ltj@adjust@temp=\relax
\define@choicekey[ltj]{adjust}{lineend}[\@@temp\ltj@adjust@temp]%
{false,true,extended}[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}
-\define@boolkey[ltj]{adjust}{combinevoicedkana}[true]{%
- \ltjadj@status@cd=\ifltj@adjust@combinevoicedkana1\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,\the\ltjadj@status@cd)}\ignorespaces
+ \the\ltjadj@status@lp, \the\ltjadj@status@ls)}\ignorespaces
}
\protected\def\ltjdisableadjust{%
- \ltjenableadjust[lineend=false,priority=false,profile=false,linestep=false,combinevoicedkana=false]}
+ \ltjenableadjust[lineend=false,priority=false,profile=false,linestep=false]}%
\protected\def\ltjenableadjust{%
\ltx@ifnextchar[{\@@ltjenableadjust}{\@@ltjenableadjust[lineend,priority]}}%]
luatexja.load_module 'lineskip'; local ltjl = luatexja.lineskip
luatexja.adjust = luatexja.adjust or {}
-----
-local combine_voiced_kana
-do
- local uchar = utf.char
- local cd, cp = uchar(0x3099), uchar(0x309A)
- local substituter = (utf.substituter or utf.subtituter) -- typo in lualibs?
- {
- ['ウ'..cd] = 'ヴ', ['う'..cd] = uchar(0x30F4),
- ['か'..cd] = 'が', ['カ'..cd] = 'ガ',
- ['き'..cd] = 'ぎ', ['キ'..cd] = 'ギ',
- ['く'..cd] = 'ぐ', ['ク'..cd] = 'グ',
- ['け'..cd] = 'げ', ['ケ'..cd] = 'ゲ',
- ['こ'..cd] = 'ご', ['コ'..cd] = 'ゴ',
- --
- ['さ'..cd] = 'ざ', ['サ'..cd] = 'ザ',
- ['し'..cd] = 'じ', ['シ'..cd] = 'ジ',
- ['す'..cd] = 'ず', ['ス'..cd] = 'ズ',
- ['せ'..cd] = 'ぜ', ['セ'..cd] = 'ゼ',
- ['そ'..cd] = 'ぞ', ['ソ'..cd] = 'ゾ',
- --
- ['た'..cd] = 'だ', ['タ'..cd] = 'ダ',
- ['ち'..cd] = 'ぢ', ['チ'..cd] = 'ヂ',
- ['つ'..cd] = 'づ', ['ツ'..cd] = 'ヅ',
- ['て'..cd] = 'で', ['テ'..cd] = 'デ',
- ['と'..cd] = 'ど', ['ト'..cd] = 'ド',
- --
- ['は'..cd] = 'ば', ['ハ'..cd] = 'バ', ['は'..cp] = 'ぱ', ['ハ'..cp] = 'パ',
- ['ひ'..cd] = 'び', ['ヒ'..cd] = 'ビ', ['ひ'..cp] = 'ぴ', ['ヒ'..cp] = 'ピ',
- ['ふ'..cd] = 'ぶ', ['フ'..cd] = 'ブ', ['ふ'..cp] = 'ぷ', ['フ'..cp] = 'プ',
- ['へ'..cd] = 'べ', ['ヘ'..cd] = 'ベ', ['へ'..cp] = 'ぺ', ['ヘ'..cp] = 'ペ',
- ['ほ'..cd] = 'ぼ', ['ホ'..cd] = 'ボ', ['ほ'..cp] = 'ぽ', ['ホ'..cp] = 'ポ',
- --
- ['ゝ'..cd] = 'ゞ', ['ヽ'..cd] = 'ヾ',
- ['ワ'..cd] = uchar(0x30F7), ['ヰ'..cd] = uchar(0x30F8),
- ['ヱ'..cd] = uchar(0x30F9), ['ヲ'..cd] = uchar(0x30FA),
- }
- combine_voiced_kana = function(buffer) return substituter(buffer) end
-end
-----
-
local to_node = node.direct.tonode
local to_direct = node.direct.todirect
return to_node(head)
end
local is_reg = false
- local function enable_cb(status_le, status_pr, status_lp, status_ls, status_cd)
+ local 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',
status_lp>0 and 'profile' or 'dummy',
status_ls>0 and 'step' or 'dummy'
)
- if status_cd==1 then
- if not luatexbase.in_callback('process_input_buffer', 'Combine voiced kana-syllables') then
- ltjb.add_to_callback('process_input_buffer', combine_voiced_kana, 'Combine voiced kana-syllables')
- end
- else
- if luatexbase.in_callback('process_input_buffer', 'Combine voiced kana-syllables') then
- luatexbase.remove_from_callback('process_input_buffer', 'Combine voiced kana-syllables')
- end
- end
end
local function disable_cb() -- only for compatibility
- enable_cs(0,0,0,0,0)
+ enable_cs(0,0,0,0)
end
luatexja.adjust.enable_cb=enable_cb
luatexja.adjust.disable_cb=disable_cb
local getcatcode, getcount = tex.getcatcode, tex.getcount
local ltjc_is_japanese_char_curlist = ltjc.is_japanese_char_curlist
+local substituter
+do
+ local uchar = utf.char
+ local cd, cp = uchar(0x3099), uchar(0x309A)
+ substituter = (utf.substituter or utf.subtituter) -- typo in lualibs?
+ {
+ ['ウ'..cd] = 'ヴ', ['う'..cd] = uchar(0x30F4),
+ ['か'..cd] = 'が', ['カ'..cd] = 'ガ',
+ ['き'..cd] = 'ぎ', ['キ'..cd] = 'ギ',
+ ['く'..cd] = 'ぐ', ['ク'..cd] = 'グ',
+ ['け'..cd] = 'げ', ['ケ'..cd] = 'ゲ',
+ ['こ'..cd] = 'ご', ['コ'..cd] = 'ゴ',
+ --
+ ['さ'..cd] = 'ざ', ['サ'..cd] = 'ザ',
+ ['し'..cd] = 'じ', ['シ'..cd] = 'ジ',
+ ['す'..cd] = 'ず', ['ス'..cd] = 'ズ',
+ ['せ'..cd] = 'ぜ', ['セ'..cd] = 'ゼ',
+ ['そ'..cd] = 'ぞ', ['ソ'..cd] = 'ゾ',
+ --
+ ['た'..cd] = 'だ', ['タ'..cd] = 'ダ',
+ ['ち'..cd] = 'ぢ', ['チ'..cd] = 'ヂ',
+ ['つ'..cd] = 'づ', ['ツ'..cd] = 'ヅ',
+ ['て'..cd] = 'で', ['テ'..cd] = 'デ',
+ ['と'..cd] = 'ど', ['ト'..cd] = 'ド',
+ --
+ ['は'..cd] = 'ば', ['ハ'..cd] = 'バ', ['は'..cp] = 'ぱ', ['ハ'..cp] = 'パ',
+ ['ひ'..cd] = 'び', ['ヒ'..cd] = 'ビ', ['ひ'..cp] = 'ぴ', ['ヒ'..cp] = 'ピ',
+ ['ふ'..cd] = 'ぶ', ['フ'..cd] = 'ブ', ['ふ'..cp] = 'ぷ', ['フ'..cp] = 'プ',
+ ['へ'..cd] = 'べ', ['ヘ'..cd] = 'ベ', ['へ'..cp] = 'ぺ', ['ヘ'..cp] = 'ペ',
+ ['ほ'..cd] = 'ぼ', ['ホ'..cd] = 'ボ', ['ほ'..cp] = 'ぽ', ['ホ'..cp] = 'ポ',
+ --
+ ['ゝ'..cd] = 'ゞ', ['ヽ'..cd] = 'ヾ',
+ ['ワ'..cd] = uchar(0x30F7), ['ヰ'..cd] = uchar(0x30F8),
+ ['ヱ'..cd] = uchar(0x30F9), ['ヲ'..cd] = uchar(0x30FA),
+ }
+end
+
--- the following function is modified from jafontspec.lua (by K. Maeda).
--- Instead of "%", we use U+FFFFF for suppressing spaces.
--DEBUG require"socket"
local start_time_measure, stop_time_measure
= ltjb.start_time_measure, ltjb.stop_time_measure
local function add_comment(buffer)
- start_time_measure 'inputbuf'
+ start_time_measure 'inputbuf'; buffer = substituter(buffer)
local i = utflen(buffer)
local c = utfbyte(buffer, i)
while (i>0) and (getcatcode(c)==1 or getcatcode(c)==2) do
-\documentclass{ltjarticle}\usepackage{luatexja-adjust}
-\usepackage[margin=15mm]{geometry}\begin{document}\large FALSE
+\documentclass{ltjarticle}
+\usepackage[margin=15mm]{geometry}
+\begin{document}\large
{\obeylines\ttfamily
U+304x ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く
U+305x ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た
U+30Fx ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ ヿ
\par}
-\par
-\newpage\ltjenableadjust[combinevoicedkana] TRUE
-{\obeylines\ttfamily
-U+304x ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く
-U+305x ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た
-U+306x だ ち ぢ っ つ づ て で と ど な に ぬ ね の は
-U+307x ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み
-U+308x む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ
-U+309x ゐ ゑ を ん ゔ ゕ ゖ ゙ ゚ ゛ ゜ ゝ ゞ ゟ
-U+30Ax ゠ ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク
-U+30Bx グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ
-U+30Cx ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ
-U+30Dx バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ
-U+30Ex ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ
-U+30Fx ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ ヿ
-\par}
+\bigskip
+\def\CB{\char"3099 }\def\CD{\char"309A }
-\par
-\newpage\ltjenableadjust[combinevoicedkana=false] FALSE
{\obeylines\ttfamily
-U+304x ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く
-U+305x ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た
-U+306x だ ち ぢ っ つ づ て で と ど な に ぬ ね の は
-U+307x ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み
+U+304x ぁ あ ぃ い ぅ う ぇ え ぉ お か か\CB{} き き\CB{} く
+U+305x く\CB{} け け\CB{} こ こ\CB{} さ さ\CB{} し し\CB{} す す\CB{} せ せ\CB{} そ そ\CB{} た
+U+306x た\CB{} ち ち\CB{} っ つ つ\CB{} て て\CB{} と と\CB{} な に ぬ ね の は
+U+307x は\CB{} は\CD{} ひ ひ\CB{} ひ\CD{} ふ ふ\CB{} ふ\CD{} へ へ\CB{} へ\CD{} ほ ほ\CB{} ほ\CD{} ま み
U+308x む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ
-U+309x ゐ ゑ を ん ゔ ゕ ゖ ゙ ゚ ゛ ゜ ゝ ゞ ゟ
-U+30Ax ゠ ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク
-U+30Bx グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ
-U+30Cx ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ
-U+30Dx バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ
+U+309x ゐ ゑ を ん ゔ ゕ ゖ \CB{} \CD{} ゛ ゜ ゝ ゝ\CB{} ゟ
+U+30Ax ゠ ァ ア ィ イ ゥ ウ ェ エ ォ オ カ カ\CB{} キ キ\CB{} ク
+U+30Bx ク\CB{} ケ ケ\CB{} コ コ\CB{} サ サ\CB{} シ シ\CB{} ス ス\CB{} セ セ\CB{} ソ ソ\CB{} タ
+U+30Cx タ\CB{} チ チ\CB{} ッ ツ ツ\CB{} テ テ\CB{} ト ト\CB{} ナ ニ ヌ ネ ノ ハ
+U+30Dx ハ\CB{} ハ\CD{} ヒ ヒ\CB{} ヒ\CD{} フ フ\CB{} フ\CD{} ヘ ヘ\CB{} ヘ\CD{} ホ ホ\CB{} ホ\CD{} マ ミ
U+30Ex ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ
-U+30Fx ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ ヿ
+U+30Fx ヰ ヱ ヲ ン ウ\CB{} ヵ ヶ ワ\CB{} ヰ\CB{} ヱ\CB{} ヲ\CB{} ・ ー ヽ ヽ\CB{} ヿ
\par}
-
\end{document}