生成带有 OpenType 数学字体且无字体嵌入的 PDF 文件

生成带有 OpenType 数学字体且无字体嵌入的 PDF 文件

我是 TeX 新手,正在开发一款 iPhone/iPad 应用,用于显示 PDF 文档集合中的页面。集合中的每个 PDF 文档都包含一个或多个数学表达式。每个 PDF 文件都相当小,但整个集合有数千个文件。

使用默认的 LaTeX 配置,每个文件最终包含大约 3 - 8 个子集的 Postscript Type 1 字体(Latin Modern、Computer Modern 等),并且文件之间的字体重复性很高。

我正在尝试一个实验,看看我们是否可以减少文档集合的总体大小(请注意,另一个显而易见的解决方案是将小型 PDF 文件合并为大型 PDF 文件,但这是有问题的,原因我就不在这里讨论了):

从 iOS 13 开始,应用程序可以安装字体。我可以通过不在单个 PDF 文档中嵌入任何字体来减少整个字体集合的大小。相反,我的应用程序将安装所需的字体,并且希望 iOS 的 PDF 显示框架 (PDFKit) 能够从其环境中获取显示 PDF 文档所需的所有字体。(在 PDF 规范中,如果在文档中找不到字体,查看器应该默认在显示环境中搜索字体。)

一个限制是 iOS 的新字体管理框架只适用于 Apple 所称的“现代”字体:TrueType 和 OpenType。TeX 默认使用的几种字体(Computer Modern、Latin Modern 等)无法安装,因为它们是 Postscript Type 1 字体,Apple 显然认为这是非“现代”的 20 世纪 80 年代技术。

为了进行此实验,我创建了一个使用 unicode-math 和 OpenType 字体的简单测试文件(这需要从使用 LaTeX 切换到 LuaLaTeX)。我不确定是否有必要使用 unicode-math,但这是一种引入多个 OpenType 字体包的简单方法:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{texgyrepagella-regular.otf}
\usepackage{unicode-math}
\usepackage{mathtools}
\setmathfont{texgyrepagella-math.otf}

\begin{document}
Here comes a math expression:
\[x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}\]
\end{document}

我遇到了一些障碍,需要帮助解决以下问题:

问题 1:当我使用上面的源代码生成 PDF 文件,然后使用 Acrobat Reader 中的“属性/字体”对话框查看它时,我确实看到了列出的 TeXGyrePagella 字体,但它们被描述为“Type 1 (CID)”。我原本以为描述会是“OpenType”之类的。我假设“Type 1 (CID)”是一种 OpenType 字体的更具体描述。有人能证实我的假设吗?(请参阅本问题末尾的屏幕截图。)

问题2:如何生成完全不嵌入字体的 PDF 文件?我看到 tex.stackexchange 上有很多关于如何生成嵌入整个字体且不进行子集设置的 PDF 文件的建议,但我想做相反的事情:我不想嵌入任何字体。

问题 2b:在使用 LaTeX 进行实验时,我能够使用\pdfcompresslevel=0\pdfobjcompresslevel=0命令消除一些嵌入的字体。在 LuaLaTeX 环境中,这些命令的等效项是什么?

Adobe Reader 属性/字体对话框的屏幕截图:

答案1

请尝试在以后将问题限制为一个问题,但它们密切相关,因此无论如何我都会回答。

为什么使用 Type 1 (CID) 而不是 OpenType?可以直接在 PDF 文件中导入 OpenType 字体,但据我所知,任何 TeX 引擎都无法做到这一点。相反,特别是对于基于 Type 1 的 OpenType 字体(通常字体文件以 而.otf不是结尾.ttf),只有实际的字形数据(CFF 格式(CFF 是 Type 1 的压缩版本))从 OpenType 文件中提取并直接包含在 PDF 文件中,而不会包装到 OpenType 结构中。这只是 OpenType 字体中可用信息的一小部分,尤其是有关连字/字距调整的信息会丢失。(这主要是为了兼容性,因为这些信息不是必需的:所有字体布局/连字/字距调整内容都已由 TeX 本身处理,因此添加此信息毫无意义。)

你能禁用字体嵌入吗?可以,但你不应该。从 OpenType 到纯 CFF 字体的转换以及 LuaTeX 对字体进行的一些其他内部更改会导致这样一种情况:如果嵌入了字体,一切都会正常工作,但单独的字体很可能无法工作,要么是因为它具有不同的格式,因此找不到它,要么是因为某些值发生了变化,因此字体显示不正确。此外,PDF 文件以不同于内部字体的方式访问外部 OpenType 字体,并且规范留下了一些实现定义,因此 TeX 基本上无法可靠地从外部 OpenType 字体中选择正确的字形,即使它将所有内容设置为直接使用 OpenType 字体。如果你还想尝试,请参阅强制 lualatex **不嵌入**字体

LuaTeX 相当于

\pdfcompresslevel=0
\pdfobjcompresslevel=0

\pdfvariable compresslevel=0
\pdfvariable objcompresslevel=0

l3pdf但使用适用于几乎所有引擎的方法做同样的事情通常更好:

\usepackage{l3pdf}
\ExplSyntaxOn
\pdf_uncompress:
\ExplSyntaxOff

但是禁用压缩不会消除任何嵌入的字体,所以我不确定您想在那里存档什么。

相关内容