如何劫持按键分配来引发触发其事件处理程序的事件?

如何劫持按键分配来引发触发其事件处理程序的事件?

每当我调用\degrees运算符(角度单位)的定义时,都会更新。只需使用和au重新定义 即可轻松完成。到目前为止一切顺利。\degrees\let\renewcommand

现在我想创建另外两个运算符pt2xu和,它们在和方向上pt2yu转换pt(指向)到活动单元。不幸的是,活动单元和必须通过键值赋值进行更新,所以我不能在这里使用和的方法。相反,我必须创建一个名为的新宏。必须至少调用一次才能进行初始化。后续调用必须在我们对、和进行赋值之后进行。拥有这样的接口不是一个好主意,因为用户可能会在赋值后忘记调用。xy\psxunit\psyunit\let\renewcommand\updateoperator\updateoperatorunitxunityunit\updateoperator

我的想法是劫持和分配unit,以便它们在初始化时以及通过键值分配更新时默默调用至少一个。xunityunit\updateoperator

您有什么想法可以实现它吗?

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

\let\tempdegrees\degrees
\renewcommand\degrees[1][360]{\pstVerb{/au {\pst@angleunit} bind def}\tempdegrees[#1]}

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

\makeatother
\updateoperator% the first invocation for initialization
\begin{document}
\begin{pspicture}[showgrid](-1,0)(4,2)
    \psline[linecolor=red,linewidth=20pt](2,0)(2,1)
    \psframe*[linecolor=blue](!2 10 pt2yu sub 1)(!2 10 pt2yu add 2)
    \qdisk(!1 90 PtoC){1}
\end{pspicture}

\psset{unit=2cm,runit=2cm}
\updateoperator
\degrees[400]

\begin{pspicture}[showgrid](-.5,0)(2,1)
    \psline[linecolor=red,linewidth=20pt](1,0)(1,.5)
    \psframe*[linecolor=blue](!1 10 pt2yu sub .5)(!1 10 pt2yu add 1)
    \qdisk(!.5 100 au PtoC){.5}
\end{pspicture}
\end{document}

答案1

关键字的参数unit由宏处理\psset@pstricks@unit。因此,你可以通过以下方式劫持参数的处理(在为@字母的上下文中,例如在包文件中):

\let\saved@pstricks@unit=\psset@pstricks@unit
\def\psset@pstricks@unit#1{%
  \saved@pstricks@unit{#1}%
  \updateoperator
}

关键字的行为由以下代码片段unit定义:pstricks.tex

\define@key[psset]{pstricks}{unit}[1cm]{%
  \pssetlength\psunit{#1}%
  \psxunit=\psunit%
  \psyunit=\psunit%
}

如果发生变化,宏的合成名称\psset@pstricks@unit也可能会改变。

第二种选择是劫持\psset宏,如下所示

 \let\saved@psset=\psset
 \def\psset#1{\saved@psset{#1}\updateoperator}

相关内容