我想建立一个允许将 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}