如何使用 pstricks 中的宏作为坐标参数?

如何使用 pstricks 中的宏作为坐标参数?

好的,作为一个优秀的新手,我遇到了一个令人印象深刻的功能(!允许直接注入 PostScript 作为坐标参数的符号)。我可以用这个功能真正简化我的工作,所以我开始尝试它。

\documentclass[11pt]{book}
\usepackage{graphicx}
\usepackage{pstricks}
\begin{document}%
\begin{pspicture}(-5,-5)(5,5)%
% this works which means I could technically define points as macros
\newcommand{\pAa}{!1.5 1.5}%
\psdot(\pAa)%
% this OTOH does not work
\newcommand{\pAb}[1][1]{!1 #1}
\psdot(\pAb)%
% these don't work either
\psdot(\pAa mul 2)%
\psdot(\pAb{2})%
\end{pspicture}%
\end{document}%

错误消息(1/47)

用法\psdot@ii与定义不符

我想我的问题有两个方面

  • 为什么后者不起作用?我很确定这与宏扩展没有按正确的顺序发生有关
  • 有没有定义点并进行算术运算的解决方法使用和传递 postscript普斯特里克宏?

更新

这个例子没有默认参数也能完美运行。我欢迎任何人解释为什么默认参数会带来灾难

答案1

那个工程

\psdot(\pAa mul 2)

不起作用,因为控制序列后的空格会被忽略,所以当\pAa扩展时结果是

!1.5 1.5mul 2

这是非法的 PostScript 代码。如果你说

\psdot(\pAa\space mul 2)

你得到了你所期望的。

那个工程

\psdot(\pAb{2})

不起作用有两个原因:您定义了\pAb一个可选参数,该参数应该用方括号而不是花括号括起来。但是,

\psdot(\pAb[2])

不会起作用,因为定义不是“完全可扩展的”:它的作用是生成命令印刷 !1 2,而不只是那些字符。

正确的定义应该是

\newcommand{\pAb}[1]{!1 #1}

并调用\psdot{\pAb{2}}即可。但是没有默认值:该参数是必需的。

完整示例:

\documentclass[11pt]{book}
\usepackage{pstricks}

\begin{document}

\begin{pspicture}(-5,-5)(5,5)
%
\newcommand{\pAa}{!1.5 1.5}%
\newcommand{\pAb}[1]{!1 #1}%
%
\psdot(\pAa) 
\psdot(\pAb{1}) 
\psdot(\pAa\space mul 2) 
\psdot(\pAb{2}) 
\end{pspicture}

\end{document}

在此处输入图片描述

答案2

您可以修改宏,这样就不再需要\space

\documentclass[11pt]{book}
\usepackage{graphicx}
\usepackage{pstricks}
\newcommand\pAb[1][1]{\psdot(!1 #1 )}

\begin{document}
    \begin{pspicture}[showgrid](-5,-5)(5,5)
    \newcommand\pAa{!1.5 1.5 }%  The space after 1.5 is important
    \psdot(\pAa)
    \pAb \pAb[3]%
    \psdot(\pAa mul 2)
    \pAb[2]
    \end{pspicture}
\end{document}

相关内容