Wie kann man Klammern als Makrotrennzeichen nutzbar machen, wenn das Makro in der RPN-Notation als Punkt übergeben wird?

Wie kann man Klammern als Makrotrennzeichen nutzbar machen, wenn das Makro in der RPN-Notation als Punkt übergeben wird?

Wie kann man sie als Makrotrennzeichen erstellen (und verwenden, wenn das Makro in der RPN-Notation als Punkt übergeben wird?)

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

Antwort1

das ist das Standardproblem mit TeX und wie es Token liest. Es sucht nach dem ersten ( und dem ersten ), dem Grund, warum Sie diese Art der Notation nicht verwenden können. Es ist ein ähnliches Problem wie das bekannte [...[...]]. Sie können jedoch die algebraische Notation verwenden:

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

Alternativ können Sie verwenden

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

es ergibt keinen Sinn, ein Argument für h zu verwenden, das bereits oben auf dem Stapel vorhanden ist. Dasselbe gilt für \g. Der umgekehrte Weg ist (was auch funktioniert):

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

Wenn man jedoch die doppelten Klammern will, dann kann man es lösen mit

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

Antwort2

Wie Herbert bemerkt, \psdotswird die erste rechte Klammer als Trennzeichen verwendet, nicht die zweite. Dieses häufige TeX-Problem wird im xparsePaket gelöst. Hier speichere ich die Definition von \psdotsund definiere sie mit neu, xparseum ein „erforderliches“ Argument „ “ zu verwenden, rdas durch (und abgegrenzt ist ). Diese Trennzeichen werden gepaart, sodass es wie gewünscht #1ist !2 \h(2). Ich gebe dies dann in Klammern #1an das gespeicherte weiter \psdots: Die zusätzlichen Klammern darum herum #1stellen sicher, dass das richtige Argument verwendet wird.

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

Eine allgemeinere Lösung wäre eine Neudefinition \pst@object, die einigen pst-plotBefehlen zugrunde zu liegen scheint.

verwandte Informationen