底部有附加信息
我本来打算\colorbox
以逐字模式使用 es,每个字母一个,但这会显著增加 pdf 的大小(通过生成latex+dvipdfmx
但pdflatex
类似,我对它进行了进一步测试)。
绘制黄色规则似乎比绘制字母字形更简单,但从简单的测试来看,当 PDF 需要绘制许多字母时,它比绘制许多小规则时更经济。有没有办法知道pdflatex
某些东西会被反复使用,将其存储在某个地方,并在需要时经济地使用指向它的指针?我猜有点像自动从部分嵌入的字体中拾取的字形。
在下面的排序中MWE
,我发现当我有数千份相同类型的彩色框副本时,pdf 文件大小并不离谱,大约 4 个字节切换到黄色,绘制一个矩形,切换回正常颜色,还不错。但它仍然比编码绘制字母所需的要多得多X
。有没有办法获得更紧凑的 PDF?
(我尝试过ps2pdf
,在这里是可以的,但在实际情况下无法减少从 dvipdfmx 获取的文件大小;事实上文件大小从 1.1M 变为 1.5M)。
\documentclass{article}
\usepackage{color}
\begin{document}
Hello.
% 28367 bytes for 4000 boxes
% 19844 bytes for 2000 boxes
% 15558 bytes for 1000 boxes
% 11658 bytes for 100 boxes
% 11167 bytes for 1 box
% about 4.4 bytes per colored box.
\newsavebox{\mybox}
\sbox{\mybox}{\colorbox{yellow}{\phantom{X}}}
\count255 4000
\noindent\loop
\usebox{\mybox}
%\colorbox{yellow}{\phantom{X}}
\advance\count255 by -1
\ifnum\count255>0
\repeat
% 11695 bytes for 1000 X
% 12272 bytes for 2000 X
% 12895 bytes for 3000 X
% 13057 bytes for 4000 X
% 13603 bytes for 5000 X
% \sbox{\mybox}{X}
% \count255 5000
% \noindent\loop
% \usebox{\mybox}
% \advance\count255 by -1
% \ifnum\count255>0
% \repeat
\end{document}
pdfxform
我在这里报告我当时所做的测试wipet 的回答出现了。我使用了以下测试文件。这是现在在旧的 TL2010 上。在其他默认设置下,PDF 是 PDF 1.5 文件。我得到了26907
带有单词Hello
和4000
黄色框的字节\usebox
,并23972
使用方式得到了字节\pdfxform
。
然后在我的实际用例中,再次TL2010
(并且dvipdfmx
从那时起不断发展)我得到以下数量级:
对于没有任何框而只有字母(在 monotype 中)的源,
dvipdfmx
生成的文件有大约580000
字节,而一个pdflatex
文件有大约760000
字节(文档正文中使用的字体主要是newtxtt
我添加到我的 中的字体TL2010
)。当我完成所有彩色框时,
dvipdfmx
现在的重量约为930000
字节(但在家里它约为1050000
字节)和pdflatex
一个1122000
字节。如果我现在做这
\pdfxform
件事,我会得到一个1090000
字节文件。
结论:不可否认的是,这样做确实有一些好处,但pdflatex+\pdfxform
在我的例子中,它产生的文件仍然比 更大dvipdfmx
。而当我不使用任何彩色框时,我的dvipdfmx
文件会40%
小一些……
通过添加框增加的文件大小约为350k
(对于两种编译路径而言),并且使用为\pdfxform
我节省了约30k
,这很好但仍然令人沮丧。
\documentclass{article}
\usepackage{color}
\begin{document}
Hello.
\fboxsep0pt
\newsavebox{\mybox}
\sbox{\mybox}{\colorbox{yellow}{\strut\phantom{X}}}
% USE OF A BOX
% gives pdf file of 26907 bytes
% This is a 1.5 PDF file pdfTeX-1.40.11 (TL2010)
\count255 4000
\noindent\loop
\penalty0
\usebox{\mybox}%
\advance\count255 by -1
\ifnum\count255>0
\repeat
% % USE OF \pdfxform
% % gives pdf file of 23972 bytes
% \pdfxform\mybox % attention, empties box register
% \count255 4000
% \noindent\loop
% \penalty0
% \hbox{\pdfrefxform \pdflastxform}%
% \advance\count255 by -1
% \ifnum\count255>0
% \repeat
\end{document}
最后一点信息:在我的实际用例中,文档目前有大约 100150
页,每页有 5 到 10 个单词,其字母具有黄色背景,实际上我可以数出它们:32297
方框!因此,对于每个这样的黄色矩形,惩罚约为 100010
个字节,使用\pdfxform
并没有太大的改善。
152
我已经在实际使用带有方框的页面文档的案例上重新进行了测试32297
。为了使其更简洁,我删除了逐字字母,并对具有32297
相同字母宽度的 strutbox、彩色或非彩色(这是xcolor
和颜色 yellow
)进行了比较。添加彩色框的成本:
195303
使用 dvipdfmx 时的字节数,232110
使用 pdflatex 时字节数,194208
使用 pdflatex+ 时字节\pdfxform
。
因此,看起来dvipdfmx
和pdflatex+\pdfxform
的效率相同,每个彩色框的成本约为6
字节。我不知道为什么当在文件中完成此操作而不执行其他操作时,3.2
每个彩色框的成本会更高。
我还发现了一些奇怪的事情\pdfxform
。使用这个测试文件:
\documentclass{article}
%\usepackage{xcolor}
\begin{document}
Hello.
%\fboxsep0pt
\newsavebox{\mybox}
\sbox{\mybox}
%{\colorbox{yellow}{\strut\phantom{X}}}
{\strut\phantom{X}}% NO COLOR!
% USE OF \pdfxform
\pdfxform\mybox
\count255 32297
\noindent\loop
\penalty0
\hbox{\pdfrefxform \pdflastxform}%
\advance\count255 by -1
\ifnum\count255>0
\repeat
\end{document}
我获得大约114000
字节,如果使用则大致相同\colorbox
。但是如果我不 使用该\pdfxform
机制,然后使用彩色盒子,其pdf
重量约为140000
字节,但是当生产时没有颜色而只有空盒子,那么它就只有16572
字节。
在我的大文件中,使用\pdfxform
彩色框会得到951744
字节,使用非彩色框会得到951711
字节。但是,不使用时,彩色(字节)和非彩色(字节)情况pdfxform
之间存在很大差异。953646
721543
答案1
以下是使用的解决方案\pdfxform
:
\setbox0=\hbox{\colorbox{yellow}{\phantom{X}}}
\pdfxform0 \mathchardef\myboxnum=\pdflastxform
\def\mybox{\pdfrefxform\myboxnum}
\count255 4000
\noindent\loop
\mybox\
\advance\count255 by -1
\ifnum\count255>0
\repeat
MWE 的未压缩 PDF(\pdfcompresslevel=0
)有 673757 个字节,而相同使用\pdfxform
有 170255 个字节,压缩率为 3.95。MWE 创建的一个黄色框在 PDF 中看起来像:
0 0 1 0 k 0 0 1 0 K
0 0 1 0 k 0 0 1 0 K
q
1 0 0 1 150.281 642.291 cm
0 0 13.45 12.785 re f
Q
0 0 1 0 k 0 0 1 0 K
0 g 0 G
0 0 1 0 k 0 0 1 0 K
0 g 0 G
0 g 0 G
0 g 0 G
显然,颜色处理非常无效(color.sty
这是宏包造成的)。
另一方面,当\pdfxform
使用时,相同的黄色框表示为:
q
1 0 0 1 150.281 642.291 cm
/Fm1 Do
Q
这里使用了指针。但是,每个框都必须应用由连接矩阵 (cm) 实现的当前点的移位。另一方面,PDF 规范对字体中字符的打印进行了更优化:字符之间的当前点会“自动”移位。
编辑:我做了第三个实验进行比较。为了尽量减少 PDF 中的垃圾,在没有宏支持的情况下手动使用颜色:
\count255 4000
\noindent\loop
\hbox{\pdfliteral{0 0 1 0 k}\rlap{\vrule height2ex width.7em}\pdfliteral{0 g}\kern.7em}
\advance\count255 by -1
\ifnum\count255>0
\repeat
现在,未压缩的 PDF 有 250322 个字节,一个黄色框如下所示:
1 0 0 1 10.205 0 cm
0 0 1 0 k
q
0 0 6.974 8.579 re f
Q
0 g
MWE 与第三种解决方案的压缩比为 2.7。不使用\pdfxform
。仅省略了无效的宏包并手动设置颜色。