答案1
为此,我们需要以下 Ti钾Z 库:
calc
将一些节点放置在另外两个节点的中间点:
\node (N) at ($(A)!0.5!(B)$) {}; % places the node (N) midway between (A) and (B)
backgrounds
最后绘制椭圆,但on background layer
(在节点后面)。此选项需要scope
。
剩下的,先把所有的节点都摆好,再画线(如 所述on background layer
)。由于图中有两个几乎完全相同的图,我们可以使用一个\foreach
循环来放置左右节点,代码相同,再用另一个循环来放置编号节点。
像这样:
\documentclass[tikz,border=1.618mm]{standalone}
\usetikzlibrary{calc,backgrounds}
\definecolor{aquamarine}{HTML}{008B9B}
\tikzset{my node/.style={draw,circle,fill=white,inner sep=0,minimum size=9mm}}
\begin{document}
\begin{tikzpicture}
\def\a{4.5} % a semiaxis
\def\b{2.25} % b semiaxis
\def\h{2.5} % height
\foreach[count=\jj from 0]\j in {L,R} % left, right
{
\begin{scope}[shift={({2*\jj*(\a+0.5)},0)}]
\foreach[count=\ii]\i in {130,210,250,290,330}
{% nodes 1 to 5
\node[my node] (\j B\ii) at (\i:\a cm and \b cm) {$\ii'$};
\node[my node,yshift=\h cm] (\j T\ii) at (\i:\a cm and \b cm) {$\ii$};
}% nodes 6 and 7
\node[my node] (\j B6) at (50:\a cm and \b cm) {};
\node[my node,yshift=\h cm] (\j T6) at (50:\a cm and \b cm) {};
\node[my node] (\j B7) at (90:\a cm and \b cm) {$(2n)'$};
\node[my node,yshift=\h cm] (\j T7) at (90:\a cm and \b cm) {$(2n)$};
\foreach\i in {1,...,7}% vertical lines
\draw (\j B\i) -- (\j T\i);
\foreach\i in {2,4}% middle height nodes
\node[my node] at ($(\j B\i)!0.5!(\j T\i)$) {\pgfmathparse{int(\i/2)}$\bar\pgfmathresult$};
\node[rotate=-10] at ($(\j B6) !0.5!(\j T7)$) {$\cdots$}; % dots
\end{scope}
}
% ellipses
\begin{scope}[on background layer]
\draw[very thick,red] (0,0) ellipse (\a cm and \b cm);
\draw[very thick,aquamarine] (0,\h) ellipse (\a cm and \b cm);
\draw[very thick,red] (RT7) -- (RB1.center) arc (130:450:\a cm and \b cm);
\draw[very thick,aquamarine] (RB7) -- (RT1.center) arc (130:450:\a cm and \b cm);
\end{scope}
\end{tikzpicture}
\end{document}
答案2
由于 TO 至少对于 Tikz 来说是新的,因此让我强调一下Juan 的精彩回答,为新手铺平道路。我将使用代码摘录,其中仅显示必需的内容。
新手不应该被 Tikz 丰富的语法吓倒,而应该逐个元素地征服它,就像我在这里使用的简化一样。尝试并接受。
1. 省略号
standalone
是用于绘图的文档类;替换article
并编译以查看差异- 为了定义常量,他使用 TEX 符号,例如,稍后
\def\h{4}
调用\h
- 我放了一个
help grid
来简化方向一点 - 我
\h
稍微增加了一点以便更好地看到中心 - 该
% ellipses
部分是 tikz-ish:\draw
某事,与[options]
,,(some, where)
意图ellipse
与(parameters)
;
- 最后,为了更好地了解椭圆的定义,我将两个
\node
s 与一些{text}
以及[draw]
它的形状(即框架)放在一起
摘自 Juans 的代码和扩展:
\documentclass[tikz,border=1.618mm]{standalone}
\usetikzlibrary{backgrounds}
\definecolor{aquamarine}{HTML}{008B9B}
\begin{document}
\begin{tikzpicture}
\def\a{4.5} % a semiaxis % TEX-syntax; defines a constant
\def\b{2.25} % b semiaxis
\def\h{3} % height % increased separation
% ~~~ for some orientation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\draw [help lines] (-5,-3) grid (5,3);
% ellipses
\begin{scope}[on background layer]
\draw[very thick,red] (0,0) ellipse (\a cm and \b cm);
\draw[very thick,aquamarine] (0,\h) ellipse (\a cm and \b cm);
% ~~~ indicating the centers ~~~~~~~~~~~~~~~~~~~~
\node [draw] at (0,0) {(0/0 - red center)};
\node [draw] at (0,\h) {(0/\h) - green center};
\end{scope}
\end{tikzpicture}
\end{document}
2.“自动”命名节点
非常棒,对于 Tikz 新手来说,需要消化很多内容。
- 为了说明,我再次放了一个简单的
help
grid
,和一些文字上面以下 \foreach \j in {L,R}
将迭代给定的集合,这里{L,R}
,变量\j
在迭代时将具有值 L 和 R- 该
[count=\jj from 0]
选项引入了第二个变量\jj
,给出所述列表中的索引或位置,即取值 0 和 1 - 所以在第一个循环中将
\node at (\jj,0) {\j};
被替换为\node at ( 0 ,0) {L};
- 他稍后会重复使用此机制来生成节点位置的名称
- eg
(RT7)
用于寻址所述节点,该节点由 eg 预先生成(\j T7)
,在迭代过程中\j
具有值R
摘自 Juans 的代码和扩展:
\documentclass[tikz,border=1.618mm]{standalone}
\begin{document}
\begin{tikzpicture}
% ~~~ help grid, from (0/0) to (1/2), 1 cm each ~~~~~~~
\draw [help lines] (0,0) grid (1,2);
% ~~~ placing a node, with text, draw its shape ~~~~~~~~
\node [draw] at (0,2) {centered text at (0/2)};
% Juan's special, simplified
\foreach[count=\jj from 0]\j in {L,R} % left, right
{
\node at (\jj,0) {\j};
}
% ~~~ just to emphasize placement ~~~~~~~~~~~~~~~~~~~
\draw [dashed,thick] (0,.5) -- (0,1.5);
\end{tikzpicture}
\end{document}
3. 其他 Tikz 语法
最好从 ctan 下载 tikz 手册,该手册也有在线 HTML 版本。让我们来看看还有哪些地方需要解释或指出,以便充分理解 Juan 的回答。
- tikz-libraries 扩展了 Tikz;
calc
并backgrounds
在手册中有描述 \tikzset
定义绘图的选项或属性;使代码更具可读性;例如:\node[my node]
...使用定义为的样式my node
\begin{}
...\end{}
是在 LaTeX 和 Tikz 中定义的环境scope
有时是必要的;参见相关章节\node
是你很快就应该记住的一个 Tikz 元素;请参阅相关章节以及第一部分中的教程yshift
移动节点内容,此处沿 y 轴移动;通常用于微调位置$formula$
定义 LaTeX 中的数学环境;作为文本,它可以是节点的内容,例如\node at (0,0) {$formula$};
\pgfmathparse
并\pgfresult
在手册的后面进行了解释:大多数时候你可以不用它,但对于双圈任务来说它很有用