Fehler bei der Verwendung von tikz \node, \subnode

Fehler bei der Verwendung von tikz \node, \subnode

Im folgenden Code werden die gefundenen LösungenHier, ich versuche, die Optionen \nodeund zu verwenden \subnode, um den Pfeil zu zeichnen, aber ich kann die Datei nicht kompilieren. Können Sie mir helfen, den Code zu korrigieren, damit der Pfeil auf den Text und die hervorgehobene Zelle zeigt, wie hierBildbeschreibung hier eingeben

Hier ist der Code:

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

Antwort1

Das Problem mit dem Code ist also, dass er \subnodenie definiert ist. Sie können ihn definieren, indem Sie die tikzmarkBibliothek laden. Allerdings \newcommand\tikzmark...schlägt dann fehl, da die Bibliothek den Standardbefehl definiert \tikzmark. Dieses Problem kann vermieden werden, indem Sie einfach einen anderen Makronamen wählen, z. B. \mytikzmark.

Sie können jedoch nicht \mytikzmarkoder innerhalb eines Knotens innerhalb eines TikZ-Bildes verwenden. Tatsächlich ist \tikzmarkdie Daseinsberechtigung von in diesem Kontext genau deshalb gegeben, weil s dort nicht verwendet werden kann.\subnodetikzmark

Sie können also entweder die umgebende TikZ-Bildumgebung verwenden \mytikzmarkoder ohne. Oder Sie können s innerhalb einer verwenden.\tikzmark\subnode

Hier ist ein Vergleich der beiden Methoden:

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

Unterknoten und Tikzmarks

Angesichts Ihrer aktualisierten Frage glaube ich nicht, dass Sie das \subnodeüberhaupt wollen. Warum verwenden Sie nicht einfach die Noten, die Sie bereits haben?

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

Verwenden Sie vorhandene Markierungen, um Anmerkungen hinzuzufügen

Antwort2

Folgendes können Sie mit der Umgebung {bNiceArray}von tun nicematrix(mit der neuesten Version: v. 5.12 vom 10.03.2021).

{array}Diese Umgebung ist (von ) ähnlich, arrayerstellt jedoch PGF/Tikz-Knoten unter den Zellen, Zeilen und Spalten.

Ich habe diese Knoten verwendet, um den Pfeil und seine Beschriftung zu zeichnen. Für die hervorgehobene Spalte gibt es einen integrierten Befehl, der \Blockeinfach zu verwenden ist (Sie benötigen keine Transparenz).

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

Sie benötigen mehrere Kompilierungen (da nicematrixPGF/Tikz-Knoten verwendet werden).

Ausgabe des obigen Codes

verwandte Informationen