![更改特定字体的逗号外观](https://linux22.com/image/279517/%E6%9B%B4%E6%94%B9%E7%89%B9%E5%AE%9A%E5%AD%97%E4%BD%93%E7%9A%84%E9%80%97%E5%8F%B7%E5%A4%96%E8%A7%82.png)
我正在使用这个kerkis
字体,我非常喜欢它除了表示逗号。(逗号的卷边非常小,如果不仔细观察,它们看起来就像句号。)
有没有办法改变此字体中逗号的外观?
\documentclass[11pt]{article}
\usepackage{kmath, kerkis}
\begin{document}
It's hard to tell apart commas, and periods.
\end{document}
答案1
除了在宏级别更改逗号(可能带来危险结果)外,您还可以使用虚拟字体。虽然这对 TeX 来说是透明的,因此非常可靠,但不幸的是它也复杂得多。步骤如下:
查看字体定义文件
ot1mak.fd
(其位置记录在log
文件中),看看我们实际上想要修改哪种字体。在那里,我们发现了以下行:\DeclareFontShape{OT1}{mak}{m}{n}{<-> s * [0.90] k8a}{}
[从现在开始,我假设您位于 TeX 文件的当前目录中。]
将(已存在的)虚拟字体(位于 中
<TEXMF>/fonts/vf/public/kerkis/
)转换为人类可读的形式。(实际上,您甚至不需要知道文件在哪里vf
,因为vftovp
应该能够自行找到它。)vftovp k8a > k8a.vpl
我们打开这个新文件
k8a.vpl
并搜索逗号的定义,找到了以下几行:(CHARACTER O 54 (CHARWD R 0.32) (CHARHT R 0.114) (CHARDP R 0.111) (MAP (SETCHAR O 54) ) )
(
O
表示数字是八进制。)与其使用不同字体的逗号,不如从相同字体中取出撇号,向下移动,这样外观才能匹配。撇号位于插槽中
O 47
,因此我们将上面的行替换(SETCHAR O 54)
为:(MOVEDOWN R .6) (SETCHAR O 47)
。(R
代表“实数”,因此字形将向下移动 0.6 个设计单位,这似乎大致正确。)由于分号的下半部分与逗号形状相同,因此它不再与下移的撇号匹配。因此,我们可以用撇号(向下移动)和句号(向上移动)额外构造分号:
(CHARACTER O 73 (CHARWD R 0.32) (CHARHT R 0.4865) (CHARDP R 0.111) (MAP (PUSH) (MOVEUP R .37) (SETCHAR O 56) (POP) (MOVEDOWN R .6) (SETCHAR O 47) ) )
将文件翻译
vpl
回vf
并附带tfm
文件:vptovf k8a
对于其他字体形状,您可以相应地进行操作,例如斜体形状(ki8a
):
vftovp ki8a > ki8a.vpl
编辑逗号和分号,例如:
(CHARACTER O 54
(CHARWD R 0.3)
(CHARHT R 0.116)
(CHARDP R 0.1125)
(MAP
(MOVELEFT R .12) (MOVEDOWN R .6) (SETCHAR O 47)
)
)
....
(CHARACTER O 73
(CHARWD R 0.3)
(CHARHT R 0.4925)
(CHARDP R 0.1125)
(MAP
(PUSH) (MOVERIGHT R .06) (MOVEUP R .37) (SETCHAR O 56) (POP)
(MOVELEFT R .12) (MOVEDOWN R .6) (SETCHAR O 47)
)
)
最后:
vptovf ki8a
如果新创建的tfm
和vf
文件位于工作目录中,它们将在分发的文件之前被拾取kerkis
。瞧,撇号逗号和分号:
不幸的是,您必须对所有编码中使用的每种字体(斜体、小型大写字母等)重复此过程。
答案2
这只是一个草案:
\documentclass[11pt]{article}
\usepackage{kmath, kerkis}
\font\commaf=cmr11
\begin{document}
It's hard to tell apart commas, and periods.
It's hard to tell apart commas{\commaf,} and periods.
If there will be no math:
\def\cmcomma{{\commaf,}}
\let\commasign\cmcomma
\catcode`\,=13
%\def,{\commasign}
\def,{\cmcomma}
It's hard to tell apart commas, and periods.
But beware: $(a,b)$
\end{document}
答案3
这是另一个解决方案,它需要 luatex,使用 OpenType 字体功能文件,令人惊讶的是,它也适用于 Type1 字体。将以下内容保存为kerkis.fea
:
languagesystem DFLT dflt;
languagesystem latn dflt;
lookup SHIFT_N { # shift the apostrophe down and add some space on the right
pos quoteright <0 -600 60 0> ;
} SHIFT_N ;
lookup SHIFT_I { # additionally shift a bit to the left
pos quoteright <-120 -600 -60 0> ;
} SHIFT_I ;
lookup REPLACE {
sub comma by quoteright ;
} REPLACE ;
feature comn {
lookup REPLACE ;
lookup SHIFT_N ;
} comn ;
feature comi {
lookup REPLACE ;
lookup SHIFT_I ;
} comi ;
您的文档(要用 进行编译lualatex
)可能如下所示:
\documentclass[11pt]{article}
\usepackage{kmath}
\usepackage[no-math]{fontspec}
\setmainfont[
Ligatures=TeX,
FeatureFile=kerkis.fea,
% with Type1 fonts, fontspec doesn't seem to be able to
% automatically detect the other shapes, so we specify them:
ItalicFont=Kerkis-Italic.pfb,
SmallCapsFont=Kerkis-SmallCaps.pfb,
BoldFont=Kerkis-Bold.pfb,
BoldItalicFont=Kerkis-BoldItalic.pfb,
% add the comma replacement feature
UprightFeatures={RawFeature=+comn},
ItalicFeatures={RawFeature=+comi}]
{Kerkis.pfb}
\begin{document}
It's hard to tell apart commas, and; periods.
\textit{It's hard to tell apart commas, and; periods.}
\end{document}
请注意,您不能’
在文档中使用 quoteright 字符 ( ),因为它也会向下移动,但幸运的是,Ligatures=TeX
您可以简单地用书写'
来代替。
与使用虚拟字体的解决方案相比,似乎没有办法改变分号。
还有另外一个警告:由于 luatex 并不是 pdftex 最初宣布的完全替代品,因此您的文档中的其他一些内容可能会出现问题。