好的,作为一个优秀的新手,我遇到了一个令人印象深刻的功能(!
允许直接注入 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}