我想调用一个带有节点名的 PSTricks 宏,该节点名涉及带计数器的算术表达式的结果。
考虑以下不起作用的示例:
\documentclass{article}
\usepackage{pst-node}
\newcounter{mycnt}
\setcounter{mycnt}{2}
\def\nodename#1{%
A\numexpr\themycnt-#1\relax B}%
\begin{document}
\begin{pspicture}[showgrid](5,5)
\pnode(5,5){A1B}
\psdot(\nodename{1})
\end{pspicture}
\end{document}
宏调用\nodename{1}
应该在 PSTricks 宏的括号内求值A1B
。但上述示例在使用 编译时不起作用latex -> dvips -> ps2pdf
。它给出了 Postscript 错误
Error: /undefined in 2-1\relax
Operand stack:
--dict:51/400(L)-- N@A\numexpr
这表明,并\numexpr
没有被评估,而是逐字传递给了 Postscript 文件。
\nodename
是否可以这样定义宏,使其在上述示例中起作用?这不得影响宏的使用方式,但必须按 工作\psdot(\nodename{1})
。算术表达式涉及计数器。
答案1
\psdot
扩展其参数,但\numexpr
不可扩展;它在\number
或之后扩展\the
。在 的上下文中,\numexpr
最好使用\value{mycnnt}
,它指的是“抽象”值,而不是\themycnt
指的是其表示。
\documentclass{article}
\usepackage{pst-node}
\newcounter{mycnt}
\setcounter{mycnt}{2}
\newcommand\nodename[1]{%
A\the\numexpr\value{mycnt}-#1\relax B}
\begin{document}
\begin{pspicture}[showgrid](5,5)
\pnode(5,5){A1B}
\psdot(\nodename{1})
\end{pspicture}
\end{document}