Normalmente, es posible guardarlo tikzpicture
en una caja para su uso posterior. De hecho, esta es una estrategia recomendada para el uso de uno tikzpicture
dentro de otro: el uso de la caja evita los peligros de anidar tikzpicture
.
¿Se puede hacer esto si tikzpicture
consta de a 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}
Error:
! 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.
?
Respuesta1
No estoy seguro de por qué, pero a veces es tikz
necesario guardarlo en una casilla temporal, lo queentoncesse puede salvar de una manera más permanente.
\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}
Respuesta2
Este es el viejo problema del código cat &
como separador de columnas. La \sbox
macro lee el contenido del cuadro como un argumento que hace imposible que TikZ busque el signo comercial. Tienes varias posibilidades para solucionarlo:
Utilice
ampersand replacement
, no se requieren cambios de código cat en el lado de TikZ.\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}
Usar
\setbox\mybox=\hbox{...}
en lugar de\sbox
. El contenido de la caja no se lee como argumento y todo está bien.\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}
Básicamente, la misma razón que 2. pero más LaTeX-y. Usar
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}
Arregle
\sbox
para volver a escanear los tokens que se pasan. Este es probablemente uno de los pocos usos válidos de\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}