我尝试定义以下命令,用于在 pstricks 中绘制正方形:
\newcommand{\square}[4] {
\rput(#1,#2){\psframe[linecolor=#4](0,0)(#3,#3)}
}
我像这样使用它(绘制一个角位于(1,1)且边长为 3 的红色正方形):
\square(1,1,3,red)
并得到以下错误:
Package xcolor error: Undefined color '1'.
Missing number, treated as zero.
Illegal unit of measure (pt inserted).
我究竟做错了什么?
(此外,如果有更简单的方法来编写这个方形命令,我会很乐意学习..)
答案1
使用 PSTricks 对象定义。然后你就有了相同的选项和星号版本的语法:
\documentclass{article}
\usepackage{pstricks}
\makeatletter
\def\square{\pst@object{square}}% reads star and options and continues with \square@i
\def\square@i(#1,#2)#3{{\use@par\solid@star\psframe[origin={#1,#2}](#3,#3)}}
\makeatother
\begin{document}
\begin{pspicture}[showgrid](0,0)(4,4)
\square(1,1){3}
\square[linecolor=red](0,0.5){2}
\square[linecolor=blue,fillcolor=red!40,fillstyle=solid,opacity=0.5](2,0){2}
\square*[linecolor=cyan,opacity=0.4](0,2){2}
\end{pspicture}
\end{document}
答案2
当然调用:
\square(1,1,3,red)
如果您定义以下内容则无法工作:
\newcommand{\square}[4] {
\rput(#1,#2){\psframe[linecolor=#4](0,0)(#3,#3)}
}
因为 LaTeX 处理参数的方式与其他编程语言不同。你应该调用:
\square{1}{1}{3}{red}
完整示例:
\documentclass{article}
\usepackage{pstricks}
\newcommand{\square}[4] {
\rput(#1,#2){\psframe[linecolor=#4](0,0)(#3,#3)}
}
\begin{document}
\begin{pspicture}(0,0)(3,3)
\square{1}{1}{3}{red}
\end{pspicture}
\end{document}
如果你确实希望使用:
\square(1,1,3,red)
您有可能,但您应该使用以下内容修改定义:
\def\square(#1,#2,#3,#4){
\rput(#1,#2){\psframe[linecolor=#4](0,0)(#3,#3)}
}
示例变为:
\documentclass{article}
\usepackage{pstricks}
\def\square(#1,#2,#3,#4){
\rput(#1,#2){\psframe[linecolor=#4](0,0)(#3,#3)}
}
\begin{document}
\begin{pspicture}(0,0)(3,3)
\square(1,1,3,red)
\end{pspicture}
\end{document}
答案3
只是为了宣传新宏的存在,\reversepath
它是在 2013 年底推出的。
\documentclass[pstricks,border=12pt]{standalone}
\def\RightWing{\psline(0,.5)(.5,.5)(.5,-.5)(0,-.5)}
\def\square(#1,#2)#3#4{%
\pscustom[linecolor=#4,origin={#1,#2}]
{
\scale{#3 #3}
\RightWing
\reversepath
\scale{-1 1}
\RightWing
\closepath
}
\ignorespaces
}
\begin{document}
\begin{pspicture}[showgrid](-5,-5)(5,5)
\square(0,0){3}{red}
\square(3,3){2}{blue}
\end{pspicture}
\end{document}