TikZ 使用新定义的 \includegraphics 命令进行外部化失败

TikZ 使用新定义的 \includegraphics 命令进行外部化失败

对于相当大的文档,我使用了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是,当你打开外化时,TiZ 将会重新阅读整个文档以查看每一张图片. 一个证据是,如果你定义,比如,,\def\n{100}在 之外tikzpicture,TiZ 似乎记住了定义,以便您可以\n在 中使用tikzpicture。换句话说,TiZ 花费大量时间重读一堆不相关的内容只是为了确保你没有隐藏\n某处深层的定义。

当你打开时external/optimize,TiZ 会尝试忽略诸如 之类的昂贵宏来节省一些时间。尽管如此,它会在认为需要时\includegraphics启动。\includegraphics

回到你的代码:当你说 时\let\latexincludegraphics\includegraphics,你实际上完成了 的定义\latexincludegraphics;即使 Ti ,你的宏也不会改变Z 改变了 的定义\includegraphics。由于在您完成宏定义时 已\includegraphics关闭,因此您的宏将无法正常工作。

有两种方法可以解决这个问题。一种是,就像我评论的那样,使用\def而不是\let。这样,你的宏的功能就会在 Ti 时发生变化Z 做出任何改变。另一个是在\latexincludegraphicsTi 之前确定的定义Z 可以将其关闭。

相关内容