如何在 LaTeX 中编写自动递增计数器

如何在 LaTeX 中编写自动递增计数器

排版字母时通常有一个参考,例如:

   XXX-yl-0001

最后一个数字随着每个连续字母而递增。通常,我会手动编码数字。当有数百个字母时,人们往往会时不时地犯错误、重复或遗漏引用。

有人能提出一种使用 TeX 自动化此操作的方法吗?重要的是每次运行只增加一次,即,如果重新运行文件,您不希望计数器增加。请注意,我对 MWE 的灵感已经耗尽。

我的建议是,可能需要两个文件。第一个文件用于汇总,另一个文件用于保存每个作业名称的特定字母参考。

答案1

这是一个基于 ConTeXt 的解决方案。它使用数据集,这是 ConTeXt 的多通道数据机制。基本思想是将文件的 MD5sum 和字母计数存储在辅助文件中。每次运行时,将存储的 MD5sum 值与当前值进行比较。如果 md5sum 已更改,则增加数字并将其存储在辅助文件中。当然,如果您删除辅助文件,则数字将重置为零。(为简单起见,我假设文件后缀始终为.tex

\definedataset[letterdata]

\startluacode
  local datasets = job.datasets
  local filename = environment.inputfilename .. '.tex' -- temp hack
  local checksum = file.checksum(filename)

  local set = "letterdata"

  datasets.setdata{
    name = set,
    data = { checksum = checksum }
  }

  local oldsum  = datasets.getdata(set, 1, "checksum", "")
  local number  = datasets.getdata(set, 2, "number", 0)

  if oldsum ~= checksum then
    number = tonumber(number) + 1
  end

  datasets.setdata{
    name = set,
    data = { number = number }
  }


  context.setvalue("letternumber", number)
\stopluacode

\starttext

Value: \letternumber

\stoptext

每当更改文件并重新编译时,该数字都会增加。重新编译同一个文件不会增加该数字。

答案2

快速 LaTeX 破解。可能不如 Aditya 提出的 ConTeXt 解决方案那么优雅。使用两个流。一个保存总数,另一个缓存字母的值。

\documentclass{article}

\begin{document}
\newcounter{total}
\setcounter{total}{1000}
\def\autoinc{%
        \newread\inputstream
        \immediate\openin\inputstream=\jobname.lcl
        \immediate\read\inputstream to \auxcommand
        \immediate\closeout\inputstream
    \gdef\OurRef{XXX-XX-\auxcommand}

}
%% First we check if a file with the jobname exists holding the RefNumber
%% If it does not exist increment the totalizer and write to file
\IfFileExists{\jobname.lcl}{\autoinc}{%
%% Read totals from file
        \newread\inputstream
        \immediate\openin\inputstream=autoincrementtotals.lcl
        \immediate\read\inputstream to \auxcommand
        \immediate\closeout\inputstream
    \setcounter{total}{\auxcommand}        
    \stepcounter{total}
%% Update totals file
    \newwrite\tempfile
    \immediate\openout\tempfile=autoincrementtotals.lcl
    \immediate\write\tempfile{\thetotal}%
    \immediate\closeout\tempfile

    \gdef\OurRef{XXX-XX-\thetotal}
    %% write to jobname.lcl
    \newwrite\tempfile
    \immediate\openout\tempfile=\jobname.lcl
    \immediate\write\tempfile{\thetotal}%
    \immediate\closeout\tempfile
}
\OurRef
\end{document}

需要进行更多错误检查,然后就可以了。基于此方法,还可以扩展以缓存信件的日期。

相关内容