Sagittarius Rover
Sagittarius Rover
我要成为Typst糕手/(ㄒoㄒ)/~~

注册于 3年前

回答
397
文章
0
关注者
15

这是一个在ai需求上修改的回答

\documentclass{standalone}
\usepackage{tkz-base}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}[scale=1.2]
% ===== 1. 绘制平面直角坐标系 =====
\tkzInit[xmin=-3, xmax=5, ymin=-3, ymax=2]
\tkzGrid[color=gray!30, line width=0.5pt]
\tkzLabelX[orig=false, below=8pt]        
\tkzLabelY[orig=false, left=8pt]
\tkzDrawXY[noticks, >=latex]    
% ===== 2. 定义并标记点P(1,1)、点A(0,-2) =====
\tkzDefPoints{1/1/P, 0/-2/A, 0/0/O} 
\tkzDrawPoints[fill=blue, size=4](P,A)  
\tkzLabelPoints[above right](P)  
\tkzLabelPoints[below left](A,O)    

% ===== 3. 在x轴正半轴找点B满足 PA = PB =====

\tkzDefPoints{0/0/O,4/0/X}
\tkzInterLC(O,X)(P,A) % 圆与x轴的交点
\tkzGetPoints{C}{B}   % 获取两个交点(取正半轴的点)
\tkzDrawPoint[fill=red, size=4](B) 
\tkzLabelPoint[above](B){$B$} 

% ===== 4. 连接线段并添加标注 =====
\tkzDrawSegments[thick](P,A P,B)       

\end{tikzpicture}
\end{document}

image.png

我强烈建议你在文档上花时间,AI只是提供补全和辅助

享受看着文档一步步学东西的乐趣,而不是全部丢进AI,得到一份(可能)有多处暗病的回答,当一份代码里有3~5个bug,你修起来的时间成本并不比自己读文档低....

还有一些标点、标线段长一类的细节

实现留做习题、读文档并不难

这只是一个告诉你「代码为何报错」的post..

AI只是起补全效果/提供思路,不能完全用来搭建框架,务必在文档里做验证并自行学习,切忌在对输出的代码完全不懂的前提下使用AI的代码。

debug步骤一:

Undefined control sequence. ^^I^^I\tkzDrawXY

你需要在tkz-euclide中搜索.....

你会发现仅有\tkzDrawX或者\tkzDrawY

事实上\tkzDrawXY这个命令需要tkz-base,加上\usepackage{tkz-base}之后:

\documentclass{standalone}
\usepackage{tkz-base}
\usepackage{tkz-euclide}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale=1.2]

% ===== 1. 绘制平面直角坐标系 =====
\tkzInit[xmin=-3, xmax=3, ymin=-3, ymax=2]  % 设置坐标范围
\tkzGrid[color=gray!30, line width=0.5pt]     % 添加浅灰色网格
\tkzDrawXY[noticks, >=latex]                 % 绘制坐标轴(无刻度,箭头样式)
\tkzLabelX[orig=false, below=8pt]           % 标注x轴(原点不重复标记)
\tkzLabelY[orig=false, left=8pt]            % 标注y轴

% ===== 2. 定义并标记点P(1,1)、点A(0,-2) =====
\tkzDefPoints{1/1/P, 0/-2/A}                % 定义点P和点A
\tkzDrawPoints[fill=blue, size=4](P,A)       % 绘制蓝色实心点
\tkzLabelPoints[above right](P)             % 标记点P(右上)
\tkzLabelPoints[below left](A)              % 标记点A(左下)

% ===== 3. 在x轴正半轴找点B满足 PA = PB =====
% 原理:B在x轴上且满足PB=PA → B是以P为圆心、PA为半径的圆与x轴的交点
\tkzDefCircle[radius](P,A)                  % 定义以P为圆心、PA为半径的圆
\tkzGetLength{PRad}                         % 获取半径长度
\tkzInterLC[R](tkzPointResult,tkzPointResult)(P,\PRad pt) % 圆与x轴的交点
\tkzGetPoints{B}{C}                         % 获取两个交点(取正半轴的点)
\tkzDrawPoint[fill=red, size=4](B)           % 绘制红色点B
\tkzLabelPoint[above](B){$B$}               % 标记点B

% ===== 4. 连接线段并添加标注 =====
\tkzDrawSegments[thick](P,A P,B)             % 绘制PA和PB(粗实线)
\tkzLabelSegment[above left](P,A){$PA$}      % 标注PA
\tkzLabelSegment[above right](P,B){$PB$}     % 标注PB

% ===== 添加构造辅助标记(可选)=====
\tkzDrawCircle[dashed, red, thin](P,A)       % 红色虚线圆(辅助构造)
\tkzCompasss[color=blue](P,A P,B)            % 标记等距弧线(蓝色)
\node[align=left, below] at (0,-2.5) { 
    $PA = PB$,$B$ 是圆 $P(PA)$ 与 $x$ 轴正半轴的交点
};

\end{tikzpicture}
\end{document}

报错信息变为:

! Package pgfkeys Error: I do not know the key '/tkzcircle/radius' and I am goi
ng to ignore it. Perhaps you misspelled it.

See the pgfkeys package documentation for explanation.
Type  H <return>  for immediate help.
 ...

l.23 \tkzDefCircle[radius](P,A)
                                                 % 定义以P为圆心、PA...

?

这说明\tkzDefCircle不按照语法乱写呗...

debug步骤二:

image.png

显然,应该用R而不是radius,需要参考这个例子,第二个参数应该传入半径而不是圆周上的点....

image.png

\documentclass{standalone}
\usepackage{tkz-base}
\usepackage{tkz-euclide}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale=1.2]

% ===== 1. 绘制平面直角坐标系 =====
\tkzInit[xmin=-3, xmax=3, ymin=-3, ymax=2]  % 设置坐标范围
\tkzGrid[color=gray!30, line width=0.5pt]     % 添加浅灰色网格
\tkzDrawXY[noticks, >=latex]                 % 绘制坐标轴(无刻度,箭头样式)
\tkzLabelX[orig=false, below=8pt]           % 标注x轴(原点不重复标记)
\tkzLabelY[orig=false, left=8pt]            % 标注y轴

% ===== 2. 定义并标记点P(1,1)、点A(0,-2) =====
\tkzDefPoints{1/1/P, 0/-2/A}                % 定义点P和点A
\tkzDrawPoints[fill=blue, size=4](P,A)       % 绘制蓝色实心点
\tkzLabelPoints[above right](P)             % 标记点P(右上)
\tkzLabelPoints[below left](A)              % 标记点A(左下)

% ===== 3. 在x轴正半轴找点B满足 PA = PB =====
% 原理:B在x轴上且满足PB=PA → B是以P为圆心、PA为半径的圆与x轴的交点


% \tkzDefCircle[radius](P,A)%错误!                  % 定义以P为圆心、PA为半径的圆
\tkzCalcLength(P,A) 
\tkzGetLength{rPA} 
\tkzDefCircle[R](P,\rPA)
% \tkzGetLength{PRad}                         % 获取半径长度
\tkzInterLC[R](tkzPointResult,tkzPointResult)(P,\PRad pt) % 圆与x轴的交点
\tkzGetPoints{B}{C}                         % 获取两个交点(取正半轴的点)
\tkzDrawPoint[fill=red, size=4](B)           % 绘制红色点B
\tkzLabelPoint[above](B){$B$}               % 标记点B

% ===== 4. 连接线段并添加标注 =====
\tkzDrawSegments[thick](P,A P,B)             % 绘制PA和PB(粗实线)
\tkzLabelSegment[above left](P,A){$PA$}      % 标注PA
\tkzLabelSegment[above right](P,B){$PB$}     % 标注PB

% ===== 添加构造辅助标记(可选)=====
\tkzDrawCircle[dashed, red, thin](P,A)       % 红色虚线圆(辅助构造)
\tkzCompasss[color=blue](P,A P,B)            % 标记等距弧线(蓝色)
\node[align=left, below] at (0,-2.5) { 
    $PA = PB$,$B$ 是圆 $P(PA)$ 与 $x$ 轴正半轴的交点
};

\end{tikzpicture}
\end{document}

这同样将报错:

! Undefined control sequence.
<argument> \PRad
                 pt cm
l.30 ...tkzPointResult,tkzPointResult)(P,\PRad pt)
                                                   % 圆与x轴的交点
?

这又说明第30行:

\tkzInterLC[R](tkzPointResult,tkzPointResult)(P,\PRad pt) % 圆与x轴的交点

写的一窍不通,垃圾AI.....

debug步骤三:

稍微想了一下:

\tkzDefCircle[radius](P,A)                  % 定义以P为圆心、PA为半径的圆
\tkzGetLength{PRad}                         % 获取半径长度
\tkzInterLC[R](tkzPointResult,tkzPointResult)(P,\PRad pt) % 圆与x轴的交点

这部分可以优化

\tkzDefPoints{0/0/O,4/0/X}
\tkzInterLC(O,X)(P,A) % 圆与x轴的交点

换句话说

\documentclass{standalone}
\usepackage{ctex}
\usepackage{tkz-base}
\usepackage{tkz-euclide}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale=1.2]

% ===== 1. 绘制平面直角坐标系 =====
\tkzInit[xmin=-3, xmax=3, ymin=-3, ymax=2]  % 设置坐标范围
\tkzGrid[color=gray!30, line width=0.5pt]     % 添加浅灰色网格
\tkzDrawXY[noticks, >=latex]                 % 绘制坐标轴(无刻度,箭头样式)
\tkzLabelX[orig=false, below=8pt]           % 标注x轴(原点不重复标记)
\tkzLabelY[orig=false, left=8pt]            % 标注y轴

% ===== 2. 定义并标记点P(1,1)、点A(0,-2) =====
\tkzDefPoints{1/1/P, 0/-2/A}                % 定义点P和点A
\tkzDrawPoints[fill=blue, size=4](P,A)       % 绘制蓝色实心点
\tkzLabelPoints[above right](P)             % 标记点P(右上)
\tkzLabelPoints[below left](A)              % 标记点A(左下)

% ===== 3. 在x轴正半轴找点B满足 PA = PB =====
% 原理:B在x轴上且满足PB=PA → B是以P为圆心、PA为半径的圆与x轴的交点

\tkzDefPoints{0/0/O,4/0/X}
\tkzInterLC(O,X)(P,A) % 圆与x轴的交点
\tkzGetPoints{B}{C}                         % 获取两个交点(取正半轴的点)
\tkzDrawPoint[fill=red, size=4](B)           % 绘制红色点B
\tkzLabelPoint[above](B){$B$}               % 标记点B

% ===== 4. 连接线段并添加标注 =====
\tkzDrawSegments[thick](P,A P,B)             % 绘制PA和PB(粗实线)
\tkzLabelSegment[above left](P,A){$PA$}      % 标注PA
\tkzLabelSegment[above right](P,B){$PB$}     % 标注PB

% ===== 添加构造辅助标记(可选)=====
\tkzDrawCircle[dashed, red, thin](P,A)       % 红色虚线圆(辅助构造)
\tkzCompasss[color=blue](P,A P,B)            % 标记等距弧线(蓝色)
\node[align=left, below] at (0,-2.5) { 
    $PA = PB$,$B$ 是圆 $P(PA)$ 与 $x$ 轴正半轴的交点
};

\end{tikzpicture}
\end{document}

不报错了...但好像和OP的目标也有差距...

image.png

其实非常简单,只要把合并单元格挪到下面一格就行了\multirow支持反向合并
% !tex xelatex
\documentclass[a4paper]{ctexart}
\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry}
\usepackage{array}
\usepackage{multirow}
\usepackage{colortbl} % 必须包含的包
\usepackage{xcolor}
\usepackage{graphicx}
\definecolor{lightblue}{rgb}{0.85,0.95,1}
\definecolor{lightyellow}{rgb}{1,1,0.85}

\begin{document}
\pagestyle{empty}
\centering

{\LARGE\bfseries 九九乘法口诀表}\\[1cm]

% 主乘法表
\begin{minipage}{0.9\textwidth}
\centering
\setlength{\tabcolsep}{3mm} % 列间距
\renewcommand{\arraystretch}{1.5} % 行高
\begin{tabular}{|>{\columncolor{lightblue}}c|*{9}{>{\centering\arraybackslash}m{1.2cm}|}}
\hline
\rowcolor{lightyellow}
& 
\multicolumn{9}{c|}{\textcolor{red}{被乘数}} \\
\cline{2-10}
\rowcolor{lightblue}
\cellcolor{lightyellow}
\multirow{-2}{*}{\textcolor{red}{乘数}}
& 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
\hline
1 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
\hline
2 & 2 & 4 & 6 & 8 & 10 & 12 & 14 & 16 & 18 \\
\hline
3 & 3 & 6 & 9 & 12 & 15 & 18 & 21 & 24 & 27 \\
\hline
4 & 4 & 8 & 12 & 16 & 20 & 24 & 28 & 32 & 36 \\
\hline
5 & 5 & 10 & 15 & 20 & 25 & 30 & 35 & 40 & 45 \\
\hline
6 & 6 & 12 & 18 & 24 & 30 & 36 & 42 & 48 & 54 \\
\hline
7 & 7 & 14 & 21 & 28 & 35 & 42 & 49 & 56 & 63 \\
\hline
8 & 8 & 16 & 24 & 32 & 40 & 48 & 56 & 64 & 72 \\
\hline
9 & 9 & 18 & 27 & 36 & 45 & 54 & 63 & 72 & 81 \\
\hline
\end{tabular}
\end{minipage}

\end{document}

image.png

另外,这个需求显然有基于循环的方案,可参考这个链接

一个基于tkz-euclide的可能方案,有大量瑕疵:

  • "质心"可以最好地近似「N个点的"最小覆盖圆"的圆心」吗?
  • 图中使用\tkzAutoLabelPoints来调整dist也并不完美,点A,B,C,F偏远;点DE偏近
  • \tkzDefBarycentricPoint(A=1,B=1,C=1,D=1,E=1,F=1)语法冗杂,而\tkzCentroid(A,B,C)仅支持三个点
  • 暂时没有做封装...
\documentclass[tikz,border=5mm]{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
  \tkzDefPoints{-1/-1/A, 1/-2/B, 3/0/C, 2/4/D, 0/5/E,-3/2/F}  
  \tkzDrawPolygons[thick](A,...,F)
% \tkzLabelPoints(A,...,F) % No!
% \tkzCentroid(A,B,C) %怎么只支持三个点呢..真可惜
\tkzDefBarycentricPoint(A=1,B=1,C=1,D=1,E=1,F=1)
\tkzGetPoint{centroid}
\tkzDrawPoint(centroid)
\tkzAutoLabelPoints[center = centroid,dist= .12](A,...,F)
\end{tikzpicture}
\end{document}

image.png

抛砖引玉了~ 期待@u817 老师提供更general方案的补充


Edited:

使用\pathpos..对位置的控制相对好一些了,但是却不能很好的融入tkz-euclide的框架里...

这里的各个label和点的距离是「路径(centeroid--\x)的长度*0.1」,因为不好找到精准的最小覆盖圆(因为多点情况下这不存在),长度不相等,这是利用pos的瑕疵...

\documentclass[tikz,border=5mm]{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
  \tkzDefPoints{-1/-1/A, 1/-2/B, 3/0/C, 2/4/D, 0/5/E,-3/2/F}  
  \tkzDrawPolygons[thick](A,...,F)
% \tkzLabelPoints(A,...,F) % No!
% \tkzCentroid(A,B,C) %怎么只支持三个点呢..真可惜
\tkzDefBarycentricPoint(A=1,B=1,C=1,D=1,E=1,F=1)
\tkzGetPoint{centroid}
\tkzDrawPoint(centroid)
% \tkzAutoLabelPoints[center = centroid,dist= .12](A,...,F)
\foreach \x in {A,...,F}{
    \path (centroid) -- (\x) node [text=magenta,pos=1.1] {\x};
}
\end{tikzpicture}
\end{document}

image.png

很棒!学以致用!

也许从下面这个例子里可以找到原因:

image.png

name=H意味着得到的垂直实际上名为HaHbHc...

\documentclass[tikz, border=5mm]{standalone}
\usepackage{tkz-euclide}
%\usetkzobj{all} % 解决命令未定义问题 - 加载所有对象类型
\usetikzlibrary{angles, quotes} % 用于绘制角度标记

\begin{document}
    \begin{tikzpicture}[scale=0.8]
        % 定义三个顶点
        \tkzDefPoints{-1.5/0/B, 1.5/0/C, 0/4/A}
        % 定义垂心
        \tkzDefTriangleCenter[ortho](A,B,C)
        \tkzGetPoint{P}
        % 定义三个垂足
        \tkzDefSpcTriangle[ortho,name=P](A,B,C){D,E,F}
        % 画三角形ABC,画三个顶点,连三条高线
        \tkzDrawPolygon[thick][color=blue](A,B,C)
%        \tkzDrawPoints(A,B,C,P)
%        \tkzDrawSegments[thick](A,PD B,PE C,Pc)
        \tkzDrawSegments[thick](A,PD B,PE)
        % 添加标签
        \tkzLabelPoint[above left](P){$P$}
        \tkzLabelPoint[above](A){$A$}
        \tkzLabelPoint[below left](B){$B$}
        \tkzLabelPoint[below right](C){$C$}
        \tkzLabelPoint[below](PD){$D$}
        \tkzLabelPoint[right](PE){$E$}
%        \tkzAutoLabelPoints[center=P](A,B,C)        
    \end{tikzpicture}
\end{document}

image.png


如何debug?

Package pgf Error: No shape named `D' is known. ^^I^^I\tkzLabelPoint[below](D){$D$}
Package pgf Error: No shape named `E' is known. ^^I^^I\tkzLabelPoint[right](E){$E$}

查看报错信息,为什么只有DE找不到,看看这两个点是在\tkzDefSpcTriangle里定义的,回去翻\tkzDefSpcTriangle的文档:

(此事在文档中亦有记载...)

image.png


关于如何精确让AE=BE...

这里的E点如果直接用AE=BE个人觉得会稍显复杂,因为衡量长度似乎稍显代码冗长....

条条大道通罗马...

第一个思路:「高+等腰=等腰直角大概可以想到中垂线」

  • 确定A、B、C
  • 作高AD⊥BC
  • 作AB上的中垂线交AC于E
\documentclass[tikz,border=5mm]{standalone}
\usepackage{tkz-euclide}
\usetikzlibrary{angles}
\begin{document}
    \begin{tikzpicture}[line cap=round,line join=round]
        \tkzDefPoints{-1.5/0/B, 1.5/0/C, 0/4/A}
        \tkzDefPointBy[projection = onto B--C](A)
        \tkzGetPoint{D}

        \tkzDefLine[mediator](A,B)
        \tkzGetPoints{P1}{P2}
        \tkzInterLL(A,C)(P1,P2) 
        \tkzGetPoint{E}

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

        \tkzDrawSegments[thick](A,D B,E)
        \tkzDrawPolygon[semithick](A,B,C)
 
        \tkzLabelPoint[above](A){$A$}
        \tkzLabelPoint[below left](B){$B$}
        \tkzLabelPoint[below right](C){$C$}
        \tkzLabelPoint[below](D){$D$}
        \tkzLabelPoint[right](E){$E$}
    \end{tikzpicture}
\end{document}

image.png

不过这似乎不太直角...

再看看「点A」应该如何定位吧...

嗯,显然∠BAC是45°,对于(-1.5,0) (1.5,0)和(0,4)用余弦定理理论上这个角不是45°,所以要想完全精确最好是不要直接给定ABC的坐标,应该另谋他路来「用最少的点唯一确定这个图形」...


未完待续....

可以直接用pgfplots:

\documentclass[a4paper,border=2pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
    axis lines=middle,
    xlabel=$x$,
    ylabel=$y$,
    xmin=-3, xmax=5,
    ymin=-2, ymax=5,
    samples=300,
    smooth,thick,
    grid=major,
    grid style={gray!30},
]
    \addplot[cyan, dashed, domain=-3:5] {abs(x) - 1};
    \addplot[violet, dotted, domain=-3:5] {(x-2)^2};
    \addplot[red, ultra thick, domain=-3:5] {min(abs(x)-1, (x-2)^2)};
\end{axis}
\end{tikzpicture}
\end{document}

image.png

「函数图像」和「平面欧几里得图形」是不太一样的,应该选择最合适的工具。

niceamtrix的方案二:

同样是读文档!!

image.png

\documentclass{article}
\usepackage{libertinus-otf}
\usepackage{nicematrix}
\usepackage{tikz}
\usepackage{lipsum}
\begin{document}
\lipsum[2]
\[
X = 
\begin{pNiceMatrix}[
        create-large-nodes,
        left-margin=7pt,
        right-margin=2pt
    ]
    1 & 0 & 2 & 0 & -3 \\
    0 & 1 & -1 & 0 & -4 \\
    0 & 0 & 0 & 3 & 5 \\
    0 & 0 & 0 & 0 & 0 \\
    \CodeAfter
    \tikz \draw[densely dashed,violet]
    (1|-1) -- (1|-2) -- (2|-2) -- (2|-3) -- (4|-3) -- (4|-4) -- (6|-4)
    ;
\end{pNiceMatrix}
= Y
\]
\lipsum[2]

\end{document}

image.png

nicematrix的方案一:

\documentclass{article}
\usepackage{libertinus-otf}
\usepackage{nicematrix}
\usepackage{tikz}
\usepackage{lipsum}
\begin{document}
\lipsum[2]
\[
X = 
\begin{pNiceMatrix}[extra-margin=7pt,cell-space-limits=.125cm]
1\Block[borders={bottom,left,tikz=densely dashed}]{1-1}{} & 0 & 2 & 0 & -3 \\
0 & 1\Block[borders={bottom,left,tikz=densely dashed}]{1-2}{} & -1 & 0 & -4 \\
0 & 0 & 0 & 3\Block[borders={bottom,left,tikz=densely dashed}]{1-2}{} & 5 \\
0 & 0 & 0 & 0 & 0 \\
\end{pNiceMatrix}
= Y
\]
\lipsum[2]

\end{document}

image.png

另一个基于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

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

但是在实际操作时,由于写代码更多的是坐标来描述点的位置,因此想上面图中的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

0.提问要给代码,即使是只有矩阵的内容的代码。给代码可以大大方便别人回答。
1.在命令行输入「texdoc nicematrix」回车
2.翻到Page 69,学!

image.png

我认为的最佳实践,当涉及「圆锥曲线」时,比较系统化的作图方式是基于tkz-elements,下面的代码虽然较长,但是逻辑清晰可拓展性强,方便多次复用。

\documentclass[tikz,border=2pt]{standalone}
\usepackage{tkz-euclide,tkz-elements}
\directlua{
    init_elements()
    z.O = point(0, 0)
    z.C = point(2, 1)
    z.P = point(4, 4)
    % -- 准线
    z.L1 = point(-1,-4.5)
    z.L2 = point(-1,4.5)
    L.line = line(z.L1, z.L2)
    % -- 抛物线
    z.F = point(1, 0)
    CO.PA = conic(z.F, L.line, 1)
    PA.PA = CO.PA:points(-4.5, 4.5, 300)
    % -- 定义圆
    z.c = point(0, 1)
    C.Cc = circle(z.C, z.c) 
    % -- 定义过P做圆C的切线
    L.T1,L.T2 = C.Cc:tangent_from(z.P)
    z.T1 = L.T1.pb
    z.T2 = L.T2.pb
}
\begin{document}
    \begin{tikzpicture}[scale=.4,smooth,line cap=round]
        \tkzGetNodes
        \tkzInit[xmin=-2,xmax=5.5,ymin=-4.5,ymax=4.5] 
        \tkzDrawX[noticks]\tkzDrawY[noticks]
        \tkzDrawCircle[red,thick](C,c)
        \tkzDrawPoints(O,P,C,T1,T2)
        \tkzLabelPoints[below left](O,P,C)
        \tkzDrawSegment[cyan,thick](L1,L2)
        \tkzDrawCoordinates[smooth,cyan,thick](PA.PA)
        \tkzDrawSegments[violet,thick](P,T1 T1,C C,T2 T2,P)
    \end{tikzpicture}
\end{document}

image.png

预期的目标效果是什么呢?

image.png

这个图中的c是一个node,圆周是node的边界,而你代码中:

\coordinate[label=left:$C$](C)at(2,1);
\draw[red](C)circle(2);
\draw(P)--(tangent cs:node=C,point={(P)},solution=1)--(C.center)--cycle;

圆周是一个path,你用tangent cs绘制的是对coordinateC的切线,而点是没有半径的,所以重合了...

BTW,下面这些包只有calc和你的问题有关。

\usetikzlibrary{
    % math,
    calc,
    % intersections,
    % through,
    % angles,
    arrows.meta,
    % shapes.geometric,
    % shadows,
    % quotes,
    % spy,
    % datavisualization,
    % datavisualization.formats.functions,
    % plotmarks
}

需要注意的是:

LaTeX2e内核中定义的\casesamsmath宏包重定义的cases环境并不相同。

\documentclass{article}
\begin{document}
\[
|x|=\cases{x,&if $x\ge0$;\cr 
-x,&otherwise.\cr}
\]
\end{document}

image.png

重点要转到关注amsmath.dtx中的有关定义:

% line 2604~2614
\renewenvironment{cases}{%
  \matrix@check\cases\env@cases
}{%
  \endarray\right.%
}
\def\env@cases{%
  \let\@ifnextchar\new@ifnextchar
  \left\lbrace
  \def\arraystretch{1.2}%
  \array{@{}l@{\quad}l@{}}%
}

cases环境本质是是一个带\lbracearray环境,与\jot并无关系

所以...似乎patch一下\arraystretch即可实现第二个需求:

\documentclass{ctexart}
\usepackage{amsmath,amsfonts}
\makeatletter
\def\env@cases{%
  \let\@ifnextchar\new@ifnextchar
  \left\lbrace
  \def\arraystretch{2.5}%
  \array{@{}l@{\quad}l@{}}%
}
\makeatother
\begin{document}
\[
\begin{cases}
    \dfrac{1}{1} + \dfrac{2}{2} \neq \dfrac{3}{3} \\
    \dfrac{1}{1} + \dfrac{2}{2} = \dfrac{3}{3}
\end{cases}
\]
\[
\begin{cases}
    \dfrac{1}{1} + \dfrac{2}{2} \neq \dfrac{3}{3} \\
    \dfrac{1}{1} + \dfrac{2}{2} = \dfrac{3}{3}
\end{cases}
\]
\[
\begin{cases}
    \dfrac{1}{1} + \dfrac{2}{2} \neq \dfrac{3}{3} \\
    \dfrac{1}{1} + \dfrac{2}{2} = \dfrac{3}{3}
\end{cases}
\]
\[
\begin{cases}
    \dfrac{1}{1} + \dfrac{2}{2} \neq \dfrac{3}{3} \\
    \dfrac{1}{1} + \dfrac{2}{2} = \dfrac{3}{3}
\end{cases}
\]
\[
\begin{cases}
    \dfrac{1}{1} + \dfrac{2}{2} \neq \dfrac{3}{3} \\
    \dfrac{1}{1} + \dfrac{2}{2} = \dfrac{3}{3}
\end{cases}
\]
\end{document}

image.png

嗯...效果并不是很好...

可以利用fgruler宏包给PDF加上标尺

%%使用paracol环境,可以发现文字高度没有变化
%%不使用paracol环境,文字高度变化

文字高度变化是什么意思(?)是和什么做对比的(?) 可否补充详细的对比图示....

\documentclass[
    oneside, % 让页面左右对称
    openany, % 去掉偶数面的空白页
]{book}
\usepackage{lipsum}
\usepackage[type=upperleft]{fgruler}
\usepackage[showframe]{geometry}
\usepackage{paracol}
\newcommand{\Chapter}[1]{%
\chapter{#1}%
\enlargethispage{-2.0cm}
}
\begin{document}
    %%使用paracol环境,可以发现文字高度没有变化
    \Chapter{title}
    \begin{paracol}{2}
        \lipsum[1-2]
    \end{paracol}
    %%不使用paracol环境,文字高度变化
    \Chapter{title}
    \lipsum[1-3]
\end{document}

image.png

发布
问题