尝试将 \csname...\endcsname 控制序列的值写入日志文件时出现“未定义的控制序列”错误

尝试将 \csname...\endcsname 控制序列的值写入日志文件时出现“未定义的控制序列”错误

在阅读 中的 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 

相关内容