
Considere la siguiente matriz
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 \pgfmatrixcurrentrow
y \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}
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}