upLaTeX豎排虛擬字體jfm/jvf標點符號修改

豎排標點的迷思

書接前文。這回我們要處理的是豎排的標點,我們先來看一個例子,有大概地瞭解:

上面的詩文部分中,逗號和字符空間大、不美觀,且不太適宜閱讀。下文要做的就是縮小它們之間的距離。這裏,依然對 zvp 文件的修改,先生成相應字體的 zvp 文件:

jfmutil vf2zvp -u --lenient upschrm-v

它是 uptex 默認字體中爲中文專門配置的虛擬字體(其中,codespace因爲篇幅太大做了刪減,可通過上面的命令生成完整的文件內容查看):

upschrm-v.zvp

(DIRECTION TATE)
(VTITLE )
(FAMILY UPSCH KANJI)
(FACE F MRR)
(CODINGSCHEME TEX KANJI TEXT)
(DESIGNSIZE R 10.0)
(CHECKSUM O 0)
(FONTDIMEN
   (SLANT R 0.0)
   (SPACE R 0.0)
   (STRETCH R 0.1)
   (SHRINK R 0.0)
   (XHEIGHT R 1.0)
   (QUAD R 1.0)
   (EXTRASPACE R 1.25)
   (EXTRASTRETCH R 0.2)
   (EXTRASHRINK R 0.125)
   )
(MAPFONT D 0
   (FONTNAME upstsl-v)
   (FONTCHECKSUM O 0)
   (FONTAT R 1.0)
   (FONTDSIZE R 10.0)
   )
(GLUEKERN
   (LABEL D 0)
   (GLUE D 1 R 0.5 R 0.0 R 0.5)
   (GLUE D 3 R 0.25 R 0.0 R 0.25)
   (STOP)
   (LABEL D 1)
   (GLUE D 3 R 0.25 R 0.0 R 0.25)
   (STOP)
   (LABEL D 2)
   (GLUE D 0 R 0.5 R 0.0 R 0.5)
   (GLUE D 1 R 0.5 R 0.0 R 0.5)
   (GLUE D 3 R 0.25 R 0.0 R 0.25)
   (GLUE D 5 R 0.5 R 0.0 R 0.5)
   (STOP)
   (LABEL D 3)
   (GLUE D 0 R 0.25 R 0.0 R 0.25)
   (GLUE D 1 R 0.25 R 0.0 R 0.25)
   (GLUE D 2 R 0.25 R 0.0 R 0.25)
   (GLUE D 3 R 0.5 R 0.0 R 0.25)
   (GLUE D 4 R 0.25 R 0.0 R 0.25)
   (GLUE D 5 R 0.25 R 0.0 R 0.25)
   (STOP)
   (LABEL D 4)
   (GLUE D 0 R 0.5 R 0.0 R 0.0)
   (GLUE D 1 R 0.5 R 0.0 R 0.0)
   (GLUE D 3 R 0.75 R 0.0 R 0.25)
   (GLUE D 5 R 0.5 R 0.0 R 0.0)
   (STOP)
   (LABEL D 5)
   (GLUE D 1 R 0.5 R 0.0 R 0.5)
   (GLUE D 3 R 0.25 R 0.0 R 0.25)
   (KRN D 5 R 0.0)
   (STOP)
   )
(CODESPACE
  ...
   )
(CHARSINTYPE D 1
   U2018 U201C U2329 U3008 U300A U300C U300E U3010 U3014 U3016 U3018
   U301A U301D UFF08 UFF3B UFF5B UFF5F
   )
(CHARSINTYPE D 2
   U2019 U201D U232A U3001 U3009 U300B U300D U300F U3011 U3015 U3017
   U3019 U301B U301E U301F UFF09 UFF0C UFF3D UFF5D UFF60
   )
(CHARSINTYPE D 3
   U00B7 U30FB UFF1A UFF1B
   )
(CHARSINTYPE D 4
   U3002 UFF0E
   )
(CHARSINTYPE D 5
   U2014 U2015 U2025 U2026
   )
(TYPE D 0
   (CHARWD R 1.0)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (SETCHAR)
      )
   )
(TYPE D 1
   (CHARWD R 0.5)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (MOVERIGHT R -0.5)
      (SETCHAR)
      )
   )
(TYPE D 2
   (CHARWD R 0.5)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (SETCHAR)
      )
   )
(TYPE D 3
   (CHARWD R 0.5)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (MOVERIGHT R -0.25)
      (SETCHAR)
      )
   )
(TYPE D 4
   (CHARWD R 0.5)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (SETCHAR)
      )
   )
(TYPE D 5
   (CHARWD R 1.0)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (SETCHAR)
      )
   )

接下來根據該文件做修改,重命名爲 utbwa-v.zvp ,最後在 main.tex 中使用,下文是修改後得到的代碼:

utbwa-v.zvp

(DIRECTION TATE)
(VTITLE )
(FAMILY UPSCH KANJI)
(FACE F MRR)
(CODINGSCHEME TEX KANJI TEXT)
(DESIGNSIZE R 10.0)
(CHECKSUM O 0)
(FONTDIMEN
   (SLANT R 0.0)
   (SPACE R 0.0)
   (STRETCH R 0.1)
   (SHRINK R 0.0)
   (XHEIGHT R 1.0)
   (QUAD R 1.0)
   (EXTRASPACE R 0.25)
   (EXTRASTRETCH R 0.2)
   (EXTRASHRINK R 0.125)
   )
(MAPFONT D 0
   (FONTNAME upstsl-v)
   (FONTCHECKSUM O 0)
   (FONTAT R 1.0)
   (FONTDSIZE R 10.0)
   )
(GLUEKERN
   (LABEL D 0)
   (GLUE D 1 R 0.5 R 0.0 R 0.5)
   (GLUE D 2 R 0 R 0.0 R 0.15)
   (GLUE D 3 R 0.25 R 0.0 R 0.25)
   (STOP)
   (LABEL D 1)
   (GLUE D 3 R 0.25 R 0.0 R 0.25)
   (STOP)
   (LABEL D 2)
   (GLUE D 0 R 0.25 R 0.25 R 0.0)
   (GLUE D 1 R 0.5 R 0.0 R 0.5)
   (GLUE D 3 R 0.5 R 0.0 R 0.25)
   (GLUE D 5 R 0.5 R 0.0 R 0.5)
   (GLUE D 6 R 0.15 R 0.0 R 0.15)
   (STOP)
   (LABEL D 3)
   (GLUE D 0 R 0.25 R 0.0 R 0.25)
   (GLUE D 1 R 0.25 R 0.0 R 0.25)
   (GLUE D 2 R 0.5 R 0.0 R 0.25)
   (GLUE D 3 R 0.5 R 0.0 R 0.25)
   (GLUE D 4 R 0.25 R 0.0 R 0.25)
   (GLUE D 5 R 0.25 R 0.0 R 0.25)
   (STOP)
   (LABEL D 4)
   (GLUE D 0 R 0.35 R 0.15 R 0.0)
   (GLUE D 1 R 0.5 R 0.0 R 0.0)
   (GLUE D 3 R 0.75 R 0.0 R 0.25)
   (GLUE D 5 R 0.5 R 0.0 R 0.0)
   (STOP)
   (LABEL D 5)
   (GLUE D 1 R 0.5 R 0.0 R 0.5)
   (GLUE D 3 R 0.25 R 0.0 R 0.25)
   (KRN D 5 R 0.0)
   (STOP)
   (LABEL D 6)
   (GLUE D 0 R 0.15 R 0.0 R 0.15)
   (GLUE D 1 R 0.5 R 0.0 R 0.5)
   (GLUE D 3 R 0.25 R 0.0 R 0.25)
   (KRN D 5 R 0.0)
   (STOP)
   )
(CODESPACE
  ...
    )
(COMMENT)
(CHARSINTYPE D 1
   U2018 U201C U2329 U3008 U300A U300C U300E U3010 U3014 U3016 U3018
   U301A U301D UFF08 UFF3B UFF5B UFF5F
   )
(CHARSINTYPE D 2
   U2019 U201D U232A U3001 U3009 U300B U300D U300F U3011 U3015 U3017
   U3019 U301B U301E U301F UFF09 UFF0C UFF3D UFF5D UFF60
   )
(CHARSINTYPE D 3
   U00B7 U30FB UFF1A UFF1B
   )
(CHARSINTYPE D 4
   U3002 UFF0E
   )
(CHARSINTYPE D 5
   U2014 U2015 U2025 U2026
   )
(CHARSINTYPE D 6
   UFF1F UFF01
   )
(COMMENT )
(TYPE D 0
   (CHARWD R 1.0)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (SETCHAR)
      )
   )
(TYPE D 1
   (CHARWD R 0.5)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (MOVERIGHT R -0.5)
      (SETCHAR)
      )
   )
(TYPE D 2
   (CHARWD R 0.30)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
     (SELECTFONT D 0)
      (SETCHAR)
      )
   )
(TYPE D 3
   (CHARWD R 1)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (MOVERIGHT R -0.25)
      (SETCHAR)
      )
   )
(TYPE D 4
   (CHARWD R 0.25)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (SETCHAR)
      )
   )
(TYPE D 5
   (CHARWD R 1.0)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (SETCHAR)
      )
   )
(TYPE D 6
   (CHARWD R 1.0)
   (CHARHT R 0.5)
   (CHARDP R 0.5)
   (MAP
      (SETCHAR)
      )
   )
(COMMENT ,)
(CHARACTER H FF0C
   (MAP
     (SETCHAR)
     )
   )
(COMMENT :)
(CHARACTER H FF1A
   (MAP
     (SETCHAR H 003A)
     )
   )

upTeX標點被分成6類

執行 jfmutil zvp2vf -u --lenient utbwa-v.zvp 生成 utbwa-v.vfutbwa-v.tfm兩個文件,與 mian.tex 放在一起編譯。那麼,上面修改的內容具體如何起作用的呢?把上面的 Uxxxx 形式的 unicode 代碼轉換爲字符:

(CHARSINTYPE D 1
   ‘ “ 〈 〈 《 「 『 【 〔 〖 〘
   〚 〝 ( [ { ⦅
   )
(CHARSINTYPE D 2
   ’ ” 〉 、 〉 》 」 』 】 〕 〗
   〙 〛 〞 〟 ) , ] } ⦆
   )
(CHARSINTYPE D 3
   · ・ : ;
   )
(CHARSINTYPE D 4
   。 .
   )
(CHARSINTYPE D 5
   — ― ‥ …
   )
(CHARSINTYPE D 6
   ? !
   )

這裏實際上定義了 6 類標點符號,然後回到 upschrm-v.zvp 中帶有關鍵字 GLUEKERN 的行:

(GLUEKERN
   ...
   (LABEL D 2) (COMMENT 標點分類中的第2類)
   (GLUE D 0 R 0.25 R 0.25 R 0.0)
   (GLUE D 1 R 0.5 R 0.0 R 0.5)
   (GLUE D 3 R 0.5 R 0.0 R 0.25)
   (GLUE D 5 R 0.5 R 0.0 R 0.5)
   (GLUE D 6 R 0.15 R 0.0 R 0.15)
   (STOP)

標點需要兩兩組合,分別處理

下表稍微解釋了上面代碼是什麼意思:

標點組合 組合類型 描述
LABEL D 2 在標點兩兩組合組合中,第一個符號是 D 2 類型,如果 <br />LABEL D 5 那麼組合中第一個符號落在 D 5 類型<br />默認情況下,D 0 是漢字字符。
GLUE D 0 \rightarrow D2 + D0 組合 R_1 = Width,~~R_2 = Stetch,~~R_3 = Shrink ,<br />R1爲兩者之間距離的固定值,<br />R2表示距離擴展,<br />R3表示距離收縮
GLUE D 1 \rightarrow D2 + D1 組合 同上

配置新生成的虛擬字體——測試成功

main.tex 中做 NFSS 字體配置:

% declare font family
\DeclareFontFamily{JY2}{fzwb}{}
\DeclareFontFamily{JT2}{fzwb}{}
% yoko definition
\DeclareFontShape{JY2}{fzwb}{m}{n }{<->s*[0.924690]utbwa-v}{} % 映射 FZBWKSGBX.OTF  方正北魏楷書_GB18030
\DeclareFontShape{JY2}{fzwb}{m}{it}{<->ssub*fzwb/m/n}{} % 按理說這裏也要做橫向虛擬字體的配置,本文中省略
\DeclareFontShape{JY2}{fzwb}{m}{sl}{<->ssub*fzwb/m/n}{}
\DeclareFontShape{JY2}{fzwb}{m}{sc}{<->ssub*fzwb/m/n}{}
% tate definition
\DeclareFontShape{JT2}{fzwb}{m}{n }{<->s*[0.924690]utbwa-v}{} % 這裏就是本文做的虛擬字體,專門用於豎排
\DeclareFontShape{JT2}{fzwb}{m}{it}{<->ssub*fzwb/m/n}{}
\DeclareFontShape{JT2}{fzwb}{m}{sl}{<->ssub*fzwb/m/n}{}
\DeclareFontShape{JT2}{fzwb}{m}{sc}{<->ssub*fzwb/m/n}{}
% command for using
\DeclareRobustCommand\poetfont{\kanjifamily{fzwb}\kanjiseries{m}\selectfont}

做一個測試:

\documentclass[dvipdfmx, uplatex]{utbook}
% 在這裏添加上面的字體配置
\begin{document}
\begin{quote}\fzwb
殿宇凋零倒塌,廊房寂寞傾頹。 
磚破瓦十餘堆,盡是些歪梁折柱。 
後盡生青草,塵埋朽爛香廚。 
樓崩壞鼓無皮,琉璃香燈破損。 
祖金身沒色,羅漢倒臥東西。 
音淋壞盡成泥,楊柳淨瓶墜地。
內並無僧人,夜間盡宿狐狸。
\end{quote}
\end{document}

編譯上述文件,得到:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章