如何手动设置字体的字体编码设置?

如何手动设置字体的字体编码设置?

我有一个字体,其字体表包含连字,还有数学根号、运算符以及例如积分符号。(这与我在这个问题中展示的字体不同,后者不包含积分符号。)

在我的例子中,一些字符组合不会触发字形替换,例如“ffi”连字。这种情况发生在pdflatex(think otftotfm) 和xelatex( fontspec) 字体实现解决方案中。

包含我打算使用的商业字体的编译结果显示(对于两个fontspec解决方案以及otftotfm

http://i.imgur.com/I4XfJbM.png?1

XeLaTeX ( fontspec)

运行中概述的解决方案后fi、fl、ffl 的连字符不适用于 Times New Roman (XeLaTeX),尝试触发连字仍然不起作用。Egreg 提到聊天解决方案通常能够为XeTeX文档生成正确的输出,前提是字形位于字体表的正确位置。事实证明它们位于字体表中(屏幕截图取自 Adob​​e 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 完全理解何时使用什么字符。)理想的解决方案将描述完成它所需的完整过程。它还允许混合不同的字体(与单一字体解决方案相比,这不会太复杂——它只是概括答案)。

相关内容