我使用节点绘制了以下水平线,并想在某些节点之间绘制下支撑/上支撑。请告诉我该怎么做。
%draw horizontal line
\draw (0,0) -- (8,0);
%draw vertical lines
\foreach \x in {0,2.3,4,8}
\draw (\x cm,3pt) -- (\x cm,-3pt);
%draw nodes
\draw (0,0) node[below=3pt] {$ \underline{c} $} node[above=3pt] {$ $};
\draw (2.3,0) node[below=3pt] {$ c_A^{*} $} node[above=3pt] {$ $};
\draw (4,0) node[below=3pt] {$ c_B^{*} $} node[above=3pt] {$ $};
\draw (8,0) node[below=3pt] {$\overline{c} $} node[above=3pt] {$ $};
答案1
我将为此使用decorations.pathreplacing
TikZ 库,它可以让您替换提供装饰的路径brace
。
要获得括号,您要做的第一件事就是绘制一条线,该线稍后将成为您的路径。由于您在绘图中使用节点(而不仅仅是坐标),因此使用这些节点来定位括号是有意义的。为了使用节点来定位新元素,需要对它们进行命名。这可以通过使用语法\node (<name>) at (<coordinates>) [<options>] {<text>};
或使用name
中的选项来完成<options>
。
我还将为标签节点定义一种新样式,这样以后如果你想同时更改所有节点的偏移量、颜色、大小或任何其他属性时就会更加容易。我将像这样绘制节点:
\tikzset{
position label/.style={
below = 3pt
}
}
\node [position label] (cStart) at (0,0) {$ \underline{c} $};
\node [position label] (cA) at (2.3,0) {$ c_A^{*} $};
\node [position label] (cB) at (4,0) {$ c_B^{*} $};
\node [position label] (cEnd) at (8,0) {$\overline{c} $};
然后,您可以绘制将成为支撑的线。要连接前两个节点,您可以说
\draw (cStart.south) -- (cA.south);
然而,这并不奏效
该线不是水平的,因为south
两个节点的锚点位于不同的 y 坐标。
有很多不同的方法可以使线条变得水平:
您可以使用以下
-|
语法:\draw (cStart.south) -- (cStart.south -| cA.south)
,它将从(cStart.south)
到通过的水平线(cStart.south)
和通过的垂直线的交点绘制一条线(cA.south)
您可以使用以下
let
语法:\draw let \p1=(cStart.south), \p2=(cA.south) in (\p1) -- (\x2,\y1);
,将两个坐标保存到宏中\p1
,\p2
并允许您分别访问每个点的 x 和 y 分量您可以将所有节点定义为具有相同的
text depth
和,这样无论节点文本如何,和锚点text height
都会与节点中心保持相同的距离。我会选择这种方式,因为它可以为行提供最易读的代码,还可以很好地对齐所有内容,此外,它还可以确保所有括号最终都位于相同的垂直位置,无论它们连接的是哪些节点。south
north
$c$
以下是节点和线的新代码:
\tikzset{
position label/.style={
below = 3pt,
text height = 2ex,
text depth = 1ex
}
}
\node [position label] (cStart) at (0,0) {$ \underline{c} $};
\node [position label] (cA) at (2.3,0) {$ c_A^{*} $};
\node [position label] (cB) at (4,0) {$ c_B^{*} $};
\node [position label] (cEnd) at (8,0) {$\overline{c} $};
现在可以将该行转换为括号。为此,首先使用 key 定义一个修饰符decoration={brace}
,然后使用 key 应用该修饰符decorate
:
\draw [decoration={brace}, decorate] (cStart.south) -- (cA.south);
快完成了:括号指向了错误的方向。现在,您可以通过说 来反转绘制路径的方向\draw [decoration={brace}, decorate] (cA.south) -- (cStart.south);
,或者通过说 `decoration={brace, mirror} 来交换装饰的方向。我选择第二种选择。这也可以包装成一种样式,等等:
\tikzset{
position label/.style={
below = 3pt,
text height = 1.5ex,
text depth = 1ex
},
brace/.style={
decoration={brace, mirror},
decorate
}
}
\node [position label] (cStart) at (0,0) {$ \underline{c} $};
\node [position label] (cA) at (2.3,0) {$ c_A^{*} $};
\node [position label] (cB) at (4,0) {$ c_B^{*} $};
\node [position label] (cEnd) at (8,0) {$\overline{c} $};
\draw [brace] (cStart.south) -- (cA.south);
奖励:如果您想标记括号,您可以在构建路径时放置一个节点:
\draw [brace] (cStart.south) -- (cA.south) node [position label, pos=0.5] {First};
或者
\draw [brace] (cStart.south) -- node [position label, pos=0.5] {First} (cA.south);
都会将节点放置在路径的中间(请注意node
关键字的不同位置:在第一种情况下,它位于路径的第二个坐标之后,这意味着您必须使用它pos=0.5
来指定中点。在第二种情况下,node
位于第二个坐标之前,它会自动将节点放置在线的中间)。
要添加不与第一个括号重叠的第二个括号,您可以使用raise
装饰选项。这不会影响标签节点的位置(因为它相对于未装饰的路径),因此您必须yshift
向节点定义提供相同长度的括号:
\draw [brace,decoration={raise=4ex}] (cStart.south) -- node [position label,yshift=-4ex] {Second} (cB.south);