如何使用 \pstVerb 定义新的 RPN 运算符以将 pt 转换为活动单位?

如何使用 \pstVerb 定义新的 RPN 运算符以将 pt 转换为活动单位?

我想用不同的单位进行矢量加法,如下所示,

(1+2pt,3+4pt) % of course this point format will not work for the current PSTricks

我的解决方案是用 PostScript 符号来写点。但是出现了一个问题:我需要一个新的运算符来转换pt为活动单位。

我想在 PostScript 中执行的操作如下,

(!1 2 Pt2AU add 3 4 Pt2AU add)

又如何定义Pt2AU

注意,PSTricks 中默认的活动单位是 1 厘米。但我们可以更改它。

您可以使用的 MWE 如下,

\documentclass[pstricks,border=12pt]{standalone}
\SpecialCoor

\pstVerb{/Pt2AU {72.27 div 2.54 mul} bind def}% needs correction to accommodate all possible active unit
\psset{unit=1cm}

\begin{document}
\begin{pspicture}[showgrid](4,4)
    \psline(1,3)(!1 2 Pt2AU add 3 4 Pt2AU add)
\end{pspicture}
\end{document}

答案1

尝试这样的事情:(我认为这个版本有效)。

\documentclass{article}
\usepackage{pstricks,pst-node,pst-eucl}
\pagestyle{empty}
\makeatletter
\pstVerb{ /aceGetXcoor {GetNode 0 mul add} bind def
          /aceGetYcoor {GetNode exch 0 mul add} bind def
        }
\newcommand{\mynewnode}[4]{%
    %% #1 = old node
    %% #2 = addition to x-value
    %% #3 = addition to y-value
    %% #4 = new node name
    \pnode( !   tx@EcldDict begin
                /N@#1 aceGetYcoor \expandafter\pst@number\dimexpr #3\relax\space add 
                /N@#1 aceGetXcoor \expandafter\pst@number\dimexpr #2\relax\space add 
                \pst@number\psxunit div exch 
                \pst@number\psyunit div
                end
            ){#4}}
\makeatother
\begin{document}
\psset{xunit=2cm,yunit=20pt}
\begin{pspicture}[showgrid=true](0,0)(5,5)
    \pnode(2,3){A}
    \mynewnode{A}{2cm}{1cm}{B}
    \mynewnode{B}{-1in}{10pt}{C}
    \mynewnode{C}{2em-2ex}{-20ex}{D}
    \psline(A)(B)(C)(D)
\end{pspicture}

\end{document}

在此处输入图片描述

此示例使用 中的 PostScript 库pst-eucl。看起来,如果您以这种方式处理(因为 LaTeX 将所有单位转换为 pts),您可以通过参数传递任何您喜欢的单位#2#3并将点放置在您想要的位置。

答案2

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-node}
\psset{yunit=10pt}

\begin{document}
\begin{pspicture}[showgrid](4,4)
  \pcline[YnodesepB=-3pt,offsetB=10pt](1,3)(1,3)
\end{pspicture}

\end{document}

或者

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pstricks-add}
\psset{yunit=10pt}

\def\myLine(#1)(#2){\rput(#1){\psline(#2)}}

\begin{document}
\begin{pspicture}[showgrid](4,4)
  \myLine(1,3)(3pt,10pt)
\end{pspicture}

\end{document}

答案3

窃取 A.Ellett 答案的重要部分。

\documentclass[pstricks,border=12pt]{standalone}
\SpecialCoor
\psset{xunit=1cm,yunit=10pt}% must be declare before \pstVerb!

\makeatletter
\pstVerb
{
    /pt2xu {\pst@number\psxunit div} bind def
    /pt2yu {\pst@number\psyunit div} bind def
}
\makeatother



\begin{document}
\begin{pspicture}[showgrid](4,4)
    \psline(1,3)(!1 3 pt2xu add 3 10 pt2yu add)
\end{pspicture}

\end{document}

相关内容