我用 Inkscape 制作了一张图像,并将其导出为 PDF,我想将其包含在文档中。但是,有一件烦人的事情:线宽(例如矩形的边框宽度)取决于 PDF 的缩放比例。例如,当我像这样将其包含两次时
\includegraphics[width=1.00\textwidth]{Example.pdf}
\includegraphics[width=0.50\textwidth]{Example.pdf}
上图中的线条比下图的线条粗。
我能否以某种方式覆盖线宽,使得它始终为 1 毫米,而不管缩放比例如何,或者(重新)定义用于计算实际宽度的基数?
答案1
一般来说答案是否定的。线宽通常在文件中明确设置.pdf
。此设置将覆盖 TeX 文件之前可能设置的任何设置。
了解 PDF 内部结构和 PDF 页面流操作符后,有时.pdf
可以调整文件。让我们以一个简单的 PostScript 文件为例:
%!PS
%%BoundingBox: 99 99 121 111
%%HiResBoundingBox: 99.499989 99.499989 120.500012 110.499958
100 100 moveto 20 0 rlineto 0 10 rlineto
-20 0 rlineto closepath
100 100 moveto
10 5 rlineto
stroke
showpage
%%EOF
然后程序 epstopdf 调用 ghostscript 并生成一个.pdf
文件。由于我们需要查看页面流,因此可以通过以下方式解压缩它:
pdftk Example1.pdf cat output Example2.pdf uncompress
/Contents
可以通过对象中的键找到页面流/Page
(这里用注释标注,有时用相应的 PostScript 运算符):
q 0.1 0 0 0.1 0 0 cm % save 0.1 scale
/R7 gs % not relevant here
10 w % 10 setlinewidth
0 G % black for stroking
10 10 m % m = moveto
210 10 l % l = lineto
210 110 l
10 110 l
h % closepath
10 10 m
110 60 l
S % stroke
Q % restore
这里 ghostscript 添加了线宽设置,PostScript 文件没有设置线宽。可以通过注释或用空格覆盖来删除。对象的大小非常重要不是已更改,否则许多其他设置需要更新:
- 流的长度记录在
/Length
dict流对象中的键中。 - 间接对象的偏移量记录在
xref
表中。
禁用线宽设置的示例(%
在 PostScript 和 PDF 中都是注释字符):
%0 w
可以选择重新.pdf
压缩修改后的文件,请参阅上面的命令行pdftk
。
以下示例使用 pdfTeX。由于我们不想在图形之后保留更改的设置(并让 pdfTeX 感到惊讶),因此将更改的设置放在save
/restore
对之间,即 pdfTeX: \pdfsave
/ \pdfrestore
。然而这也会影响当前点,必须在完全相同的点调用这两个图元。否则,TeX 内部坐标系和 PDF 输出的坐标系的同步将丢失。
\documentclass{article}
\usepackage[a4paper, hmargin=60mm, vmargin=0mm]{geometry}
\pagestyle{empty}
\usepackage{graphicx}
\begin{document}
\centering
\section*{Unmodifed example}
\includegraphics[width=\linewidth]{ExampleUnmodified.pdf}
\includegraphics[width=.5\linewidth]{ExampleUnmodified.pdf}
\section*{Example without line width}
\includegraphics[width=\linewidth]{ExampleWithoutLineWidth.pdf}
\includegraphics[width=.5\linewidth]{ExampleWithoutLineWidth.pdf}
\section*{Example with settings}
\newcommand*{\pdfset}[2]{%
\leavevmode
\pdfsave
\pdfliteral{#1}%
\rlap{#2}%
\pdfrestore
\phantom{#2}%
}
\pdfset{%
10 w % setlinewidth
1 J % setlinecap: round
1 j % setlinejoin: round
}{\includegraphics[width=\linewidth]{ExampleWithoutLineWidth.pdf}}
\pdfset{%
20 w % setlinewidth
1 J % setlinecap: round
1 j % setlinejoin: round
}{\includegraphics[width=.5\linewidth]{ExampleWithoutLineWidth.pdf}}
\end{document}
可以看出几个问题/缺点:
所包含文件的媒体大小/边界框
.pdf
不会改变。TeX 可以看到trim
这一点。如果线宽发生变化,边界框也可能会改变。选项可以提供帮助:如果线宽小于原始值,则使用正值;如果边界框增大,则使用负值。有时可以轻松计算出这些值,否则可以目测(例如:\fbox
使用\setlength{\fboxsep}{0pt}
)。根据图像的不同,四边的值甚至可能不同。即使线宽相同,缩放后的图像看起来也会有很大差异,因为如果形状被缩放,线宽和形状的比例会不同。