\rput
这是TikZ的测试版。我不知道 psticks 版本是否接受极坐标,但我添加了此选项。我的问题是添加选项ref = B, Bl , Br, t, tl , tr, b, bl , br
。我不知道什么是执行此操作的好方法(pgfkeys?IeX?)。我知道如何应用这些选项,但我不知道如何正确获取值。
\documentclass{scrartcl}
\usepackage{ifpdf,tikz}
\def\myobject{% this is to make some tests
\pgfpathmoveto{\pgfqpoint{0bp}{0bp}}
\pgfpathcurveto{\pgfqpoint{50bp}{0bp}}
{\pgfqpoint{150bp}{0bp}}
{\pgfqpoint{200bp}{16bp}}
\pgfpathcurveto{\pgfqpoint{250bp}{0bp}}
{\pgfqpoint{350bp}{0bp}}
{\pgfqpoint{400bp}{0bp}}
\pgfpathlineto{\pgfqpoint{400bp}{1bp}}
\pgfpathcurveto{\pgfqpoint{350bp}{0bp}}
{\pgfqpoint{250bp}{0bp}}
{\pgfqpoint{200bp}{22bp}}
\pgfpathcurveto{\pgfqpoint{150bp}{0bp}}
{\pgfqpoint{50bp}{0bp}}
{\pgfqpoint{0bp}{1bp}}
\pgfpathlineto{\pgfqpoint{0bp}{0bp}}
\pgfusepath{fill,stroke}}%
\makeatletter
\ifpdf
\pgfutil@ifundefined{rput}
{\def\rput{\pgfutil@ifnextchar[{\rput@i}{\rput@ii}}% the code is based on pstricks version
\def\rput@i[#1]{\global\edef\opt@rput{#1}\rput@ii}%
\def\rput@ii{\pgfutil@ifnextchar({\def\angle@rput{0}\rput@iv}{\rput@iii}}%
\def\rput@iii#1{\def\angle@rput{#1}\pgfutil@ifnextchar({\rput@iv}{\rput@iv(0,0)}}%,
\def\rput@iv(#1){\edef\pos@rput{#1}\rput@v}%
\def\rput@v#1{%
\begingroup%
\makeatletter
\begin{tikzpicture}[overlay]
\path (0,0)--(\pos@rput);
\protected@edef\rput@temp{%
\noexpand
\node[inner sep=0pt,anchor=base,\opt@rput,rotate=\angle@rput]}\rput@temp at (\pos@rput) {#1};
\end{tikzpicture}%
\endgroup%
\ignorespaces}}{}%
\fi
\makeatother
\begin{document}
a\foreach \y in {0,6,...,72}{\pgfmathsetmacro{\ratio}{0.2+\y*0.01}%
\rput[](50pt,\y pt){\pgftransformscale{\ratio}\myobject}}
\vspace{5cm}
a\foreach \a in {0,4,...,356}{\rput(\a:3){$\bullet$}}
\hrule
bad\rput{40}(-90:4){\myobject}\rput(0:5){good}
\hrule
\end{document}
答案1
最后我找到了一种ref
选择方法。我使用了与我在 pstricks 中看到的方法类似的方法。我不知道我是否做对了,但目前我保留了这种方法。我尝试使用 pgfkeys,但遇到了一些困难。
\protected@edef\rput@temp
很有用,但我不知道如何替换这个宏,也许用很多\expandafter
。我的问题是管理键,但我希望我的代码与纯文本一起工作。
如果你找到更简单或更好的东西,我会很高兴。
更新 4
我添加了;
而不是:
来表示极坐标,并添加了和ref
等一些值。我更正了 pstricks 版本中的一些错误空格和等。最后,我创建了一个小包:tikzrput.styr
l
\ignorespaces
tikzrput.sty
%% Options are the same of /rput in pstricks
\NeedsTeXFormat{LaTeX2e}%
\RequirePackage{tikz,ifpdf}%
\ProvidesPackage{tikzrput}[2012/02/23 v0.1 rput for tikz]%
\edef\rputPtVirCode{\the\catcode`\;}
\edef\rputAtCode{\the\catcode`\@}
\catcode`\;=12\relax
\catcode`\:=12\relax
\catcode`\@=11\relax
\newif\ifrput@polar\rput@polarfalse
\def\rput@empty{}
\def\rput@parsecoordinate#1{%
\rput@getseparator#1,\@nil
\ifrput@polar
\rput@getfrompolar#1\@nil
\fi
}%
\def\rput@getseparator#1,#2\@nil{%
\ifx\rput@empty#2\rput@empty%
\rput@polartrue
\else
\rput@polarfalse
\fi
}%
\def\rput@getfrompolar#1;#2\@nil{%
\def\pos@rput{#1:#2}%
}%
\def\rput@pos@ {\def\rput@anchor{center}}
\def\rput@pos@B {\def\rput@anchor{base}}
\def\rput@pos@Br {\def\rput@anchor{base east}}
\def\rput@pos@Bl {\def\rput@anchor{base west}}
\def\rput@pos@tr {\def\rput@anchor{north east}}
\def\rput@pos@tl {\def\rput@anchor{north west}}
\def\rput@pos@br {\def\rput@anchor{south east}}
\def\rput@pos@bl {\def\rput@anchor{south west}}
\def\rput@pos@t {\def\rput@anchor{north}}
\def\rput@pos@b {\def\rput@anchor{south}}
\def\rput@pos@r {\def\rput@anchor{east}}
\def\rput@pos@l {\def\rput@anchor{west}}
\ifpdf
\pgfutil@ifundefined{rput}%
{%
\def\rput{\pgfutil@ifnextchar[{\rput@i}{\global\edef\opt@rput{}\rput@ii}}%
\def\rput@i[#1]{\global\edef\opt@rput{#1}\rput@ii}%
\def\rput@ii{\pgfutil@ifnextchar({\def\angle@rput{0}\rput@iv}{\rput@iii}}%
\def\rput@iii#1{\def\angle@rput{#1}\pgfutil@ifnextchar({\rput@iv}{\rput@iv(0,0)}}%,
\def\rput@iv(#1){\def\pos@rput{#1}%
\rput@parsecoordinate{#1}%
\rput@v}%
\def\rput@v#1{%
\begingroup
\@nameuse{rput@pos@\opt@rput}%
\begin{tikzpicture}[overlay]
\path (0,0)--(\pos@rput);
\protected@edef\rput@temp{%
\noexpand\node[inner sep=0pt,
anchor=\rput@anchor,
rotate=\angle@rput]%
}\rput@temp at (\pos@rput) {#1};
\end{tikzpicture}%
\endgroup\ignorespaces
}%
}{%
}%
\fi
\catcode`\;=\rputPtVirCode\relax
\catcode`\@=\rputAtCode\relax
\endinput
\documentclass{scrartcl}
\usepackage{ifpdf,tikz}
\edef\rputPtVirCode{\the\catcode`\;}
\edef\rputAtCode{\the\catcode`\@}
\catcode`\;=12\relax
\catcode`\:=12\relax
\catcode`\@=11\relax
\newif\ifrput@polar\rput@polarfalse
\def\rput@empty{}
\def\rput@parsecoordinate#1{%
\rput@getseparator#1,\@nil
\ifrput@polar
\rput@getfrompolar#1\@nil
\fi
}%
\def\rput@getseparator#1,#2\@nil{%
\ifx\rput@empty#2\rput@empty%
\rput@polartrue
\else
\rput@polarfalse
\fi
}%
\def\rput@getfrompolar#1;#2\@nil{%
\def\pos@rput{#1:#2}%
}%
\def\rput@pos@ {\def\rput@anchor{center}}
\def\rput@pos@B {\def\rput@anchor{base}}
\def\rput@pos@Br {\def\rput@anchor{base east}}
\def\rput@pos@Bl {\def\rput@anchor{base west}}
\def\rput@pos@tr {\def\rput@anchor{north east}}
\def\rput@pos@tl {\def\rput@anchor{north west}}
\def\rput@pos@br {\def\rput@anchor{south east}}
\def\rput@pos@bl {\def\rput@anchor{south west}}
\def\rput@pos@t {\def\rput@anchor{north}}
\def\rput@pos@b {\def\rput@anchor{south}}
\def\rput@pos@r {\def\rput@anchor{east}}
\def\rput@pos@l {\def\rput@anchor{west}}
\ifpdf
\pgfutil@ifundefined{rput}%
{%
\def\rput{\pgfutil@ifnextchar[{\rput@i}{\global\edef\opt@rput{}\rput@ii}}%
\def\rput@i[#1]{\global\edef\opt@rput{#1}\rput@ii}%
\def\rput@ii{\pgfutil@ifnextchar({\def\angle@rput{0}\rput@iv}{\rput@iii}}%
\def\rput@iii#1{\def\angle@rput{#1}\pgfutil@ifnextchar({\rput@iv}{\rput@iv(0,0)}}%,
\def\rput@iv(#1){\def\pos@rput{#1}%
\rput@parsecoordinate{#1}%
\rput@v}%
\def\rput@v#1{%
\begingroup
\@nameuse{rput@pos@\opt@rput}%
\begin{tikzpicture}[overlay]
\path (0,0)--(\pos@rput);
\protected@edef\rput@temp{%
\noexpand\node[inner sep=0pt,
anchor=\rput@anchor,
rotate=\angle@rput]%
}\rput@temp at (\pos@rput) {#1};
\end{tikzpicture}%
\endgroup\ignorespaces
}%
}{%
}%
\fi
\catcode`\;=\rputPtVirCode\relax
\catcode`\@=\rputAtCode\relax
\begin{document}
\null\vspace*{4cm}%
\hspace*{5cm}%
\foreach \a in {0,4,...,356}{\rput(\a;3){$\bullet$}}\rput[B](0;0){Circle}%
\hspace{5cm}end\rput[B](180;5cm){start}
\end{document}
如何使用 :
\documentclass{scrartcl}
\usepackage{tikzrput}
\begin{document}
\null\vspace*{4cm}%
\hspace*{5cm}%
\foreach \a in {0,4,...,356}{\rput(\a;3){$\bullet$}}\rput[B](0;0){Circle}%
\vspace*{4cm}%
\hspace{5cm}end\rput[B](180;5cm){start}
a line :\ \rput[B](5,0){end}\rput[Bl](0,0){start}
\hrule
\end{document}
结果 :