From 27609d55b31cf084416b897ef51701ae117166ae Mon Sep 17 00:00:00 2001 From: Hironori Kitagawa Date: Thu, 23 Jan 2014 11:48:32 +0900 Subject: [PATCH] Use Lua (ltj-jfont.lua) to manage Kanji encodings. --- src/addons/luatexja-fontspec.sty | 58 ++++++-------- src/ltj-adjust.lua | 2 +- src/ltj-jfont.lua | 52 +++++++++++- src/patches/lltjfont.sty | 167 +++++++++++++-------------------------- 4 files changed, 130 insertions(+), 149 deletions(-) diff --git a/src/addons/luatexja-fontspec.sty b/src/addons/luatexja-fontspec.sty index b1a9b4a..597e533 100644 --- a/src/addons/luatexja-fontspec.sty +++ b/src/addons/luatexja-fontspec.sty @@ -3,7 +3,7 @@ % \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{luatexja-fontspec}[2013/08/17 fontspec support of LuaTeX-ja] +\ProvidesPackage{luatexja-fontspec}[2014/01/23 fontspec support of LuaTeX-ja] \RequirePackage{fontspec,luatexja} \ExplSyntaxOn @@ -174,38 +174,31 @@ %%%%%%%% Now we completely ignore kanjifont definition file. \DeclareRobustCommand\fontfamily[1]{% - \@notkfamfalse\@notffamfalse\edef\tmp@item{{#1}}% + \@notkfamfalse\@notffamfalse + \edef\tmp@item{'\luatexluaescapestring{#1}'}% + \edef\tmp@enc{'\luatexluaescapestring{\f@encoding}'}% \ifcsname \k@encoding+#1\endcsname % if \k@encoding+#1 is already defined \edef\k@family{#1}% - \else - \def\@temp##1+{\lowercase{\def\@@temp{##1#1.fd}}}\expandafter\@temp\k@encoding+% - \@notkfamtrue - \fi + \else\@notkfamtrue\fi \ifcsname \f@encoding+#1\endcsname \edef\f@family{#1}% \else % search font definition file... - \ifcsname ffam@list@\f@encoding\endcsname\else - \expandafter\gdef\csname ffam@list@\f@encoding\endcsname{}% - \expandafter\gdef\csname notffam@list@\f@encoding\endcsname{}% - \fi - \edef\@templist{\@nameuse{ffam@list@\f@encoding}}% - \expandafter\expandafter\expandafter\inlist@\expandafter\tmp@item\expandafter{\@templist}% - \ifin@\edef\f@family{#1}\else - \edef\@templist{\@nameuse{notffam@list@\f@encoding}}% - \expandafter\expandafter\expandafter\inlist@\expandafter\tmp@item\expandafter{\@templist}% - \ifin@\@notffamtrue\else - \def\@temp##1+{\lowercase{\def\@@temp{##1#1.fd}}}\expandafter\@temp\f@encoding+% - \message{(I search font definition file. \@@temp)}% - \IfFileExists{\@@temp}{\@tempswztrue}{\@tempswzfalse}% - \if@tempswz - \expandafter\xdef\csname ffam@list@\f@encoding\endcsname - {\@nameuse{ffam@list@\f@encoding}\fam@elt<#1>}\edef\f@family{#1}% - \else - \expandafter\xdef\csname notffam@list@\f@encoding\endcsname - {\@nameuse{notffam@list@\f@encoding}\fam@elt<#1>}\@notffamtrue% - \fi - \fi - \fi + \directlua{luatexja.jfont.is_ffam(\tmp@enc, \tmp@item)}% + \ifin@\edef\k@family{#1}\else% + \directlua{luatexja.jfont.is_Nffam(\tmp@enc, \tmp@item)}% + \ifin@\@notffamtrue\else% + \def\@temp##1+{\lowercase{\def\@@temp{##1#1.fd}}}\expandafter\@temp\f@encoding+% + \message{(I search kanjifont definition file: \@@temp)}% + \IfFileExists{\@@temp#1.fd}{\@tempswztrue}{\@tempswzfalse}% + \if@tempswz + \directlua{luatexja.jfont.add_ffam_list(\tmp@enc, \tmp@item)}% + \edef\f@family{#1}% + \else + \directlua{luatexja.jfont.add_Nffam_list(\tmp@enc, \tmp@item)}% + \@notffamtrue% + \fi + \fi + \fi \fi \if@notkfam\if@notffam {\ifcsname D@\k@encoding\endcsname\@nameuse{D@\k@encoding}\fi @@ -219,17 +212,12 @@ \def\try@load@fontshape{% \expandafter \ifx\csname \f@encoding+\f@family\endcsname\relax - \edef\tmp@item{{\directlua{% - tex.print(luatexbase.catcodetables["latex-package"], '\f@encoding')}% - }}% \f@encoding の展開結果の catcode は 12 であるため,これで補正. - \expandafter\expandafter\expandafter - \inlist@\expandafter\tmp@item\expandafter{\kenc@list}% + \directlua{luatexja.jfont.is_kenc('\luatexluaescapestring{\f@encoding}')}% \ifin@ % Japanese font: we don't search fd. \@font@warning{We don't search kanjifont definition \MessageBreak for \f@encoding/\f@family}% \else % Alphabetic font - \@font@info{Try loading font information for - \f@encoding+\f@family}% + \@font@info{Try loading font information for \f@encoding+\f@family}% \global\expandafter\let \csname\f@encoding+\f@family\endcsname\@empty \nfss@catcodes diff --git a/src/ltj-adjust.lua b/src/ltj-adjust.lua index 380fa90..01d6d7b 100644 --- a/src/ltj-adjust.lua +++ b/src/ltj-adjust.lua @@ -3,7 +3,7 @@ -- luatexbase.provides_module({ name = 'luatexja.adjust', - date = '2013/03/14', + date = '2014/01/23', description = 'Advanced line adjustment for LuaTeX-ja', }) module('luatexja.adjust', package.seeall) diff --git a/src/ltj-jfont.lua b/src/ltj-jfont.lua index cb63545..d58f4de 100644 --- a/src/ltj-jfont.lua +++ b/src/ltj-jfont.lua @@ -3,7 +3,7 @@ -- luatexbase.provides_module({ name = 'luatexja.jfont', - date = '2014/01/02', + date = '2014/01/23', description = 'Loader for Japanese fonts', }) module('luatexja.jfont', package.seeall) @@ -317,6 +317,56 @@ do end ------------------------------------------------------------------------ +-- LATEX INTERFACE +------------------------------------------------------------------------ +do + local kyenc_list, ktenc_list = {}, {} + function add_kyenc_list(enc) kyenc_list[enc] = 'true ' end + function add_ktenc_list(enc) ktenc_list[enc] = 'true ' end + function is_kyenc(enc) + tex.sprint(cat_lp, '\\let\\ifin@\\if' .. (kyenc_list[enc] or 'false ')) + end + function is_kyenc(enc) + tex.sprint(cat_lp, '\\let\\ifin@\\if' .. (kyenc_list[enc] or 'false ')) + end + function 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 add_kfam_list(enc, fam) + if not kfam_list[enc] then kfam_list[enc] = {} end + kfam_list[enc][fam] = 'true ' + end + function add_Nkfam_list(enc, fam) + if not Nkfam_list[enc] then Nkfam_list[enc] = {} end + Nkfam_list[enc][fam] = 'true ' + end + function is_kfam(enc, fam) + tex.sprint(cat_lp, '\\let\\ifin@\\if' + .. (kfam_list[enc] and kfam_list[enc][fam] or 'false ')) end + function is_Nkfam(enc, fam) + tex.sprint(cat_lp, '\\let\\ifin@\\if' + .. (Nkfam_list[enc] and Nkfam_list[enc][fam] or 'false ')) end + + local ffam_list, Nffam_list = {}, {} + function add_ffam_list(enc, fam) + if not ffam_list[enc] then ffam_list[enc] = {} end + ffam_list[enc][fam] = 'true ' + end + function add_Nffam_list(enc, fam) + if not Nffam_list[enc] then Nffam_list[enc] = {} end + Nffam_list[enc][fam] = 'true ' + end + function is_ffam(enc, fam) + tex.sprint(cat_lp, '\\let\\ifin@\\if' + .. (ffam_list[enc] and ffam_list[enc][fam] or 'false ')) end + function is_Nffam(enc, fam) + tex.sprint(cat_lp, '\\let\\ifin@\\if' + .. (Nffam_list[enc] and Nffam_list[enc][fam] or 'false ')) end +end +------------------------------------------------------------------------ -- ALTERNATE FONTS ------------------------------------------------------------------------ alt_font_table = {} diff --git a/src/patches/lltjfont.sty b/src/patches/lltjfont.sty index e10834c..6c9529f 100644 --- a/src/patches/lltjfont.sty +++ b/src/patches/lltjfont.sty @@ -3,7 +3,7 @@ % \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{lltjfont}[2013/05/14 Patch to NFSS2 for LuaTeX-ja] +\ProvidesPackage{lltjfont}[2014/01/23 Patch to NFSS2 for LuaTeX-ja] \let\k@encoding\@empty \let\ck@encoding\@empty @@ -27,15 +27,7 @@ \ifdefined\chs\else\newdimen\chs\fi \ifdefined\cHT\else\newdimen\cHT\fi %\let\afont\font -\def\inlist@#1#2{% - \def\in@@##1<#1>##2##3\in@@{% - \ifx\in@##2\in@false\else\in@true\fi}% - \in@@#2<#1>\in@\in@@} -\def\fam@elt{\noexpand\fam@elt} -\def\enc@elt{\noexpand\enc@elt} -\let\kenc@list\@empty -\let\kyenc@list\@empty -\let\ktenc@list\@empty + \newbox\tstrutbox \newbox\zstrutbox \def\strut{\relax @@ -87,16 +79,13 @@ \expandafter\endgroup \DeclareYokoKanjiEncoding@} \def\DeclareYokoKanjiEncoding@#1#2#3{% - \expandafter - \ifx\csname T@#1\endcsname\relax + \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 - \def\enc@elt{\noexpand\enc@elt}% - \xdef\kyenc@list{\kyenc@list\enc@elt<#1>}% - \xdef\kenc@list{\kenc@list\enc@elt<#1>}% + \directlua{luatexja.jfont.add_kyenc_list('\luatexluaescapestring{#1}')}% \else \@font@info{Redeclaring KANJI (yoko) font encoding #1}% \fi @@ -109,16 +98,13 @@ \expandafter\endgroup \DeclareTateKanjiEncoding@} \def\DeclareTateKanjiEncoding@#1#2#3{% - \expandafter - \ifx\csname T@#1\endcsname\relax + \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 - \def\enc@elt{\noexpand\enc@elt}% - \xdef\ktenc@list{\ktenc@list\enc@elt<#1>}% - \xdef\kenc@list{\kenc@list\enc@elt<#1>}% + \directlua{luatexja.jfont.add_ktenc_list('\luatexluaescapestring{#1}')}% \else \@font@info{Redeclaring KANJI (tate) font encoding #1}% \fi @@ -211,16 +197,11 @@ \math@fontsfalse \every@math@size{}% \fontsize{#6}\z@ - \edef\tmp@item{{#2}}% - \expandafter\expandafter\expandafter - \inlist@\expandafter\tmp@item\expandafter{\kyenc@list}% - \ifin@ + \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{#2}')}\ifin@% \usekanji{#2}{#3}{#4}{#5}% \global\let#1\getjfont \else - %\expandafter\expandafter\expandafter - %\inlist@\expandafter\tmp@item\expandafter{\ktenc@list}% - %\ifin@ + %\directlua{luatexja.jfont.is_ktenc('\luatexluaescapestring{#2}')}\ifin@% % \usekanji{#2}{#3}{#4}{#5}% % \let\font\tfont %\else @@ -278,32 +259,22 @@ \DeclareRobustCommand\selectfont{% \let\tmp@error@fontshape\error@fontshape \let\error@fontshape\error@kfontshape - \edef\tmp@item{{\k@encoding}}% - \expandafter\expandafter\expandafter - \inlist@\expandafter\tmp@item\expandafter{\kyenc@list}% - \ifin@ + \directlua{luatexja.jfont.is_kyenc('\luatexluaescapestring{\k@encoding}')}\ifin@% \let\cy@encoding\k@encoding \edef\ct@encoding{\csname t@enc@\k@encoding\endcsname}% \else - \expandafter\expandafter\expandafter - \inlist@\expandafter\tmp@item\expandafter{\ktenc@list}% - \ifin@ - \let\ct@encoding\k@encoding - \edef\cy@encoding{\csname y@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 \fi - %\let\font\tfont - %\let\k@encoding\ct@encoding - %\xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% - %\pickup@font - %\font@name \let\k@encoding\cy@encoding \xdef\font@name{\csname\curr@kfontshape/\f@size\endcsname}% \pickup@jfont \font@name - \expandafter\def\expandafter\k@encoding\tmp@item + \edef\tmp@item{{\k@encoding}}\expandafter\def\expandafter\k@encoding\tmp@item \kenc@update \let\error@fontshape\tmp@error@fontshape \if@knjcmd \@knjcmdfalse @@ -318,7 +289,6 @@ \csname rel@\k@encoding/\k@family/\k@series/\k@shape\endcsname \fi \fi - %\let\font\afont \xdef\font@name{\csname\curr@fontshape/\f@size\endcsname}% \pickup@font \font@name @@ -326,7 +296,15 @@ \ifx\f@linespread\baselinestretch \else \set@fontsize\baselinestretch\f@size\f@baselineskip \fi - \size@update} + \size@update +% ここからは altfont 用 + \ltj@@does@alt@set{\curr@kfontshape}% + % alt fonts の定義 + \directlua{luatexja.jfont.output_alt_font_cmd('\luatexluaescapestring{\curr@kfontshape}')}% + % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする + \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% + \fi +} \def\KanjiEncodingPair#1#2{\@namedef{t@enc@#1}{#2}\@namedef{y@enc@#2}{#1}} \KanjiEncodingPair{JY3}{JT3} \def\set@fontsize#1#2#3{% @@ -397,27 +375,23 @@ \fi } \DeclareRobustCommand\fontencoding[1]{% - \edef\tmp@item{{#1}}% - \expandafter\expandafter\expandafter - \inlist@\expandafter\tmp@item\expandafter{\kenc@list}% - \ifin@ \kanjiencoding{#1}\else\romanencoding{#1}\fi} + \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@item{{\k@encoding}}% - \expandafter\expandafter\expandafter - \inlist@\expandafter\tmp@item\expandafter{\kyenc@list}% - \ifin@ \let\cy@encoding\k@encoding + \edef\tmp@enc{'\luatexluaescapestring{\k@encoding}'} + \directlua{luatexja.jfont.is_kyenc(\tmp@enc)}\ifin@% + \let\cy@encoding\k@encoding \else - \expandafter\expandafter\expandafter - \inlist@\expandafter\tmp@item\expandafter{\ktenc@list}% - \ifin@ \let\ct@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 \fi } \let\kenc@update\relax @@ -444,58 +418,47 @@ \newif\if@tempswz \DeclareRobustCommand\romanfamily[1]{\edef\f@family{#1}} \DeclareRobustCommand\kanjifamily[1]{\edef\k@family{#1}} -% \notkfam@list@: list of non-defined kanji families under -% \kfam@list@: list of kanji families under , defined in a .fd file \DeclareRobustCommand\fontfamily[1]{% - \@notkfamfalse\@notffamfalse\edef\tmp@item{{#1}}% + \@notkfamfalse\@notffamfalse + \edef\tmp@item{'\luatexluaescapestring{#1}'}% + \edef\tmp@enc{'\luatexluaescapestring{\k@encoding}'}% \ifcsname \k@encoding+#1\endcsname % if \k@encoding+#1 is already defined \edef\k@family{#1}% \else % search font definition file... - \ifcsname kfam@list@\k@encoding\endcsname\else - \expandafter\gdef\csname kfam@list@\k@encoding\endcsname{}% - \expandafter\gdef\csname notkfam@list@\k@encoding\endcsname{}% - \fi - \edef\@templist{\@nameuse{kfam@list@\k@encoding}}% - \expandafter\expandafter\expandafter\inlist@\expandafter\tmp@item\expandafter{\@templist}% + \directlua{luatexja.jfont.is_kfam(\tmp@enc, \tmp@item)}% \ifin@\edef\k@family{#1}\else% - \edef\@templist{\@nameuse{notkfam@list@\k@encoding}}% - \expandafter\expandafter\expandafter\inlist@\expandafter\tmp@item\expandafter{\@templist}% + \directlua{luatexja.jfont.is_Nkfam(\tmp@enc, \tmp@item)}% \ifin@\@notkfamtrue\else% \def\@temp##1+{\lowercase{\def\@@temp{##1#1.fd}}}\expandafter\@temp\k@encoding+% \message{(I search kanjifont definition file: \@@temp)}% \IfFileExists{\@@temp#1.fd}{\@tempswztrue}{\@tempswzfalse}% \if@tempswz - \expandafter\xdef\csname kfam@list@\k@encoding\endcsname - {\@nameuse{kfam@list@\k@encoding}\fam@elt<#1>}\edef\k@family{#1}% + \directlua{luatexja.jfont.add_kfam_list(\tmp@enc, \tmp@item)}% + \edef\k@family{#1}% \else - \expandafter\xdef\csname notkfam@list@\k@encoding\endcsname - {\@nameuse{notkfam@list@\k@encoding}\fam@elt<#1>}\@notkfamtrue% + \directlua{luatexja.jfont.add_Nkfam_list(\tmp@enc, \tmp@item)}% + \@notkfamtrue% \fi \fi \fi \fi + \edef\tmp@enc{'\luatexluaescapestring{\f@encoding}'}% \ifcsname \f@encoding+#1\endcsname \edef\f@family{#1}% \else % search font definition file... - \ifcsname ffam@list@\f@encoding\endcsname\else - \expandafter\gdef\csname ffam@list@\f@encoding\endcsname{}% - \expandafter\gdef\csname notffam@list@\f@encoding\endcsname{}% - \fi - \edef\@templist{\@nameuse{ffam@list@\f@encoding}}% - \expandafter\expandafter\expandafter\inlist@\expandafter\tmp@item\expandafter{\@templist}% + \directlua{luatexja.jfont.is_ffam(\tmp@enc, \tmp@item)}% \ifin@\edef\f@family{#1}\else - \edef\@templist{\@nameuse{notffam@list@\f@encoding}}% - \expandafter\expandafter\expandafter\inlist@\expandafter\tmp@item\expandafter{\@templist}% + \directlua{luatexja.jfont.is_Nffam(\tmp@enc, \tmp@item)}% \ifin@\@notffamtrue\else \def\@temp##1+{\lowercase{\def\@@temp{##1#1.fd}}}\expandafter\@temp\f@encoding+% \message{(I search font definition file: \@@temp)}% \IfFileExists{\@@temp#1.fd}{\@tempswztrue}{\@tempswzfalse}% \if@tempswz - \expandafter\xdef\csname ffam@list@\f@encoding\endcsname - {\@nameuse{ffam@list@\f@encoding}\fam@elt<#1>}\edef\f@family{#1}% + \directlua{luatexja.jfont.add_ffam_list(\tmp@enc, \tmp@item)}% + \edef\f@family{#1}% \else - \expandafter\xdef\csname notffam@list@\f@encoding\endcsname - {\@nameuse{notffam@list@\f@encoding}\fam@elt<#1>}\@notffamtrue% + \directlua{luatexja.jfont.add_Nffam_list(\tmp@enc, \tmp@item)}% + \@notffamtrue% \fi \fi \fi @@ -520,10 +483,8 @@ \romanencoding{#1}\romanfamily{#2}\romanseries{#3}\romanshape{#4}% \selectfont\ignorespaces} \protected\def\usefont#1#2#3#4{% - \edef\tmp@item{{#1}}% - \expandafter\expandafter\expandafter - \inlist@\expandafter\tmp@item\expandafter{\kenc@list}% - \ifin@ \usekanji{#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{% @@ -565,12 +526,8 @@ % #1 の展開結果から encoding 部分をとりだし,それが和文用かどうかの結果を \ifin@ に代入 \def\ltj@@IsFontJapanese#1{% - \expandafter\ltj@@IsFontJapaneseX#1//:% - \expandafter\expandafter\expandafter - \inlist@\expandafter\tmp@item\expandafter{\kenc@list}} -\def\ltj@@IsFontJapaneseX#1/#2/:{\edef\tmp@item{{\directlua{% - tex.print(luatexbase.catcodetables["latex-package"], '#1')}% -}}} + \directlua{luatexja.jfont.is_kenc(string.match( + '\luatexluaescapestring{#1}', '[^/]+'))}} \let\extract@afont\extract@font @@ -606,7 +563,7 @@ \aftergroup\subst@correction } \def\do@subst@correction{% - \ltj@@IsFontJapanese{\curr@fontshape}\ifin@ + \ltj@@IsFontJapanese{\curr@fontshape}\ifin@% \ltj@@ja@do@subst@correction \else \ltj@@al@do@subst@correction @@ -676,21 +633,7 @@ %%%% \ClearAlternateKanjiFont % いつも global \def\ClearAlternateKanjiFont#1#2#3#4{% - \directlua{luatexja.jfont.clear_alt_font_latex( - '\luatexluaescapestring{#1/#2/#3/#4}')}} - -% \selectfont 上書き -\let\ltj@@alt@selectfont@orig=\selectfont -\def\selectfont{% - \ltj@@alt@selectfont@orig - \ltj@@does@alt@set{\curr@kfontshape} - % alt fonts の定義 - \directlua{luatexja.jfont.output_alt_font_cmd('\luatexluaescapestring{\curr@kfontshape}')}% - % 定義した alt fonts のデータを \ltjdeclarealtfont に渡すのと同等の処理をする - \directlua{luatexja.jfont.pickup_alt_font_a('\f@size')}% - \fi -} -%\let\selectfont=\ltj@@alt@selectfont@orig + \directlua{luatexja.jfont.clear_alt_font_latex('\luatexluaescapestring{#1/#2/#3/#4}')}} \def\ltj@pickup@altfont@aux#1{% {\edef\font@name{\csname #1/\f@size\endcsname}\pickup@jfont}% -- 2.11.0