![TikZ - 解释 3 维方阵行列式的计算](https://linux22.com/image/416001/TikZ%20-%20%E8%A7%A3%E9%87%8A%203%20%E7%BB%B4%E6%96%B9%E9%98%B5%E8%A1%8C%E5%88%97%E5%BC%8F%E7%9A%84%E8%AE%A1%E7%AE%97.png)
我想展示计算 3 维方阵行列式的经典技巧。这是我最初的代码。
\documentclass{article}
\usepackage{tikz}
\usepackage{nicematrix}
\begin{document}
$\begin{NiceArray}{|CCC|CC}
a & b & c & a & b \\
r & s & t & r & s \\
x & y & z & x & y
%
\CodeAfter
%
\tikz\draw[blue] (1-1.south east) -- (3-3.south east) ;
\end{NiceArray}$
\end{document}
这是不需要的输出。
我希望路径被文本隐藏,就像下面的一样,并且我需要线条更长,如下图所示。
答案1
最简单的可能性是在相应的条目上添加一个填充为白色的节点。这可行,但前提是页面背景为白色(屏幕截图中不是白色)。所以我们需要避免在某些延伸部分绘制线条。有几种可能性,其中我重点关注剪辑和交叉点。
您可以使用even odd clip
。因此,我们首先通过 找到入口的边界路径fit
,然后使用该路径和某个大矩形执行奇偶裁剪。遮挡区域的大小取决于节点inner sep
的fit
。拟合圆之外和大框内的所有内容都将可见。
\documentclass{article}
\usepackage{tikz}
\usepackage{nicematrix}
\usetikzlibrary{fit}
\tikzset{% https://tex.stackexchange.com/a/76216
even odd clip/.code={\pgfseteorule}}
\makeatletter
\tikzset{% https://tex.stackexchange.com/a/38995
reuse path/.code={\pgfsyssoftpath@setcurrentpath{#1}}
}
\makeatother
\begin{document}
$\begin{NiceArray}{|CCC|CC}
a & b & c & a & b \\
r & s & t & r & s \\
x & y & z & x & y
%
\CodeAfter
\begin{tikzpicture}
\node[inner sep=0.5pt,circle,fit=(1-1),save path=\pathA]{};
\clip[even odd clip,reuse path=\pathA] ([xshift=-1cm,yshift=1cm]1-1)
rectangle ([xshift=1cm,yshift=-1cm]3-3);
\draw[semithick,blue,-latex,shorten <=-0.8em,shorten >=-0.8em]
(1-1.center) -- (3-3.center);
\end{tikzpicture}
\end{NiceArray}$
\end{document}
因此,如果需要的话,可以省去所有条目。
\documentclass{article}
\usepackage{tikz}
\usepackage{nicematrix}
\usetikzlibrary{arrows.meta,fit}
\tikzset{% https://tex.stackexchange.com/a/76216
even odd clip/.code={\pgfseteorule}}
\makeatletter
\tikzset{% https://tex.stackexchange.com/a/38995
reuse path/.code={\pgfsyssoftpath@setcurrentpath{#1}}
}
\makeatother
\begin{document}
$\begin{NiceArray}{|CCC|CC}
a & b & c & a & b \\
r & s & t & r & s \\
x & y & z & x & y
%
\CodeAfter
\begin{tikzpicture}
\node[inner sep=0.5pt,circle,fit=(1-1),save path=\pathA]{};
\node[inner sep=0.5pt,circle,fit=(2-2),save path=\pathB]{};
\node[inner sep=0.5pt,circle,fit=(3-3),save path=\pathC]{};
\clip[even odd clip,reuse path=\pathA] ([xshift=-1cm,yshift=1cm]1-1)
rectangle ([xshift=1cm,yshift=-1cm]3-3);
\clip[even odd clip,reuse path=\pathB] ([xshift=-1cm,yshift=1cm]1-1)
rectangle ([xshift=1cm,yshift=-1cm]3-3);
\clip[even odd clip,reuse path=\pathC] ([xshift=-1cm,yshift=1cm]1-1)
rectangle ([xshift=1cm,yshift=-1cm]3-3);
\draw[semithick,blue,-{Latex[round,length=3.5pt]},shorten <=-0.8em,shorten >=-0.8em]
(1-1.center) -- (3-3.center);
\end{tikzpicture}
\end{NiceArray}$
\end{document}
或者,也可以使用交叉口。1
\documentclass{article}
\usepackage{tikz}
\usepackage{nicematrix}
\usetikzlibrary{fit,intersections}
\begin{document}
$\begin{NiceArray}{|CCC|CC}
a & b & c & a & b \\
r & s & t & r & s \\
x & y & z & x & y
%
\CodeAfter
\begin{tikzpicture}
\node[inner sep=0.5pt,circle,fit=(1-1),draw,opacity=0,name path=circ1]{};
\path (1-1.center) -- (3-3.center)
coordinate[pos=-0.2] (start) coordinate[pos=1.2] (end);
\path[name path=line] (start) to[bend left=0] (end);
\draw[semithick,blue,-latex,name intersections={of=line and circ1,total=\t}]
(start) -- \ifnum\t=2 (intersection-1) (intersection-2) --\fi
(end);
\end{tikzpicture}
\end{NiceArray}$
\end{document}
如果您想要省去几个条目,可以使用循环。
\documentclass{article}
\usepackage{tikz}
\usepackage{nicematrix}
\usetikzlibrary{arrows.meta,fit,intersections}
\begin{document}
$\begin{NiceArray}{|CCC|CC}
a & b & c & a & b \\
r & s & t & r & s \\
x & y & z & x & y
%
\CodeAfter
\begin{tikzpicture}
\foreach \X in {1,2,3}{
\node[inner sep=0.5pt,circle,fit=(\X-\X),draw,opacity=0,
name path global=circ\X]{};
}
\path (1-1.center) -- (3-3.center)
coordinate[pos=-0.2] (start) coordinate[pos=1.2] (end);
\path[name path=line] (start) to[bend left=0] (end);
\draw[semithick,blue,-{Latex[round,length=3.5pt]},
name intersections={of=line and circ1,name=i1,total=\tA},
name intersections={of=line and circ2,name=i2,total=\tB},
name intersections={of=line and circ3,name=i3,total=\tC},
]
(start) -- \ifnum\tA=2
(i1-1) (i1-2) --\fi
\ifnum\tB=2
(i2-1) (i2-2) --\fi
\ifnum\tC=2
(i3-1) (i3-2) --\fi
(end);
\end{tikzpicture}
\end{NiceArray}$
\end{document}
1如果您认为我疯了,因为我用:画了一条直线,bend=0
原因是否则对交叉点进行排序会更加困难:https://tex.stackexchange.com/a/418650。