![使用相同字体的字形替换字体的字形](https://linux22.com/image/236812/%E4%BD%BF%E7%94%A8%E7%9B%B8%E5%90%8C%E5%AD%97%E4%BD%93%E7%9A%84%E5%AD%97%E5%BD%A2%E6%9B%BF%E6%8D%A2%E5%AD%97%E4%BD%93%E7%9A%84%E5%AD%97%E5%BD%A2.png)
是否可以用同一字体中的其他字形替换某些字体的字形?我正在使用 Xelatex 和 Fontspec。
更具体地说,我使用小写字母,Linux Libertine O C
而希腊字母的元音则使用重音符号排版。这是一个问题,因为希腊字母中的大写字母从不带重音符号。我可以编写不带重音符号的源文件,但我想要一个更通用、更干净的解决方案(正确的拼写检查等)。
我想要的是能够编写Κείμενο
并具有与相同的输出Κειμενο
,这意味着在下面的 mwe 中,第一行应该排版为第二行。
除了重新映射字形之外,还有其他方法可以实现此行为吗?我在 fontspec 的文档中没有找到任何相关选项。
我希望第一行排版为第二行。
\documentclass[]{article}
\usepackage{fontspec}
\begin{document}
\fontspec{Linux Libertine O C}
\textsc{Κείμενο}
\fontspec{Linux Libertine O C}
\textsc{Κειμενο}
\end{document}
如果相关的话,其他字体如政府金融服务局字体具有所需的(正确)行为,尽管我不确定它们的小写字母是真实的还是只是普通大写字母变成了小写字母。Kerkis
行为方式与Linux Liberine O C
更新
我联系了Kerkis
作者 Tsolomitis 先生,他提出了(显而易见的)建议,更简单的解决方案是首先不要使用重音符号。要么这样做,要么在结构中使用可选参数,例如\section[Κείμενο]{Κειμενο}
XeLaTeX
作为更改(默认)行为的 另一种方法(使用),Kerkis
他建议使用*.pfb
fontforge 更改文件,删除元音的重音。当然,字体的名称也应该更改。
我还向“Linux Libertine”填写了一份错误报告,但至今没有答复。
答案1
是的,这是可能的。您可以编写一个映射并使用 teckit-compile 对其进行编译以获取 .tec 文件,然后可以使用 fontspec 的“映射”选项来使用它。(例如映射--
到 en-dash 的“tex-text”)http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=TECkitDownloads。您可以在 tex 安装中找到地图文件的示例。
但我建议首先将问题报告给字体作者。如果他们先决定是否可以通过开放字体功能解决此问题,那当然更好。
顺便说一句:您在描述字体时并不一致。您的示例使用了Linux Libertine C
(不存在的),在文本中使用了名称Linux Libertine O C
(您的意图)和Linux Libertine O
(另一种字体)。
答案2
经过一些研究,我认为正确的方法是创建一个字形替换表 (GSUB)。
FontForge,可以胜任这项任务。我还没有尝试过,也不知道它有多难(可能不难——尤其是对于几个字形)。我相信这是在 OpenType 字体中替换字形的“正确”方法。更多信息可以在FontForge 的文档n. 字体作者可能可以轻松地合并新表格(如果他们批准的话)。
另一种更老套的方法是直接删除元音中的重音符号,或者直接使用 FontForge 复制粘贴元音的非重音符号版本。这种方法非常快,而且开箱即用。这种方法既不干净,也不是字形替换的通用解决方案。
答案3
@UlrikeFischer 提出的解决方案是特定于 xetex 的;而@pmav99 提出的解决方案需要更改字体,这很困难而且根本不是通用的。
此外,我自己对同一问题进行了一些研究(在遇到相同问题后),我发现可用字体的情况非常不一致:作为一个极端的例子,新的 Microsoft 字体(例如 Constantia)在不同版本之间改变了行为:旧版本产生了“正确”(期望)的输出,而 Windows 8 附带的版本产生的输出类似于问题图片中的输出。我甚至发现了一种字体,它不会将 ς(最终西格玛)映射到任何东西,而是将其保留为小写字母形式。
因此,我的建议是创建一个类似的宏\MakeUppercase
,进行适当的替换(Άνθρωπος -> Ανθρωποσ),然后使用字体的小型大写形式。