我正在尝试将一个可调整大小的 OTF 字体转换为 TeX 字体规格。不可避免地,我必须对要使用的连字符、字距等做出一些选择。otftotfm
手册中提到了一个--ligkern=<command>
应该可以满足我要求的功能。
手册对该功能有以下说明:
--ligkern=command
向编码添加 LIGKERN 命令。例如,“--ligkern "T {L} h"”可抑制字体中的任何 T_h 连字符。您可以提供多个 --ligkern 选项。请参阅下面的 ENCODINGS。
转到编码部分,其中对连字符有以下说明:
编码中的 LIGKERN 注释可以添加连字并禁止字距调整,如 afm2tfm(1)。要添加连字,请说:
% LIGKERN glyph1 glyph2 =: result ;
如果我想将字符T
和映射h
到指定的字形T_h
,并且这种组合不能被自动识别otftotfm
(不知何故),我设计了以下映射选项T + h --> T_h
:
- 我可以
--ligkern="T h =: T_h"
在命令提示符中设置或 %LIGKERN T h =: T_h
无论*.ec
我使用什么文件,都要使用注释。
无论我使用自定义编码文件还是通用8r
编码,结果都是:
- 字形做显示在字体表中
Th
没有被连字符正确替换。
那么问题出在哪里?如有必要,我很乐意提供更多信息。
添加图片来显示问题:
答案1
看一眼berenisadf 来源。对于这种工作,我通常使用fontinst
而不是 ,但我使用后者。源中的 LY1 编码文件在这里将是最有用的,因为它们包含额外的连字符等。您实际上没有提供足够的信息来说明哪里出了问题。otftotfm
berenisadf
看一眼romandeadf 来源以及。这将使用 创建虚拟字体fontinst
。字体安装指南中详细记录了基础知识。更复杂的情况需要使用fontinst
手册中的信息,但我发现如果不查看使用示例,很难理解这一点。我的许多字体包都支持额外的连字、花体字符等,它们都包含 CTAN 包中的源代码。包的文档提供了打包策略的“大局”概念(以及使用信息)。
您在聊天中提到了花饰字符。如果您只是指花式连字符,那相当简单。如果您指的是上下文花饰,那就更复杂了。例如,您可能希望在e.end
单词末尾而不是开头或中间使用类似 OTF 中的某些内容。这可以是变体的一部分,该变体将被自动化,以便用户只需输入类似以下内容即可\swashstyle
启用(一组)上下文花饰。
但是,对于您在聊天中提到的字体大小,我要么建议用户使用 LuaTeX/XeTeX,要么根本不会尝试让字体中的所有内容都适用于 (pdf)TeX。相反,请考虑 256 个字符的有用集合。创建放弃如此多核心字符以腾出空间用于花哨内容的集合是没有用的,因为实际上没有人会真正想使用它们。
请记住,大多数使用字体包的用户都会想说完\usepackage{name}
就忘。更挑剔的用户会乐意说\usepackage[some options]{name}
,少数人可能还想使用自定义命令(如果这些命令相对易懂且可用)来在文档中进行特殊样式设置。
答案2
我不确定哪里出了问题,但我再次运行了该命令,现在它似乎确实有效了。使用的命令(就我而言)是:
otftotfm -a -e 8r --vendor Typofonderie -fkern -fliga --ligkern="T h =: T_h" --ligkern="a e =: ae" LeMondeLivreClassicPro-Book.otf fmlk8r
上述命令删除 T 和 h(如果在序列中找到)并将其替换为字符 T_h,并且它还会映射 a 和 e --> ae。
下面的帖子试图尽可能完整地涵盖一些基本知识以外的内容,以便使用 otftotfm 设置您喜欢的文本字体。可能会更长的帖子
在调试错误时,需要考虑几个注意事项。假设您otftotfm
了解如何使用 otftotfm 将 TrueType 字体与 PDFTeX 结合使用?),基本命令和上面一样,所以
otftotfm -a -e 8r --vendor Typofonderie -fkern -fliga --ligkern="T h =: T_h" --ligkern="a e =: ae" LeMondeLivreClassicPro-Book.otf fmlk8r
重要部分:文件名始终在末尾指定fmlk8r
(根据 fontinst 使用的字体方案)。我已将其用作fml
类型系列名称,因此我的 fd 文件是
\ProvidesFile{t1fml.fd}
[2012/04/22 scalable font definitions for T1/LeMondeLivre.]
\DeclareFontFamily{T1}{fml}{}
\DeclareFontShape{T1}{fml}{m}{n}{<-> fmlk8r}{}
\endinput
我使用以下方法获取字体表并测试文本中的一些特定连字符:
\documentclass{article}
\usepackage{fonttable}
\usepackage[T1]{fontenc}
%\usepackage{geometry}
\usepackage{microtype}
\pdfmapfile{Typofonderie.map}
\begin{document}
\xfonttable{T1}{fml}{m}{n}
\fontfamily{fml}\selectfont There you go. Some beautiful formulae. Here's a ligature ffi ffl. Therefore.
\end{document}
要检查某个字符 + 另一个字符是否正确映射到您的连字符,请检查字体表并提取八进制数。在本例中,八进制数为 240。24 表示红色框(见下文),0 表示蓝色框(加起来为 24-0)。(记住连字符的八进制数。)
下一步是将 TeX 字体指标转换为属性列表文件。使用命令
tftopl fmlk8r.tfm fmlk8r.pl
创建fmlk8r.pl
。使用任何文本编辑器打开它。
在这个属性列表文件中,您可以通过查找大写字母 T 并检查它是否映射到连字符来查看连字符是否正确映射。字母字符仅显示为CHARACTER C <letter>
,而所有其他字符、连字符等都使用CHARACTER O <octal number>
。在这种情况下,我们想要检查 是否CHARACTER C T
有与 相关的内容CHARACTER C h
,这应该映射到CHARACTER O 240
。在我的例子中,它确实如此:
(CHARACTER C T
(CHARWD R 0.615)
(CHARHT R 0.6925)
(COMMENT
(LIG C h O 240)
(KRN O 73 R -0.04)
(KRN O 72 R -0.04)
(KRN O 140 R 0.035)
...
)
)
这一行(LIG C h O 240)
告诉我们一个LIG
特征,只有当下一个字母是 时才会被调用C h
,并且它映射到O 240
。
如果没有,则在 OTF 和 TFM 之间的转换阶段出现了问题。在这种情况下,我会考虑查阅 otftotfm 手册。
希望这对某人有用!