tikz-matrices 会被“遗忘”吗?

tikz-matrices 会被“遗忘”吗?

tikz我对矩阵名称的“持久性”存在问题。

考虑两个矩阵:

在此处输入图片描述

这些矩阵是使用以下代码生成的:

\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}

两个矩阵是在不同的tikzpicture环境中构建的,左边的矩阵名为m,右边的矩阵名为a

第二个命令tikzpicture引用了\draw前一个矩阵中的节点tikzpicture。我实际上希望此代码抛出错误,因为此代码tikzpicture没有名为的矩阵m

是否可以要求tikz“忘记”矩阵m

答案1

严格来说,这不是对 OP 问题的回答,但它可能有用。

由于 OP 使用 Tikz 库matrix,他应该看一下nicematrix。该扩展的环境为矩阵的每个单元创建带有 Tikz 节点的矩阵(以及用于潜在规则位置的 Tikz 节点,而 Tikz 模块matrix不会这样做)。

可以使用行和列i-j中单元格节点的语法来使用这些节点。没有矩阵的名称(这些名称仅在当前矩阵中有效,即在当前环境中有效)。ij

因此,不存在意外引用另一个矩阵中的节点的风险。

例如,对于以下代码,我们将出现错误,因为当前矩阵中没有节点1-4(前一个矩阵中有一个节点,但不会干扰)。

\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

tikzpictureZ 所有坐标都是全局的。因此,即使您开始新的页面或转到下一页,也不会忘记它们。所以答案是否定的。您可以通过安装一些坐标前缀来创建产生错误消息的机制。这里有一个代码,它在每个 中安装一个唯一的前缀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}

相关内容