![tikz-matrices 会被“遗忘”吗?](https://linux22.com/image/423909/tikz-matrices%20%E4%BC%9A%E8%A2%AB%E2%80%9C%E9%81%97%E5%BF%98%E2%80%9D%E5%90%97%EF%BC%9F.png)
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
中单元格节点的语法来使用这些节点。没有矩阵的名称(这些名称仅在当前矩阵中有效,即在当前环境中有效)。i
j
因此,不存在意外引用另一个矩阵中的节点的风险。
例如,对于以下代码,我们将出现错误,因为当前矩阵中没有节点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
钛钾tikzpicture
Z 所有坐标都是全局的。因此,即使您开始新的页面或转到下一页,也不会忘记它们。所以答案是否定的。您可以通过安装一些坐标前缀来创建产生错误消息的机制。这里有一个代码,它在每个 中安装一个唯一的前缀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}