Error al usar tikz \node,\subnode

Error al usar tikz \node,\subnode

En el código siguiente, se encuentran soluciones basadas en la construcción.aquí, Estoy intentando usar las opciones \nodey \subnodepara dibujar la flecha, pero no puedo compilar el archivo. ¿Puedes ayudarme a corregir el código para que la flecha apunte al texto y a la celda resaltada de esta manera?ingrese la descripción de la imagen aquí

Aquí está el código:

\documentclass{article}
\usepackage{tikz}
\usepackage{blkarray}
\usetikzlibrary{fit,calc,arrows,shapes,decorations.pathreplacing,pgfplots.groupplots, matrix}
\tikzset{%
  highlight/.style={rectangle,rounded corners,fill=red!15,draw,
    fill opacity=0.5,thick,inner sep=0pt}
}
\newcommand{\tikzmark}[2]{\tikz[overlay,remember picture,
  baseline=(#1.base)] \node (#1) {#2};}
%
\newcommand{\Highlight}[1][submatrix]{%
    \tikz[overlay,remember picture]{
    \node[highlight,fit=(left.north west) (right.south east)] (#1) {};}
}
\begin{document}
\[
  M = \left(\begin{array}{*5{c}}
    \tikzmark{left}{1} & 2 & 3 & 4 & 5 \\
    6 & 7 & 8 & 9 & 10 \\
    11 & 12 & \tikzmark{right}{13} & 14 & 15 \\
    16 & 17 & 18 & 19 & 20
  \end{array}\right)
  \Highlight[first]
  \qquad
  M^T = \left(\begin{array}{*5{c}}
    \tikzmark{left}{1} & 6 & 11 & 16 \\
    2 & 7 & 12 & 17 \\
    3 & 8 & \tikzmark{right}{13} & 18 \\
    4 & 9 & 14 & 19 \\
    5 & 10 & 15 & 20
  \end{array}\right)
\]
\Highlight[second]
%
\tikz[overlay,remember picture] {
  \draw[->,thick,red,dashed] (first) -- (second) node [pos=0.66,above] {Transpose};
  \node[above of=first] {$N$};
  \node[above of=second] {$N^T$};
}

\[
\begin{blockarray}{ccccc}
x_{1} & x_{2} & x_{3} & x_{4} &  \\
\begin{block}{[cccc|c]}
  1 & 0 & \tikzmark{left}{-1} & 0 & 0 \\
  0 & 1 & 2 & 0 & 0 \\
  0 & 0 & \tikz{\node{\subnode{d1}\tikzmark{right}{0}};} & 1 & 0 \\
\end{block}
\end{blockarray}
\Highlight[new1]
\]

%\begin{tikzpicture}[remember picture,overlay]
%    \node [shift={(3.0em,-4.0ex)}, anchor=west] at ({pic cs:starta}) (X) {Tip measurement};
%    \draw [mybluei, thick, -latex] (X.west) -| ($({pic cs:starta})!0.5!({pic cs:enda})+(0,-0.5ex)$);
%\end{tikzpicture}

\end{document}

Respuesta1

Entonces el problema con el código es que \subnodenunca se define. Puede definirlo cargando la tikzmarkbiblioteca. Sin embargo, \newcommand\tikzmark...fallará ya que la biblioteca define el \tikzmarkcomando estándar. Este problema se puede evitar simplemente eligiendo un nombre de macro diferente, como \mytikzmark.

Sin embargo, no puedes usar \mytikzmarko \tikzmarkdentro de un nodo dentro de una imagen TikZ. De hecho, la razón de ser de \subnodees para usarse en este contexto precisamente porque tikzmarks no puede usarse allí.

Por lo tanto, puede utilizar \mytikzmarko \tikzmarkno el entorno de imagen TikZ circundante. O puedes usar \subnodes dentro de uno.

Aquí hay una comparación de los dos métodos:

\documentclass{article}
\usepackage{tikz}
\usepackage{blkarray}
\usetikzlibrary{fit,tikzmark}
\tikzset{%
  highlight/.style={rectangle,rounded corners,fill=red!15,draw, fill opacity=0.5,thick,inner sep=0pt}
}
\newcommand{\mytikzmark}[2]{\tikz[overlay,remember picture, baseline=(#1.base)] \node (#1) {#2};}

\newcommand{\Highlight}[1][submatrix]{%
    \tikz[overlay,remember picture]{
    \node[highlight,fit=(left.north west) (right.south east)] (#1) {};}
}
\begin{document}
\[
  \begin{blockarray}{ccccc}
    x_{1} & x_{2} & x_{3} & x_{4} &  \\
    \begin{block}{[cccc|c]}
      1 & 0 & \mytikzmark{left}{-1} & 0 & 0 \\
      0 & 1 & 2 & 0 & 0 \\
      0 & 0 & \tikz{\node{\subnode{d1}{d1}\subnode{right}{0}};} & 1 & 0 \\
    \end{block}
  \end{blockarray}
  \Highlight[new1]
\]
\tikz[remember picture,overlay]{%
  \node [fit=(d1), inner sep=-2.5pt, draw=blue, circle] {};
  \node [fit=(right), inner sep=-2.5pt, draw=green!50!black, circle] {};
}
\[
  \begin{blockarray}{ccccc}
    x_{1} & x_{2} & x_{3} & x_{4} &  \\
    \begin{block}{[cccc|c]}
      1 & 0 & \mytikzmark{left}{-1} & 0 & 0 \\
      0 & 1 & 2 & 0 & 0 \\
      0 & 0 & \mytikzmark{d1}{d1} \mytikzmark{right}{0} & 1 & 0 \\
    \end{block}
  \end{blockarray}
  \Highlight[new1]
\]
\tikz[remember picture,overlay]{%
  \node [fit=(d1), inner sep=-2.5pt, draw=blue, circle] {};
  \node [fit=(right), inner sep=-2.5pt, draw=green!50!black, circle] {};
}

\end{document}

subnodos y tikzmarks

Dada su pregunta actualizada, no creo que quiera \subnodenada. ¿Por qué no utilizar las marcas que ya tienes?

\documentclass{article}
\usepackage{tikz}
\usepackage{blkarray}
\usetikzlibrary{fit,arrows.meta}
\tikzset{%
  highlight/.style={rectangle,rounded corners,fill=red!15,draw, fill opacity=0.5,thick,inner sep=0pt}
}
\newcommand{\mytikzmark}[2]{\tikz[overlay,remember picture, baseline=(#1.base)] \node (#1) {#2};}

\newcommand{\Highlight}[1][submatrix]{%
    \tikz[overlay,remember picture]{
    \node[highlight,fit=(left.north west) (right.south east)] (#1) {};}
}
\begin{document}
\[
  \begin{blockarray}{ccccc}
    x_{1} & x_{2} & x_{3} & x_{4} &  \\
    \begin{block}{[cccc|c]}
      1 & 0 & \mytikzmark{left}{-1} & 0 & 0 \\
      0 & 1 & 2 & 0 & 0 \\
      0 & 0 & \mytikzmark{right}{0} & 1 & 0 \\
    \end{block}
  \end{blockarray}
  \Highlight[new1]
\]
\tikz[remember picture,overlay]{%
  \draw [LaTeX-] (new1.south) ++(0,-2.5pt) [out=-90,in=160] to ++(5mm,-10mm) node [right, xshift=-2.5mm, font=\itshape, text=red, align=center] {free\\variable};
}

\end{document}

usar marcas existentes para agregar anotaciones

Respuesta2

Esto es lo que puede hacer con el entorno {bNiceArray}de nicematrix(con la última versión: v. 5.12 del 10-03-2021).

Ese entorno es similar a {array}(de array) pero construye nodos PGF/Tikz debajo de las celdas, filas y columnas).

He usado estos nodos para dibujar la flecha y su etiqueta. Para la columna resaltada, hay un comando integrado \Blockfácil de usar (no necesita transparencia).

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

\begin{document}

$\begin{bNiceArray}{cccc|c}[first-row]
x_1 & x_2 & x_3 & x_4 \\
1   & 0   & \Block[draw,fill=red!10,rounded-corners]{3-1}{}-1  & 0  & 0 \\
0   & 1   & 2   & 0  & 0 \\
0   & 0   & 0   & 1  & 0 
\CodeAfter
\tikz
\draw [<-] (3-3.south) ++(0,-5pt) [out=-90,in=160] to ++(5mm,-10mm) 
    node [right, xshift=-2.5mm, font=\itshape, text=red, align=center] {free\\variable} ;
\end{bNiceArray}$

\end{document}

Necesita varias compilaciones (porque nicematrixusa nodos PGF/tikz).

salida del código anterior

información relacionada