Ist es möglich, auf die letzte Spalte einer Tikz-Matrix zu verweisen?

Ist es möglich, auf die letzte Spalte einer Tikz-Matrix zu verweisen?

Betrachten Sie die folgende Matrix

Bildbeschreibung hier eingeben

Diese Matrix wurde mit dem Code

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

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

\end{tikzpicture}

Der Punkt an der Position (1, 4) wurde mit gesetzt \node at (m-1-4) {\textbullet};.

Ich möchte dieser Matrix möglicherweise Spalten hinzufügen, aber der Punkt soll in der letzten Spalte bleiben. Ich bin neugierig, ob es möglich ist, mit einer Syntax wie programmgesteuert auf die letzte Spalte dieser Matrix zu verweisen \node at (m-1-last column index) {\textbullet};. Ist das möglich?

Antwort1

pgf enthält die Zählungen \pgfmatrixcurrentrowund \pgfmatrixcurrentcolumn, die zurückgesetzt werden, wenn Sie eine neue Matrix starten. Wenn Sie also die Zählungen direkt nach einer Matrix überprüfen, enthalten sie die Anzahl der Zeilen und Spalten. Andernfalls können Sie sie in Makros speichern. In Ihrem Beispiel benötigen Sie jedoch nur

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

Bildbeschreibung hier eingeben

Wenn die Anzahl der Spalten kleiner als das Maximum in der letzten Zeile ist, schlägt die obige Methode fehl. Für diesen Fall können Sie Stile definieren. Ab pgf-Version 3.1.6 gibt es eine Methode, mit der Sie die Ergebnisse aus dem Pfad schmuggeln können. Sie können diese dann nach Verwendung eines geeigneten Pops abrufen.

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

Alternativ können Sie neue Zählungen einführen.

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

Schließlich müssen Sie die Nummer nicht explizit kennen.

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

Antwort2

Streng genommen ist dies keine Antwort auf die Frage, aber vielleicht interessiert es einige Leute, dass diese Funktion direkt in den Umgebungen von nicematrix(die PGF/Tikz-Knoten unter den Zellen der Matrix erstellen) verfügbar ist.

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

\begin{document}

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

\end{document}

Ausgabe des obigen Codes

verwandte Informationen