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.

그러나 TikZ 사진 내부의 노드 내부에는 \mytikzmark또는 를 사용할 수 없습니다 . 실제로 이 문맥에서는 s를 사용할 수 없기 때문에 \tikzmarkraison d'être를 이 문맥에서 사용하는 것입니다.\subnodetikzmark

따라서 주변 TikZ 사진 환경을 사용하거나 사용하지 않을 \mytikzmark수 있습니다 . \tikzmark아니면 하나 안에 s를 사용할 수도 있습니다 \subnode.

두 가지 방법을 비교하면 다음과 같습니다.

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

하위 노드 및 tikzmark

\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최신 버전: 2021-03-10의 v. 5.12).

{array}해당 환경은 (of ) 와 유사 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}

nicematrixPGF/tikz 노드를 사용하기 때문에 여러 컴파일이 필요합니다 .

위 코드의 출력

관련 정보