Normalerweise ist es möglich, eine e tikzpicture
in einer Box für die spätere Verwendung zu speichern. Tatsächlich ist dies eine empfohlene Strategie für die Verwendung einer e tikzpicture
in einer anderen: Die Verwendung der Box vermeidet die Gefahren der Verschachtelung tikzpicture
von e.
Ist dies möglich, wenn tikzpicture
aus einem besteht 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}
Fehler:
! 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.
?
Antwort1
Ich bin mir nicht sicher, warum, aber manchmal tikz
muss das in einer temporären Box gespeichert werden, dieDanndauerhafter gespeichert werden können.
\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}
Antwort2
Dies ist das gute alte Catcode-Problem mit &
einem Spaltentrennzeichen. Das \sbox
Makro liest den Inhalt der Box als Argument, was es TikZ unmöglich macht, nach dem Et-Zeichen zu suchen. Sie haben mehrere Möglichkeiten, dies zu umgehen:
Verwenden Sie
ampersand replacement
, auf der TikZ-Seite sind keine Catcode-Änderungen erforderlich.\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}
Verwenden Sie
\setbox\mybox=\hbox{...}
anstelle von\sbox
. Der Boxinhalt wird nicht als Argument gelesen und alles ist gut.\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}
Im Grunde der gleiche Grund wie bei 2, aber mehr im LaTeX-Stil. Verwenden Sie
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}
Korrigieren Sie up
\sbox
, um die übergebenen Token erneut zu scannen. Dies ist wahrscheinlich eine der wenigen gültigen Verwendungen von\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}