From c282c4699b5c50d0d050bb1d7f5187a47eebc94e Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 5 May 2014 22:06:34 +0000 Subject: luatexja (4may14) git-svn-id: svn://tug.org/texlive/trunk@33863 c570f23f-e606-0410-a88d-b1316a301751 --- .../luatex/luatexja/addons/luatexja-fontspec.sty | 178 ++++++++++++++---- .../tex/luatex/luatexja/addons/luatexja-ruby.sty | 207 +++++++++++++++++++++ 2 files changed, 349 insertions(+), 36 deletions(-) create mode 100644 Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-ruby.sty (limited to 'Master/texmf-dist/tex/luatex/luatexja/addons') diff --git a/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec.sty b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec.sty index 9fa1ec4867e..43666d3b3f3 100644 --- a/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec.sty +++ b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-fontspec.sty @@ -3,31 +3,64 @@ % \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{luatexja-fontspec}[2014/01/23 fontspec support of LuaTeX-ja] - -\RequirePackage{fontspec,luatexja} +\ProvidesPackage{luatexja-fontspec}[2014/04/16 fontspec support of LuaTeX-ja] +\RequirePackage{l3keys2e,luatexja} \ExplSyntaxOn +\bool_new:N \ltj_fontspec_match +\cs_set:Nn \ltj_fontspec_pass_opts: {} +\keys_define:nn { luatexja-fontspec } + { + match .bool_set:N = \ltj_fontspec_match, + match .default:n = true, + pass .code:n = \cs_set:Nn \ltj_fontspec_pass_opts: {#1}, + } +\ProcessKeysOptions { luatexja-fontspec } +\RequirePackage[\ltj_fontspec_pass_opts:]{fontspec}[2011/09/13] + +%%%%%%%% Change Japanese font family by \rmfamily or not +\bool_if:NTF \ltj_fontspec_match +{ + \renewcommand\jttdefault{\gtdefault} + \DeclareRobustCommand\rmfamily + {\not@math@alphabet\rmfamily\mathrm + \romanfamily\rmdefault\kanjifamily\mcdefault\selectfont} + \DeclareRobustCommand\sffamily + {\not@math@alphabet\sffamily\mathsf + \romanfamily\sfdefault\kanjifamily\gtdefault\selectfont} + \DeclareRobustCommand\ttfamily + {\not@math@alphabet\ttfamily\mathtt + \romanfamily\ttdefault\kanjifamily\jttdefault\selectfont} + \DeclareDocumentCommand \setmonojfont { O{} m } { + \__ltj_fontspec_set_family:Nnn \jttdefault {#1}{#2} + \normalfont + } +}{ +} + %%%%%%%% Messages -\cs_new:Npn \ltj_fontspec_warning:n { \msg_warning:nn {ltj-fontspec} } -\msg_new:nnn {ltj-fontspec} {addjfontfeatures-ignored} +\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. } -\cs_generate_variant:Nn \prg_new_conditional:Nnn {Nnx} +\msg_new:nnn {luatexja-fontspec} {altfont-ignored-by-norange} +{ + ignored~ sublist~ `#1'~ in~ AltFont~ (no~ range~ is~ specified). +} -%%%%%%%% For compatibility with old fontspec. -\prg_new_conditional:Nnx \ltj_fontspec_if_liiikeys: {TF,F} { - \@ifpackagelater {fontspec} {2011/09/13} - { \exp_not:N \prg_return_true: } % fontspec >= 2.2 (l3keys) - { \exp_not:N \prg_return_false: } % fontspec < 2.2 (xkeyval) +\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} + %%%%%%%% \g_ltj_fontspec_scale_fp %% Default scale value for jfont. +\fp_new:N \g_ltj_fontspec_scale_fp \group_begin: \fontsize{10}{10}\selectfont \fp_gset:Nn \g_ltj_fontspec_scale_fp {\zw / 10} @@ -36,23 +69,49 @@ %%%%%%%% Internal control sequences %% Each CS is ltj_fontspec version that corresponds to original CS of fontspec. \cs_new:Nn \ltj_fontspec_define_option:nn { - \ltj_fontspec_if_liiikeys:TF { - \keys_define:nn {fontspec} { #1 .code:n = {#2}} - } { - \define@key[zf]{options}{#1}{#2} - } + \keys_define:nn {fontspec} { #1 .code:n = {#2}} } \cs_new:Nn \ltj_fontspec_define_preparse_external:nn { - \ltj_fontspec_if_liiikeys:TF { - \keys_define:nn {fontspec-preparse-external} { #1 .code:n = {#2}} - } { - \define@key[zf]{preparse-external}{#1}{#2} - } + \keys_define:nn {fontspec-preparse-external} { #1 .code:n = {#2}} +} + +\cs_new:Nn \ltj_fontspec_define_altfont_option:nn { + \keys_define:nn {fontspec-ltjaltfont} { #1 .code:n = {#2}} } +%% Alternate Fonts +%% Spec: AltFont = { +%% ... +%% { Range = , }, +%% { Range = , Font = , }, +%% { Range = , Font = }, +%% ... +%% } +\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} +} + +\cs_new:Nn \__ltj_fontspec_altfont_key_code:n + { + \clist_set:Nn \l_ltj_fontspec_altfont_clist {#1} + \fontspec_update_fontid:n {alt:#1} + } + \cs_new:Nn \ltj_fontspec_select:nn { \group_begin: + \ltj_fontspec_define_option:nn {AltFont} { + \__ltj_fontspec_altfont_key_code:n { ##1 } + } \ltj_fontspec_define_option:nn {CID} { \fontspec_update_fontid:n {+cid=##1} \fontspec_update_featstr:n {cid=##1} @@ -74,43 +133,91 @@ \fontspec_update_fontid:n {-kern} \fontspec_update_featstr:n {-kern} } - \ltj_fontspec_if_liiikeys:TF { - \tl_set:Nn \g_fontspec_encoding_tl {JY3} - } { - \tl_set:Nn \zf@enc {JY3} - } + \tl_set:Nn \g_fontspec_encoding_tl {JY3} \tl_set:Nx \g_fontspec_default_fontopts_tl - {JFM=ujis,Scale=\fp_use:N \g_ltj_fontspec_scale_fp,Kerning=Off,\g_ltj_fontspec_default_fontopts_tl} + {JFM=ujis, Scale=\fp_use:N \g_ltj_fontspec_scale_fp, + Kerning=Off, \g_ltj_fontspec_default_fontopts_tl} \prop_set_eq:NN \g__fontspec_fontopts_prop \g__ltj_fontspec_fontopts_prop + \cs_set_eq:NN \fontspec_make_font_shapes:nnnn \ltj_fontspec_make_font_shapes:nnnn \cs_set_eq:NN \DeclareFontFamily \DeclareKanjiFamily \fontspec_select:nn{#1}{#2} \group_end: - \ltj_fontspec_if_liiikeys:F { - \tl_set_eq:NN \l_fontspec_family_tl \zf@family - } } -\cs_new:Nn \ltj_fontspec_set_family:Nnn { +\cs_new:Nn \__ltj_fontspec_set_family:Nnn { \ltj_fontspec_select:nn{#2}{#3} \tl_set_eq:NN #1 \l_fontspec_family_tl } +\cs_set_eq:NN \__ltj_orig_fontspec_make_font_shapes:nnnn \fontspec_make_font_shapes:nnnn +\cs_set_eq:NN \__ltj_fontspec_orig_DeclareFontShape \DeclareFontShape +\cs_new:Nn \ltj_fontspec_make_font_shapes:nnnn { + \__ltj_orig_fontspec_make_font_shapes:nnnn {#1} {#2} {#3} {#4} + \group_begin: + %% Parse font features. However, we have to avoid redefine already defined shape. + \__fontspec_load_fontname:n {#1} + \cs_set_eq:NN \DeclareFontShape \use_none:nnnnnn + \fontspec_declare_shape:nnn {#2}{#3} + { \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} #4 } + \cs_set_eq:NN \DeclareFontShape \__ltj_fontspec_orig_DeclareFontShape + %% + \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 + + \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 } + } { + \group_begin: + \__fontspec_load_fontname:n { \l_ltj_fontspec_altname_tl } + \fontspec_declare_shape:nnn {#2} + {#3 _ alt \int_use:N \g_ltj_fontspec_altnumber_int } + { + \quark_if_no_value:NF \l__fontspec_fontopts_clist {\l__fontspec_fontopts_clist,} + #4 , \l_ltj_fontspec_altfont_leftover_clist + } + \group_end: + \DeclareAlternateKanjiFont + {JY3}{ \l_fontspec_family_tl }{#2}{#3}% + {JY3}{ \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 } { - \ltj_fontspec_set_family:Nnn \k@family {#1}{#2} + \__ltj_fontspec_set_family:Nnn \k@family {#1}{#2} \selectfont \ignorespaces } \DeclareDocumentCommand \setmainjfont { O{} m } { - \ltj_fontspec_set_family:Nnn \mcdefault {#1}{#2} + \__ltj_fontspec_set_family:Nnn \mcdefault {#1}{#2} \DeclareSymbolFont{mincho}{JY3}{\l_fontspec_family_tl}{m}{n} \SetSymbolFont{mincho}{bold}{JY3}{\l_fontspec_family_tl}{bx}{n} \normalfont } \DeclareDocumentCommand \setsansjfont { O{} m } { - \ltj_fontspec_set_family:Nnn \gtdefault {#1}{#2} + \__ltj_fontspec_set_family:Nnn \gtdefault {#1}{#2} \DeclareMathAlphabet{\mathgt}{JY3}{\l_fontspec_family_tl}{m}{n} \normalfont } @@ -160,7 +267,7 @@ \group_end: \fontfamily\l_fontspec_family_tl\selectfont \else - \ltj_fontspec_warning:n {addjfontfeatures-ignored} + \msg_warning:nn {luatexja-fontspec} {addjfontfeatures-ignored} \fi \ignorespaces } @@ -231,5 +338,4 @@ \fi \fi} - \endinput diff --git a/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-ruby.sty b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-ruby.sty new file mode 100644 index 00000000000..57e58947418 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luatexja/addons/luatexja-ruby.sty @@ -0,0 +1,207 @@ +% +% luatexja-ruby.sty +% + +% LaTeX only! +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{luatexja-ruby}[2014/03/28 v0.21] +\RequirePackage{luatexja} + +%%------------------ +\newluatexattribute\ltj@rubyattr +\ltj@rubyattr=0 +\RequireLuaTeXjaSubmodule{ruby} + +% ltjset/getparameter への追加設定 +% これらは段落単位の設定. + +%% 引数:ルビ全角を単位とした実数 +%% この文字への pre-, post-intrusion の許容量 +\define@key[ltj]{japaram}{rubypreintrusion}{% + \expandafter\ltj@@set@stack@real#1:{RIPRE}{0}{0x7FFFFFFF}} +\define@key[ltj]{japaram}{rubypostintrusion}{% + \expandafter\ltj@@set@stack@real#1:{RIPOST}{0}{0x7FFFFFFF}} +\def\ltj@@set@stack@real#1,#2:#3#4#5{% + \directlua{luatexja.stack.set_stack_perchar(luatexja.stack_table_index.#3, + \ltj@safe@num@or\ltj@defnum{#1},\ltj@safe@real{#2},#4,#5)}} + +% ルビ用のキー設定 +\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} +\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 -- cgit v1.2.3