tikz マトリックスは「忘れられる」のでしょうか?

tikz マトリックスは「忘れられる」のでしょうか?

マトリックス名が「永続的」であるという問題が発生していますtikz

次の 2 つの行列を考えてみましょう。

ここに画像の説明を入力してください

これらの行列は次のコードで生成されました。

\documentclass[border=12pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
$
\begin{tikzpicture}
  \matrix[
  , matrix of math nodes
  , left delimiter = {[}
  , right delimiter = {]}
  ] (m)
  {
    1  & -32  & 0  & 15 \\
    16 & -138 & -3 & 5  \\
    4  & 14   & 11 & 19 \\
  };
\end{tikzpicture}
$
$
\begin{tikzpicture}
  \matrix[
  , matrix of math nodes
  , left delimiter = {[}
  , right delimiter = {]}
  ] (a)
  {
    1  \\
    16 \\
    4  \\
  };

  \draw[red, thick] (m-1-4) -- (m-3-1);
\end{tikzpicture}
$

\end{document}

2 つの行列は異なるtikzpicture環境で構築されています。左側の行列には という名前が付けられm、右側の行列には という名前が付けられますa

2 番目には、前の からのマトリックス内のノードを参照するコマンドtikzpictureがあります。 には という名前のマトリックスがないので、実際にはこのコードでエラーをスローするようにします。\drawtikzpicturetikzpicturem

tikzマトリックスを「忘れる」ように依頼することは可能ですかm?

答え1

厳密に言えば、これは OP の質問に対する回答ではありませんが、役に立つかもしれません。

OP は Tikz ライブラリ を使用しているためmatrix、 を確認する必要があります。その拡張機能の環境では、マトリックスの各セルに Tikz ノードを持つマトリックスが作成されます (また、Tikz モジュールでは実行されないnicematrix、潜在的なルールの位置の Tikz ノードも作成されます)。matrix

これらのノードは、行と列i-jのセルのノードの構文で使用できます。マトリックスの名前はありません (これらの名前は現在のマトリックス、つまり現在の環境でのみ有効です)。ij

したがって、誤って別のマトリックス内のノードを参照するリスクはありません。

たとえば、次のコードでは、現在のマトリックスにノードがないためエラーが発生します1-4(前のマトリックスには 1 つのノードがありますが、干渉しません)。

\documentclass{article}
\usepackage{nicematrix,tikz}

\begin{document}
$
\begin{pNiceMatrix}
    1  & -32  & 0  & 15 \\
    16 & -138 & -3 & 5  \\
    4  & 14   & 11 & 19 \\
\end{pNiceMatrix}
$
$
\begin{bNiceMatrix}
    1  \\
    16 \\
    4  \\
\CodeAfter
  \tikz \draw [red, thick] (1-4) -- (3-1) ; % error : there is no node (1-4)
\end{bNiceMatrix}
$

\end{document}

答え2

ティZ 座標はすべてグローバルです。したがって、新しいページを開始したりtikzpicture、次のページに進んだりしても、座標が忘れられることはありません。したがって、答えは「いいえ」です。たとえば、いくつかの座標プレフィックスをインストールすることで、エラー メッセージを生成するメカニズムを作成できます。以下は、すべての に一意のプレフィックスをインストールするコードですtikzpicture。使用する場合は、注意して使用してください。

\documentclass[border=12pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix}
\newcounter{TikZpicture}
\tikzset{every picture/.append style={step tikz counter,
    name prefix=pic-\number\value{TikZpicture}},
step tikz counter/.code={\stepcounter{TikZpicture}}}

\begin{document}
$
\begin{tikzpicture}
  \matrix[
  , matrix of math nodes
  , left delimiter = {[}
  , right delimiter = {]}
  ] (m)
  {
    1  & -32  & 0  & 15 \\
    16 & -138 & -3 & 5  \\
    4  & 14   & 11 & 19 \\
  };
\end{tikzpicture}
$
$
\begin{tikzpicture}
  \matrix[
  , matrix of math nodes
  , left delimiter = {[}
  , right delimiter = {]}
  ] (a)
  {
    1  \\
    16 \\
    4  \\
  };

  \draw[red, thick] (m-1-4) -- (m-3-1);
\end{tikzpicture}
$

\end{document}

答え3

TikZ ノードは 5 つのグローバル マクロとして保存されていることがわかりました。実際にノードを削除することはできませんが、すべてを同じ (存在しない) ノードにエイリアスすることはできます。おそらく、現在使用されていないグローバル マクロは としてリリースされるでしょう\global\let\foo=\relax

\documentclass[border=12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}

\makeatletter
\newcommand{\removenode}[1]% #1 = node name
{\bgroup
  \let\pgf@nodecallback=\pgfutil@gobble%
  \pgfnodealias{#1}{}% node ()
\egroup}
\newcommand{\removematrix}[3]% #1 = matrix name, #2 = number rows, #3 = number columns
{\bgroup% use local \i and \j
  \let\pgf@nodecallback=\pgfutil@gobble%
  \foreach \i in {1,...,#2}{%
    \foreach \j in {1,...,#3}{\pgfnodealias{#1-\i-\j}{}}}%
  \pgfnodealias{#1}{}%
\egroup}
\makeatother

\begin{document}
 \begin{tikzpicture}[baseline=(current bounding box.center)]
  \matrix[
  , matrix of math nodes
  , left delimiter = {[}
  , right delimiter = {]}
  ] (m)
  {
    1  & -32  & 0  & 15 \\
    16 & -138 & -3 & 5  \\
    4  & 14   & 11 & 19 \\
  };
\end{tikzpicture}

\removematrix{m}{3}{4}%

\begin{tikzpicture}[baseline=(current bounding box.center)]
  \matrix[
  , matrix of math nodes
  , left delimiter = {[}
  , right delimiter = {]}
  ] (a)
  {
    1  \\
    16 \\
    4  \\
  };
  \draw[red, thick] (m-1-4) -- (m-3-1);
\end{tikzpicture}
\end{document}

ちなみに、より高速ですが読みにくいバージョンは\removematrix次のとおりです。

\newcommand{\removematrix}[3]% #1 = matrix name, #2 = number rows, #3 = number columns
{\bgroup% use local registers
  \let\pgf@nodecallback=\pgfutil@gobble%
  \count1=#2\relax
  \loop\ifnum\count1>0{% one loop per group
    \count2=#3\relax
    \loop\ifnum\count2>0
      \edef\nodename{#1-\number\count1-\number\count2}%
      \pgfnodealias{\nodename}{}%
      \advance\count2 by -1
    \repeat}%
    \advance\count1 by -1
  \repeat
  \pgfnodealias{#1}{}%
\egroup}

関連情報