노드 행렬을 상자에 어떻게 저장할 수 있습니까?

노드 행렬을 상자에 어떻게 저장할 수 있습니까?

tikzpicture일반적으로 나중에 사용하기 위해 상자에 저장하는 것이 가능합니다 . 실제로 이것은 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 replacementTikZ 측에서 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-y가 더 많습니다. 사용 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전달된 토큰을 다시 스캔하도록 수정하세요 . 이것은 아마도 의 몇 가지 유효한 용도 중 하나일 것입니다 \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}
    

관련 정보