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
Herbert が指摘しているように、\psdots
は最初の右括弧を区切り文字として取り、2 番目の括弧は取りません。この一般的な 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
コマンドの基礎となっていると思われるものを再定義することです。