我有一个宏\Content
,其中包含多个宏的出现\comm
。后者增加一个计数器,并显示计数器的值。调用\Content
给出正确的输出。但我想将其写入\Content
文件,但遇到了问题。我猜,这是因为\write
不喜欢\stepcounter
。我想了解原因,并找到解决方法。
\documentclass{article}
\begin{document}
\newcounter{myCounter}
\newcommand{\comm}{%
\stepcounter{myCounter}%
var\arabic{myCounter} %
}
\def\Content{text \comm text \comm text \comm}
\Content %%%% This works
\newwrite\tempfile
\immediate\openout\tempfile=counter.txt
\immediate\write\tempfile{\Content}
\immediate\closeout\tempfile
\end{document}
附言:顺便说一句,Missing \endcsname inserted.
我不太明白错误信息……
编辑1我更精确地阐述了我的问题:宏\Content
是给定的,我不想修改它。我只知道它包含许多出现的\comm
。我想将的内容写入\COntent
文件,但\comm
用类似的东西替换每个var1
,var2
这会随着一些计数器而增加。
答案1
\write
是扩展上下文,\edef
因此只发生扩展,没有分配,因此没有\def
或计数器分配。您需要增加计数器前寫作。
如果(如评论中所述)您确实想使用扩展,那么您不能使用\advance
(或等效地)\stepcounter
但您可以这样做:
\documentclass{article}
\begin{document}
\newcounter{myCounter}
\def\Content{text \comm text \comm text \comm}
\newwrite\tempfile
\immediate\openout\tempfile=counter.txt
{%
\def\comm#1\expandcomm#2{var#2 #1\expandcomm}
\def\expandcomm#1\relax{}
\immediate\write\tempfile{\Content\expandcomm123456789\relax}%
}%
\immediate\closeout\tempfile
\end{document}
其中写道:
text var1 text var2 text var3
答案2
以下是如何在 Plain TeX 中执行此操作。将其转换为 LaTeX 应该不难。
\newcount\roycount
\def\writecontent{\buildcontent\immediate\write\tempfile{\commcontent}}
\def\buildcontent{\def\commcontent{\gobble}\step{text}{var}\step{text}{var}\step{text}{var}}
\def\step#1#2{\advance\roycount 1
\edef\commcontent{\commcontent\space#1\space#2\number\roycount}}
\def\gobble#1{}
\newwrite\tempfile
\immediate\openout\tempfile=\jobname.out
\writecontent
\writecontent
\immediate\closeout\tempfile
\bye
正如你所见,要写入的字符串是构建前写入(无法执行分配)。
书面文件是
text var1 text var2 text var3
text var4 text var5 text var6