此代码
\documentclass[border=2mm]{standalone}
\usepackage{libertine}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\sffamily
\draw[very thick, label=below:{Darnay}] (0,-1) -- (0,-3);
\draw[very thick, rotate=120, label=above left:{Lorry}] (0,-1) -- (0,-3);
\draw[very thick, rotate=240, label=above right:{Stryver}] (0,-1) -- (0,-3);
\node at (0,0) {Carton};
\end{tikzpicture}
\end{document}
产生这样的结果:
我的目标是让代码中指示的标签出现在相应行的末尾,但这并没有发生。基于这个答案我以为我知道自己在做什么,但也许我误读了?
另外,我可以将更多标签与线条关联起来吗(例如,每条线条的中间),还是需要创建单独的节点并单独放置它们?
答案1
Apath
不是 a plot
,适用于其中一个的选项不一定适用于另一个。您需要创建节点或坐标和/或标签或使用edge
和标签或……有很多方法。
但是,您可以使用 将所有这些作为路径规范的一部分来执行\draw
。我还移至了very thick
图片的选项以避免重复。
例如:
\documentclass[border=2mm,tikz]{standalone}
\usepackage{libertine}
\begin{document}
\begin{tikzpicture}[very thick]
\sffamily
\draw (0,-1) -- (0,-3) node [label=below:{Darnay}] {};
\draw[rotate=120] (0,-1) -- (0,-3) node [label=above left:{Lorry}] {};
\draw[rotate=240] (0,-1) -- (0,-3) node [midway, label=right:Plane] {} node [pos=.75, label=right:Van] {} node [label=above right:{Stryver}] {};
\node at (0,0) {Carton};
\end{tikzpicture}
\end{document}
默认情况下,anode
位于最后位置,例如路径刚刚结束的位置。[实际情况比这稍微复杂一些,但对于我们的目的来说这已经足够了。]但你可以用位置说明符覆盖它,例如midway
或near end
或pos=.04
。
编辑
这是一个更复杂的方法,它使用库来放置node
标签和edge
标签quotes
以启用every edge quotes
样式和使用"<label>"
速记。
\documentclass[border=2mm,tikz]{standalone}
\usepackage{libertine}
\usetikzlibrary{quotes}
\begin{document}
\begin{tikzpicture}
[
very thick,
every edge quotes/.append style={auto, text=blue}
]
\sffamily
\draw (0,0) node {Carton}
(0,-1) edge ["Here"] node [at end, label=below:{Darnay}] {} (0,-3)
edge [rotate=120, "There"'] node [at end, label=above left:{Lorry}] {} (0,-3)
edge [rotate=240, "Everywhere", "Plane"', "Van"' pos=0.8] node [at end, label=above right:{Stryver}] {} (0,-3)
;
\end{tikzpicture}
\end{document}
这是起什么作用的?
\usetikzlibrary{quotes}
允许使用如上所述的简写和样式。
[
very thick,
every edge quotes/.append style={auto, text=blue}
]
设置整个图片的选项:绘制的路径应该是very thick
,并且使用引号语法放置为标签的所有节点edge
都应auto
与blue
文本一起放置。通常,这会将标签放置在可接受的位置(根据上下文,在上方、下方、右侧、左侧),但我们可以在特定情况下反转此操作,使用'
后将"<label>"
其放在相反的一侧,即"<auto-placed label>"
"<switched label>"'
。
path
整个图表使用绘制而成\draw
。我们从原点开始,立即创建包含文本 的第一个节点Carton
:
\draw (0,0) node {Carton}
现在我们移动到(0,-1)
但我们不想让这一举动被画出来,所以我们就移动到那里:
(0,-1)
其他所有东西都从这个点向不同的方向辐射。edge
在这里是完美的,因为每个都edge
将从相同的位置开始,但可以做自己的事情。第一个将使用引号语法转到此处的(0,-3). We'll put the node with the label beneath
末尾:and we'll create a label
edge ["Here"] node [at end, label=below:{Darnay}] {} (0,-3)
由于我们没有改变任何东西,Here
它将被auto
放置在右侧并位于该midway
点,因为这是默认设置。现在来看看第二条边,它被旋转了:
edge [rotate=120, "There"'] node [at end, label=above left:{Lorry}] {} (0,-3)
这次,auto
放置会将标签放在左侧,但我们希望标签放在右侧,因此我们添加了'
后面的按钮"There"
来切换侧面。第三个是最复杂的:
edge [rotate=240, "Everywhere", "Plane"', "Van"' pos=0.8] node [at end, label=above right:{Stryver}] {} (0,-3)
末尾的节点放置方式与之前相同,且第一个标签Everywhere
放置在默认位置(在本例中为左侧),即中间点。Plane
也在中间,但它在右侧,因为我们添加了'
。Van
也向右翻转,但它沿着 更远edge
,因为pos=0.8
,其中0
是起点,1
是终点edge
。
最后我们结束\draw
操作:
;
编辑 编辑
扎尔科正确地指出,label
末尾的节点实际上没有必要使用 s,因为文本可以进入节点本身。但是,需要进行一些调整来模拟现有的间距,因为label
节点与它们标记的节点之间有一定距离,而它们标记的节点则没有。
这使用了positioning
这里并不严格需要的库,但似乎给出了更令人愉悦的视觉效果:
\documentclass[border=2mm,tikz]{standalone}
\usepackage{libertine}
\usetikzlibrary{quotes,positioning}
\begin{document}
\begin{tikzpicture}
[
very thick,
every edge quotes/.append style={auto, text=blue}
]
\sffamily
\draw (0,0) node {Carton}
(0,-1) edge ["Here"] node [at end, below=10pt] {Darnay} (0,-3)
edge [rotate=120, "There"'] node [at end, above left=10pt] {Lorry} (0,-3)
edge [rotate=240, "Everywhere", "Plane"', "Van"' pos=0.8] node [at end, above right=10pt] {Stryver} (0,-3)
;
\end{tikzpicture}
\end{document}
答案2
是的,您可以将更多标签与您想要的任何位置的线条关联起来。只需定义一个类似于那个答案,并mark=at position #1
根据您的需要进行定制。因此,此处的新宏接受两个参数;一个用于位置,另一个用于内容(label/.style args={#1#2}{...}
)。
\documentclass[border=2mm,tikz]{standalone}
\usetikzlibrary{decorations.markings}
\usepackage{libertine}
\begin{document}
\begin{tikzpicture}[label/.style args={#1#2}{%
postaction={ decorate,
decoration={ markings, mark=at position #1 with \node #2;}}}]
\sffamily
\draw[very thick, label={1}{[below]{Darnay}}] (0,-1) -- (0,-3);
\draw[very thick, label={.5}{{Darnay 2}}] (0,-1) -- (0,-3);
\draw[very thick, rotate=120, label={1}{[above right]{Lorry}}](0,-1) -- (0,-3);
\draw[very thick, rotate=240, label={1}{[above left]{Stryver}}](0,-1) -- (0,-3);
\node at (0,0) {Carton};
\end{tikzpicture}
\end{document}