在下面的代码中,基于找到的解决方案这里,我尝试使用\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
或\tikzmark
。事实上, 的存在理由正是因为不能在那里使用 而\subnode
在此上下文中使用。tikzmark
因此,您可以使用\mytikzmark
或\tikzmark
不使用周围的 TikZ 图片环境。或者,您可以\subnode
在其中一个中使用 s。
以下是两种方法的比较:
\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}
该环境与(的)类似,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 节点)。