给定两个点,以下代码绘制一个连接它们的括号并标记。
\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}
得出:
然而,如果连接线不a
与b
轴平行,我们就会得到如下结果:
\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
,并考虑括号的raise
和amplitude
。当我尝试调整这些时,我失败了……这里有什么聪明的方法吗?
答案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@anchor
swap
\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}