这个问题为最符合该问题的答案提供了 4 个赏金,每个赏金 500。
\uput
我对描述非零维对象的行为很感兴趣。非零维对象是具有 TeX 级别准备好的容器的对象。零维对象在 TeX 级别没有容器。
对于零维物体,其行为已知如下,现在我对此不再感兴趣。
让我们考虑以下两种情况:
情况1:
\documentclass[pstricks,border=12pt]{standalone}
\SpecialCoor
\usepackage{multido}
\def\NonZeroDimenObject{%
\pspicture(2,1)
\psframe(2,1)
\psline[linecolor=blue]{->}(1,.5)(2,.5)
\endpspicture}
\SpecialCoor
\begin{document}
\multido{\i=0+15}{24}{%
\begin{pspicture}[showgrid](8,8)
\pscircle(4,4){2}
\psline[origin={4,4}](3.5;\i)
\rput(4,4){\i}
\uput{2}[\i]{0}(4,4){\NonZeroDimenObject}
\end{pspicture}}
\end{document}
案例 2:
\documentclass[pstricks,border=12pt]{standalone}
\SpecialCoor
\usepackage{multido}
\def\NonZeroDimenObject{%
\pspicture(2,1)
\psframe(2,1)
\psline[linecolor=blue]{->}(1,.5)(2,.5)
\endpspicture}
\SpecialCoor
\begin{document}
\multido{\i=0+15}{24}{%
\begin{pspicture}[showgrid](8,8)
\pscircle(4,4){2}
\rput(4,4){\i}
\uput{2}[0]{\i}(4,4){\NonZeroDimenObject}
\end{pspicture}}
\end{document}
问题:
我有 3 个问题:
对于给定的
\alpha
(或第二个参数),从 到(i_x,i_y)
的一条线(i_x,i_y)+(r;\alpha)
并不总是指向对象框和半径为 的假设圆之间的接触点labelsep
。如何\uput
确定接触点?解释内部算法应该没问题。枢轴似乎不是静态的。如何
\uput
确定接触点?解释内部算法应该没问题。我们什么时候才真正需要
\uput
?请给我至少 2 个无法被其他 put 宏替代的实用独特示例。
答案1
\documentclass[pstricks,border=12pt]{standalone}
\SpecialCoor
\usepackage{multido}
\def\Width{3 }
\def\Height{1 }
\def\NonZeroDimenObject#1{%
\pspicture(\Width,\Height)\psframe(\Width,\Height)\endpspicture}
\SpecialCoor
\psset{dotscale=0.5}
\begin{document}
\multido{\i=0+5}{73}{%
\begin{pspicture}[showgrid](9,8)
\multido{\iB=0+1}{\i}{\uput{2}[\iB]{0}(4,4){\pspicture(\Width,\Height)\psdot(!\Width 2 div \Height 2 div)\endpspicture}}
\pscircle(4,4){2}
\rput(4,4){\psline[linecolor=blue]{->}(3;\i)}
\rput(4,4){\i}
\uput{2}[\i]{0}(4,4){\NonZeroDimenObject{\i}}
\end{pspicture}}
\end{document}
第一个是labelsep=0
。如果它不是正方形,它将使用变换矩阵进行平移。
答案2
在我看来,解释是显而易见的:
\uput{2}[\i]{0}(4,4){\NonZeroDimenObject}
考虑 object 之前的 4 个参数
\NonZeroDimenObject
。它被放置在- 在径向距离
2
单位处(runits
具体来说) - 第一个参数{.}
; - 以 的可变角度
\i
(范围从 到0
,345
步长为度增量,总共15
~步;根据 的定义) - 第二个参数;24
\multido{<type/var>=<start>+<diff>}{<repititions>}{<stuff>}
[.]
0
围绕对象中心原点进行固定角度的旋转——第三个参数{.}
;- 从点 (x,y) = (
4,4
) - 第四个参数(.,.)
。
- 在径向距离
\uput{2}[0]{\i}(4,4){\NonZeroDimenObject}
考虑 object 之前的 4 个参数
\NonZeroDimenObject
。它被放置在- 在径向距离
2
单位处(runits
具体来说) - 第一个参数{.}
; - 以固定的角度
0
-第二个参数[.]
; \i
围绕物体中心原点以度为单位进行可变旋转(范围从0
到,360
以5
度为单位递增,总共约 73 步;根据 的定义\multido{<type/var>=<start>+<diff>}{<repititions>}{<stuff>}
)- 第三个参数{.}
;和- 从点 (x,y) = (
4,4
) - 第四个参数(.,.)
。
- 在径向距离
\uput{<labelsep>}[<refangle>]{<rotation>}(<x,y>){<stuff>}
是一个便利宏,\rput
它还执行大量繁重的工作,将对象放置在所需的参考点上。在某些(非常)特殊的情况下,您可以使用\rput
命令组合来获得与 类似的放置\uput
,如下例所示(例如 45 度角):\documentclass{article} \usepackage{pstricks}% http://tug.org/PSTricks/main.cgi/ \begin{document} \SpecialCoor \noindent \begin{minipage}{0.5\linewidth} \begin{pspicture}[showgrid](3,3) \pscircle*(1.5,1.5){1} \uput{1.2}[45]{0}(1.5,1.5){$v$} \end{pspicture} \end{minipage}% \begin{minipage}{0.5\linewidth} \begin{pspicture}[showgrid](3,3) \pscircle*(1.5,1.5){1} \rput{0}(1.5,1.5){\rput[bl]{0}(1.2;45){$v$}} \end{pspicture} \end{minipage} \end{document}
正如预期的那样,输出是相同的。
方便之处在哪里?嗯,
\uput
自动决定放置对象时使用的参考点,以保证它<labelsep>
与放置点有径向距离。以下示例显示了这一点:\documentclass[pstricks,border=12pt]{standalone}% http://ctan.org/pkg/standalone \usepackage{multido}% http://ctan.org/pkg/multido \begin{document} \SpecialCoor \multido{\i=0+15}{24}{% \begin{pspicture}[showgrid](3,3) \psline[linecolor=gray,origin={1.5,1.5}](1.2;\i) \pscircle(1.5,1.5){1} \rput(1.5,1.5){\i} \uput{1.2}[\i]{0}(1.5,1.5){$v$}% Example 1 %\rput{0}(1.5,1.5){\rput{0}(1.2;\i){$v$}}% Example 2 %\rput{0}(1.5,1.5){\rput[bl]{0}(1.2;\i){$v$}}% Example 3 \end{pspicture} } \end{document}
通过注释掉/添加示例 1、2 或 3 所需的行,可以从上述代码中获得三个动画的相应输出。
注意,
\uput
始终保持固定的径向距离,而\rput
使用固定参考点时,则会受到影响。如果没有固定参考点,则默认为对象的中心。
以下显示了为了充分回答该问题必须计算的距离和平移的差异:
\documentclass[pstricks,border=12pt]{standalone}% http://ctan.org/pkg/standalone
\usepackage{multido,pst-node}% http://ctan.org/pkg/{multido,pst-node)
\def\Width{3 }
\def\Height{1 }
\def\NonZeroDimenObject{%
\pspicture(\Width,\Height)\psframe(\Width,\Height)\endpspicture}
\SpecialCoor
\psset{dotscale=0.5}
\begin{document}
\multido{\i=0+5}{73}{%
\begin{pspicture}[showgrid](9,8)
\pscircle(4,4){2}
\uput{2}[\i]{0}(4,4){\rnode{MyNode}{\NonZeroDimenObject}\pnode(! \psGetNodeCenter{MyNode} MyNode.x MyNode.y){NZDOcentre}}
\rput{0}(4,4){\psline[linecolor=blue]{->}(2;\i)}
\psline[linecolor=red]{->}(4,4)(NZDOcentre)
\rput(4,4){\i}
\end{pspicture}}
蓝线表示命令指向的精确角度和距离\uput
,而红线表示中心\NonZeroDimenObject
。