Como tornar os parênteses utilizáveis ​​como delimitadores de macro quando a macro é passada como um ponto na notação RPN?

Como tornar os parênteses utilizáveis ​​como delimitadores de macro quando a macro é passada como um ponto na notação RPN?

Como tornar (e )utilizável como delimitadores de macro quando a macro é passada como um ponto na notação 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}

Responder1

esse é o problema padrão do TeX e como ele lê tokens. Ele procura o primeiro (e o primeiro), o motivo pelo qual você não pode usar esse tipo de notação. É um problema semelhante ao bem conhecido [...[...]]. No entanto, você pode usar a notação algébrica:

\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 você pode usar

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

não faz sentido usar um argumento para h que já esteja presente no topo da pilha. O mesmo para \g. A outra maneira é (que também funciona):

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

No entanto, se alguém quiser os parênteses duplos, isso pode ser resolvido com

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

Responder2

Como observa Herbert, \psdotstoma o primeiro parêntese direito como delimitador, não o segundo. Este problema comum do TeX é resolvido no xparsepacote. Aqui eu salvo a definição de \psdotse a redefino com xparsepara receber um argumento "obrigatório" r" " delimitado por (e ). Esses delimitadores serão emparelhados, conforme #1desejado !2 \h(2). Em seguida, coloco isso #1entre \psdotsparênteses: o conjunto extra de colchetes #1garante que o argumento correto seja usado.

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

Uma solução mais geral seria redefinir \pst@objecto que parece estar subjacente a alguns pst-plotcomandos.

informação relacionada