另一个实现在这个链接
另一个实现在这个链接
0.作为例子,请用example-image
而不是photo/层次分析法图1.jpg
前者在每个安装了TL
的电脑上都有,后者只有你有
1.读一下lshort-zh-cn
默认是t-b-p
2.你可以试着显式写为h
:
\documentclass{article}
\usepackage{showframe}
\usepackage{graphicx}
\usepackage{ctex}
\title{层次分析法暑期练习}
\author{qiao xinkai}
\date{\today}
\begin{document}
\maketitle
\section{模型建立}
\subsection{建立系统的递阶层次结构}
\begin{figure}[h]
\centering
\includegraphics[width=1.2\textwidth,height=0.9\textwidth]{example-image}
\caption{图1.1.饲养地选择层次结构图}
\label{fig:cengci}
\end{figure}
\end{document}
3.可以试着调一下图片高度
\documentclass{article}
\usepackage{showframe}
\usepackage{graphicx}
\usepackage{ctex}
\title{层次分析法暑期练习}
\author{qiao xinkai}
\date{\today}
\begin{document}
\maketitle
\section{模型建立}
\subsection{建立系统的递阶层次结构}
\begin{figure}[h]
\centering
\includegraphics[width=1.2\textwidth,height=.85\textwidth]{example-image}
\caption{图1.1.饲养地选择层次结构图}
\label{fig:cengci}
\end{figure}
\end{document}
P.S. showframe
是为了显示页面layout,进一步说明「位置不够」....
在命令行输入:
texdoc mpfonts
这将得到:
mpfonts
Maintained by Daniel Benjamin Miller
January 30, 2020
***
The Computer Modern fonts are available in Type 1 format, but these renditions
are somewhat thin and spindly, and produce much lighter results than the
originals. It is alternatively possible to use METAFONT bitmaps, but this has
its disadvantages in comparison with vector fonts.
These fonts are conversions to Type 3 fonts, done entirely in METAPOST;
they are vector fonts which are a direct conversion from the original METAFONT
files, so they are the design most authentic to the originals.
However, these fonts, because they are PostScript Type 3 fonts, are not
suitable for on-screen reading, and should probably only be used for printing.
In order to produce a document using these fonts, first produce a DVI with
TeX or LaTeX, and then run dvips as follows:
dvips -D 10000 -u +mpfonts.map myfile.dvi
This will output a PostScript file using these fonts. It is recommended to keep
the resolution at 10000 DPI, since this allows for the most accurate glyph
positioning. As the fonts are vector fonts, this will not increase file size
in comparison with lower DPI settings.
***
The following font sets are supported:
* Computer Modern (cm)
* LaTeX fonts (latex-fonts)
* Frege symbols (fge)
* Extra logic symbols (cmll)
* Fraktur (cmfrak)
* AMS fonts (amsfonts)
* IPA (tipa)
Note that the T1 encoding is not directly supported. When using this package,
use the classic OT1 encoding (this is the default encoding, and will be used
unless you choose to change it).
丢进AI:
mpfonts
由 Daniel Benjamin Miller 维护
2020年1月30日
***
Computer Modern 字体虽提供 Type 1 格式,但这些版本略显纤细单薄,输出效果较原版更为轻淡。虽然也可使用 METAFONT 点阵字体,但与矢量字体相比存在固有缺陷。
本套字体通过 METAPOST 完全转换为 Type 3 格式,是从原始 METAFONT 文件直接转换的矢量字体,因此最大程度保留了原版的设计精髓。
需要注意的是,由于采用 PostScript Type 3 格式,这些字体不适合屏幕阅读,建议仅用于印刷场景。
使用步骤:
1. 先用 TeX 或 LaTeX 生成 DVI 文件
2. 执行以下 dvips 命令:`dvips -D 10000 -u +mpfonts.map myfile.dvi`
将生成采用本字体的 PostScript 文件。推荐保持 10000 DPI 分辨率以确保字形定位精确。由于是矢量字体,较高分辨率不会导致文件体积增大。
***
支持以下字体集:
* Computer Modern (cm)
* LaTeX fonts (latex-fonts)
* Frege symbols (fge)
* Extra logic symbols (cmll)
* Fraktur (cmfrak)
* AMS fonts (amsfonts)
* IPA (tipa)
特别说明:本包不直接支持 T1 编码,使用时请采用经典 OT1 编码(此为默认编码,除非手动更改)。
所谓type3字体是该怎么用啊
此事在「使用步骤」中亦有说明....
\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}
享受看着文档一步步学东西的乐趣,而不是全部丢进AI,得到一份(可能)有多处暗病的回答,当一份代码里有3~5个bug,你修起来的时间成本并不比自己读文档低....
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
不按照语法乱写呗...
显然,应该用R
而不是radius
,需要参考这个例子,第二个参数应该传入半径而不是圆周上的点....
\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.....
稍微想了一下:
\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的目标也有差距...
其实非常简单,只要把合并单元格挪到下面一格就行了,\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}
另外,这个需求显然有基于循环的方案,可参考这个链接。
一个基于tkz-euclide
的可能方案,有大量瑕疵:
\tkzAutoLabelPoints
来调整dist
也并不完美,点A
,B
,C
,F
偏远;点D
与E
偏近\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}
抛砖引玉了~ 期待@u817 老师提供更general方案的补充
使用\path
和pos
..对位置的控制相对好一些了,但是却不能很好的融入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}
name=H
意味着得到的垂直实际上名为Ha
、Hb
与Hc
...
\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}
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$}
查看报错信息,为什么只有D
和E
找不到,看看这两个点是在\tkzDefSpcTriangle
里定义的,回去翻\tkzDefSpcTriangle
的文档:
(此事在文档中亦有记载...)
AE=BE
...这里的E点如果直接用AE=BE
个人觉得会稍显复杂,因为衡量长度似乎稍显代码冗长....
条条大道通罗马...
\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}
不过这似乎不太直角...
再看看「点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}
「函数图像」和「平面欧几里得图形」是不太一样的,应该选择最合适的工具。
用niceamtrix
的方案二:
\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}
用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}
另一个基于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}
通用的绘图逻辑: 思考确定合适的思路/顺序 ➡ 定点 ➡ 连线 ➡ 标记
但是在实际操作时,由于写代码更多的是坐标来描述点的位置,因此想上面图中的D点和C点的坐标并不好精确确定,这个时候一般靠抖机灵吧
先看看你的思路:
手绘的时候,我的思维是这样的:先画出来一条直线长度为4的线段AB → 画出来∠DAB和∠CBA → 画出∠DAB和∠CBA各自的角平分线(射线),取到交点E并裁掉射线多余的部分 → 过E点按照原图中的样子画直线DC → 把多余的线擦掉
是可以做到的,但是在绘图时「绘制相等的角」和「取交点」在代码实现上相对是比较长的,在这个例子里可以规避,让思路更简单,也让代码更简单;而且在画的时候,只有使用指令才会绘制,我们可以只定义某个点但不做绘制,也就不需要所谓的「擦去」了。上面的「思考确定合适的思路/顺序」要以有便捷的命令来实现为原则,这可能需要对tkz-euclide
提供的功能有一定的熟悉度,尽量避免一些比较复杂的定点思路。
因为这是平面欧几里得几何,所以我会优先选择tkz-euclide
,使用纯tikz
画起来更难受...有空我会做补充,你可以对比一下...
分享一下我抖机灵的思路,其实这里比较难确定的是D点和C点,而他们都是Q点的对称点,通过texdoc tkz-euclide
在文档里寻宝,不难发现有projection
操作:
于是最初步的定点思路和代码基本出来了:
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}
0.提问要给代码,即使是只有矩阵的内容的代码。给代码可以大大方便别人回答。
1.在命令行输入「texdoc nicematrix
」回车
2.翻到Page 69,学!
我认为的最佳实践,当涉及「圆锥曲线」时,比较系统化的作图方式是基于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}
问 是否可以实现对一些可构成(凸)多边形的点实现自动智能在其外侧添加标签?