我编写了以下代码来向我的 latex 标头添加修订号。我依赖于一个 .txt 文件,该文件假定
- 存在于同一目录中。
- 总是有一个数字。任何其他东西都可能让它破裂
我使用的软件包是:
\usepackage{xifthen}
\usepackage{calculator}
从 txt 文件中获取数字并将其加一的代码是:
\newread\file %starts a new file reader
\openin\file=tracking.txt %define 'file' as the 'tracking.txt' file from the tex directory
\def\lastNum{} %declares a variable
\read\file to \lastNum %read the content of the txt file into the variable
\ADD{1}{\lastNum}{\version} %increment it by 1 and saves in a new variable
\newwrite\file %starts a file writer
\immediate\openout\file=tracking.txt % open the file
\immediate\write\file{\version} %write the new incremented value
\closeout\file %closes the file
然后我在标题中使用 \version。
我想让它更强大、更可重用。所以我一直在尝试找到处理以下情况的方法:
- 如果tracking.txt文件不存在,则创建它。
- 如果 tracking.txt 存在,但为空或包含一些非法文本,则从 0 开始(向其中写入零)。非法文本可以是数字以外的任何内容
使用 xifthen 包,我添加了这行代码......
\ifthenelse{isempty{read\file}}{\lastNum{0}}{read\file to \lastNum}
这是完整的、非工作版本:
\newread\file %starts a new file reader
\openin\file=tracking.txt %define 'file' as the 'tracking.txt' file from the tex directory
\def\lastNum{} %declares a variable
\read\file to \lastNum %read the content of the txt file into the variable
\ifthenelse{isempty{read\file}}{\lastNum{0}}{read\file to \lastNum} %check
\ADD{1}{\lastNum}{\version} %increment it by 1 and saves in a new variable
\newwrite\file %starts a file writer
\immediate\openout\file=tracking.txt % open the file
\immediate\write\file{\version} %write the new incremented value
\closeout\file %closes the file
我在 ADD 方法中不断遇到错误。我认为读取的文件中存在错误。任何提示都将不胜感激!我是 Latex 编程的新手——请原谅我的问题和粗糙的代码。
答案1
为什么不使用 aux 文件和 latex 的 label-ref 系统?
\documentclass{report}
\usepackage{refcount}
\makeatletter
\AtBeginDocument{
\newcounter{version} % start version counter, associated label is lblversion
\setcounterref{version}{lblversion} % init counter to label value (thanks to refcount)
\stepcounter{version} % step to counter for current version, add corresponding label
\immediate\write\@auxout{ % while we're at it, let's write immediately current version number
\string
\newlabel{lblversion}{{\theversion}{}}%
}%
}
\makeatother
\begin{document}
\theversion
\chapter{chap1}
\end{document}
每次编译都会将计数器加一version
,由标签记住lblversion
。但是我还没有找到如何摆脱“标签可能已更改”警告……
此外,它包含在一个中,AtBeginDocument
如果您希望在标题中显示版本号,则可能会出现问题,但由于辅助文件是在之前读取的\begin{document}
,因此这是必要的(只要您使用辅助文件)。
答案2
另一个答案无法用于标题,因为它在 begin{document} 处读取辅助文件。但是,就像您对专用文件所做的那样,命令如下InputIfFileExists
:
\documentclass{report}
\newcounter{version} % start version counter, no label here
\InputIfFileExists{\jobname.version}{}{} % read from file, if it exists (might want to consider a ./\jobname.version here to limit to the working folder)
\stepcounter{version}
\makeatletter
{%
\if@filesw % respect \nofiles
\begingroup
\chardef\reserved@c=15 % same write register as environment `filecontents` uses
\immediate\openout\reserved@c=\jobname.version\relax % open/create file to read/write to
\immediate\write\reserved@c{% % instead of writing only version number, we write the assignment
\string\setcounter{version}{\theversion}%
}%
\immediate\closeout\reserved@c
\endgroup
\fi
}
\makeatother
\begin{document}
\theversion
\end{document}
这个片段实际上不是我自己的(虽然在这里根据您的需要进行了调整),但自从我在 tex.sx 上找到它以来,我一直在使用它来满足我的外部文件需求,并且我很难再次找到这个问题......