在 tikz 中标记非轴平行括号

在 tikz 中标记非轴平行括号

给定两个点,以下代码绘制一个连接它们的括号并标记。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathreplacing}
\begin{document}
\begin{tikzpicture}
  \coordinate (a) at (0,0);
  \coordinate (b) at (4,0);
  \draw[decorate,decoration={brace,amplitude=10pt,raise=1pt,mirror},yshift=0pt] (a) -- (b) node [midway,yshift=-15pt]{$x$};
  \fill (a) circle (2pt);
  \fill (b) circle (2pt);
\end{tikzpicture}
\end{document}

得出: 在此处输入图片描述

然而,如果连接线不ab轴平行,我们就会得到如下结果:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathreplacing}
\begin{document}
\begin{tikzpicture}
  \coordinate (a) at (0,0);
  \coordinate (b) at (4,2);
  \draw[decorate,decoration={brace,amplitude=10pt,raise=1pt,mirror},yshift=0pt] (a) -- (b) node [midway,yshift=-15pt]{$x$};
  \fill (a) circle (2pt);
  \fill (b) circle (2pt);
\end{tikzpicture}
\end{document}

得出的结果是:在此处输入图片描述

x在这种情况下,标签如何自动定位在“正确的”位置?如果没有自动方法,我猜必须使用xshift和的组合yshift,并考虑括号的raiseamplitude。当我尝试调整这些时,我失败了……这里有什么聪明的方法吗?

答案1

为此,auto放置选项是一个很好的方法:放置节点时会考虑线的斜率,确保它不会与连接起点和终点的直线重叠。如果它在线的错误一侧,您可以添加选项swap。在装饰的情况下brace,您还需要通过为设置更大的值将节点移离线outer sep

\draw [
        decorate, decoration={brace,amplitude=10pt,raise=1pt,mirror}
    ] (a) -- (b) node [
        midway, auto, swap, outer sep=10pt
    ]{$x$};

但是,如您所见,放置还不理想。这是因为auto放置选项仅以 45° 步长定位节点:东、东南、南等。不过,我们可以“破解”一个小的内部宏,使放置以 1° 步长进行。使用该选项放置的节点的锚点由名为(auto的宏确定,当使用该选项时),并且在调用脚本时,和保存指向线方向的矢量的 x 和 y 坐标。将以下内容(取自我的一个\tikz@auto@anchor\tikz@auto@anchorswap\pgf@x\pgf@y先前的答案)进入序言:

\makeatletter
\def\tikz@auto@anchor{%
    \pgfmathtruncatemacro\angle{atan2(\pgf@y,\pgf@x)-90}
    \edef\tikz@anchor{\angle}%
}

\def\tikz@auto@anchor@prime{%
    \pgfmathtruncatemacro\angle{atan2(\pgf@y,\pgf@x)+90}
    \edef\tikz@anchor{\angle}%
}
\makeatother

我们得到


完整代码:

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,decorations.pathreplacing}
\makeatletter
\def\tikz@auto@anchor{%
    \pgfmathtruncatemacro\angle{atan2(\pgf@y,\pgf@x)-90}
    \edef\tikz@anchor{\angle}%
}

\def\tikz@auto@anchor@prime{%
    \pgfmathtruncatemacro\angle{atan2(\pgf@y,\pgf@x)+90}
    \edef\tikz@anchor{\angle}%
}
\makeatother

\begin{document}
\begin{tikzpicture}
  \coordinate (a) at (0,0);
  \coordinate (b) at (4,2);
  \draw [
        decorate, decoration={brace,amplitude=10pt,raise=1pt,mirror}
    ] (a) -- (b) node [
        midway, auto, swap, outer sep=10pt
    ]{$x$};
  \fill (a) circle (2pt);
  \fill (b) circle (2pt);
\end{tikzpicture}
\end{document}

相关内容