\documentclass[border=5cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix, positioning, calc}
\begin{document}
\tikzset{every matrix/.style={matrix of math nodes, left delimiter=|, right delimiter=|, column sep=1.5em, row sep=1.5em, nodes={inner sep=0.3ex}}}
\newcommand{\mycenter}[4]{ \path (#1)--coordinate[pos=0.5](a)(#2) (#1)--coordinate[pos=0.5](b)(#3); \coordinate (#4) at (b-|a); }
\begin{tikzpicture}[rounded corners, text=black, draw=gray!70]
\matrix (Mb) {
a_{11} & a_{12} & a_{13} \\
a_{21} & a_{22} & a_{23} \\
a_{31} & a_{32} & a_{33} \\
};
\draw[red] (Mb-1-1)--(Mb-2-2)--(Mb-3-3);
\mycenter{Mb-1-2}{Mb-1-3}{Mb-2-2}{myc} \mycenter{Mb-2-2}{Mb-2-3}{Mb-3-2}{myc2}
\draw[red] (Mb-1-2)--(Mb-2-3)--($(Mb-3-2)!2!(Mb-3-3)$)--($(myc)!3!(myc2)$) coordinate(x2)--(Mb-3-1);
\coordinate (a14) at ($(Mb-1-2)!2!(Mb-1-3)$); \mycenter{Mb-1-3}{a14}{Mb-2-3}{myd} \coordinate (myd2) at (myc2 -| myd);
\draw[red] (Mb-2-1)--(Mb-3-2)--($(myd)!3!(myd2)$) coordinate(x1)--($(Mb-3-2)!3!(Mb-3-3)$)--(Mb-1-3);
\draw[densely dashed,blue] (Mb-1-3)--(Mb-2-2)--(Mb-3-1);
\coordinate (x3) at ($(x1)!2!(x2)$); \coordinate (x4) at ($(x1)!3!(x2)$);
\draw[densely dashed,blue] (Mb-1-2)--(Mb-2-1)--($(Mb-3-2)!2!(Mb-3-1)$)--(x3)--(Mb-3-3);
\draw[densely dashed,blue] (Mb-2-3)--(Mb-3-2)--(x4)--($(Mb-3-2)!3!(Mb-3-1)$)--(Mb-1-1);
\end{tikzpicture}
\end{document}
一模一样的问题,图都是一样的
https://www.zhihu.com/question/525613625/answer/2420699577
用TikZ的matrix库结合tkz-euclide宏包作了一个实现,代码不够优雅,希望大家一起讨论。
\documentclass{article}
\usepackage{tkz-euclide}
\usetikzlibrary{positioning}
\usetikzlibrary{matrix}
% 将TikZ坐标名称转换为tkz坐标名称
\newcommand{\CopyPointToTKZ}[2]{%
\path (#1);
\pgfgetlastxy{\macrox}{\macroy}
\pgfmathsetmacro{\macroxcm}{\macrox/1cm}
\pgfmathsetmacro{\macroycm}{\macroy/1cm}
\tkzDefPoint(\macroxcm,\macroycm){#2}
}
\begin{document}
\begin{tikzpicture}
\node (d) at (0,0) {$D=$};
\matrix (m) [%
matrix of math nodes,
nodes in empty cells,
left delimiter=|,
right delimiter=|,
nodes={anchor=center,minimum size=2em},
right= 0.1 of d, % 应该使用相对坐标
] {%
a_{11} & a_{12} & a_{13}\\
a_{21} & a_{22} & a_{23}\\
a_{31} & a_{32} & a_{33}\\
};
% \draw (m-1-1.center) rectangle (m-3-3.center);
% 将TikZ坐标标记转换为tkz坐标标记
\foreach \i in {1,2,...,3}{%
\foreach \j in {1,2,...,3}{%
\CopyPointToTKZ{m-\i-\j.center}{M_\i_\j}
}
}
% 定义主对角线方向的平行线及求各个交点
\foreach \i [count=\j from 4] in {2,3}{%
\tkzDefLine[parallel=through M_1_\i](M_1_1,M_3_3)
\tkzGetPoint{p}
\tkzInterLL(M_1_\i,p)(M_3_1,M_3_3)
\tkzGetPoint{M_3_\j}
}
\foreach \i [count=\j from 4, count=\k from 3] in {3,2}{%
\tkzDefLine[parallel=through M_\i_1](M_1_1,M_3_3)
\tkzGetPoint{p}
\tkzDefLine[parallel=through M_3_\j](M_3_1,M_1_3)
\tkzGetPoint{q}
\tkzInterLL(M_3_\j,q)(M_\i_1,p)
\tkzGetPoint{M_4_\k}
}
% 定义副对角线方向的平行线及求各个交点
\foreach \i [count=\j from 6] in {1,2}{%
\tkzDefLine[parallel=through M_1_\i](M_3_1,M_1_3)
\tkzGetPoint{p}
\tkzInterLL(M_1_\i,p)(M_3_1,M_3_3)
\tkzGetPoint{M_3_\j}
}
\foreach \i [count=\j from 6, count=\k from 1] in {2,3}{%
\tkzDefLine[parallel=through M_\i_3](M_3_1,M_1_3)
\tkzGetPoint{p}
\tkzDefLine[parallel=through M_3_\j](M_1_1,M_3_3)
\tkzGetPoint{q}
\tkzInterLL(M_3_\j,q)(M_\i_3,p)
\tkzGetPoint{M_4_\k}
}
% 绘制主对角线方向
\foreach \i [count=\j from 3] in {1,2,3}{%
\tkzDrawSegment[thick, red](M_1_\i,M_3_\j)
}
\foreach \i [count=\j from 3] in {3,2}{%
\tkzDrawSegment[thick, red](M_\i_1,M_4_\j)
}
\foreach \i [count=\j from 3] in {4,5}{%
\tkzDrawSegment[thick, red](M_3_\i,M_4_\j)
}
% 绘制副对角线方向
\foreach \i [count=\j from 6] in {1,2}{%
\tkzDrawSegment[thick, blue, dashed](M_1_\i,M_3_\j)
}
\tkzDrawSegment[thick, blue, dashed](M_1_3,M_3_1)
\foreach \i [count=\j from 1] in {2,3}{%
\tkzDrawSegment[thick, blue, dashed](M_\i_3,M_4_\j)
}
\foreach \i [count=\j from 1] in {6,7}{%
\tkzDrawSegment[thick, blue, dashed](M_3_\i,M_4_\j)
}
\end{tikzpicture}
\end{document}
实现结果如下:
借楼:
在QQ群中恰有一位朋友的类似需求如下:
这里总结一些我的尝试和搜罗到的解答,也希望@u78 老师能做点补充:
尝试基于tikz
的matrix
库,利用网格化的node
定位确保平行...但缺陷也是有的,不好方便地控制「斜线倾斜的角度」
\documentclass[tikz,border=3pt]{standalone}
\usepackage{amsmath}
\usepackage{newpxmath}
\usetikzlibrary{matrix}
\usetikzlibrary{ext.positioning-plus}
\newcommand\blind{\phantom{a_{11}}}
\begin{document}
\begin{tikzpicture}[line cap=round]
\matrix (det) [matrix of math nodes,nodes={circle}]
{
\blind & \blind & a_{11} & a_{12} & a_{13} & \blind & \blind \\
\blind & \blind & a_{21} & a_{22} & a_{23} & \blind & \blind \\
\blind & \blind & a_{31} & a_{32} & a_{33} & \blind & \blind \\
\blind & \blind & \blind & \blind & \blind & \blind & \blind \\
};
\draw[blue,dashed,thick] (det-1-3.center) -- (det-3-1.center) -- (det-4-3.ext_corner south west) -- (det-2-5.center);
\draw[blue,dashed,thick] (det-1-4.center) -- (det-3-2.center) -- (det-4-4.ext_corner south west) -- (det-3-5.center);
\draw[blue,dashed,thick] (det-1-5.center) -- (det-3-3.center);
\draw[red,thick] (det-1-4.center) -- (det-3-6.center) -- (det-4-5.ext_corner south west) -- (det-3-3.center);
\draw[red,thick] (det-1-5.center) -- (det-3-7.center) -- (det-4-6.ext_corner south west) -- (det-3-4.center);
\draw[red,thick] (det-1-3.center) -- (det-3-5.center);
\draw[thick]
(det-1-3.ext_corner north west) -- (det-3-3.ext_corner south west)
(det-1-5.ext_corner north east) -- (det-3-5.ext_corner south east)
;
\end{tikzpicture}
\end{document}
基于nicematrix
的\CodeAfter
.
感谢@u98900 提出的思路:为了避免使用「绝对坐标」调整,使用calc
计算「差向量」来辅助定位以保证绝对的平行.
\documentclass{article}
\usepackage{newpxmath}
\usepackage{nicematrix}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\setlength{\extrarowheight}{1mm}
\[
D = \begin{vNiceMatrix}
a_{11} & a_{12} & a_{13}\\
a_{21} & a_{22} & a_{23}\\
a_{31} & a_{32} & a_{33}\\
\CodeAfter
\begin{tikzpicture}[line cap=round]
\coordinate (vec1) at ($(3-3.center)-(1-1.center)$);
\coordinate (vec2) at ($(3-1.center)-(1-3.center)$);
\draw[blue,dashed,thick] (1-3.center) -- (3-1.center);
\draw[blue,dashed,thick] (1-1.center) -- ++(vec2) -- ++($.75*(vec1)$) -- (2-3.center);
\draw[blue,dashed,thick] (1-2.center) -- ++(vec2) -- ++($.75*(vec1)$) -- (3-3.center);
\draw[red,thick] (1-1.center) -- (3-3.center);
\draw[red,thick] (1-2.center) -- ++(vec1) -- ++($.75*(vec2)$) -- (3-1.center);
\draw[red,thick] (1-3.center) -- ++(vec1) -- ++($.75*(vec2)$) -- (2-1.center);
\end{tikzpicture}
\end{vNiceMatrix}
\]
\end{document}
耿楠老师曾经说过:
一锤子买卖的话,没必要用代码,咋画都行。
如果后期需要维护,需要微调,需要大量复制,我建议还是上代码。
如果追求的是自由和乐趣,那就用代码思考人生。
基于nicematrix
做了一点小小的自动化,如下:
% https://ask.latexstudio.net/ask/question/17826.html
\documentclass{article}
\usepackage{newpxmath}
\usepackage{nicematrix}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\pagestyle{empty}
\setlength{\extrarowheight}{1.5mm}
\ExplSyntaxOn
\def\N{8}
\def\ratio{\fpeval{\N/(2*(\N-1))}}
\[
\begin{vNiceMatrix}
% \c_math_subscript_token
\int_step_inline:nn {\N} {%
a\c_math_subscript_token{#11}%
\int_step_inline:nnn {2}{\N} {%
& a\c_math_subscript_token{#1{##1}}%
}%
\int_compare:nNnTF {#1} < {\N} {\\} {}%
}%
\CodeAfter%
\begin{tikzpicture}[line~cap=round]
% 定义主/副对角线的向量
\coordinate (main-vec) at ($(\N-\N.center)-(1-1.center)$);
\coordinate (secondary-vec) at ($(\N-1.center)-(1-\N.center)$);
% 处理副对角线方向的其他 \N-1 条虚线
\draw[orange,dashed,thick] (1-\N.center) -- (\N-1.center);
\int_step_inline:nn {\N-1} {
\draw[orange,dashed,thick,rounded~corners=5mm] (1-#1.center) --++(secondary-vec) --++($\ratio*(main-vec)$) -- (\int_eval:n{#1+1}-\N.center);
}
% 处理主对角线方向的其他 \N-1 条实线
\draw[magenta,thick] (1-1.center) -- (\N-\N.center);
\int_step_inline:nn {\N-1} {
\draw[magenta,thick,rounded~corners=5mm] (1-\int_eval:n{#1+1}.center) --++(main-vec) --++($\ratio*(secondary-vec)$) -- (\int_eval:n{\N-#1+1}-1.center);
}
\end{tikzpicture}
\end{vNiceMatrix}
\]
\ExplSyntaxOff
\end{document}
好的,多谢啦,我研究一下
@u7693 强烈建议补充你尝试成功的代码,在此做记录。
{{Tikz学习笔记.docx(uploading...)}}@u70550 已经搞定了
上一条回复也已经修改好了
@u7693 谢谢,就是文件的上传好像还不太成功,不过这个没太大关系。
Happy TikZing!