为什么
\pstGeonode(!{15/sqrt(25)} I2P 45 PtoC){B}
不是产生与以下相同的输出
\pstGeonode(!15 25 sqrt div 45 PtoC){A}
在哪里
\pstVerb{/I2P {exec AlgParser cvx exec} def}%
?
最小工作示例
\documentclass[preview,border=12pt,varwidth]{standalone}
\usepackage{pst-eucl}
\begin{document}
\pstVerb{/I2P {exec AlgParser cvx exec} def}%
\begin{pspicture}[showgrid](4,4)
\pstGeonode(!15 25 sqrt div 45 PtoC){A}
\psarc[linecolor=blue](0,0){3}{0}{90}
\end{pspicture}
%
\hspace{1cm}
%
\begin{pspicture}[showgrid](4,4)
\pstGeonode(!{15/sqrt(25)} I2P 45 PtoC){B}
\psarc[linecolor=blue](0,0){3}{0}{90}
\end{pspicture}
\end{document}
答案1
问题定义了 PostScript 运算符I2P
:
/I2P {exec AlgParser cvx exec} def
并I2P
获取一个被执行的过程作为参数(exec
):
{25/sqrt(25)}
这是错误的,因为花括号内的表达式是AlgParser
和的中缀表达式不是PostScript 代码。据我所知,AlgParser
它需要一个 PostScript 字符串,但该字符串不会被执行:
/I2P {AlgParser cvx exec} def
(25/sqrt(25)) I2P
后一个表达式放在里面\pstGeonode
:
\pstGeonode(...){B}
参数由括号分隔,但中缀表达式也包含括号,这给 TeX 的参数解析带来了麻烦。正确的方法是添加花括号:
\pstGeonode({...}){B}
由于\Pst@Geonode@ii
文件中的错误而无法工作pst-eucl.tex
:
\def\Pst@Geonode@ii(#1)#2{%
\pnode(#1){#2}
....
}
TeX 删除花括号#1
并将参数作为宏参数传递,该宏参数再次由括号分隔。因此\Pst@Geonode@ii
需要修复:
\def\Pst@Geonode@ii(#1)#2{%
\pnode({#1}){#2}% curly braces around #1 and line end removed
...
}
如果没有修复(见下文),在这种情况下可以使用解决方法:
PostScript 字符串也可以以带尖括号的十六进制字符串形式给出。如果使用 pdfTeX(无论何种模式),则\pdfescapehex
可以使用可扩展的,或者也支持 LuaTeX\pdf@escapehex
的包:pdftexcmds
\pstGeonode(! <\pdfescapehex{15/sqrt(25)}> I2P 45 PtoC){B}
或者,括号可以隐藏在宏内,例如:
\newcommand{\firstofone}[1]{#1}
\pstGeonode(! \firstofone{(15/sqrt(25))} I2P 45 PtoC){B}
示例文件:
\documentclass[preview,border=12pt,varwidth]{standalone}
\usepackage{pst-eucl}
\begin{document}
\pstVerb{/I2P {AlgParser cvx exec} def}%
\begin{pspicture}[showgrid](4,4)
\pstGeonode(!15 25 sqrt div 45 PtoC){A}
\psarc[linecolor=blue](0,0){3}{0}{90}
\end{pspicture}
%
\hspace{1cm}
%
\begin{pspicture}[showgrid](4,4)
\pstGeonode(! <\pdfescapehex{15/sqrt(25)}> I2P 45 PtoC){B}
\psarc[linecolor=blue](0,0){3}{0}{90}
\end{pspicture}
\end{document}
修复\Pst@Geonode@ii
:
\usepackage{pst-eucl}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\Pst@Geonode@ii}{\pnode(#1)}{\pnode({#1})}{}{}
\makeatother
% then curly braces can be used to hide the inner parentheses:
\pstGeonode({! (15/sqrt(25)) I2P 45 PtoC}){B}