![TikZ 使用新定义的 \includegraphics 命令进行外部化失败](https://linux22.com/image/345512/TikZ%20%E4%BD%BF%E7%94%A8%E6%96%B0%E5%AE%9A%E4%B9%89%E7%9A%84%20%5Cincludegraphics%20%E5%91%BD%E4%BB%A4%E8%BF%9B%E8%A1%8C%E5%A4%96%E9%83%A8%E5%8C%96%E5%A4%B1%E8%B4%A5.png)
对于相当大的文档,我使用了external
中的库tikz
。但是,为了注释图像,我尝试将其包含在 tikzpicture 节点中,然后在其上绘图。
我的问题是,我定义了一个新命令\includegraphicscoloured
,它取代了默认的\includegraphics
命令,这样它就可以支持额外的文件后缀(对我来说是“-monochrome”或“-rgb”,在序言中已经定义过)。现在,当我编译文档时,我的图像不会被包含,但我只得到了文本
[includegraphics 已优化,因为它对导出的 PDF 没有帮助]
当我使用默认设置时,\includegraphics
一切都很好。当我全局使用时,我也可以让其工作,tikzset{external/optimize=false}
但那不是一个真正的选择,因为每次外部化都要花费很长时间。
我尝试将external/optimize
密钥直接放在tikzpicture
环境中或简单地放在我新定义的宏中,但这些都不起作用。
有没有办法可以只针对那一张图片关闭优化?或者我可以在 tikzexternalize 设置中修改哪些东西来提供帮助?我阅读了文档,但找不到有关该过程的任何详细信息。
梅威瑟:
\documentclass{article}
\usepackage{mwe}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[optimize=true]
\def\imageSuffix{-monochrome}
% This line is only here to stop TeXnicCenter from complaining
% that the image #2\tikzExternalSuffix does not exist
\let\latexincludegraphics\includegraphics
\newcommand{\includegraphicscoloured}[2][]{%
% we have to define the filename to test for in a macro,
% otherwise it just fails
\def\testfile{./#2\imageSuffix}%
%
% now test if the picture exists as
% pdf, png, or jpg
\IfFileExists{\testfile.pdf}{%
% pdf version of file exists
\latexincludegraphics[#1]{#2\imageSuffix}%
}{%
\IfFileExists{\testfile.jpg}{%
% jpg version of file exists
\latexincludegraphics[#1]{#2\imageSuffix}%
}{%
\IfFileExists{\testfile.png}{%
% png version of file exists
\latexincludegraphics[#1]{#2\imageSuffix}%
}{%
% no known version of the suffixed image exists
% thus fallback to normal include, which will
% print it's own error when it fails
\latexincludegraphics[#1]{#2}%
}
}
}
}
\begin{document}
\begin{figure}
\begin{tikzpicture}
\node at (0, 0) {\includegraphics[width=0.5\columnwidth]{example-image-a}};
\end{tikzpicture}
\caption{This works as expected.}
\end{figure}
\begin{figure}
\begin{tikzpicture}
\node at (0, 0) {\includegraphicscoloured[width=0.5\columnwidth]{example-image-b}};
\end{tikzpicture}
\caption{This doesn't: ``includegraphics optimized away because it does not contribute to exported PDF''.}
\end{figure}
\end{document}
答案1
的动机external/optimize
是,当你打开外化时,Ti钾Z 将会重新阅读整个文档以查看每一张图片. 一个证据是,如果你定义,比如,,\def\n{100}
在 之外tikzpicture
,Ti钾Z 似乎记住了定义,以便您可以\n
在 中使用tikzpicture
。换句话说,Ti钾Z 花费大量时间重读一堆不相关的内容只是为了确保你没有隐藏\n
某处深层的定义。
当你打开时external/optimize
,Ti钾Z 会尝试忽略诸如 之类的昂贵宏来节省一些时间。尽管如此,它会在认为需要时\includegraphics
启动。\includegraphics
回到你的代码:当你说 时\let\latexincludegraphics\includegraphics
,你实际上完成了 的定义\latexincludegraphics
;即使 Ti ,你的宏也不会改变钾Z 改变了 的定义\includegraphics
。由于在您完成宏定义时 已\includegraphics
关闭,因此您的宏将无法正常工作。
有两种方法可以解决这个问题。一种是,就像我评论的那样,使用\def
而不是\let
。这样,你的宏的功能就会在 Ti 时发生变化钾Z 做出任何改变。另一个是在\latexincludegraphics
Ti 之前确定的定义钾Z 可以将其关闭。