是否可以引用 tikz 矩阵的最后一列?

是否可以引用 tikz 矩阵的最后一列?

考虑以下矩阵

在此处输入图片描述

该矩阵由代码生成

\begin{tikzpicture}
  \matrix[
  , matrix of nodes
  , left delimiter={[},right delimiter = {]}
  ] (m)
  {
    * & * & * & * \\
    * & * & * & * \\
    * & * & * & * \\
  };

  \node at (m-2-4) {\textbullet};

\end{tikzpicture}

(1, 4) 位置上的点被放置在\node at (m-1-4) {\textbullet};

我可能想向这个矩阵添加列,但我希望点保留在最后一列。我很好奇是否可以使用类似这样的语法以编程方式引用此矩阵的最后一列\node at (m-1-last column index) {\textbullet};。这可能吗?

答案1

pgf 具有计数\pgfmatrixcurrentrow\pgfmatrixcurrentcolumn,每当您启动新矩阵时,它们都会重置。因此,如果您在矩阵之后立即检查计数,它们将包含行数和列数。否则,您可以将它们存储在宏中。但是,在您的示例中,您只需要

\documentclass[tikz,border=3mm]{standalone}

\usetikzlibrary{matrix}

\begin{document}
\begin{tikzpicture}
  \matrix[
  , matrix of nodes
  , left delimiter={[},right delimiter = {]}
  ] (m)
  {
    * & * & * & * \\
    * & * & * & * \\
    * & * & * & * \\
  };

  \node at (m-2-\the\pgfmatrixcurrentcolumn) {\textbullet};

\end{tikzpicture}
\end{document}

在此处输入图片描述

如果最后一行的列数小于最大值,则上述方法会失败。您可以为这种情况定义样式。从 pgf 版本 3.1.6 开始,有一种方法允许您将结果偷运出路径。然后您可以在使用一些适当的 pop 后检索它们。

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\makeatletter
\tikzset{record number of columns in/.style={execute at end matrix={%
\edef#1{\the\pgf@matrix@numberofcolumns}%
\pgfutil@pushmacro#1}},
record number of rows in/.style={execute at end matrix={%
\edef#1{\the\pgfmatrixcurrentrow}%
\pgfutil@pushmacro#1}}
}
\newcommand\pgfpop[1]{\pgfutil@popmacro#1}
\makeatother
\begin{document}
\begin{tikzpicture}
  \matrix[matrix of nodes,
  left delimiter={[},right delimiter = {]},
  record number of columns in=\mycols,
  record number of rows in=\myrows
  ] (m)
  {
    * & * & * & * \\
    * & * & * & * \\
    * & * & * & * \\
  };
  \pgfpop\mycols
  \pgfpop\myrows
  \node[anchor=center] at (m-2-\mycols.center) {\textbullet};
\end{tikzpicture}
\end{document}

或者,您可以引入新的计数。

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\newcount\tikzmatrixrows
\newcount\tikzmatrixcols
\makeatletter
\tikzset{record matrix dimensions/.style={execute at end matrix={%
\global\tikzmatrixcols=\pgf@matrix@numberofcolumns
\global\tikzmatrixrows=\pgfmatrixcurrentrow}}}
\makeatother
\begin{document}
\begin{tikzpicture}
  \matrix[matrix of nodes,
  left delimiter={[},right delimiter = {]},
  record matrix dimensions
  ] (m)
  {
    * & * & * & * \\
    * & * & * & * \\
    * & * & * & * \\
  };
  \node[anchor=center] at (m-2-\the\tikzmatrixcols.center) {\textbullet};
\end{tikzpicture}
\end{document}

最后,您不需要明确知道这个数字。

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
  \matrix[matrix of nodes,nodes={alias=m-\the\pgfmatrixcurrentrow-last},
  left delimiter={[},right delimiter = {]}
  ] (m)
  {
    * & * & * & * \\
    * & * & * & * \\
    * & * & * & * \\
  };

  \node at (m-2-last) {\textbullet};

\end{tikzpicture}
\end{document}

答案2

严格来说,这不是问题的答案,但也许有些人会感兴趣看到这个功能直接在环境中可用nicematrix(在矩阵的单元下创建 PGF/Tikz 节点)。

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

\begin{document}

$\begin{pNiceMatrix}
    * & * & * & * \\
    * & * & * & * \\
    * & * \\
\CodeAfter 
\tikz \node at (1-last) {$\bigcirc$};
\end{pNiceMatrix}$

\end{document}

上述代码的输出

相关内容