OSDN Git Service

test/mfonttest.tex: reconstruction:
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Mon, 30 Dec 2013 07:40:47 +0000 (16:40 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Mon, 30 Dec 2013 07:43:42 +0000 (16:43 +0900)
 * \ltjsetaltfont<base_font_cs><alt_font_cs>{100-200,3000-,5000,...}
 * \ltjclearaltfont<font_cs>

---
Also, I corrected typo in ltj-charrange.lua.

src/ltj-charrange.lua
test/mfonttest.pdf
test/mfonttest.tex

index d95e45b..e3478ab 100644 (file)
@@ -37,11 +37,11 @@ for i=0x100,ucs_out-1 do jcr_table_main[i]=0 end
 
 -- EXT: add characters to a range
 function add_char_range(b,e,ind) -- ind: external range number
-   if not ind or ind<0 or ind>=7*ATTR_RANGE then -- 0 は error にしない(隠し)
+   if not ind or ind<0 or ind>=31*ATTR_RANGE then -- 0 は error にしない(隠し)
       ltjb.package_error('luatexja',
                         "invalid character range number (" .. ind .. ")",
                         "A character range number should be in the range 1.."
-                          .. 7*ATTR_RANGE-1 .. ",\n" ..
+                          .. 31*ATTR_RANGE-1 .. ",\n" ..
                          "ignored.")
       return
    elseif b<0x80 or e>=ucs_out then
index a9ced84..30516b2 100644 (file)
Binary files a/test/mfonttest.pdf and b/test/mfonttest.pdf differ
index bd8d013..b6f1501 100644 (file)
 %#!lualatex
 \documentclass{ltjsarticle}
 
-%%% ltj-charrange.lua に本ドキュメント末尾のようなパッチが必要
-
 \makeatletter
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% 42 番の文字範囲を「かな書体」用として宣言
-\ltjdefcharrange{42}{"3000-"30FF, "31F0-"31FF, "FF00-"FFEF, "1B000-"1B0FF}
-% 3000-303F CJK Symbols and Punctuation
-% 3040-309F Hiragana
-% 30A0-30FF Katakana
-% 31F0-31FF Katakana Phonetic Extensions
-% FF00-FFEF Halfwidth and Fullwidth Forms
-% 1B000-1B0FF Kana Supplement
-
-% 42 番の文字範囲を和文文字の範囲とする
-\ltjsetparameter{jacharrange={+42}}
-
-%% 42 にあまり大きい意味はない.既に使われていないもののうち
-%% 適当に大きいものをとった
-
-% 「現在のかな用書体」のフォント番号を格納する attribute
-\newluatexattribute\ltj@curkanafnt
+\def\ltj@@getjfontnumber#1{% result in \ltj@tempcntc 
+  \bgroup#1\directlua{luatexja.__temp = \the\ltj@curjfnt}\egroup
+  \ltj@tempcntc=\directlua{tex.sprint(luatexja.__temp)}\relax}
+
+%%%%%%%% 公開命令
+%%%% \ltjsetaltfont<base_font_cs><alt_font_cs>{100-200,3000-,5000,...}
+% <base_font_cs> の 第 3 引数の文字達は <alt_font_cs> で組む
+\protected\def\ltjsetaltfont#1#2#3{%
+  {\ltj@@getjfontnumber#1\@tempcnta=\ltj@tempcntc% \@tempcnta: 基底フォント
+   \ltj@@getjfontnumber#2%
+   \expandafter\ltj@@altfont#3,,}\ignorespaces}
+\def\ltj@@altfont#1,{\def\ltj@temp{#1}%
+  \ifx\ltj@temp\empty\let\@next=\relax\else
+  \ltj@@altfontA{#1}\let\@next=\ltj@@altfont\fi\@next}
+\def\ltj@@altfontA#1{\ltj@@altfontB#1--\@nil}
+\def\ltj@@altfontB#1-#2-#3\@nil{\def\ltj@temp{#3}%
+  \ifx\ltj@temp\empty
+    \ltj@tempcnta=#1 \ltj@tempcntb=\ltj@tempcnta
+  \else
+    \def\ltj@temp{#1}%
+    \ifx\ltj@temp\empty\ltj@tempcnta='200\else\ltj@tempcnta=#1\fi\relax
+    \def\ltj@temp{#2}%
+    \ifx\ltj@temp\empty\ltj@tempcntb="10FFFF\else\ltj@tempcntb=#2\fi\relax%"
+  \fi
+  \directlua{luatexja.jfont.set_alt_font(
+    \the\ltj@tempcnta,\the\ltj@tempcntb,
+    \the\ltj@tempcntc, \the\@tempcnta)}%
+  }
+
+%%%% \ltjclearaltfont<font_cs>
+% <font_cs> の文字は全部 <font_cs> 本来の文字で組む
+\protected\def\ltjclearaltfont#1{%
+  {\ltj@@getjfontnumber#1%
+   \directlua{luatexja.jfont.clear_alt_font(\the\ltj@tempcntc)}}\ignorespaces}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % ここから Lua code
 \usepackage{luacode}
 
-\begin{luacode}
-local ltjc = luatexja.charrange
+\begin{luacode*} -- この行は 47 行目
+local alt_font_table = {}; luatexja.jfont.alt_font_table = alt_font_table
+local attr_curaltfnt = {}
 
+local ucs_out = 0x110000
 local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
-local attr_curkfnt = luatexbase.attributes['ltj@curkanafnt']
 local attr_icflag = luatexbase.attributes['ltj@icflag']
 local has_attr = node.has_attribute
 local set_attr = node.set_attribute
 local id_glyph = node.id('glyph')
+local ltjb = luatexja.base
+
+local function set_alt_font(b,e,ind,fnum)
+   -- ind: 新フォント, fnum: 基底フォント
+  if b<0x80 or e>=ucs_out then
+      ltjb.package_warning('luatexja',
+                        'bad character range ([' .. b .. ',' .. e .. ']). ' ..
+                          'I take the intersection with [0x80, 0x10ffff].')
+   elseif b>e then
+      local j=b; e=b; b=j
+   end
+   if not alt_font_table[fnum] then alt_font_table[fnum]={} end
+   local t = alt_font_table[fnum]
+   for i=math.max(0x80,b),math.min(ucs_out-1,e) do
+      t[i]=ind
+   end
+end
+luatexja.jfont.set_alt_font = set_alt_font
+
+local function clear_alt_font(fnum)
+   if alt_font_table[fnum] then 
+      local t = alt_font_table[fnum]
+      for i,_ in pairs(t) do t[i]=nil; end
+   end
+end
+luatexja.jfont.clear_alt_font = clear_alt_font
 
-local function font_replace_42(head)
+--%%%%%%%% callback
+local function replace_altfont(head)
    for p in node.traverse_id(id_glyph, head) do
-      if (has_attr(p, attr_icflag) or 0)<=0 and ltjc.jcr_table_main[p.char]==42 then
-         set_attr(p, attr_curjfnt, 
-            has_attr(p, attr_curkfnt) or (has_attr(p, attr_curjfnt) or p.font))
-         -- 42 番の文字範囲に即する文字は,(もし和文ならば)かな書体で組まれる
+      local pf = p.font
+      if p.font == (has_attr(p, attr_curjfnt) or 0) then
+         if alt_font_table[pf] and alt_font_table[pf][p.char] then
+            local n = alt_font_table[pf][p.char]
+            if n then 
+               p.font = n; set_attr(p, attr_curjfnt, n)
+            end
+         end
       end
    end
    return head
 end
 luatexbase.add_to_callback('hyphenate', 
-   function (head,tail)
-      return font_replace_42(head)
-   end,'replace_42', 1)
-
-\end{luacode}
+ function (head,tail)
+    return replace_altfont(head)
+ end,'ltj.replace_altfont',
+ luatexbase.priority_in_callback('hyphenate', 'ltj.hyphenate')+1)
 
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% ユーザ命令: \setkanafont <書体選択命令>, \unsetkanafont
-
-\def\setkanafont#1{%
-  \bgroup#1\directlua{luatexja.mfont_temp = \the\ltj@curjfnt}\egroup
-  \ltj@curkanafnt=\directlua{tex.sprint(luatexja.mfont_temp)}\relax
-}
-\def\unsetkanafont{\ltj@curkanafnt=-"7FFFFFFF\relax}%"
-
-\makeatother
 
-\usepackage{luatexja-fontspec}
-\setmainjfont{ipam.ttf}
-\setsansjfont{ipag.ttf}
-\newjfontfamily\kanaX{mogamb.ttc}% かな用書体1: MogaMincho Bold
-%%% ↑Y. Oz Vox (http://yozvox.web.fc2.com/) より入手可能
-\newjfontfamily\kanaY{ipag.ttf}%   かな用書体2: IPA ゴシック
+\end{luacode*}
 
 \begin{document}
-% \setkanafont はTeX のグルーピングに従う
-あいう漢字
-{\setkanafont\kanaY あいう漢字}%
-あいう漢字
-{\setkanafont\kanaX あいう漢字
-  {\setkanafont\kanaY あいう漢字}
-あいう漢字}
-
-% \unsetkanafont で解除可能
-{\setkanafont\kanaY あいう漢字
-  {\unsetkanafont あいう漢字}% ここだけ IPA 明朝
-あいう漢字}
-
-
-% ゴシック体に太明朝のカタカナを合わせる
-{\gtfamily\setkanafont\kanaX あいう漢字}
+% test
+\jfont\jaA=KozGoPr6N-Regular.otf:jfm=ujis at 9.24872pt
+\jfont\jaB=KozMinPr6N-Bold.otf:jfm=ujis   at 9.24872pt
+\jfont\jaC=KozGoPr6N-Bold.otf:jfm=ujis    at 9.24872pt
+
+\jaA 
+あア漢字% 置換なし
+\ltjsetaltfont\jaA\jaB{"3000-"30FF}
+あア漢字% 「あ」のみ置換(setaltfont は段落末尾の状況が全段落で通用)
+\ltjsetaltfont\jaA\jaA{"30A0-"30FF}
+あア漢字% 「あ」のみ置換
+
+\ltjsetaltfont\jaA\jaB{"3000-"30FF}
+\ltjsetaltfont\jaA\jaC{`漢}
+あア漢字% 「あ」「ア」「漢」置換
+\mc
+あア漢字% 置換なし
+\jaA 
+あア漢字% 「あ」「ア」「漢」置換
+
+\jaA 
+あア漢字% 置換なし,\ltjclearaltfont の効力はこの段落全部なので
+\ltjclearaltfont\jaA
+あア漢字% 置換なし
 
-% \setkanafont はメインの和文フォントに追従しない
-% サイズ変更にも追従しないので注意
-{\setkanafont\kanaY あいう漢字\gtfamily あいう漢字\Large あいうえお漢字}
-
-% サイズ変更命令には手動で \setkanafont を実行しないといけない
-{\setkanafont\kanaY あいう漢字\Large\setkanafont\kanaY あいう漢字}
-
-
-\gtfamily\setkanafont\kanaX
-これは,意味のないサンプルテキストです.「スペーシングはうまく行ってるかな?」
-
-\unsetkanafont
-これは,意味のないサンプルテキストです.「スペーシングはうまく行ってるかな?」
 
 \end{document}
-
-
---- src/ltj-charrange.lua.orig 2013-12-29 16:58:52.482148630 +0900
-+++ src/ltj-charrange.lua      2013-12-25 20:26:17.879807073 +0900
-@@ -28,8 +28,7 @@
- --         external    1  2       216, (out of range): 'other'
- -- initialize
--jcr_table_main = {}
--local jcr_table_main = jcr_table_main
-+local jcr_table_main = {}
- local jcr_cjk = 0; local jcr_noncjk = 1; local ucs_out = 0x110000
- for i=0x80 ,0xFF      do jcr_table_main[i]=1 end