美文网首页
upLaTeX竖排虚拟字体jfm/jvf标点符号修改

upLaTeX竖排虚拟字体jfm/jvf标点符号修改

作者: 千羽之城88 | 来源:发表于2021-04-23 23:53 被阅读0次

竖排标点的迷思

书接前文。这回我们要处理的是竖排的标点,我们先来看一个例子,有大概地了解:

image.png

上面的诗文部分中,逗号和字符空间大、不美观,且不太适宜阅读。下文要做的就是缩小它们之间的距离。这里,依然对 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}

编译上述文件,得到:

image.png

相关文章

网友评论

      本文标题:upLaTeX竖排虚拟字体jfm/jvf标点符号修改

      本文链接:https://www.haomeiwen.com/subject/lhqkrltx.html