排版字母时通常有一个参考,例如:
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}
需要进行更多错误检查,然后就可以了。基于此方法,还可以扩展以缓存信件的日期。