![结合 tikzexternalize、tikzscale 和外部图形的问题](https://linux22.com/image/292788/%E7%BB%93%E5%90%88%20tikzexternalize%E3%80%81tikzscale%20%E5%92%8C%E5%A4%96%E9%83%A8%E5%9B%BE%E5%BD%A2%E7%9A%84%E9%97%AE%E9%A2%98.png)
我在尝试缩放和外部化包含外部图形文件的 时遇到问题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 放在node
a 中tikzpicture
,并用 填充\includegraphics
。这会导致错误。文档生成正确,但tikzpicture
未外部化,即未保存在单独的 .pdf 中。
第二种方法:
在之前的一些工作中,我了解到pgfplots
'\addplot graphics
实际上可以与tikzscale
和 一起使用\tikzexternalize
。现在的想法是将外部图形放入环境中axis
并隐藏轴、刻度和标签。假设我们想要一个tikzpicture
包含以下图形(mwe
包中包含的 example-image-16x10.jpg)的 :
然后代码如下所示(tikzpicture 写在单独的文件中,以便使用'stest.tikz
加载它)。请注意和选项以隐藏轴、刻度和标签: tikzscale
\includegraphics
ticks=none
axis 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}
这将生成所需的文档以及外部化图形。我不知道是否有更优雅的方法来做到这一点,但它确实有效。