我有一个字体,其字体表包含连字,还有数学根号、运算符以及例如积分符号。(这与我在这个问题中展示的字体不同,后者不包含积分符号。)
在我的例子中,一些字符组合不会触发字形替换,例如“ffi”连字。这种情况发生在pdflatex
(think otftotfm
) 和xelatex
( fontspec
) 字体实现解决方案中。
包含我打算使用的商业字体的编译结果显示(对于两个fontspec
解决方案以及otftotfm
)
XeLaTeX ( fontspec
)
运行中概述的解决方案后fi、fl、ffl 的连字符不适用于 Times New Roman (XeLaTeX),尝试触发连字仍然不起作用。Egreg 提到聊天解决方案通常能够为XeTeX
文档生成正确的输出,前提是字形位于字体表的正确位置。事实证明它们位于字体表中(屏幕截图取自 Adobe Illustrator)
这表明它们的位置不对。因此,最好有一个选项可以手动设置输入例如“ffi”和将其链接到字体中的正确连字符之间的链接。
PdfLaTeX ( otftotfm
)
为了确保万无一失,我使用了otftotfm
以下命令:
otftotfm -a -e ec -fkern -fliga --verbose --vendor <mapfilename> <somefont>.otf T1--<fontname>--<fontweight>
该命令产生与连字符相关的错误:
otftotfm: warning: 'liga' feature ignored, not supported by font
构建文件后也证实了这一点.pl
:
tftopl T1--<fontname>--<fontweight>.tfm > T1--<fontname>--<fontweight>.pl
连字符确实不存在。以下内容取自文件T1--<fontname>--<fontweight>.pl
:
(LABEL C f)
(KRN O 41 R 0.08)
(KRN O 47 R 0.1)
(KRN O 51 R 0.07)
(KRN O 52 R 0.08)
(KRN O 54 R -0.05)
(KRN O 56 R -0.05)
(KRN O 77 R 0.12)
(KRN O 135 R 0.07)
(KRN C a R -0.01)
(KRN C b R 0.1)
(KRN C c R -0.01)
(KRN C e R -0.01)
(KRN C g R -0.01)
(KRN C h R 0.1)
(KRN C i R 0.03)
(KRN C j R 0.03)
(KRN C k R 0.1)
(KRN C l R 0.1)
(KRN C o R -0.01)
(KRN C t R 0.01)
(KRN C v R 0.01)
(KRN C w R 0.01)
(KRN C y R 0.01)
(KRN O 175 R 0.07)
(KRN O 15 R -0.05)
(KRN O 22 R -0.05)
(KRN O 21 R 0.1)
(KRN O 346 R -0.01)
(KRN O 370 R -0.01)
(KRN O 367 R -0.01)
(KRN O 344 R -0.01)
(KRN O 345 R -0.01)
(KRN O 351 R -0.01)
(KRN O 352 R -0.01)
(KRN O 364 R -0.01)
(KRN O 366 R -0.01)
(STOP)
我能想到的唯一办法就是弄乱人类可读的.pl
文件(上面是其中的摘录),然后手动构建所有内容。但也许(希望如此?!)LaTeX 有处理此类事情的工具。
无论如何,分配随意的(但具体)字体表的字形以非常通用的方式分配给特定命令。想想\int
哪个会触发来自 ie(虚构数字)、八进制 501 或 unicode+00a6
或字母组合的整数符号,这样“ffi”就变成(链接到)-->“连字符 ffi”。我甚至不介意在源中将所有 256 个插槽声明为特定命令或字母组合,只要我知道如何去做吧。
考虑下面的例子,使用另一种(非商业)字体,它也包含连字:http://exljbris.com/tallys.html。对于我们当中的 Windows 用户,您可以根据需要将其复制粘贴到批处理文件中。我有意禁用了-fkern
和-fliga
功能,因为这正是相关的部分:我的字体无法正确映射字形。
otftotfm -a -e ec --verbose --vendor tallys Tallys_15.otf T1--Tallys15--Regular
pause
这也是该t1tallys.fd
文件:
\ProvidesFile{t1tallys.fd}
[2015/04/30 scalable font definitions for T1/Tallys.]
\DeclareFontFamily{T1}{Tallys}{}
\DeclareFontShape{T1}{Tallys}{m}{n}{<-> T1--Tallys15--Regular}{}
\DeclareFontShape{T1}{Tallys}{m}{it}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{m}{sc}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{m}{sl}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{b}{n}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{b}{it}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{b}{sc}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{b}{sl}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{l}{n}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{l}{it}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{l}{sc}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{l}{sl}{<-> ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{bx}{n}{ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{bx}{it}{ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{bx}{sc}{ssub * Tallys/m/n}{}
\DeclareFontShape{T1}{Tallys}{bx}{sl}{ssub * Tallys/m/n}{}
\endinput
和 MWE(XeLaTeX
在这种情况下,使用连字符,仍然会产生正确的结果...如果您想采用这种XeLaTeX
方法,只需映射任何其他字符。我仍然想知道如何在 中做到这一点XeLaTeX
。)
\documentclass{article}
\usepackage{ifxetex}
\ifxetex
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Tallys}
\usepackage{microtype}
\else
\RequirePackage[T1]{fontenc}
\pdfmapfile{tallys.map}
\RequirePackage{microtype}
\renewcommand\rmdefault{Tallys}
\renewcommand\sfdefault{Tallys}
\fi
\begin{document}
\fontsize{100pt}{0pt}\selectfont ffi fi fl ffl
\end{document}
这个想法是仍然能够将字符组合映射ffi
到连字。如果能以某种方式为正确的数学命令设置正确的字符,那就太好了(我知道这更复杂,但请理解,我真的在寻找一个通用的解决方案,让我能够完全映射字体,并让 TeX 完全理解何时使用什么字符。)理想的解决方案将描述完成它所需的完整过程。它还允许混合不同的字体(与单一字体解决方案相比,这不会太复杂——它只是概括答案)。