tikz作图,并排放置。问:代码有改进的方案吗?即tikz绘图有循环方法吗?图形排列有简单的方法吗?

2020-06-08 16:35发布

tikz## 编译环境 操作系统 * [ x] Windows 7/8/10 * [ ] macOS * [ ] Linux `若需勾选,请把[ ]改成[x]` Tex发行版 * [ x] TexL...

tikz## 编译环境 操作系统 * [ x] Windows 7/8/10 * [ ] macOS * [ ] Linux `若需勾选,请把[ ]改成[x]` Tex发行版 * [ x] TexLive `年份` * [ ] MikTeX `版本号` * [ ] CTeX `若需勾选,请把[ ]改成[x]` ## 我的问题 图形是人民教育出版社,七年级数学上册课本,第71页习题的图。下面给了一个实现的方法。问:代码有改进的方案吗?即tikz绘图有循环方法吗?图形排列有简单的方法吗? [![](https://wenda.latexstudio.net/data/attach/200608/Ahs83M4d.png)](https://wenda.latexstudio.net/data/attach/200608/Ahs83M4d.png) ```` \documentclass[UTF8]{ctexart} \usepackage{tikz} \usetikzlibrary {calc} \usepackage{graphicx} \usepackage{caption,subcaption} \begin{document} %要用的的包:tikz、calc、graphicx、caption。 %\end{minipage}%之后的“%”不能少,与一个图形不能有空行。 \begin{figure} \begin{minipage}[thtbp]{0.25\linewidth} \centering \begin{tikzpicture} \def\x{1cm} %利用参数定义长度。 \def\r{0.8mm} \coordinate (A) at (0,0); \coordinate (B) at (\x,0); \coordinate (C) at (60:\x); \fill[red] (A) circle (\r); \fill[red] (B) circle (\r); \fill[red] (C) circle (\r); \end{tikzpicture} \subcaption*{$n=2$} \end{minipage}% \begin{minipage}[thtbp]{0.25\linewidth} \centering \begin{tikzpicture} \def\x{1cm} %利用参数定义长度。 \def\r{0.8mm} \coordinate (A) at (0,0); \coordinate (B) at (\x,0); \coordinate (C) at (60:\x); \fill[red] (A) circle (\r); \fill[red] (B) circle (\r); \fill[red] (C) circle (\r); \fill[red] ($ (A)!.5!(B) $) circle (\r); \fill[red] ($ (B)!.5!(C) $) circle (\r); \fill[red] ($ (C)!.5!(A) $) circle (\r); \end{tikzpicture} \subcaption*{$n=3$} \end{minipage}% \begin{minipage}[thtbp]{0.25\linewidth} \centering \begin{tikzpicture} \def\x{1cm} %利用参数定义长度。 \def\r{0.8mm} \coordinate (A) at (0,0); \coordinate (B) at (\x,0); \coordinate (C) at (60:\x); \fill[red] (A) circle (\r); \fill[red] (B) circle (\r); \fill[red] (C) circle (\r); \fill[red] ($ (A)!0.333!(B) $) circle (\r); \fill[red] ($ (A)!0.666!(B) $) circle (\r); \fill[red] ($ (B)!0.333!(C) $) circle (\r); \fill[red] ($ (B)!0.666!(C) $) circle (\r); \fill[red] ($ (C)!0.333!(A) $) circle (\r); \fill[red] ($ (C)!0.666!(A) $) circle (\r); \end{tikzpicture} \subcaption*{$n=4$} \end{minipage}% \begin{minipage}[thtbp]{0.25\linewidth} \centering \begin{tikzpicture} \def\x{1.3cm} %利用参数定义长度。 \def\r{0.9mm} \coordinate (A) at (0,0); \coordinate (B) at (\x,0); \coordinate (C) at (60:\x); \fill[red] (A) circle (\r); \fill[red] (B) circle (\r); \fill[red] (C) circle (\r); \fill[red] ($(A)!0.25!(B)$) circle (\r); \fill[red] ($(B)!0.25!(C)$) circle (\r); \fill[red] ($(C)!0.25!(A)$) circle (\r); \fill[red] ($(A)!0.5!(B)$) circle (\r); \fill[red] ($(B)!0.5!(C)$) circle (\r); \fill[red] ($(C)!0.5!(A)$) circle (\r); \fill[red] ($(A)!0.75!(B)$) circle (\r); \fill[red] ($(B)!0.75!(C)$) circle (\r); \fill[red] ($(C)!0.75!(A)$) circle (\r); \end{tikzpicture} \subcaption*{$n=5$} \end{minipage}% \caption*{(第10题)} \end{figure} \end{document} ````
3条回答
registor
2020-06-08 20:52
可以使用`\foreach`循环实现: ```tex \documentclass{ctexart} \usepackage{tikz} \usetikzlibrary{positioning} \usepackage{graphicx} \def\x{2} %利用参数定义长度。 \def\r{0.8mm} \newcommand\tikzTri[1][1]{ % 起始点 \fill[red] (0, 0) circle (\r); % 顶点坐标,主要是为了题注定位 \coordinate (C) at (60:\x); % 单位长度 \pgfmathsetmacro\dx{\x / #1} % 循环绘制3个边 \foreach \tx/\rt in {0/0,0/60,\x/120} { \begin{scope}[shift={(\tx,0)},rotate=\rt] \foreach \i in {1,...,#1} { \pgfmathsetmacro\offx{\dx * \i} \fill[red] (\offx, 0) circle (\r); } \end{scope} } % 标记数加1,并变为整数 \pgfmathtruncatemacro{\lb}{#1+1} % 绘制题注 \node[below =\x of C] {$n=\lb$}; } \begin{document} \begin{figure} \begin{tikzpicture} \foreach \j in {1,...,4} { % 平移距离 \pgfmathsetmacro\offx{(\x + 1.5) * \j} \begin{scope}[shift={(\offx, 0)}] \tikzTri[\j] \end{scope} } \end{tikzpicture} \caption{(第10题)} \end{figure} \end{document} ``` 既然是欧几里德几何,建议你学习一下用texdoc tkz-euclide学习一下tkz-euclide宏包,可能还可以解决你其它的一些问题。用该宏包,可以实现这个图形: ```tex \documentclass[12pt, border = 8pt, varwidth, convert]{standalone} % 平面几何绘图宏包 \usepackage{tkz-euclide} \def\x{1} %利用参数定义长度 % 设置点样式 % \tkzSetUpPoint[⟨local options⟩] % shape possible: circle, cross, cross out % size the size of the point is size * line width % color % fill circle \tkzSetUpPoint[shape=circle, size=2, color=red, fill=red!50] \newcommand\tikzTri[1][1]{ % 定义等边三角形 \tkzDefPoint(0, 0){A} \tkzDefPoint(\x, 0){B} \tkzDefTriangle[equilateral](A,B) \tkzGetPoint{C} % 绘制三角形顶点 \tkzDrawPoints(A, B, C) % 循环绘制三个边的等分点 \foreach \pta/\ptb in {A/B, B/C, A/C} { % 计算边长 \tkzCalcLength(\pta,\ptb)\tkzGetLength{ABl} % 循环绘制等分点 \foreach \i in {1,...,#1} { % 计算点的位置比例 \pgfmathsetmacro\myl{((\ABl/#1)/\ABl)*\i} % 按比例定义线上的点 \tkzDefPointOnLine[pos=\myl](\pta,\ptb) \tkzGetPoint{D} % 绘制点 \tkzDrawPoint(D) } } % 底边中点 \tkzDefMidPoint(A,B) \tkzGetPoint{M} % 标记数加1,并变为整数 \pgfmathtruncatemacro{\lb}{#1 + 1} % 绘制题注 \node[below =0.2 of M] {$n=\lb$}; } \begin{document} %在document环境中撰写文档 \begin{tikzpicture} \tkzInit[ymax=5,xmax=5] \foreach \j in {1,...,4} { % 平移距离 \pgfmathsetmacro\offx{(\x + 1.5) * \j} \begin{scope}[shift={(\offx, 0)}] \tikzTri[\j] \end{scope} } \end{tikzpicture} \end{document} ``` 敬请批评指正。

一周热门 更多>