使用 TikZmatrix
作为嵌套的tikzpicture
,我预先定义了前者并将其存储在 中savebox
。
但是,当我添加第二列时,编译失败。这似乎是由于&
(请参阅下面的 MWE)。日志特别指出:!软件包 pgf 错误:单个 & 符号与错误的 catcode 一起使用。
问题:matrix
如何定义具有多列的TikZ savebox
?
\documentclass{article}
\usepackage{tikz}
\newsavebox{\testsbox}
\savebox{\testsbox}{
\begin{tikzpicture} [borders/.style={draw, help lines}]
\matrix[borders]{
\node [borders] {11};
% &
% \node [borders] {12};
\\
};
\end{tikzpicture}
}
\begin{document}
This example stops working as soon as you add a second column (i.e. uncomment lines 9 and 10).
\begin{tikzpicture}
\node {\usebox{\testsbox}};
\end{tikzpicture}
\end{document}
答案1
TikZ 将 的类别代码更改为&
活动字符以处理矩阵。但tikzpicture
被用作 的参数\savebox
。当 TeX 解析参数时,文本将使用当前类别代码设置进行标记。然后,当 TikZ 更改类别代码时,它不会产生任何影响,因为&
已经被标记化。
LaTeX 提供环境lrbox
作为命令\savebox
或 的替代\sbox
。在环境形式中,内容不会被读取为参数,并且类别更改有效:
\documentclass{article}
\usepackage{tikz}
\newsavebox{\testsbox}
\begin{lrbox}{\testsbox}
\begin{tikzpicture} [borders/.style={draw, help lines}]
\matrix[borders]{
\node [borders] {11};
&
\node [borders] {12};
\\
};
\end{tikzpicture}
\end{lrbox}
\begin{document}
\begin{tikzpicture}
\node {\usebox{\testsbox}};
\end{tikzpicture}
\end{document}
环境还会删除与/lrbox
相反的主体开始和结束处的空格。\savebox
\sbox
答案2
使用ampersand replacement
来替换&
任意命令(大多数人选择\&
)。
\documentclass{article}
\usepackage{tikz}
\newsavebox{\testsbox}
\savebox{\testsbox}{%
\begin{tikzpicture} [borders/.style={draw, help lines}]
\matrix[borders,ampersand replacement=\&]{
\node [borders] {11};
\&
\node [borders] {12};
\\
};
\end{tikzpicture}%
}
\begin{document}
This example stops working as soon as you add a second column (i.e. uncomment lines 9 and 10).
\begin{tikzpicture}
\node {\usebox{\testsbox}};
\end{tikzpicture}
\end{document}