아래 코드에서 찾은 솔루션 구축여기\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를 사용할 수 없기 때문에 \tikzmark
raison d'être를 이 문맥에서 사용하는 것입니다.\subnode
tikzmark
따라서 주변 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}
\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}
nicematrix
PGF/tikz 노드를 사용하기 때문에 여러 컴파일이 필요합니다 .