Как сделать (
и )
пригодными для использования в качестве разделителей макросов, когда макрос передается как точка в нотации 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
. Другой способ (который тоже работает):
\def\h(#1){#1 dup 2 exp 1 sub}
\psdot(!{\h(2)})
Однако, если вам нужны двойные скобки, то это можно решить с помощью
\psdot(!2 {\h(2)}/Y ED Y)
решение2
Как отмечает Герберт, \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
команд.