如何连接节点间的下支撑/上支撑

如何连接节点间的下支撑/上支撑

我使用节点绘制了以下水平线,并想在某些节点之间绘制下支撑/上支撑。请告诉我该怎么做。

%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.pathreplacingTikZ 库,它可以让您替换提供装饰的路径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都会与节点中心保持相同的距离。我会选择这种方式,因为它可以为行提供最易读的代码,还可以很好地对齐所有内容,此外,它还可以确保所有括号最终都位于相同的垂直位置,无论它们连接的是哪些节点。 southnorth$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);

相关内容