使用外部 txt 文件跟踪修订

使用外部 txt 文件跟踪修订

我编写了以下代码来向我的 latex 标头添加修订号。我依赖于一个 .txt 文件,该文件假定

  1. 存在于同一目录中。
  2. 总是有一个数字。任何其他东西都可能让它破裂

我使用的软件包是:


\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。

我想让它更强大、更可重用。所以我一直在尝试找到处理以下情况的方法:

  1. 如果tracking.txt文件不存在,则创建它。
  2. 如果 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 上找到它以来,我一直在使用它来满足我的外部文件需求,并且我很难再次找到这个问题......

相关内容