我可以使用\let
重命名
\curvepnodes
到\ParametricNodes
,\Pnodecount
如下\LastIndexP
。
但是,由于\Pnodecount
是在内部动态生成的\curvepnodes
,因此我无法移动\let\LastIndexP\Pnodecount
到序言或单独的文件。
\documentclass[pstricks]{standalone}
\usepackage{pst-plot}
\let\ParametricNodes\curvepnodes
\begin{document}
\begin{pspicture}(-1,-1.5)(7,1.5)
\ParametricNodes[plotpoints=50]{0}{2 Pi mul}{t|sin(t)}{P}
\let\LastIndexP\Pnodecount
\foreach \i in {0,...,\LastIndexP}{\psline(P\i|0,0)(P\i)}
\end{pspicture}
\end{document}
问题
如何\Pnodecount
在序言或单独的文件中重命名动态创建的宏?
注意:P
in\Pnodecount
是 的最后一个参数中指定的节点名称\curvepnodes
。
编辑1
目的是让上述两个宏具有更直观的名称。无论你使用哪种方法来实现此问题,无论是使用修补、劫持、注入、重命名、复制等,只要我可以在序言或单独的文件中进行修补、劫持、注入、重命名、复制等即可。
编辑2
我对写作体力劳动不感兴趣
\def\LastIndexA{\Anodecount}
在正文中使用之后,在序言中\curvepnodes...{A}
,因为重命名将在单独的文件(我自己的包)中自动完成。
答案1
如果您有一个由某些代码定义的命令,并且您希望它除了定义的名称之外还定义一个不同的名称,则需要更改进行定义的代码。在这种情况下:
\documentclass[pstricks]{standalone}
\usepackage{pst-plot}
\makeatletter
\let\curvepnodes@i@old\curvepnodes@i
\def\curvepnodes@i#1#2#3#4{%
\curvepnodes@i@old{#1}{#2}{#3}{#4}%
\expandafter\let\csname LastIndex#4\expandafter\endcsname
\csname#4nodecount\endcsname
\ignorespaces}
\makeatother
\let\ParametricNodes\curvepnodes
\begin{document}
\begin{pspicture}(-1,-1.5)(7,1.5)
\ParametricNodes[plotpoints=50]{0}{2 Pi mul}{t|sin(t)}{P}
\foreach \i in {0,...,\LastIndexP}{\psline(P\i|0,0)(P\i)}
\end{pspicture}
\end{document}
答案2
\documentclass[pstricks]{standalone}
\usepackage{pst-plot}
\let\ParametricNodes\curvepnodes
\def\LastIndexP{\Pnodecount}
\begin{document}
\begin{pspicture}(-1,-1.5)(7,1.5)
\ParametricNodes[plotpoints=50]{0}{2 Pi mul}{t|sin(t)}{P}
\foreach \i in {0,...,\LastIndexP}{\psline(P\i|0,0)(P\i)}
\end{pspicture}
\end{document}
答案3
因为无论如何您都需要在调用时知道词缀,所以最简单的解决方案是使用一个参数宏。
% arara: latex
% arara: dvips
% arara: ps2pdf
\documentclass[pstricks]{standalone}
\usepackage{pst-plot}
\let\ParametricNodes\curvepnodes
\newcommand*{\LastIndex}[1]{\csname #1nodecount\endcsname}
\begin{document}
% original syntax
\begin{pspicture}(-1,-1.5)(7,1.5)
\curvepnodes[plotpoints=50]{0}{2 Pi mul}{t|sin(t)}{P}
\foreach \i in {0,...,\Pnodecount}{\psline(P\i|0,0)(P\i)}
\end{pspicture}
% "better" syntax
\begin{pspicture}(-1,-1.5)(7,1.5)
\ParametricNodes[plotpoints=50]{0}{2 Pi mul}{t|sin(t)}{P}
\foreach \i in {0,...,\LastIndex{P}}{\psline(P\i|0,0)(P\i)}
\end{pspicture}
% with a different name
\begin{pspicture}(-1,-1.5)(7,1.5)
\ParametricNodes[plotpoints=50]{0}{2 Pi mul}{t|sin(t)}{Q}
\foreach \i in {0,...,\LastIndex{Q}}{\psline(Q\i|0,0)(Q\i)}
\end{pspicture}
\end{document}