这个问题与以下答案相关tcolorbox:从框内获取实际框的高度
是否可以让新定义的选项与和 一起remember height
工作 ?\usetikzlibrary{external} \tikzexternalize
\usepackage{tikzscale}
如果没有外部化,我不知道如何处理包含大量数据的图表:-(
请再次帮助我。
\documentclass{article}
\usepackage[breakable]{tcolorbox}
\usepackage{pgfplots}\pgfplotsset{compat=1.9}
\usetikzlibrary{external}
\tikzexternalize %%%%%%% problem here %%%%%%%%
\usepackage{tikzscale}
\begin{filecontents}{tikzimage.tikz}
\begin{tikzpicture}
\begin{axis}[xlabel=time,ylabel=value]
\addplot{x^2};
\end{axis}
\end{tikzpicture}
\end{filecontents}
\makeatletter
\tcbset{%
remember height/.style={before upper={%
\iftcb@fixedheight%
\tcbdimto#1{\kvtcb@top@rule@stand+\kvtcb@bottom@rule@stand+\kvtcb@boxsep*2+\kvtcb@top+\kvtcb@bottom}%
\iftcb@hasTitle%
\tcbdimto#1{#1+\ht\tcb@titlebox+\dp\tcb@titlebox+\kvtcb@title@rule+\kvtcb@boxsep*2+\kvtcb@toptitle+\kvtcb@bottomtitle}%
\fi%
\tcbdimto#1{\kvtcb@height@fixed-#1}%
\else%
\tcbdimto#1{4cm}% fallback
\fi%
}},
}
\makeatother
\begin{document}
\begin{tcolorbox}a\\a\\a\end{tcolorbox}
\begin{tcolorbox}
\includegraphics[width=\linewidth,height=8cm]{tikzimage.tikz}
\end{tcolorbox}
\begin{tcolorbox}[%
height fill,
remember height=\myheight,
]
\includegraphics[width=\linewidth,height=\myheight]{tikzimage.tikz}
\end{tcolorbox}
\end{document}
答案1
我找到了解决方案:
remember height
对于第一个情节,我们也必须使用 的机制。这似乎有帮助tikz-external
。
将第一个图的高度设置为 的选项\begin{tcolorbox}
,height=10cm
并用 记住它remember height=\myheightONE,
,并使用它来设置图的高度 height=\myheightONE
。
这似乎无需 就可以工作\tikzset{external/optimize=false}
。
\documentclass{article}
\usepackage[breakable]{tcolorbox}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\usetikzlibrary{external}
%\tikzset{external/optimize=false}
\tikzexternalize %%%%%%% problem here %%%%%%%%
\usepackage{tikzscale}
\begin{filecontents}{tikzimage.tikz}
\begin{tikzpicture}
\begin{axis}[xlabel=time,ylabel=value]
\addplot{x^2};
\end{axis}
\end{tikzpicture}
\end{filecontents}
\makeatletter
\tcbset{%
remember height/.style={%
before upper={%
\iftcb@fixedheight
\tcbdimto#1{\kvtcb@top@rule@stand+\kvtcb@bottom@rule@stand+\kvtcb@boxsep*2+\kvtcb@top+\kvtcb@bottom}%
\iftcb@hasTitle
\tcbdimto#1{#1+\ht\tcb@titlebox+\dp\tcb@titlebox+\kvtcb@title@rule+\kvtcb@boxsep*2+\kvtcb@toptitle+\kvtcb@bottomtitle}%
\fi
\tcbdimto#1{\kvtcb@height@fixed-#1}%
\else
\tcbdimto#1{4cm}% fallback
\fi
},
},
}
\makeatother
\begin{document}
\begin{tcolorbox}a\\a\\a\\a\\a\\a\\a\end{tcolorbox}
\begin{tcolorbox}[%
height=10cm, %%%%%%%%%%% NEW %%%%%%%%%%%%
remember height=\myheightONE, %%%%%%%%%%% NEW %%%%%%%%%%%%
]
\includegraphics[width=\linewidth,height=\myheightONE]{tikzimage.tikz} %% NEW %%
\end{tcolorbox}
\begin{tcolorbox}[%
height fill,
remember height=\myheightTWO,
]
\includegraphics[width=\linewidth,height=\myheightTWO]{tikzimage.tikz}
\end{tcolorbox}
\end{document}
我希望我的问题没有排除这个对我来说很好的解决方案?
答案2
核心问题是tikzpicture
环境已经消失optimized
,这可以通过检查日志文件看到。
从<jobname>-figure1.log
:
(./tikzimage.tikz
A tikzpicture has been optimized away. Use '/tikz/external/optimize=false' to d
isable this.
) (./tikzimage.tikz) (./tikzimage.tikz) (./tikzimage.tikz) (./tikzimage.tikz
\openout6 = `<jobname>-figure1.dpth'.
这实际上是说它为了节省编译时间和资源而丢弃了图片。这显然不是一个好主意:我们不希望它那翻转效率。因此,让我们尝试采纳它提供的建议,通过添加禁用该功能
\tikzset{external/optimize=false}
回到序言。虽然看起来轴标签所需的空间仍然存在一些问题,但结果已经有了很大的改善。
您还可以更有选择地禁用优化,例如仅针对特定图片或特定命令。这是否值得付出额外的努力将在很大程度上取决于您的特定代码。tikzpicture
但是,如果您有很多环境,并且其中大多数不需要这样做,那么只对需要优化的图片禁用优化将节省时间。尽管如此,外部化仍然限制了总的编译时间。据我所知,关闭优化只会在必须编译图片时使编译时间更长,如果启用了外部化,大多数运行都不会出现这种情况。
完整代码:
\documentclass{article}
\usepackage[breakable]{tcolorbox}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\usetikzlibrary{external}
\tikzexternalize %%%%%%% problem here %%%%%%%%
\usepackage{tikzscale}
\begin{filecontents}{tikzimage.tikz}
\begin{tikzpicture}
\begin{axis}[xlabel=time,ylabel=value]
\addplot{x^2};
\end{axis}
\end{tikzpicture}
\end{filecontents}
\makeatletter
\tcbset{%
remember height/.style={%
before upper={%
\iftcb@fixedheight
\tcbdimto#1{\kvtcb@top@rule@stand+\kvtcb@bottom@rule@stand+\kvtcb@boxsep*2+\kvtcb@top+\kvtcb@bottom}%
\iftcb@hasTitle
\tcbdimto#1{#1+\ht\tcb@titlebox+\dp\tcb@titlebox+\kvtcb@title@rule+\kvtcb@boxsep*2+\kvtcb@toptitle+\kvtcb@bottomtitle}%
\fi
\tcbdimto#1{\kvtcb@height@fixed-#1}%
\else
\tcbdimto#1{4cm}% fallback
\fi
},
},
}
\makeatother
\tikzset{external/optimize=false}
\begin{document}
\begin{tcolorbox}a\\a\\a\end{tcolorbox}
\begin{tcolorbox}
\includegraphics[width=\linewidth,height=8cm]{tikzimage.tikz}
\end{tcolorbox}
\begin{tcolorbox}[%
height fill,
remember height=\myheight,
]
\includegraphics[width=\linewidth,height=\myheight]{tikzimage.tikz}
\end{tcolorbox}
\end{document}