¿Es posible hacer referencia a la última columna de una matriz tikz?

¿Es posible hacer referencia a la última columna de una matriz tikz?

Considere la siguiente matriz

ingrese la descripción de la imagen aquí

Esta matriz fue producida con el código

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

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

\end{tikzpicture}

El punto en la posición (1, 4) se colocó con \node at (m-1-4) {\textbullet};.

Es posible que desee agregar columnas a esta matriz, pero quiero que el punto permanezca en la última columna. Tengo curiosidad por saber si es posible hacer referencia mediante programación a la última columna de esta matriz con una sintaxis como \node at (m-1-last column index) {\textbullet};. es posible?

Respuesta1

pgf tiene los recuentos \pgfmatrixcurrentrowy \pgfmatrixcurrentcolumn, que se restablecen cada vez que inicia una nueva matriz. Entonces, si inspecciona los recuentos justo después de una matriz, contendrán el número de filas y columnas. De lo contrario, puedes almacenarlos en macros. Sin embargo, en su ejemplo solo necesita

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

ingrese la descripción de la imagen aquí

Si el número de columnas es menor que el máximo en la última fila, el método anterior falla. Puede definir estilos para este caso. A partir de la versión 3.1.6 de pgf, existe un método que le permite sacar los resultados de contrabando de la ruta. Luego podrás recuperarlos después de usar algún pop apropiado.

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

Alternativamente puede introducir nuevos recuentos.

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

Por último, no es necesario que conozca el número explícitamente.

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

Respuesta2

Estrictamente hablando, esto no es una respuesta a la pregunta, pero tal vez algunas personas estén interesadas en ver que esta característica está disponible directamente en los entornos de nicematrix(que crean nodos PGF/Tikz debajo de las celdas de la matriz).

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

\begin{document}

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

\end{document}

Salida del código anterior

información relacionada