20 LaTeX 中绘图的思维流程

发布于 2025-07-29 17:46:04

假期里家里面的小朋友在学习初中二年级的几何。学得磕磕碰碰,晚上回来后让我再把题目整理出来,重新做第二次,前面几张培训的卷子,我在空白纸上手绘了图形,但是发现也不够优雅和整齐。下午看论坛里,想试着看能不能用画图的宏包画,但想了半天发现无法了解用宏包画图的思维方式。在这里请教一下大佬们。

比如附图中的这个简单题目。

手绘的时候,我的思维是这样的:先画出来一条直线长度为4的线段AB → 画出来∠DAB和∠CBA → 画出∠DAB和∠CBA各自的角平分线(射线),取到交点E并裁掉射线多余的部分 → 过E点按照原图中的样子画直线DC → 把多余的线擦掉。

上面的流程我在CAD也是可以方便做出来的,但是非矢量图,在上面标注的字母大小比例就很不好安排。

大佬们可否就这张图用TiKz和tkz-euclide分别来讲述一下LaTeX里面画图的这个思维模式是什么样的。

不胜感谢!

image.png

查看更多

关注者
0
被浏览
134
Sagittarius Rover
Sagittarius Rover 13小时前
我要成为Typst糕手/(ㄒoㄒ)/~~

通用的绘图逻辑: 思考确定合适的思路/顺序 ➡ 定点 ➡ 连线 ➡ 标记

但是在实际操作时,由于写代码更多的是坐标来描述点的位置,因此想上面图中的D点和C点的坐标并不好精确确定,这个时候一般靠抖机灵吧

先看看你的思路:

手绘的时候,我的思维是这样的:先画出来一条直线长度为4的线段AB → 画出来∠DAB和∠CBA → 画出∠DAB和∠CBA各自的角平分线(射线),取到交点E并裁掉射线多余的部分 → 过E点按照原图中的样子画直线DC → 把多余的线擦掉

是可以做到的,但是在绘图时「绘制相等的角」和「取交点」在代码实现上相对是比较长的,在这个例子里可以规避,让思路更简单,也让代码更简单;而且在画的时候,只有使用指令才会绘制,我们可以只定义某个点但不做绘制,也就不需要所谓的「擦去」了。上面的「思考确定合适的思路/顺序」要以有便捷的命令来实现为原则,这可能需要对tkz-euclide提供的功能有一定的熟悉度,尽量避免一些比较复杂的定点思路。


因为这是平面欧几里得几何,所以我会优先选择tkz-euclide,使用纯tikz画起来更难受...有空我会做补充,你可以对比一下...

分享一下我抖机灵的思路,其实这里比较难确定的是D点和C点,而他们都是Q点的对称点,通过texdoc tkz-euclide在文档里寻宝,不难发现有projection操作:

image.png

于是最初步的定点思路和代码基本出来了:
1:确定 A B Q E 的坐标
2:Q关于AE做轴对称;Q关于BE做轴对称
3:连接点绘制图形
4:做点的标记和角度的标记

\documentclass[tikz,border=5pt]{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}[line cap=round]
% step1定点
\tkzDefPoints{0/0/A,5/0/B,3/0/Q,3.2/2.4/E}
% step2对称定点
\tkzDefPointBy[reflection = over A--E](Q) 
\tkzGetPoint{D} 
\tkzDefPointBy[reflection = over B--E](Q) 
\tkzGetPoint{C}
% step3绘制框架
\tkzDrawPolygon[thick](A,B,C,D)
\tkzDrawSegments[thick](A,E B,E)
% step4-1标点
\tkzLabelPoints[left](A)
\tkzLabelPoints[below right](B)
\tkzLabelPoints[above](D,E)
\tkzLabelPoints[above right](C)
% step4-2标角度
\tkzLabelAngle[pos=.85,font=\small](E,A,D){1} 
\tkzMarkAngle[size=.5](E,A,D)
\tkzLabelAngle[pos=.65,font=\small](B,A,E){2} 
\tkzMarkAngle[size=.35](B,A,E)
\tkzLabelAngle[pos=.65,font=\small](E,B,A){3} 
\tkzMarkAngle[size=.35](E,B,A)
\tkzLabelAngle[pos=.75,font=\small](C,B,E){4} 
\tkzMarkAngle[size=.55](C,B,E)
\end{tikzpicture}
\end{document}

image.png

6 个回答
越来越少
越来越少 3小时前
这家伙很懒,什么也没写!

8a95d7d175e16fe3a7c823a4dc17b37b.png

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{tkz-euclide}
\input{centroid_label.tex}

\begin{document}

\begin{tikzpicture}
\tkzDefPoints{0/0/A,5/0/B}
\tkzDefTriangle[two angles=40 and 50](A,B)
\tkzGetPoint{E}
\tkzDefMidPoint(A,B)
\tkzGetPoint{M}
\draw (A) -- (B) -- (E) -- cycle;
\draw (E) -- (M);
\tkzMarkRightAngle[size=0.2,color=red](A,E,B)
\LabelPts{A, B, E, M}

\tkzDefLine[parallel=through A, K=0.5](M,E)
\tkzGetPoint{A'}
\tkzDefLine[parallel=through B, K=0.5](M,E)
\tkzGetPoint{B'}

\coordinate (E') at ($(E)+(170:0.5)$);

\tkzInterLL(A,A')(E,E')
\tkzGetPoint{D}
\tkzInterLL(B,B')(E,E')
\tkzGetPoint{C}

\draw (A) -- (D) -- (C) -- (B);

\LabelPts{D,C}
\end{tikzpicture}

\end{document}

步骤:

  1. 直角三角形 AEB, 角 E=90 度
  2. 取 AB 的中点 M
  3. AD 平行于 EM, BC 平行于 EM
Balance
Balance 13小时前
这家伙很懒,什么也没写!

感谢大佬耐心回复!

有点疑惑的是,E点坐标3.2/2.4是怎么得到的?

Sagittarius Rover
Sagittarius Rover 13小时前
我要成为Typst糕手/(ㄒoㄒ)/~~

另一个基于plain-tikz的方案:

思路和上面基本一样,不过定点我用了tikz里其他的功能

\documentclass[tikz,border=5pt]{standalone}
\usetikzlibrary{calc,angles,quotes}
\begin{document}
\begin{tikzpicture}[line cap=round]
\coordinate (A) at (0,0);
\coordinate (B) at (4,0);
\coordinate (E) at (3,{sqrt(3)});
% 点D可以视为(3,0)绕点A逆时针旋转60度 用极坐标来写是「60:3」
\coordinate (D) at (60:3);
% 点C可以视为(3,0)绕点B顺时针旋转120度
% 看这个教程 https://tikz.dev/tikz-coordinates#sec-13.5.3
\coordinate (C) at ($(B)!1!-120:(3,0)$);
\draw[thick,cyan] (A) -- (B) -- (E) -- cycle;
\draw[thick,red] (A) -- (D) -- (C) -- (B);
\path (A) node[below left] {$A$} 
      (B) node[below] {$B$} 
      (C) node[right] {$C$} 
      (D) node[above] {$D$} 
      (E) node[above right] {$E$};
% 角度看这个教程 https://tikz.dev/library-angle#pgf.angles
\path 
pic ["1",draw,cyan,thick,angle radius=.75cm,angle eccentricity=1.35] {angle = E--A--D}
pic ["2",draw,violet,thick,angle radius=.5cm,angle eccentricity=1.35] {angle = B--A--E}
pic ["3",draw,olive,thick,angle radius=.35cm,angle eccentricity=1.5] {angle = E--B--A}
pic ["4",draw,orange,thick,angle radius=.55cm,angle eccentricity=1.35] {angle = C--B--E}
;
\end{tikzpicture}
\end{document}

image.png

海波
海波 1小时前
这家伙很懒,什么也没写!

水平画一个ab,之后随意画一个ad和bc。之后画两个角平分线,通过交点E任意画一条直线,跟另外两条有交点就解决了。

其中点a点b任意指定,点c和点d的坐标,你可以大致指定,角平分线有直接的命令,他们生成交点E之后,过E画直线你可以自己指定,最后的交点(其实是D,C,前面的可用其他字母)自动生成好的。

海波
海波 1小时前
这家伙很懒,什么也没写!

以下是用 tkz-euclide 绘制您描述的图形的 LaTeX 代码:

documentclass{standalone} usepackage{tkz-euclide} begin{document} begin{tikzpicture} % 定义初始点 tkzDefPoint(0,0){A} tkzDefPoint(10,0){B} tkzDefPoint(2,5){D'} tkzDefPoint(12,2){C'} % 绘制线段AB tkzDrawSegment(A,B) % 绘制AD'和BC' tkzDrawSegment(A,D') tkzDrawSegment(B,C') % 标记点 tkzLabelPointsbelow left tkzLabelPointsbelow right tkzLabelPointsabove left tkzLabelPointsabove right % 绘制角BAD'的平分线 tkzDefLinebisector tkzGetPoint{AD_bisector} tkzDrawLineadd=0 and 1,color=red % 绘制角ABC'的平分线 tkzDefLinebisector tkzGetPoint{AB_bisector} tkzDrawLineadd=0 and 1,color=blue % 找到两条角平分线的交点E tkzInterLL(A,AD_bisector)(B,AB_bisector) tkzGetPoint{E} tkzLabelPointsabove % 过E点画任意直线,与AD'和BC'相交于D和C tkzDefLinethrough=E tkzGetPoint{tempD} tkzInterLL(A,D')(E,tempD) tkzGetPoint{D} tkzDefLinethrough=E tkzGetPoint{tempC} tkzInterLL(B,C')(E,tempC) tkzGetPoint{C} % 绘制点D和C tkzDrawPoints(D,C) tkzLabelPointsabove left tkzLabelPointsabove right % 绘制线段DC tkzDrawSegment(D,C) end{tikzpicture} end{document}

这段代码会:

定义点 A(0,0)、B(10,0)、D'(2,5) 和 C'(12,2)

绘制线段 AB、AD' 和 BC'

绘制角 BAD' 和角 ABC' 的平分线(红色和蓝色)

找到两条角平分线的交点 E

过 E 点画直线与 AD' 和 BC' 相交于 D 和 C

绘制线段 DC 并标记所有点

您可以根据需要调整点的位置或添加更多标记。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览