tcolorbox:记住高度和 tikz-external 和 tikzscale

tcolorbox:记住高度和 tikz-external 和 tikzscale

这个问题与以下答案相关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}

记住高度和 tikz-external

答案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}

相关内容