我需要scope
根据极变量(不是xshift
和)来转移一些环境yshift
。假设此功能尚未实现(是吗?!)并且我没有重新发明轮子,我认为这将是一个很好的机会来pgf
自己动手做这件事。
这是我尝试过的:
\documentclass[tikz]{standalone}
\usepackage{graphicx}
\usepackage{pgf}
\newcommand\object{
\draw[fill=red] (0,0) rectangle ++(2,2);
}
\newcommand\polarshift[2]{
xshift = \pgfmathparse{multiply(#1,cos(#2))}
yshift = \pgfmathparse{multiply(#1,sin(#2))}
}
\begin{document}
\begin{tikzpicture}
\object;
\begin{scope}[\polarshift{60}{30}]
\object;
\end{scope}
\end{tikzpicture}
\end{document}
但是 LaTeX 抱怨如下:不完整 \iffalse。
此代码片段有什么问题?
答案1
这是试图说服你让事情变得更 Ti钾Zy。与宏相比,\object
定义一个 可能更好pic
object
。然后移位只是 的(相对)坐标pic
:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[pics/object/.style={
code={\draw[fill=red] (0,0) rectangle ++(2,2);}}]
\path pic{object} (30:60pt) pic{object} ;
\end{tikzpicture}
\end{document}
如你所见,代码变得更短了。而且自定义也更容易了:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[pics/object/.style={
code={\draw[fill=red,pic actions] (0,0) rectangle ++(2,2);}}]
\path pic{object} (30:60pt) pic[rotate=30,scale=1.2,dashed,draw=blue]{object} ;
\end{tikzpicture}
\end{document}
附录:至于你的评论:当然,你的方法也可以奏效。首先,Ti钾Z 会自动解析这些表达式,因此无需说\pgfmathparse
。除此之外,您还缺少一个逗号,并且需要扩展宏。
\documentclass[tikz]{standalone}
%\usepackage{graphicx} %<-loaded by tikz
%\usepackage{pgf}% <- loaded by tikz
\newcommand\object{
\draw[fill=red] (0,0) rectangle ++(2,2);
}
\newcommand\polarshift[2]{
xshift ={#1*cos(#2)},
yshift ={#1*sin(#2)}
}
\begin{document}
\begin{tikzpicture}
\object;
\begin{scope}[style/.expanded=\polarshift{60}{30}]
\object;
\end{scope}
\end{tikzpicture}
\end{document}
答案2
似乎命令不能用作 的选项scope
。请尝试以下操作:
\documentclass[tikz, margin=3mm]{standalone}
\usepackage{graphicx}
\usepackage{pgf}
\newcommand\object{
\draw[fill=red] (0,0) rectangle ++(2,2);
}
\tikzset{polarshift/.style args={#1/#2}{xshift=#1*cos(#2),yshift=#1*sin(#2)}}
\begin{document}
\begin{tikzpicture}
\object;
\begin{scope}[polarshift=60/30]
\object;
\end{scope}
\end{tikzpicture}
\end{document}
答案3
如果我正确理解了你的问题,只需将其转移到polar coordinate
:
\begin{scope}[shift={(30:2)}]
\documentclass[tikz]{standalone}
\usepackage{graphicx}
\usepackage{pgf}
\newcommand\object{
\draw[fill=red] (0,0) rectangle ++(2,2);
}
%\newcommand\polarshift[2]{
% xshift = \pgfmathparse{multiply(#1,cos(#2))}
% yshift = \pgfmathparse{multiply(#1,sin(#2))}
%}
\begin{document}
\begin{tikzpicture}
\object;
\begin{scope}[shift={(30:2)}]
\object;
\end{scope}
\end{tikzpicture}
\end{document}