编辑澄清:

编辑澄清:

编辑澄清:

我有一个计数器,我想将其值写入辅助文件。该计数器稍后将以非常动态的方式使用,因此必须在后续运行时将其读回或根据需要重新计算。

这个问题的主要目的是弄清楚如何简单地将一个在宏中递增的计数器写入文件。

========

当我运行以下 MWE 时,该\writeVerse命令正确地在 PDF 输出中显示此计数器的值,但当我将该计数器写入文件时,它还会添加一堆代码。为什么会发生这种情况?

\documentclass[pagesize=pdftex, fontsize=10]{scrbook}

\newcounter{countVerse}

\newcommand{\writeVerse}{%
  \stepcounter{countVerse}%
  \thecountVerse%
}

% Write the position to file.
\def\msec@write@lines#1#2{%
    \pdfsavepos%
    \write\yposoutputfile{%
    \string{#1\string}%
    \string{#2\string}%
    }%
}

\begin{document}
\newwrite\yposoutputfile%
\openout\yposoutputfile=\jobname.ypos.txt%

\writeVerse %this works
\msec@write@lines{1}{F}~Some test text for the first verse.
\msec@write@lines{\writeVerse}{F}~And some more text for the second verse. %this doesn't work EDIT: Added second variable {F}

\closeout\yposoutputfile%
\end{document}

在输出文件中生成此文件,其中的部分大胆的不应该存在:

{1}{F} {\global \advance \c@countVerse \@ne \relax \begingroup \let \@elt \global \c@ \csname\endcsname\z@ cl@countVerse\endcsname \endgroup1}{\nobreakspace {}}

答案1

您不能在写入操作期间执行算术计算,因此需要在写入之前执行此操作。

\documentclass{scrbook}

\newcounter{countVerse}

\makeatletter
% Write the position to file.
\newcommand\writelines[2][]{%
  \if!#1!%
    \stepcounter{countVerse}%
    \msec@write@lines{\thecountVerse}{#2}%
  \else
    \msec@write@lines{#1}{#2}%
  \fi
}
\def\msec@write@lines#1#2{%
  \pdfsavepos
  \write\yposoutputfile{%
    \string{#1\string}%
    \string{#2\string}%
  }%
}
\makeatother

\begin{document}
\newwrite\yposoutputfile
\openout\yposoutputfile=\jobname.ypos.txt

\writelines[1]{F}~Some test text for the \emph{first} verse.

\writelines{F}~And some more text for the second verse.    

\closeout\yposoutputfile
\end{document}

当然,这并没有写出位置,为此您必须使用\the\pdflastxpos\the\pdflastypos

你必须确保 的强制参数\writelines只包含 的安全标记;如果它可以包含任意文本,请将中的\write行更改为\write

\protected@write\yposoutputfile{}{%

@还要注意,名称中包含的宏应该仅在\makeatletter和之间定义和使用(明确)。\makeatother

相关内容