结合 tikzexternalize、tikzscale 和外部图形的问题

结合 tikzexternalize、tikzscale 和外部图形的问题

我在尝试缩放和外部化包含外部图形文件的 时遇到问题tikzpicture。使用以下代码将导致文档输出,但图形不会外部化到单独的文件中。此外,还会产生一条错误消息。注释tikzexternalize或使用input{test.tikz}(即不缩放tikzpicture)时,一切正常,尽管显然没有相应的效果。此外,tikzpicture没有外部图形的 也可以正常工作。有没有办法将tikzscale和 结合起来,tikzexternalize用于tikzpicture包含外部图形的 ?

\documentclass[crop,10pt,border=0]{standalone}
\usepackage[english]{babel}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{external}
\tikzexternalize[shell escape=-enable-write18]
\usepackage{tikzscale}
\usepackage{mwe}
\usepackage{filecontents}

\begin{document}
\setlength{\textwidth}{510pt}
\begin{filecontents}{test.tikz}
\begin{tikzpicture}
\node at (0,0) {\includegraphics[width=.25\textwidth]{example-image-a}};
\end{tikzpicture}
\end{filecontents}
This is my document.
% \input{test.tikz}
    \includegraphics[width=0.5\textwidth]{test.tikz}
\end{document}

错误信息如下:

! tikz 软件包错误:抱歉,系统调用“pdflatex -enable-write18 -halt-on -error -interaction=batchmode -jobname "external-test-figure0" "\def\tikzextern alrealjob{external-test}\input{external-test}"”未产生可用的输出文件“external-test-figure0”(预期为 .pdf:.jpg:.jpeg:.png: 之一)。请确认您已启用系统调用。对于 pdflatex,这是“pdflatex -sh ell-escape”。有时它也被命名为“write 18”或类似名称。或者命令可能只是失败了?错误消息可以在“external-test-figure0.log”中找到。如果您现在继续,我将尝试排版图片。

答案1

好的,我找到了解决方法。由于这个问题困扰了我很长时间,并且还涉及一些其他需要考虑的问题,我将逐步回答这个问题。

任务:创建一个由外部图形(.png、.jpg、.pdf)组成的 tikzpicture,在使用时不会导致错误tikzscale \tikzexternalize

问题:为什么是tikzpicture而不是\includegraphics
-因为我想向图片添加一些元素,这在 中很容易做到tikz
为什么要使用tikzscale
-因为我喜欢让我的图形与文本具有相同的宽度,同时保持fontsize轴、节点等的 独立于图形的宽度。tikzscale是用于此目的的工具。
为什么\tikzexternalize
-不使用\tikzexternalize意味着tikzpicture每次都会重新编译 ,文档也会被编译。根据tikzpicture的复杂性,这将花费大量时间。

第一种方法:
第一种方法可以在原始问题中看到。我将 a 放在nodea 中tikzpicture,并用 填充\includegraphics。这会导致错误。文档生成正确,但tikzpicture未外部化,即未保存在单独的 .pdf 中。

第二种方法:
在之前的一些工作中,我了解到pgfplots'\addplot graphics实际上可以与tikzscale和 一起使用\tikzexternalize。现在的想法是将外部图形放入环境中axis并隐藏轴、刻度和标签。假设我们想要一个tikzpicture包含以下图形(mwe包中包含的 example-image-16x10.jpg)的 :
示例图像-16x10
然后代码如下所示(tikzpicture 写在单独的文件中,以便使用'stest.tikz加载它)。请注意和选项以隐藏轴、刻度和标签: tikzscale\includegraphicsticks=noneaxis lines=none

\documentclass[10pt]{scrartcl}
\usepackage[english]{babel}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{external}
\tikzexternalize[shell escape=-enable-write18]
\usepackage{tikzscale}
\usepackage{pgfplots}
\usepackage{mwe}
\usepackage{filecontents}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{filecontents}{test.tikz}
\begin{tikzpicture}
\begin{axis}[
    xmin=0,xmax=1,ymin=0,ymax=1,
    ticks=none,
    axis lines=none,
    ]
    \addplot graphics [xmin=0,xmax=1,ymin=0,ymax=1] {example-image-16x10};
\end{axis}
\end{tikzpicture}
\end{filecontents}
First we will include the picture as a normal graphics:
\begin{figure}[hb]
    \centering
    \includegraphics[width=0.5\textwidth]{example-image-16x10}
    \caption{This is the figure without using \textit{tikzpicture}.}
\end{figure}
\newline Next, we include the figure as a \textit{tikzpicture} using \textit{tikzscale}.
\begin{figure}
    \centering
    \includegraphics[width=0.5\textwidth]{test.tikz}
    \caption{This is my figure in \textit{tikzpicture}'s \textit{axis} environment. Unfortunaltely it is stretched into a square shape.}
    \end{figure}
\end{document}

当编译此代码(两次)时,您会注意到,图形在tikzpicture垂直方向上被拉伸,因为pgfplots'axis环境倾向于创建方形图。为了保持原始图像的纵横比,必须定义一个新的\addplot命令,该命令将测量原始图像的纵横比并相应地缩放轴,如先前的问题中所示\addplot 图形:尽管轴的缩放比例不同,但仍保持图像的纵横比.
最终代码如下:

\documentclass[10pt]{scrartcl}
\usepackage[english]{babel}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{external}
\tikzexternalize[shell escape=-enable-write18]
\usepackage{tikzscale}
\usepackage{pgfplots}
\usepackage{mwe}
\usepackage{filecontents}
\pgfplotsset{compat=1.10}

\makeatletter
\newcommand\addplotgraphicsnatural[2][]{%
    \begingroup
    \pgfqkeys{/pgfplots/plot graphics}{#1}%
    \setbox0=\hbox{\includegraphics{#2}}%
    \pgfmathparse{\wd0/(\pgfkeysvalueof{/pgfplots/plot graphics/xmax} - \pgfkeysvalueof{/pgfplots/plot graphics/xmin})}%
    \let\xunit=\pgfmathresult
    \pgfmathparse{\ht0/(\pgfkeysvalueof{/pgfplots/plot graphics/ymax} - \pgfkeysvalueof{/pgfplots/plot graphics/ymin})}%
    \let\yunit=\pgfmathresult
    \xdef\marshal{%
        \noexpand\pgfplotsset{unit vector ratio={\xunit\space \yunit}}%
    }%
    \endgroup
    \marshal
    \addplot graphics[#1] {#2};
}   
\makeatother


\begin{document}
\begin{filecontents}{test.tikz}
\begin{tikzpicture}
\begin{axis}[
    xmin=0,xmax=1,ymin=0,ymax=1,
    ticks=none,
    axis lines=none,
    ]
    \addplotgraphicsnatural [xmin=0,xmax=1,ymin=0,ymax=1] {example-image-16x10};
\end{axis}
\end{tikzpicture}
\end{filecontents}
First we will include the picture as a normal graphics:
\begin{figure}[hb]
    \centering
    \includegraphics[width=0.5\textwidth]{example-image-16x10}
    \caption{This is the figure without using \textit{tikzpicture}.}
\end{figure}
\newline Next, we include the figure as a \textit{tikzpicture} using \textit{tikzscale}.
\begin{figure}
    \centering
    \includegraphics[width=0.5\textwidth]{test.tikz}
    \caption{This is my figure in \textit{tikzpicture}'s \textit{axis} environment. Unfortunaltely it is stretched into a square shape.}
    \end{figure}
\end{document}

这将生成所需的文档以及外部化图形。我不知道是否有更优雅的方法来做到这一点,但它确实有效。

相关内容