使用 \write 有困难

使用 \write 有困难

我有一个宏\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用类似的东西替换每个var1var2这会随着一些计数器而增加。

答案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

相关内容