Ошибка при использовании tikz \node, \subnode

Ошибка при использовании tikz \node, \subnode

В приведенном ниже коде, построенном на основе найденных решенийздесь, я пытаюсь использовать параметры \nodeи \subnodeдля рисования стрелки, но не могу скомпилировать файл. Можете ли вы помочь мне исправить код, чтобы стрелка указывала на текст и выделенную ячейку, как здесьвведите описание изображения здесь

Вот код:

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

решение1

Итак, проблема с кодом в том, что \subnodeон никогда не определен. Вы можете определить его, загрузив tikzmarkбиблиотеку. Однако \newcommand\tikzmark...затем произойдет сбой, поскольку библиотека определяет стандартную \tikzmarkкоманду. Эту проблему можно избежать, просто выбрав другое имя макроса, например \mytikzmark.

Однако вы не можете использовать \mytikzmarkили \tikzmarkвнутри узла внутри картинки TikZ. Действительно, смысл существования \subnodeзаключается в использовании в этом контексте именно потому, что tikzmarks не может быть использовано там.

Таким образом, вы можете использовать \mytikzmarkили \tikzmarkбез окружающей среды TikZ picture. Или вы можете использовать \subnodes внутри одной.

Вот сравнение двух методов:

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

подузлы и тикзмарки

Учитывая ваш обновленный вопрос, я не думаю, что вы хотите \subnodeвообще. Почему бы просто не использовать те отметки, которые у вас уже есть?

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

используйте существующие отметки для добавления аннотации

решение2

Вот что вы можете сделать с окружением {bNiceArray}( nicematrixпоследняя версия: v. 5.12 от 10.03.2021).

Эта среда похожа на {array}(из array), но создает узлы PGF/Tikz под ячейками, строками и столбцами).

Я использовал эти узлы, чтобы нарисовать стрелку и ее метку. Для выделенного столбца есть встроенная команда, которую \Blockлегко использовать (вам не нужна прозрачность).

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

Вам потребуется несколько компиляций (т.к. nicematrixиспользуются узлы PGF/tikz).

вывод кода выше

Связанный контент