Normalmente, é possível guardar tikzpicture
em uma caixa para uso posterior. Na verdade, esta é uma estratégia recomendada para a utilização de uma tikzpicture
dentro da outra: a utilização da caixa evita os perigos do aninhamento tikzpicture
.
Isso pode ser feito se tikzpicture
consistir em 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}
Erro:
! 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.
?
Responder1
Não sei porquê, mas por vezes, tikz
precisa de ser guardado numa caixa temporária, queentãopode ser salvo de uma forma mais 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}
Responder2
Este é o bom e velho problema do catcode &
como separador de colunas. A \sbox
macro lê o conteúdo da caixa como um argumento que torna impossível para o TikZ procurar o e comercial. Você tem várias possibilidades para contornar isso:
Use
ampersand replacement
, nenhuma alteração de código de gato é necessária no lado do 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}
Use
\setbox\mybox=\hbox{...}
em vez de\sbox
. O conteúdo da caixa não é lido como argumento e está tudo bem.\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}
Basicamente, o mesmo motivo de 2. mas mais 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}
Corrija
\sbox
para verificar novamente os tokens que foram passados. Este é provavelmente um dos poucos 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}