每当我调用\degrees
运算符(角度单位)的定义时,都会更新。只需使用和au
重新定义 即可轻松完成。到目前为止一切顺利。\degrees
\let
\renewcommand
现在我想创建另外两个运算符pt2xu
和,它们在和方向上pt2yu
转换pt
(指向)到活动单元。不幸的是,活动单元和必须通过键值赋值进行更新,所以我不能在这里使用和的方法。相反,我必须创建一个名为的新宏。必须至少调用一次才能进行初始化。后续调用必须在我们对、和进行赋值之后进行。拥有这样的接口不是一个好主意,因为用户可能会在赋值后忘记调用。x
y
\psxunit
\psyunit
\let
\renewcommand
\updateoperator
\updateoperator
unit
xunit
yunit
\updateoperator
我的想法是劫持和分配unit
,以便它们在初始化时以及通过键值分配更新时默默调用至少一个。xunit
yunit
\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}