NoMWE abaixo, eu defini
\def\MaxRow{3}
\def\MaxColumn{4}
o que significa que esse código não funcionará se eu adicionar uma linha ou coluna à matriz sem ajustar também as constantes \MaxRow
e \MaxColumn
. Existe uma maneira fácil de determinar
- o número máximo de linhas e
- o número máximo de colunas
de um matrix of math nodes
?
No código abaixo estou traçando uma linha entre a entrada sudoeste e a entrada nordeste.
Código:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\def\MaxRow{3}
\def\MaxColumn{4}
\begin{document}
\begin{tikzpicture}
\matrix (m) [
matrix of math nodes,
]{
1 & 2 & 3 & a\\
4 & 5 & 6 & b\\
7 & 8 & 9 & c\\
};
%% How to determine \MaxRow and \MaxColumn here?
\draw [red, thick, -latex](m-\MaxRow-1.south west) -- (m-1-\MaxColumn.north east);
\end{tikzpicture}
\end{document}
Responder1
Para minha surpresa, é tão fácil quanto usar as contagens internas \pgfmatrixcurrentrow
e \pgfmatrixcurrentcolumn
elas não são zeradas após a construção da matriz.
Claro, estes valores só são válidos até que a próxima matriz seja construída.
Como alternativa, adicionei uma matrix with last
chave que configura matrizes para que depois da matriz
<matrix name>-<row>-Z
faz referência ao último nó em row<row>
,<matrix name>-Z-<column>
faz referência ao último nó na coluna<column>
e<matrix name>-Z-Z
faz referência ao último nó da matriz.
(Isso se aplica a todos os nós dentro de uma célula, portanto não é tão simples para matrizes mais complexas.)
Código
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\newcommand*\MaxRow{\the\pgfmatrixcurrentrow}
\newcommand*\MaxColumn{\the\pgfmatrixcurrentcolumn}
\tikzset{
matrix with last/.default=Z,
matrix with last/.style={
every matrix/.append style={
nodes={
alias=\tikzmatrixname-\the\pgfmatrixcurrentrow-#1,
alias=\tikzmatrixname-#1-\the\pgfmatrixcurrentcolumn,
alias=\tikzmatrixname-#1-#1}}}}
\begin{document}
\begin{tikzpicture}
\matrix (m) [
matrix of math nodes,
matrix with last
]{
1 & 2 & 3 & a\\
4 & 5 & 6 & b\\
7 & 8 & 9 & c\\
};
\draw[red, thick, -latex](m-\MaxRow-1.south west) -- (m-1-\MaxColumn.north east);
\draw[blue, bend left] (m-Z-1.south west) to (m-1-Z.north east) to (m-Z-Z.center);
\end{tikzpicture}
\end{document}
Responder2
Para informação, existe uma maneira de criar tal figura com nicematrix
(e TikZ para desenhar a seta).
\documentclass{article}
\usepackage{nicematrix,tikz}
\begin{document}
$\begin{NiceMatrix}
1 & 2 & 3 & a \\
4 & 5 & 6 & b \\
7 & 8 & 9 & c
\CodeAfter
\tikz \draw [red,thick,-latex] (last-|1) -- (1-|last) ;
\end{NiceMatrix}$
\end{document}