使用 TikZ 模拟 \rput 的按键问题

使用 TikZ 模拟 \rput 的按键问题

\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.styrl\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}  

结果 :

在此处输入图片描述

相关内容