通常,可以将 保存tikzpicture
到框中以供以后使用。事实上,这是tikzpicture
在另一个中使用 s 的推荐策略之一:使用框可以避免嵌套tikzpicture
s 的危险。
tikzpicture
如果由组成,可以做到这一点吗matrix of nodes
?
MNWE:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\newsavebox\mybox
\sbox\mybox{%
\begin{tikzpicture}
\matrix [matrix of nodes]
{
a & b \\
c & d \\
};
\end{tikzpicture}%
}
\usebox\mybox
\end{document}
错误:
! Undefined control sequence.
<argument> \pgf@matrix@last@nextcell@options
l.185 }
? h
The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.
?
答案1
我不知道为什么,但有时,tikz
需要保存在一个临时的盒子里,然后可以更永久地保存。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\newsavebox\mybox
\setbox0=\hbox{%
\begin{tikzpicture}
\matrix [matrix of nodes]
{
a & b \\
c & d \\
};
\end{tikzpicture}%
}
\sbox\mybox{\copy0}
here is \usebox\mybox
\end{document}
答案2
&
这是使用作为列分隔符的旧 catcode 问题。\sbox
宏将框的内容作为参数读取,这使得 TikZ 无法扫描“&”符号。有几种方法可以解决这个问题:
使用
ampersand replacement
,TikZ 端不需要更改 catcode。\documentclass{article} \usepackage{tikz} \usetikzlibrary{matrix} \begin{document} \newsavebox\mybox \sbox\mybox{% \begin{tikzpicture} \matrix [matrix of nodes,ampersand replacement=\&] { a \& b \\ c \& d \\ }; \end{tikzpicture}% } \usebox\mybox \end{document}
使用
\setbox\mybox=\hbox{...}
而不是\sbox
。框内容不会被读取为参数,一切都很好。\documentclass{article} \usepackage{tikz} \usetikzlibrary{matrix} \begin{document} \newsavebox\mybox \setbox\mybox=\hbox{% \begin{tikzpicture} \matrix [matrix of nodes] { a & b \\ c & d \\ }; \end{tikzpicture}% } \usebox\mybox \end{document}
基本上,原因与 2 相同,但更具 LaTeX 风格。使用
lrbox
。\documentclass{article} \usepackage{tikz} \usetikzlibrary{matrix} \begin{document} \newsavebox\mybox \begin{lrbox}{\mybox} \begin{tikzpicture} \matrix [matrix of nodes] { a & b \\ c & d \\ }; \end{tikzpicture}% \end{lrbox} \usebox\mybox \end{document}
修复
\sbox
重新扫描传递的令牌的问题。这可能是 的少数有效用途之一\scantokens
。\documentclass{article} \usepackage{tikz} \usetikzlibrary{matrix} \makeatletter \long\def\sbox#1#2{\setbox#1\hbox{% \color@setgroup\scantokens{#2}\color@endgroup}} \makeatother \begin{document} \newsavebox\mybox \sbox\mybox{% \begin{tikzpicture} \matrix [matrix of nodes] { a & b \\ c & d \\ }; \end{tikzpicture}% } \usebox\mybox \end{document}