我在我的 LaTeX 文档(使用 pdflatex 创建)中使用了许多 PDF 图像(从 SVG 转换而来)。
我注意到我的最终文档中有很多重复的嵌入子集字体。我知道这是由于使用的图像造成的。
经过一番搜索,我发现合并嵌入字体很麻烦。我不太明白为什么,因为一个工具可以合并这些子集,删除所有具有相同编码的条目并相应地修改文本块(但我们不要进一步讨论这个问题,我会相信互联网 :) )。我放弃了嵌入子集字体。
现在我重新生成了所有图像,确保它们没有字体的子集,但包含完整的字体。(我用检查过了pdffonts
。)
再次构建文档后,它仍然具有重复的(非子集)字体:
$> pdffonts mydoc.pdf
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
...
DejaVuSans TrueType WinAnsi yes no yes 1066 0
DejaVuSans-Bold TrueType WinAnsi yes no yes 1067 0
DejaVuSans TrueType WinAnsi yes no yes 1117 0
DejaVuSans-Oblique TrueType WinAnsi yes no yes 1118 0
DejaVuSans TrueType WinAnsi yes no yes 1136 0
DejaVuSans-Oblique TrueType WinAnsi yes no yes 1137 0
DejaVuSans-Oblique TrueType WinAnsi yes no yes 1243 0
...
我的问题是:为什么会有重复的字体?!pdflatex 删除这些重复的字体应该很容易...还是我需要为 pdflatex 提供一些标志?或者在我的文档中添加一个包?
更新
可以下载所请求的文档这里并使用以下方式构建:
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{image1}
\includegraphics{image2}
\end{document}
如果需要,可以找到包括测试图像和 SVG 原件的完整项目这里。
PDF 图像包含文本“Image1”和“Image2”,并且均完全嵌入字体。
pdffonts
显示最终文档的以下信息:
$ pdffonts mydoc.pdf
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
SDXKYB+CMR10 Type 1 Builtin yes yes no 6 0
DejaVuSans TrueType WinAnsi yes no yes 11 0
DejaVuSans TrueType WinAnsi yes no yes 17 0
DejaVuSans 嵌入了两次,每次嵌入一个使用的图像。我的真实文档包含大量图像,因此问题更加严重...
我不知道这是否有趣,但 pdflatex 说:
这是 pdfTeX,版本 3.1415926-2.5-1.40.14(TeX Live 2013/Debian)
答案1
pdfTeX 程序仅合并 Type 1(或 Type 1C)格式的字体。image1.pdf
并image2.pdf
包含 TrueType 字体。从 pdfTeX 的来源来看pdftoepdf.cc
:
static void copyFont(char *tag, Object * fontRef)
{
...
// Only handle included Type1 (and Type1C) fonts; anything else will be copied.
// Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
...
}
答案2
我发现了一个有趣的问题,可以找到解决这个问题的方法,并且仍然允许您使用字体子集:
正如您已经发现的,合并字体子集并不是一件容易实现的事情(至少对于开源软件来说)。
但是由于您拥有原始 SVG,因此还有另一种解决方案:将它们合并为多页 PDF。事实上,如果您设法这样做,则只会创建一个子集:一个包含不同 SVG 中包含的所有字符的字形的子集,并且 LaTeX 只会将其嵌入一次。
您现在的目标是正确生成多页 PDF...我没能找到一个可以正确执行此操作的命令行,但这肯定是可行的。我找到的最佳解决方案是,rsvg-convert
但出于某种原因,它会生成多页 PDF,其中所有页面的大小相同,从而破坏您的图像格式:
rsvg-convert -a -f pdf -o images.pdf *.svg
因此,让我们假设您成功地从 SVG 中生成了多页 PDF,然后您只需像这样调用您的图像:
\includegraphics[page=1]{images.pdf}
\includegraphics[page=2]{images.pdf}
希望这可以帮助 ;)
2016 年 8 月 18 日更新:
经过大量调查,我未能找到任何好的命令来从 SVG 创建多页 PDF,并且生成的 PDF 中的页面大小会有所不同。
因此,我最终决定根据
rsvg-convert
工作原理创建自己的命令。它可在此处获得:https://github.com/pimpreneil/svgstopdf这个命令非常简单,语法如下:
svgstopdf *.svg out.pdf
使用此命令与上述 LaTeX 代码片段结合,您将能够将所有 SVG 集成到 LaTeX 文档中,而无需任何字体子集重复!
2016 年 8 月 19 日更新:
因为我发现使用页面的这种语法很难弄清楚包含了哪个图像,所以我
--latex-package
在命令中添加了一个附加选项,以便生成一个更容易集成的 LaTeX 包:svgstopdf 1.svg 2.svg out.pdf --latex-package
此命令将生成一个附加
svgimages.sty
文件,其中包含 includesvg 命令。加载图像的 LaTeX 代码现在将变为:\usepackage{svgimages} \includesvg{1.svg} \includesvg{2.svg}
您甚至可以传递一些
includegraphics
支持的参数:\includesvg[scale=0.8]{1.svg}