为什么我的中缀到后缀运算符不能产生正确的结果?

为什么我的中缀到后缀运算符不能产生正确的结果?

为什么

\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}

enter image description here

答案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}

Result

修复\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}

相关内容