我的用例是这样的:我使用像 fontawesome 这样的“符号”字体,其中每个字母/字形都用作图标,并在 Latex 文档中使用 进行着色\textcolor
。但是,我需要的一些符号不在 fontawesome 中,所以我需要将它们作为矢量图提供 - 即 .pdf;在这种情况下,我想以与其他 fontawesome 字形相同的方式对包含的 PDF 进行着色。
到目前为止,我发现了这一点:
有趣的是,对于我尝试过的矢量图形,\color 命令实际上会将所有黑色更改为给定的颜色。
只有 pdfTeX/LuaTeX 支持此功能,并且仅当图形不包含颜色设置时才支持此功能。此行为可以通过 \includegrahics 的选项 resetcolor 覆盖。然后 pdftex.def 在包含图像之前调用 \normalcolor。
无色 PDF 和 pdfTeX 的简单情况(不幸的是很少见):
PDF 文件包含一些没有明确颜色设置的图形,图像将由图形包的 pdftex 驱动程序包含。
一开始我对此感到困惑,但我想我终于找到了一个关于如何创建这种“没有明确颜色设置”的 PDF 的示例,我将在这里发布 - 但是,我想知道是否有更好/更通用的方法,允许我“取消着色”PDF 以便在 Latex 中包含颜色(也许通过使用imagemagick
或类似的东西?)。
好的,首先,让我们使用 Latex 生成要包含的矢量图像 - 为简单起见,使用picture
环境(没有 Tikz);这是include1.tex
:
% include1.tex; build with:
% pdflatex include1.tex
\documentclass[border=0.5mm,varwidth]{standalone}
\begin{document}
\linethickness{0.5mm}
\setlength{\unitlength}{10mm}
\begin{picture}(1,1)(0,0)
\put(0,0){\line(0,1){1}}
\put(0,0){\line(1,0){1}}
\put(1,0){\line(0,1){1}}
\put(0,1){\line(1,0){1}}
\put(0.3,0.2){\rule{3mm}{6mm}}
\put(0.4,0.35){\rule{4mm}{3mm}}
\end{picture}
\end{document}
因此,运行之后pdflatex include1.tex
,我得到include1.pdf
,它看起来像这样evince
(看起来是黑色的):
然后,这是我将其包含到的 Latex 文档testinclude.tex
:
% testinclude.tex; build with:
% pdflatex testinclude.tex
\documentclass{article}
\usepackage{color}
\usepackage{graphicx}
\begin{document}
Testing here 1: \textcolor{blue}{\includegraphics[height=1em]{include1.pdf}}
Testing here 2: \textcolor{blue}{\includegraphics[height=1em]{include1.pdf}}
\end{document}
使用 进行编译后pdflatex testinclude.tex
,我可以确认一切都符合预期 - 也就是说,包含的 PDF 是彩色的:
到目前为止一切都很好;现在,我include1.pdf
在 Inkscape 中打开,首先将其保存为 SVG include2.svg
;然后include2.svg
在 Inkscape 中重新打开,然后另存为include2.pdf
。
现在,如果我将中的“Testing here 2”行更改testinclude.tex
为Testing here 2: \textcolor{blue}{\includegraphics[height=1em]{include2.pdf}}
,并使用重新编译pdflatex testinclude.tex
,那么我会得到以下内容:
因此,显然从 Inkscape 导出的 PDF 不再是无色的,因此 Latex 无法将其着色为蓝色,因此它显示为黑色。
我们可以使用程序解压缩来检查include1.pdf
它们:include2.pdf
pdftk
pdftk include1.pdf output include1-unc.pdf uncompress
pdftk include2.pdf output include2-unc.pdf uncompress
在 Ubuntu GNU/Linux 下,我们可以使用less -L include1-unc.pdf
(或在文本编辑器中打开它们)查看这些文件。未着色的相关部分include1-unc.pdf
是:
...
endobj
4 0 obj
<<
/Length 298
>>
stream
q
1 0 0 1 0.709 1.417 cm
0 0 1.417 28.346 re f
Q
q
1 0 0 1 1.417 0.709 cm
0 0 28.346 1.417 re f
Q
q
1 0 0 1 29.055 1.417 cm
0 0 1.417 28.346 re f
Q
q
1 0 0 1 1.417 29.055 cm
0 0 28.346 1.417 re f
Q
q
1 0 0 1 9.921 7.087 cm
0 0 8.504 17.008 re f
Q
q
1 0 0 1 12.756 11.339 cm
0 0 11.339 8.504 re f
Q
endstream
endobj
3 0 obj
...
...我们可以看到一堆 PDF 图形运算符,如q
和Q
。
对于彩色的、Inkscape 导出的include2-unc.pdf
,相关部分是:
...
endobj
4 0 obj
<<
/Length 212
>>
stream
q
0 0 0 rg /a0 gs
0.711 29.763 1.414 -28.348 re f
1.418 2.126 28.344 -1.418 re f
29.055 29.763 1.418 -28.348 re f
1.418 30.47 28.344 -1.414 re f
9.922 24.095 8.504 -17.008 re f
12.758 19.841 11.336 -8.504 re f
Q
endstream
endobj
2 0 obj
...
...其中应该rg
是设置 RGB 颜色的 PDF 操作符;因此0 0 0 rg
将颜色设置为 RGB 0,0,0 - 即黑色。
0 0 0 rg
因此,我们可以简单地“擦除”此 RGB 设置,方法是用相同长度的空格字符串替换(8 个字符长)(这样我们就不会弄乱 PDF XREF 词典),可以在像 这样的文本编辑器中nano
,也可以直接使用sed
:
sed -i 's/0 0 0 rg/ /' include2-unc.pdf
...然后用替换中的“Testing here 2”行testinclude.tex
,Testing here 2: \textcolor{blue}{\includegraphics[height=1em]{include2-unc.pdf}}
并用重新编译pdflatex testinclude.tex
,——然后我们回到彩色的 PDF 内容,如本文中的第一张图片所示。
所以,我的问题是:
- 是否有一种工具可以帮助我自动“取消着色”我想要以这种方式包含的 PDF(这样我就不必解压缩 PDF 并手动搜索和替换 PDF 颜色运算符)?
- Latex 中是否存在某种技术/包,可以让我引用磁盘上的彩色 PDF,但在将它们包含在内之前会“取消着色”
\includegraphics
?
答案1
您不必替换 PDF 本身中的文本,而是可以使用tikz
颜色来为 PDF 中的形状着色:
\documentclass{article}
\usepackage{color}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{fadings}
\begin{tikzfadingfrompicture}[name=include2,inner sep=0]
\node [fill=transparent!0] {\includegraphics[height=1em]{include2.pdf}};
\end{tikzfadingfrompicture}
\newcommand{\mysymbol}{%
\begin{tikzpicture}[inner sep=0]
\node[fill=.,minimum width=1em,minimum height=1em](a){};
\path[scope fading=include2,fit fading=false];
\node[fill=white,minimum width=1em,minimum height=1em]{};
\end{tikzpicture}%
}
\begin{document}
Testing here 1: \textcolor{blue}{\includegraphics[height=1em]{include1.pdf}}
Testing here 2: \textcolor{blue}{\includegraphics[height=1em]{include2.pdf}}
Testing here 2: \textcolor{blue}{\mysymbol}
Testing here 2: \textcolor{red}{\mysymbol}
\end{document}