目标是将标签的基线与角平分线对齐。我想总结以下 4 种可能的技巧。如果还有其他超出我考虑范围的技巧,请告诉我。
第一招:
在这里我使用\rput{(B)}(0,0){\mylabel}
并且目标完成得很好。
\documentclass[pstricks,border=3pt,multi,12pt]{standalone}
\usepackage{pst-eucl}
\psset
{
saveNodeCoors,
CurveType=polyline,
PointName=none,
PointSymbol=none,
MarkAngleRadius=1.6,
LabelSep=1,
}
\newcommand{\mylabel}{$\scriptscriptstyle180^\circ-\theta$}
\begin{document}
\begin{pspicture}(6,6)
\pstGeonode(1,1){A}(5,5){B}(4,1){C}
\pstMarkAngle{A}{B}{C}{\rput{(B)}(0,0){\mylabel}}
\rput(3,5.5){\tiny rput\{(B)\}}
\end{pspicture}
\end{document}
第二招:
我使用\rput{!\psGetNodeCenter{B} B.y B.x atan}(0,0){\mylabel}
并且目的也做得很好。
\documentclass[pstricks,border=3pt,multi,12pt]{standalone}
\usepackage{pst-eucl}
\psset
{
saveNodeCoors,
CurveType=polyline,
PointName=none,
PointSymbol=none,
MarkAngleRadius=1.6,
LabelSep=1,
}
\newcommand{\mylabel}{$\scriptscriptstyle180^\circ-\theta$}
\begin{document}
\begin{pspicture}(6,6)
\pstGeonode(1,1){A}(5,5){B}(4,1){C}
\pstMarkAngle{A}{B}{C}{\rput{!\psGetNodeCenter{B} B.y B.x atan}(0,0){\mylabel}}
\rput(3,5.5){\tiny rput\{!psGetNodeCenter\{B\} B.y B.x atan\}}
\end{pspicture}
\end{document}
第三招:
我使用节点的数值文字B
,\rput{!5 5 atan}(0,0){\mylabel}
但失败了。
\documentclass[pstricks,border=3pt,multi,12pt]{standalone}
\usepackage{pst-eucl}
\psset
{
saveNodeCoors,
CurveType=polyline,
PointName=none,
PointSymbol=none,
MarkAngleRadius=1.6,
LabelSep=1,
}
\newcommand{\mylabel}{$\scriptscriptstyle180^\circ-\theta$}
\begin{document}
\begin{pspicture}(6,6)
\pstGeonode(1,1){A}(5,5){B}(4,1){C}
\pstMarkAngle{A}{B}{C}{\rput{!5 5 atan}(0,0){\mylabel}}
\rput(3,5.5){\tiny rput\{!5 5 atan\}}
\end{pspicture}
\end{document}
第四招:
我使用已保存的节点坐标B
,\rput{!N-B.y N-B.x atan}(0,0){\mylabel}
但失败了。
\documentclass[pstricks,border=3pt,multi,12pt]{standalone}
\usepackage{pst-eucl}
\psset
{
saveNodeCoors,
CurveType=polyline,
PointName=none,
PointSymbol=none,
MarkAngleRadius=1.6,
LabelSep=1,
}
\newcommand{\mylabel}{$\scriptscriptstyle180^\circ-\theta$}
\begin{document}
\begin{pspicture}(6,6)
\pstGeonode(1,1){A}(5,5){B}(4,1){C}
\pstMarkAngle{A}{B}{C}{\rput{!N-B.y N-B.x atan}(0,0){\mylabel}}
\rput(3,5.5){\tiny rput\{!N-B.y N-B.x atan\}}
\end{pspicture}
\end{document}
问题:
\rput
赫伯特曾说过,在处理和时,我必须考虑逆变换\psGetNodeCenter
。我忘记了确切的说法和链接。
简而言之,对于第 3 和第 4 个技巧,我的 PostScript 表达缺少什么?
答案1
(0,0)
在这两种情况下,您仅计算相对于B
(或)的角度(5,5)
为 45 度。这就是角度标记与 45 度线段 AB 一起亮起的原因。以下是正确实施选项 #3 和 #4 的方法:
第三招:
\documentclass[pstricks,border=3pt,multi,12pt]{standalone}
\usepackage{pst-eucl}% http://ctan.org/pkg/pst-eucl
\psset
{
saveNodeCoors,
CurveType=polyline,
PointName=none,
PointSymbol=none,
MarkAngleRadius=1.6,
LabelSep=1,
}
\newcommand{\mylabel}{$\scriptscriptstyle180^\circ-\theta$}
\begin{document}
\begin{pspicture}(6,6)
\pstGeonode(1,1){A}(5,5){B}(4,1){C}
\pstMarkAngle{A}{B}{C}{\rput{!5 5 atan 5 1 sub 5 4 sub atan add 2 div}(0,0){\mylabel}}
\rput(3,5.5){\tiny rput\{!5 5 atan\}}
\end{pspicture}
\end{document}
第四招:
\documentclass[pstricks,border=3pt,multi,12pt]{standalone}
\usepackage{pst-eucl}% http://ctan.org/pkg/pst-eucl
\psset
{
saveNodeCoors,
CurveType=polyline,
PointName=none,
PointSymbol=none,
MarkAngleRadius=1.6,
LabelSep=1,
}
\newcommand{\mylabel}{$\scriptscriptstyle180^\circ-\theta$}
\begin{document}
\begin{pspicture}(6,6)
\pstGeonode(1,1){A}(5,5){B}(4,1){C}
\pstMarkAngle{A}{B}{C}{\rput{!N-B.y N-B.x atan N-B.y N-C.y sub N-B.x N-C.x sub atan add 2 div}(0,0){\mylabel}}
\rput(3,5.5){\tiny rput\{!N-B.y N-B.x atan\}}
\end{pspicture}
\end{document}
本质上,这两种方法都是计算两条线段 AB 和 CB 之间的平均角度:
- 线段 AB (相对于原点
(0,0)
)的夹角为 45 度(或5 5 atan
); - 线段 BC (相对于原点
(0,0)
)的角为 arctan (5-1)/(5-4) = arctan 4/1 (或4 1 arctan
)。
方法四采用更符号化的方法,即保存节点坐标。 两种方法 和 都是用线段AB和BC之间的两个角度的平均值,因此使用add 2 div
。