如何將節點矩陣儲存到盒子中?

如何將節點矩陣儲存到盒子中?

通常,可以將其儲存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

&這是作為列分隔符號的老貓代碼問題。該\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-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}
    

相關內容