我习惯\rput[B](1.5,4.1){\( 1 \)}
在特定位置写一个数字,现在我想在坐标位置表达一个表达式,例如我的宏的输入在\rput[B](2+#1,4.1){\( 1 \)}
哪里,它返回一个错误,有人可以帮忙吗?#1
ERROR: Illegal unit of measure (pt inserted).
答案1
为了允许坐标中的算术,您可以使用逆波兰表示法(简称 RPN)。以下是您可以快速了解的内容可能在…之后
\documentclass{article}
\usepackage{pstricks}% http://tug.org/PSTricks/main.cgi/
\newcommand{\myput}[2][0]{%
\rput[B](!1.5 #1 add 4.1){#2}
}
\begin{document}
\begin{pspicture}(5,5)
\SpecialCoor
\rput[B](1.5,4.1){$1$}
\myput[1]{$2$}
\end{pspicture}
\end{document}
RPN 符号(在 PostScript 中使用)在章节中描述54 特殊坐标的pstricks
文档,并且需要使用\SpecialCoor
。
PostScript 中的 RPN 工作原理是维护堆栈。对于坐标,顶部两个条目代表正在使用的 x 和 y 坐标。举例来说,考虑 RPN 计算
2 3 add 4 1 sub mul
我将使用符号[a b c ...]
来表示 PostScript 堆栈,其中a
项目在底部,在b
其上方,在c
其上方...
从左到右阅读,采取了以下 PostScript 操作:
2
将数字 2 压入堆栈 ~[2]
;3
将数字 3 压入堆栈 ~[2 3]
;add
从堆栈中取出顶部两个元素,并将它们相加,将结果留在堆栈上 ~[5]
;4
将数字 4 压入堆栈 ~[5 4]
;1
将数字 1 压入堆栈 ~[5 4 1]
;sub
从堆栈中取出顶部两个元素,然后将它们相减,将结果留在堆栈上~[5 3]
;mul
从堆栈中取出顶部两个元素,然后将它们相乘,将结果留在堆栈 ~ 中[15]
。
使用这个,应该清楚的是
1.5 #1 add 4.1
1.5
被推入堆栈~[1.5]
;#1
(第一个/可选参数)被推入堆栈~[1.5 #1]
;add
弹出前两个元素,将它们相加然后将结果推r
回到堆栈~[r]
;4.1
被推入堆栈 ~[r 4.1]
。
现在\rput
,知道它已提供!
(RAW PostScript 代码)指令,弹出提供点的 x 和 y 坐标的前两个元素。当然,这需要一些时间来适应。
PostScript 命令的完整列表/参考(包括上述内容)可作为PostScript 语言参考(第三版)。感兴趣的部分包括:
- 3.4 堆栈(第 45 页),其中包括一个类似上述的例子;
- 8.1 操作符概要(第 508 页)
然而,当使用节点时,它提供了一种更直观的方式来查看这种算法[nodesep=..,offset=..]
。
答案2
这应该够了吧:
\documentclass{standalone}
\usepackage{pstricks}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \calc \fp_eval:n
\ExplSyntaxOff
\newcommand{\xyput}[3]{\rput[B](\calc{#1},\calc{#2}){#3}}
\begin{document}
\begin{pspicture}(5,5)
\psframe(0,0)(5,5)
%\rput[B](0,0){0}
\xyput{0+1}{0+1}{0}
\xyput{0+4}{0+1}{1}
\xyput{0+1}{0+4}{2}
\xyput{0+4}{0+4}{3}
\end{pspicture}
\end{document}
参见下图