Как сделать скобки пригодными для использования в качестве разделителей макросов, когда макрос передается как точка в нотации 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. Другой способ (который тоже работает):

\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команд.

Связанный контент