OSDN Git Service

Extended \ltjdeclarealtfont etc.
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Tue, 31 Dec 2013 07:35:13 +0000 (16:35 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Tue, 31 Dec 2013 07:35:13 +0000 (16:35 +0900)
範囲を表す最後の引数に {-1}-{-2} のように指定すると,
基底フォントの文字クラス 1, 2 に属する文字全部を指定したことになる.

src/ltj-jfont.lua
src/luatexja-core.sty
test/test20-mfont.pdf
test/test20-mfont.tex

index 74758ed..cc89bbc 100644 (file)
@@ -3,7 +3,7 @@
 --
 luatexbase.provides_module({
   name = 'luatexja.jfont',
-  date = '2011/05/11',
+  date = '2013/12/31',
   description = 'Loader for Japanese fonts',
 })
 module('luatexja.jfont', package.seeall)
@@ -307,18 +307,33 @@ local ucs_out = 0x110000
 -- EXT
 function set_alt_font(b,e,ind,bfnt)
    -- ind: 新フォント, bfnt: 基底フォント
-  if b<0x80 or e>=ucs_out then
-      ltjb.package_warning('luatexja',
-                        'bad character range ([' .. b .. ',' .. e .. ']). ' ..
+   if b>e then b, e = e, b end
+   if b*e<=0 then
+      ltjb.package_eror('luatexja',
+                       'bad character range ([' .. b .. ',' .. e .. ']). ' ..
                           'I take the intersection with [0x80, 0x10ffff].')
-   elseif b>e then
-      local j=b; e=b; b=j
+      b, e = math.max(0x80,b),math.min(ucs_out-1,e)
+   elseif e<0 then -- b<e<0
+      -- do nothing
+   elseif b<0x80 or e>=ucs_out then
+      ltjb.package_warning('luatexja',
+                          'bad character range ([' .. b .. ',' .. e .. ']). ' ..
+                             'I take the intersection with [0x80, 0x10ffff].')
+      b, e = math.max(0x80,b), math.min(ucs_out-1,e)
    end
    if bfnt==ind then ind = nil end -- ind == bfnt の場合はテーブルから削除
    if not alt_font_table[bfnt] then alt_font_table[bfnt]={} end
    local t = alt_font_table[bfnt]
-   for i=math.max(0x80,b),math.min(ucs_out-1,e) do
-      t[i]=ind
+   if e>=0 then -- character range
+      for i=b, e do
+        t[i]=ind
+      end
+   else
+      b, e = -e, -b
+      local tx = font_metric_table[bfnt].chars
+      for i,v in pairs(tx) do
+        if b<=v and v<=e then t[i]=ind end
+      end
    end
 end
 
@@ -361,37 +376,45 @@ end
 -- EXT
 function set_alt_font_latex(b,e,ind,bbase)
    -- ind: Alt font の enc/fam/ser/shape, bbase: 基底フォントの enc/fam/ser/shape
-  if b<0x80 or e>=ucs_out then
-      ltjb.package_warning('luatexja',
-                        'bad character range ([' .. b .. ',' .. e .. ']). ' ..
+   if b>e then b, e = e, b end
+   if b*e<=0 then
+      ltjb.package_eror('luatexja',
+                       'bad character range ([' .. b .. ',' .. e .. ']). ' ..
                           'I take the intersection with [0x80, 0x10ffff].')
-   elseif b>e then
-      local j=b; e=b; b=j
+      b, e = math.max(0x80,b),math.min(ucs_out-1,e)
+   elseif e<0 then -- b<e<0
+      -- do nothing
+   elseif b<0x80 or e>=ucs_out then
+      ltjb.package_warning('luatexja',
+                          'bad character range ([' .. b .. ',' .. e .. ']). ' ..
+                             'I take the intersection with [0x80, 0x10ffff].')
+      b, e = math.max(0x80,b), math.min(ucs_out-1,e)
    end
+
    if not alt_font_table_latex[bbase] then alt_font_table_latex[bbase]={} end
    local t = alt_font_table_latex[bbase]
    if not t[ind] then t[ind] = {} end
-   for i=math.max(0x80,b),math.min(ucs_out-1,e) do
+   for i=b, e do
       for j,v in pairs(t) do
          if v[i] then -- remove old entry
             if j~=ind then v[i]=nil end; break
          end
       end
       t[ind][i]=true
-    end
-    -- remove the empty tables
-    for j,v in pairs(t) do
-       local flag_clear = true
-       for k,_ in pairs(v) do flag_clear = false; break end
-       if flag_clear then t[j]=nil end
-    end
-    if ind==bbase  then t[bbase] = nil end
+   end
+   -- remove the empty tables
+   for j,v in pairs(t) do
+      local flag_clear = true
+      for k,_ in pairs(v) do flag_clear = false; break end
+      if flag_clear then t[j]=nil end
+   end
+   if ind==bbase  then t[bbase] = nil end
 end
 
 -- ここから先は 新 \selectfont の内部でしか実行されない
 do
    local alt_font_base, alt_font_base_num
-   
+
 -- EXT
    function output_alt_font_cmd(bbase)
       alt_font_base = bbase
@@ -407,7 +430,7 @@ do
         end
       end
    end
-   
+
 -- EXT
    function pickup_alt_font_a(size_str)
       local t = alt_font_table_latex[alt_font_base]
@@ -418,18 +441,35 @@ do
         end
       end
    end
-   
+
+   local function pickup_alt_font_class(class, afnt_num)
+      local t  = alt_font_table[alt_font_base_num] 
+      local tx = font_metric_table[alt_font_base_num].chars
+      for i,v in pairs(tx) do
+        if v==class then t[i]=afnt_num end
+      end
+   end
+
 -- EXT
    function pickup_alt_font_b(afnt_num, afnt_base)
       local t = alt_font_table[alt_font_base_num] 
       if not t then t = {}; alt_font_table[alt_font_base_num] = t end
       for i,v in pairs(alt_font_table_latex[alt_font_base]) do
         if i == afnt_base then
-           for j,_ in pairs(v) do t[j]=afnt_num end
+           for j,_ in pairs(v) do
+              if j>=0 then 
+                 t[j]=afnt_num
+              else  -- -n (n>=1) means that the character class n,
+                    -- which is defined in the JFM 
+                 pickup_alt_font_class(-j, afnt_num) 
+              end
+           end
            return
         end
       end
    end
+
+
 end
 
 
index 7ff7d1f..0995eb4 100644 (file)
 % <base_font_cs> の 第 3 引数の文字達は <alt_font_cs> で組む
 % いつも global
 \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}
+  \ltj@reset@globaldefs
+  \bgroup\ltj@curjfnt=-1\relax
+  #1\directlua{luatexja.__temp = \the\ltj@curjfnt}\egroup
+  \ltj@tempcntc=\directlua{tex.sprint(luatexja.__temp)}\relax
+  \ifnum\ltj@tempcntc=-1
+    \@PackageError{luatexja-core}%
+    {\string#1 is not a control sequence that represents \MessageBreak
+     a Japanese font}{I'll use the current Japanese font instead.^^J}%
+    \ltj@tempcntc=\ltj@curjfnt
+  \fi\ltj@restore@globaldefs}
+  
 \protected\def\ltjdeclarealtfont#1#2#3{%
   {\ltj@@getjfontnumber#1\@tempcnta=\ltj@tempcntc% \@tempcnta: 基底フォント
    \ltj@@getjfontnumber#2%
index 597aa73..f35d825 100644 (file)
Binary files a/test/test20-mfont.pdf and b/test/test20-mfont.pdf differ
index b19c0a1..264af53 100644 (file)
@@ -1,14 +1,15 @@
 %#!lualatex
 \documentclass{ltjsarticle}
+\usepackage{fontspec}% 欧文フォントを OpenType にしたいだけ
 
 %%% この文書のタイプセットには,
-%%% MogaMincho, MogaGothic 及びそれらの太字が必要.
-%%% Y. Oz Vox (http://yozvox.web.fc2.com/) より入手可能.
+%%% KozMinPr6N-Regular.otf, KozGoPr6N-Medium.otf,
+%%% ipag.ttf が必要
 
 \DeclareKanjiFamily{JY3}{mcX}{}
 \DeclareKanjiFamily{JY3}{gtX}{}
-\DeclareFontShape{JY3}{mcX}{m}{n}{<-> s*[0.962216] MogaMincho:jfm=ujis}{}
-\DeclareFontShape{JY3}{gtX}{m}{n}{<-> s*[0.962216] MogaGothic:jfm=ujis}{}
+\DeclareFontShape{JY3}{mcX}{m}{n}{<-> s*[0.962216] KozMinPr6N-Regular:jfm=ujis}{}
+\DeclareFontShape{JY3}{gtX}{m}{n}{<-> s*[0.962216] KozGoPr6N-Medium:jfm=ujis}{}
 \DeclareFontShape{JY3}{mcX}{bx}{n}{<-> ssub*gtX/m/n}{}
 \def\mcdefault{mcX}
 \def\gtdefault{gtX}
@@ -16,9 +17,9 @@
 \begin{document}
 
 %%%%%%%% plain TeX
-\jfont\jaA={MogaMincho:jfm=ujis} at 9.24872pt
-\jfont\jaB={MogaGothic:jfm=ujis}   at 9.24872pt
-\jfont\jaC={MogaGothic Bold:jfm=ujis}    at 9.24872pt
+\jfont\jaA={KozMinPr6N-Regular:jfm=ujis} at 9.24872pt
+\jfont\jaB={KozGoPr6N-Medium:jfm=ujis}   at 9.24872pt
+\jfont\jaC={IPAGothic:jfm=ujis}          at 9.24872pt
 
 \jaA 
 あア漢字% 置換なし
 \ltjclearaltfont\jaA
 あア漢字% 置換なし
 
+% 文字クラスベースの指定
+\jfont\jaR={IPAGothic:jfm=ujis;color=FF0000} at 9.24872pt
+\jfont\jaP={IPAGothic:jfm=ujis;color=7F007F} at 9.24872pt
+\jaA 
+\ltjdeclarealtfont\jaA\jaR{{-1}-{-2}}
+\ltjdeclarealtfont\jaA\jaP{{-6}-{-6}}
+この文章は,(あんまり)意味がないサンプルテキストです⁈
+
+\scrollmode
+\font\g=cmr10
+\ltjdeclarealtfont\jaA\g{"3000-"30FF}% error
+\ltjdeclarealtfont\g\jaA{"3000-"30FF}% error
+\errorstopmode
+
 %%%%%%%% LaTeX
 
-\DeclareAlternateKanjiFont{JY3}{mc}{m}{n}{JY3}{gt}{m}{n}{`い,`う}
+\DeclareAlternateKanjiFont{JY3}{mcX}{m}{n}{JY3}{gtX}{m}{n}{`い,`う}
 \mc
 あいうえお%             \selectfont しないと有効にはならない
 \selectfont あいうえお% 「い」「う」が置換
 {\Large  あいうえお}
 
 {%
-  \DeclareAlternateKanjiFont{JY3}{mc}{m}{n}{JY3}{mc}{m}{n}{`い}%
+  \DeclareAlternateKanjiFont{JY3}{mcX}{m}{n}{JY3}{mcX}{m}{n}{`い}%
 }% always global
-\DeclareAlternateKanjiFont{JY3}{mc}{m}{n}{JY3}{gt}{m}{n}{`お}
+\DeclareAlternateKanjiFont{JY3}{mcX}{m}{n}{JY3}{gtX}{m}{n}{`お}
 \selectfont あいうえお% 「う」「お」が置換
 {\Large  あいうえお}
 
-\ClearAlternateKanjiFont{JY3}{mc}{m}{n}
+\ClearAlternateKanjiFont{JY3}{mcX}{m}{n}
 {\Large  あいうえお}%    置換なし
 あいうえお%              まだ「う」「お」が置換のまま 
 
 \section{例1}
 
-% (A) \DeclareFontShape{JY3}{gtX}{an}{n}{<-> s*[0.962216] MogaGothic:jfm=ujis}{}
-% (B) \DeclareFontShape{JY3}{gtX}{an}{n}{<-> ssub*gtX/m/n}{}
-\DeclareFontShape{JY3}{gtX}{an}{n}{<-> s*[0.962216] MogaGothic:jfm=ujis;foo}{}% (C)
+%\DeclareFontShape{JY3}{gtX}{an}{n}{<-> s*[0.962216] KozGoPr6N-Medium:jfm=ujis}{} (A)
+%\DeclareFontShape{JY3}{gtX}{an}{n}{<-> ssub*gtX/m/n}{} (B)
+\DeclareFontShape{JY3}{gtX}{an}{n}{<-> s*[0.962216] KozGoPr6N-Medium:jfm=ujis;foo}{}% (C)
 
-\DeclareFontShape{JY3}{mcX}{bx}{kana}{<-> s*[0.962216] MogaMincho Bold:jfm=ujis}{}
+\DeclareFontShape{JY3}{mcX}{bx}{kana}{<-> s*[0.962216] KozMinPr6N-Regular:jfm=ujis}{}
 \DeclareAlternateKanjiFont{JY3}{gtX}{an}{n}{JY3}{mcX}{bx}{kana}{"3000-"30FF}
 
 % (A), (B) では失敗する.例えばサイズが 10 pt のとき,
 %%% なんとか解決できないだろうか?
 
 {\Large\gt 
-漢字をゴシック体,仮名を明朝を使って
+漢字をゴシック体,仮名を明朝を使って
 {\kanjiseries{an}\selectfont このように文章を組む}
-ことが時々ある.}
+ことが可能になった(太さが合わないのは気にしない).}
+
+\section{例2:メトリックの文字クラスによる指定}
+
+\ClearAlternateKanjiFont{JY3}{gtX}{an}{n}% 一旦リセットして……
+\DeclareFontShape{JY3}{gtX}{m}{red}{<-> s*[0.962216] KozGoPr6N-Medium:jfm=ujis;color=FF0000}{}
+\DeclareFontShape{JY3}{gtX}{m}{blue}{<-> s*[0.962216] KozGoPr6N-Medium:jfm=ujis;color=0000FF}{}
+\DeclareAlternateKanjiFont{JY3}{gtX}{an}{n}{JY3}{gtX}{m}{red}{{-7}-{-7}}% 半角カナ
+% ... {{-7}} のようにはできないので注意
+\DeclareAlternateKanjiFont{JY3}{gtX}{an}{n}{JY3}{gtX}{m}{blue}{{-1}-{-2}}% 括弧類
 
+{\kanjifamily{gtX}\kanjiseries{an}\selectfont
+半角カタカナとか「括弧類」だけ色を変えてみた(うまくいっているだろうか?).
+}
+
+\paragraph{fwid feature}
+\DeclareFontShape{JY3}{gtX}{af}{n}{<-> s*[0.962216] KozGoPr6N-Medium:jfm=ujis;foo;+fwid}{}
+  % fwid weature 使用
+
+{\kanjifamily{gtX}\kanjiseries{af}\selectfont
+fwid featureノタメ通常デハ半角カナハ全角化サレル
+
+\DeclareAlternateKanjiFont{JY3}{gtX}{af}{n}{JY3}{gtX}{m}{red}{{-7}-{-7}}% 半角カナ
+\DeclareAlternateKanjiFont{JY3}{gtX}{af}{n}{JY3}{gtX}{m}{blue}{{-1}-{-2}}% 括弧類
+\selectfont
+シカシ \verb+\DeclareAlternateKanjiFont+ ニヨル置キ換エハfont featureニヨル置換ノマエニ実施
+サレル.なおかつ置き換え先のフォントにはfwid featureは設定されていないので,
+コノヨウニ半角カナハ赤字・半角ノママ.
+}
 
 
 \newpage
 
 \DeclareKanjiFamily{JY3}{edm}{}
 \DeclareFontShape{JY3}{edm}{m}{n}{<-> s*[0.962216] 
-  MogaMincho:jfm=ujis;foo}{} % foo をつけている理由は JY3/gtX/an/n と一緒
+  KozMinPr6N-Regular:jfm=ujis;foo}{} % foo をつけている理由は JY3/gtX/an/n と一緒
 \DeclareFontShape{JY3}{edm}{m}{blue}{<-> s*[0.962216] 
-  MogaGothic:jfm=ujis;color=0000FF}{}
+  KozGoPr6N-Medium:jfm=ujis;color=0000FF}{}
 \DeclareFontShape{JY3}{edm}{m}{green}{<-> s*[0.962216] 
-  MogaMincho:jfm=ujis;color=007F00}{}
+  KozMinPr6N-Regular:jfm=ujis;color=007F00}{}
 
 %%% 16進表記の A--F は大文字で!