¿Cómo se puede guardar una matriz de nodos en una caja?

¿Cómo se puede guardar una matriz de nodos en una caja?

Normalmente, es posible guardarlo tikzpictureen una caja para su uso posterior. De hecho, esta es una estrategia recomendada para el uso de uno tikzpicturedentro de otro: el uso de la caja evita los peligros de anidar tikzpicture.

¿Se puede hacer esto si tikzpictureconsta de 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}

Error:

! 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.

? 

Respuesta1

No estoy seguro de por qué, pero a veces es tikznecesario guardarlo en una casilla temporal, lo queentoncesse puede salvar de una manera más 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} 

ingrese la descripción de la imagen aquí

Respuesta2

Este es el viejo problema del código cat &como separador de columnas. La \sboxmacro lee el contenido del cuadro como un argumento que hace imposible que TikZ busque el signo comercial. Tienes varias posibilidades para solucionarlo:

  1. Utilice ampersand replacement, no se requieren cambios de código cat en el lado de 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}
    
  2. Usar \setbox\mybox=\hbox{...}en lugar de \sbox. El contenido de la caja no se lee como argumento y todo está bien.

    \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. Básicamente, la misma razón que 2. pero más 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}
    
  4. Arregle \sboxpara volver a escanear los tokens que se pasan. Este es probablemente uno de los pocos 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}
    

información relacionada