ノードのマトリックスをボックスに保存するにはどうすればよいですか?

ノードのマトリックスをボックスに保存するにはどうすればよいですか?

通常、 を後で使用するためにボックスに保存することができます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 がアンパサンドをスキャンできなくなります。この問題を回避するには、いくつかの方法があります。

  1. を使用してください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}
    
  2. \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}
    
  3. 基本的に 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}
    
  4. \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}
    

関連情報