¿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, \psdots
toma el primer paréntesis derecho como delimitador, no el segundo. Este problema común de TeX se resuelve en el xparse
paquete. Aquí guardo la definición de \psdots
y la redefino para xparse
tomar un argumento "" "obligatorio" r
delimitado por (
y )
. Esos delimitadores se emparejarán, según #1
se !2 \h(2)
desee. Luego paso esto #1
al guardado \psdots
entre paréntesis: el conjunto adicional de llaves #1
asegura 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@object
cuál parece ser la base de algunos pst-plot
comandos.