在阅读 中的 pgf 面向对象编程模块的源代码时<pgf/tikz install dir>/modules/pgfmoduleoo.code.tex
,我编写了以下纯 TeX 手稿来试验该模块。
\input pgf.tex\relax%
\usepgfmodule{oo}\relax%
\pgfooclass{A}{\attribute a=1;}%
\bye
该手稿已成功编译pdftex
。
然后,我希望查看在宏末尾定义的某个 pgf 源代码宏\pgfoo@inherit@attributes
在运行时会扩展为什么。因此,我将以下代码添加为 的最后一行\pgfoo@inherit@attributes
:
\wlog{watch: \csname pgfooY\pgfoo@classname .@pgfoo@process@attributes\endcsname}%
其中的控制序列\csname ... \endcsname
直接从上一行(原始的最后一行\pgfoo@inherit@attributes
)复制而来:
\expandafter\let\csname pgfooY\pgfoo@classname .@pgfoo@process@attributes\endcsname%
\pgfoo@process@attributes
但现在编译手稿时pdftex
出现以下错误信息:
! Undefined control sequence.
\pgfooYsignal.@pgfoo@process@attributes ...ute@op
{emitter}\pgfooYsignal@emi...
<inserted text>
}\endwrite
\pgfoo@inherit@attributes ...ttributes\endcsname }
\pgfooclass@ ...methods \pgfoo@inherit@attributes
\expandafter \let \csname ...
l.837 }
为什么?
答案1
我猜您想了解该标记的含义,而不是对其进行完整扩展:
\input pgf.tex
\usepgfmodule{oo}
\catcode`@=11
\expandafter\def\expandafter\pgfoo@inherit@attributes\expandafter{%
\pgfoo@inherit@attributes
\wlog{watch:
\expandafter\meaning\csname pgfooY\pgfoo@classname .@pgfoo@process@attributes\endcsname
}%
}
\catcode`@=12
\pgfooclass{A}{\attribute a=1;}
\bye
这写入日志文件
watch: macro:->\pgfoo@attribute@op {a}\pgfooYA@a