考虑一下代码
\documentclass[12pt]{book}
\usepackage{pstricks,xcolor,graphicx}
\begin{document}
\thispagestyle{empty}
\begin{pspicture}(-5,-5)(5,12)%
\psframe[fillcolor=yellow!35!brown,fillstyle=solid](-5,-5)(5,12)
\psframe[linecolor=yellow!35!brown](-5,-5)(5,12)
\SpecialCoor % Provides for polar coordinates (r;t) ; r = length (cm); t = angle (degrees)
\psgrid
\rput(4;0){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;15){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;30){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;45){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;60){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;75){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;90){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;105){\includegraphics[width=1.4em]{example-image-a}}
\end{pspicture}%
\end{document}
产生输出
该\rput
命令始终相对于笛卡尔(即 (x,y))点 (0,0)。如果可能的话,我想改变这一点。
目前,\rput(4;0)
将在距离 (0,0) 0 度和 4 个单位的位置绘制相关图像。
\rput(4;15)
将在距 (0,0) 15 度和 4 个单位的位置绘制相关图像。
ETC。
问题:我如何覆盖 (0,0) 默认值来绘制图像,例如相对于笛卡尔点 (0,6)?代码是用 编译的xelatex
,我正在寻找一个可以修改 MWE 并可以用 编译的答案xelatex
。
评论:确实,效果只是简单地将图像的散射(在本例中)向上平移了 6 个单位。但是,在我需要这个的文档中,有相当多的图像,将参考点从 (0,0) 更改为其他点是最方便的,以免平移后的图像干扰其他现有图像。因此,这篇文章的目的是将 (0,0) 默认值替换为 (0,6) 作为参考点。
谢谢。
答案1
您可以使用一个节点,然后指定相对于该节点的极坐标:
\documentclass[12pt]{book}
\usepackage{pstricks,pst-node,xcolor,graphicx}
\begin{document}
\thispagestyle{empty}
\begin{pspicture}(-5,-5)(5,12)%
\psframe[fillcolor=yellow!35!brown,fillstyle=solid](-5,-5)(5,12)
\psframe[linecolor=yellow!35!brown](-5,-5)(5,12)
\SpecialCoor % Provides for polar coordinates (r;t) ; r = length (cm); t = angle (degrees)
\psgrid
\pnode(0,6){center}
\rput([nodesep=4,angle=0]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=15]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=30]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=45]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=60]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=75]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=90]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=105]center){\includegraphics[width=1.4em]{example-image-a}}
\end{pspicture}%
\end{document}
如果您不想更改语法,您还可以修补\polar@coor
用于应用极坐标的内部宏,以便随后移动结果点:
\documentclass[12pt]{book}
\usepackage{pstricks,xcolor,graphicx}
\makeatletter
\let \original@polar@coor \polar@coor
\newcommand \polar@transform@code{}
\renewcommand \polar@coor[2] {%
\original@polar@coor {#1}{#2}%
\edef\pst@coor{%
\pst@coor
\polar@transform@code
}%
}
\def \MovePolarBase(#1){%
\pst@@getcoor{#1}%
\edef \polar@transform@code {%
stack exch \pst@coor 3 1 roll add 3 1 roll add stack
}%
\show\polar@transform@code
}
\makeatother
\begin{document}
\thispagestyle{empty}
\begin{pspicture}(-5,-5)(5,12)%
\psframe[fillcolor=yellow!35!brown,fillstyle=solid](-5,-5)(5,12)
\psframe[linecolor=yellow!35!brown](-5,-5)(5,12)
\SpecialCoor % Provides for polar coordinates (r;t) ; r = length (cm); t = angle (degrees)
\psgrid
\MovePolarBase(0,6)
\rput(4;0){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;15){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;30){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;45){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;60){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;75){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;90){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;105){\includegraphics[width=1.4em]{example-image-a}}
\end{pspicture}%
\end{document}
答案2
以下重新定义了\rput@iv
,它是用于处理坐标规范的内部宏之一。它将极坐标转换为笛卡尔坐标(分别对 x 和 y 使用 radius*cos(angle) 和 radius*sin(angle)),添加指定的笛卡尔坐标,然后\rput@v
使用新的笛卡尔坐标调用下一个宏。计算是使用 执行的xfp
,它具有内置函数cosd
和sind
用于度数的余弦和正弦。
当然,如果您仍然想将原始定义用于其他图或其他点,那么您可以先存储定义(使用\let
)并在需要时恢复它。
梅威瑟:
\documentclass[12pt]{book}
\usepackage{pstricks,xcolor,graphicx}
\usepackage{xfp}
\begin{document}
\thispagestyle{empty}
\def\xtranslation{0}
\def\ytranslation{6}
\makeatletter
\def\rput@iv(#1;#2){%
\edef\xtranslated{\fpeval{#1*cosd(#2)+\xtranslation}}%
\edef\ytranslated{\fpeval{#1*sind(#2)+\ytranslation}}%
\message{print #1;#2 at \xtranslated,\ytranslated}
\pst@killglue \pst@makebox {\rput@v {\xtranslated,\ytranslated}}%
}
\makeatother
\begin{pspicture}(-5,-5)(5,12)%
\psframe[fillcolor=yellow!35!brown,fillstyle=solid](-5,-5)(5,12)
\psframe[linecolor=yellow!35!brown](-5,-5)(5,12)
\SpecialCoor % Provides for polar coordinates (r;t) ; r = length (cm); t = angle (degrees)
\psgrid
\rput(4;0){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;15){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;30){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;45){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;60){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;75){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;90){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;105){\includegraphics[width=1.4em]{example-image-a}}
\end{pspicture}%
\end{document}
结果:
答案3
PSTricks 解决方案仅用于娱乐或比较目的。
\documentclass[pstricks,border=\dimexpr355mm/113]{standalone}
\usepackage{pst-plot}
\usepackage{graphicx}
\begin{document}
\def\N{16 } % the trailing space is needed!
\def\a{4}
\def\b{3}
\def\x{6}
\def\y{0}
\begin{pspicture}[showgrid](-1,-4)(11,4)
\degrees[\N]
\curvepnodes[plotpoints=\numexpr\N+1]{0}{\N AnytoRad}{\a*cos(t)+\x|\b*sin(t)+\y}{A}
\psellipse(\x,\y)(\a,\b)
\foreach \i in {0,...,\numexpr\N-1}{\rput(A\i){\includegraphics[width=1cm]{example-image-a}}}
\end{pspicture}
\end{document}