通常、 を後で使用するためにボックスに保存することができますtikzpicture
。実際、これは を別の 内で使用する場合に推奨される戦略の 1 つですtikzpicture
。ボックスを使用すると、 をネストする危険性を回避できますtikzpicture
。
tikzpicture
が で構成されている場合、これを実行できますか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}
エラー:
! 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 側で catcode を変更する必要はありません。\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
渡されたトークンを再スキャンするように修正します。これはおそらく、 の数少ない有効な使用法の 1 つです\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}