¿Cómo hacer que los paréntesis se puedan utilizar como delimitadores de macros cuando la macro se pasa como un punto en notación RPN?

¿Cómo hacer que los paréntesis se puedan utilizar como delimitadores de macros cuando la macro se pasa como un punto en notación RPN?

¿Cómo crearlos (y )utilizarlos como delimitadores de macros cuando la macro se pasa como un punto en la notación 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}

Respuesta1

ese es el problema predeterminado con TeX y cómo lee los tokens. Busca el primero (y el primero), la razón por la que no puedes usar ese tipo de notación. Es un problema similar al bien conocido [...[...]]. Sin embargo, puedes utilizar la notación algebraica:

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

como alternativa puedes usar

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

no tiene sentido utilizar un argumento para h que ya está presente en la parte superior de la pila. Igual por \g. Al revés es (que también funciona):

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

Sin embargo, si uno quiere el doble paréntesis, entonces se puede resolver con

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

Respuesta2

Como señala Herbert, \psdotstoma el primer paréntesis derecho como delimitador, no el segundo. Este problema común de TeX se resuelve en el xparsepaquete. Aquí guardo la definición de \psdotsy la redefino para xparsetomar un argumento "" "obligatorio" rdelimitado por (y ). Esos delimitadores se emparejarán, según #1se !2 \h(2)desee. Luego paso esto #1al guardado \psdotsentre paréntesis: el conjunto adicional de llaves #1asegura que se use el argumento correcto.

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

Una solución más general sería redefinir \pst@objectcuál parece ser la base de algunos pst-plotcomandos.

información relacionada