使用 savebox 包装 tikz 环境

使用 savebox 包装 tikz 环境

我想建立一个允许将 tikz 图片保存为框的环境。这是我尝试的代码:

\documentclass{standalone}

\usepackage{tikz}

\begin{document}

\newenvironment{tikzcomponent}[1]
{
  \newsavebox{#1}%
  \begin{lrbox}{#1}
    \begin{tikzpicture}%
    }
    {
    \end{tikzpicture}%
  \end{lrbox}
}

\begin{tikzcomponent}{\abox}
  \draw (0,0) -- (1,1) node {Hello world};
\end{tikzcomponent}

\usebox\abox

\end{document}

编译没有错误,但结果为空。这是为什么?

答案1

问题是您的盒子只是本地的。(如果您不熟悉全局和本地的概念,您可能需要查看 TeX 按主题的第 10 节,texdoc texbytopic。)因此,您可能希望将其设为全局的(或至少将其偷运出组)。使用environ包可以更轻松地实现这一点。

\documentclass{standalone}
\usepackage{tikz}
\usepackage{environ}
\NewEnviron{tikzcomponent}[1]{\newsavebox{#1}%
  \begin{lrbox}{#1}%
  \begin{tikzpicture}
    \BODY
  \end{tikzpicture}%
  \end{lrbox}%
  \global\setbox#1\box#1% <- globalize the box
}
\begin{document}

\begin{tikzcomponent}{\abox}
  \draw (0,0) -- (1,1) node {Hello world};
\end{tikzcomponent}
\usebox\abox
\end{document}

在此处输入图片描述

答案2

包裹xsavebox可能是一个选择。

它的盒子是全局的,并且通过名称而不是命令来寻址。标准保存盒具有本地范围。在本例中,范围受环境限制tikzcomponent

在选择框名称时有一定的自由度。它们可以由任何非活动字符(字母、数字、空格、标点符号)构成。更重要的是,框内容(PDF 代码)在 PDF 输出中仅嵌入一次,这在重复插入(例如水印或徽标)的情况下可以节省一些文件大小。

\documentclass{standalone}

\usepackage{tikz}
\usepackage{xsavebox}

\newenvironment{tikzcomponent}[1]{%
  \begin{xlrbox}{#1}
  \begin{tikzpicture}
}{
  \end{tikzpicture}
  \end{xlrbox}%
}

\begin{document}

\begin{tikzcomponent}{a box?}
  \draw (0,0) -- (1,1) node {Hello world};
\end{tikzcomponent}%
%
\xusebox{a box?}

\end{document}

在此处输入图片描述

答案3

除了存储在盒子中之外,还有一种替代方法是使用scontents包直接保存在内存中:

\documentclass{standalone}
\usepackage{tikz}
\usepackage[store-env=tikz]{scontents}
\begin{document}
\begin{scontents}
\begin{tikzpicture}
  \draw (0,0) -- (1,1) node {Hello world};
\end{tikzpicture}
\end{scontents}
\getstored[1]{tikz}
\end{document}

在此处输入图片描述

相关内容