Обычно можно сохранить a tikzpicture
в ящик для последующего использования. Действительно, это одна из рекомендуемых стратегий использования одного tikzpicture
в другом: использование ящика позволяет избежать опасностей вложения tikzpicture
s.
Можно ли это сделать, если tikzpicture
состоит из matrix of nodes
?
МНВЭ:
\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 не требуется.\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}