我想定义命令进行一些简单的计算,如下所示:
\def\rectangle(#1,#2)(#3,#4)#5{
\psframe(#1,#2)(#3,#4)
\rput((#1+#3)/2,(#2+#4)/2){#5}
}
%
\rectangle(1,1)(49,49){X}
目标是画一个矩形,然后在矩形的中心写一些文字。
显然,我所做的并没有起到作用。
正确的做法是什么?
答案1
\newcommand
下面是使用而不是 的示例\def
。坐标计算在后记级别水平 ( \rput(! x y)
),考虑逆波兰表示法:
\documentclass{article}
\usepackage{pstricks}
\newcommand{\rectangle}[5]{
\psframe(#1,#2)(#3,#4)
\rput(! #3 #1 add 2 div #4 #2 add 2 div){#5}
}
% #3 #1 sub 2 div #1 add => (#3 - #1) / 2 + #1 => x
% #4 #2 sub 2 div #2 add => (#4 - #2) / 2 + #2 => y
\begin{document}
\begin{figure}
\begin{pspicture}(4,4)
\rectangle{1}{1}{4}{4}{center}
\end{pspicture}
\end{figure}
\end{document}
如果你想保留语法
\rectangle(a,b)(c,d){text}
您可以这样做xparse
:
\documentclass{article}
\usepackage{xparse}
\usepackage{pstricks}
\NewDocumentCommand{\rectangle}{
>{\SplitArgument{1}{,}} r() % argument of type (<x>,<y>), will be passed as {<x>}{<y>}
>{\SplitArgument{1}{,}} r() % ditto
m % argument in braces
}{%
\dorectangle#1#2{#3}%
}
% same as before, just changed the name
\NewDocumentCommand{\dorectangle}{ m m m m m }{%
\psframe(#1,#2)(#3,#4)%
\rput(! #3 #1 add 2 div #4 #2 add 2 div){#5}%
}
\begin{document}
\begin{pspicture}(4,4)
\rectangle(1,1)(4,4){center}
\end{pspicture}
\end{document}
这是一个使用的解决方案\def
:
\documentclass{article}
\usepackage{pstricks}
\def\rectangle(#1,#2)(#3,#4)#5{
\psframe(#1,#2)(#3,#4)
\rput(! #3 #1 add 2 div #4 #2 add 2 div){#5}
}
\begin{document}
\begin{figure}
\begin{pspicture}(4,4)
\rectangle(1,1)(4,4){center}
\end{pspicture}
\end{figure}
\end{document}
答案2
我不确定这是否是你想要的,但它确实实现了你的目标。
在 Plain TeX 中:
\long\def\Boxit#1#2{\vbox{\hrule\hbox{\vrule\vbox spread#1pt{\vfil
\hbox spread#1pt{\hfil#2\hfil}\vfil}\vrule}\hrule}}
\def\Boxedtext#1#2#3{\Boxit{0}{\vbox to #1{\hsize=#2\vfill\hbox to\hsize{\hfill#3\hfill}\vfill}}}
\Boxedtext{1in}{1.5in}{Hi there!}
\bye