当宏作为 RPN 符号中的点传递时,如何使括号可用作宏分隔符?

当宏作为 RPN 符号中的点传递时,如何使括号可用作宏分隔符?

当宏作为 RPN 符号中的点传递时,如何制作(并用作宏分隔符?)

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}

\def\f#1{#1 2 exp 1 sub}
\def\g[#1]{#1 2 exp 1 sub}
\def\h(#1){#1 2 exp 1 sub}
\def\i<#1>{#1 2 exp 1 sub}
\def\j|#1|{#1 2 exp 1 sub}

\begin{document}
\begin{pspicture}[showgrid=bottom](-4,-2)(4,4)
    \psplot{-2}{2}{\f x}
    \psdots(!0 \f{0})
    \psdots(!-2 \g[-2])
%   \psdots(!2 \h(2))% <== cannot be compiled!
    \psdots(!1.25 \i<1.25>)
    \psdots(!1.5 \j|1.5|)
\end{pspicture}
\end{document}

答案1

这是 TeX 的默认问题,也是它读取标记的方式。它会查找第一个 ( 和第一个 ),这就是为什么您不能使用那种符号的原因。这是一个与众所周知的 类似的问题[...[...]]。但是,您可以使用代数符号:

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}

\def\f#1{#1 2 exp 1 sub}
\def\g[#1]{#1 2 exp 1 sub}
\def\h(#1){#1^2-1}

\begin{document}
\begin{pspicture}[showgrid=bottom](-4,-2)(4,4)
\psplot{-2}{2}{\f x}
\psdots(!0 \f{0})(!-2 \g[-2])(*2 {\h(x)})(*1 {x^2-1})
\end{pspicture}
\end{document}

或者你可以使用

\def\h{dup 2 exp 1 sub}
\psdot(!2 \h)

使用已经存在于堆栈顶部的参数对 h 来说是没有意义的。 也一样\g。 另一种方法是 roung(也可以):

\def\h(#1){#1 dup 2 exp 1 sub}
\psdot(!{\h(2)})

但是,如果想要双括号,那么可以用以下方法解决

\psdot(!2 {\h(2)}/Y ED Y)

答案2

正如 Herbert 所指出的,\psdots将第一个右括号作为分隔符,而不是第二个。这个常见的 TeX 问题在xparse包中得到了解决。在这里,我保存了 的定义\psdots,并用 重新定义它,以接受由和分隔的xparse“必需”参数“ ” 。这些分隔符将成对出现,因此是所需的。然后我将其提供给保存在括号内的 :周围的额外括号确保使用了正确的参数。r()#1!2 \h(2)#1\psdots#1

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}

\usepackage{xparse}
\let\savedpsdots\psdots
\RenewDocumentCommand {\psdots} {r()} {\savedpsdots({#1})}

\def\f#1{#1 2 exp 1 sub}
\def\g[#1]{#1 2 exp 1 sub}
\def\h(#1){#1 2 exp 1 sub}
\def\i<#1>{#1 2 exp 1 sub}
\def\j|#1|{#1 2 exp 1 sub}

\begin{document}
\begin{pspicture}[showgrid=bottom](-4,-2)(4,4)
    \psplot{-2}{2}{\f x}
    \psdots(!0 \f{0})
    \psdots(!-2 \g[-2])
    \psdots(!2 \h(2))% <== could be compiled!
    \psdots(!1.25 \i<1.25>)
    \psdots(!1.5 \j|1.5|)
\end{pspicture}
\end{document}

更通用的解决方案是重新定义\pst@object似乎是几个pst-plot命令的基础。

相关内容