每次编译的版本控制

每次编译的版本控制

有没有办法为每次编译创建具有不同版本的不同输出文件(pdf)?例如:

  1. 编译 -> V0.1
  2. 编译 -> V0.2

等等...我知道这个包,vrsion但它不是我要找的。不需要页脚等上的版本控制。:)

答案1

我从伟大的 Heiko Oberdiek 那里得到了一个很好的答案和很有帮助的评论:

  • 不要将数字写入文件,而是写入命令以将计数器设置为文件。然后,可以使用轻松加载它\InputIfFileExists{\jobname.runs}{}{},并涵盖了第一次运行中文件丢失的情况。
  • 相反,\arabic{run}使用示例\number\value{run}\the\value{run}, then any modification of\arabic` 不会造成伤害
  • 在编译结束时写入该文件,则运行成功的概率很大。

示例文件:

\documentclass{article}

\newcounter{run}
\InputIfFileExists{\jobname.runs}{}{}
\stepcounter{run}

\usepackage{atveryend}
\usepackage{newfile}
\AtVeryEndDocument{%
  \newoutputstream{runs}%
  \openoutputfile{\jobname.runs}{runs}%
  \addtostream{runs}{\string\setcounter{run}{\number\value{run}}}%
  \closeoutputstream{runs}%
}

\begin{document}

Output: V0.\therun

\end{document}

为了设置 PDF 文件的名称,我尝试修改\jobname它,但不幸的是,它不起作用,因为我们使用它\jobname来指定写入命令的文件的名称setcounter。我现在要做的是使用带有正则表达式的 Powershell 来获取运行编号并在运行后重命名文件:

$filename = "counterfun4"
$content = [IO.File]::ReadAllText("C:\Users\Uwe\desktop\counterfun4.runs")
$content = [regex]::escape($content)

if ($content -match '\\setcounter\\{run}\\{(\d+)\}')
{
    $run = $($matches[1])
} else {
    $run = "a"
}

pdflatex "$filename.tex"

Rename-Item "C:\Users\Uwe\desktop\counterfun4.pdf" ("counterfun4-"+ $run +".pdf")

Powershell 代码肯定可以改进,但示例完全可以运行。Linux 解决方案肯定是可行的,也许有人可以贡献一个。

编辑2013-07-07:

Heiko 发送了另一个版本,该版本仅在外部文件中使用纯数字,这使得外部处理更容易:

\documentclass{article}

\newcounter{run}
\usepackage{catchfile}
\IfFileExists{\jobname.runs}{%
  \begingroup
    \CatchFileEdef\tmp{\jobname.runs}{\endlinechar=-1\relax}%
    \setcounter{run}{\tmp}%
  \endgroup
}{}
\stepcounter{run}

\usepackage{atveryend}
\usepackage{newfile}
\AtVeryEndDocument{%
  \newoutputstream{runs}%
  \openoutputfile{\jobname.runs}{runs}%
  \addtostream{runs}{\number\value{run}}%
  \closeoutputstream{runs}%
}

\begin{document}

Output: V0.\therun

\end{document}

答案2

使用 bash(大多数 Linux 发行版的普通 shell)很容易。例如,将名为 pdflatex 的文件放到 PATH 中的某个位置(例如~username/bin/usr/local/bin针对所有用户),并在其中输入

#!/bin/bash

file=${1%.tex}
version=$(ls $file.*.pdf | rev | cut -f 2 -d . | rev | sort -rn | head -1)
version=$((version+1))
/usr/bin/pdflatex $file.tex 
mv $file.pdf $file.$version.pdf

或者为其创建一个别名,它们也会在 /usr/bin 中的可执行文件之前被发现。

E:如果您使用-shell-escape并拥有支持扩展属性的文件系统,您也可以执行以下操作

\documentclass{article}

\begin{document}

\makeatletter
\newcommand{\versionnumber}{\@@input|"attr -q -g version \jobname.tex || echo 0"}
\makeatother

\newcounter{version}
\setcounter{version}{\versionnumber}
\stepcounter{version}

This pdf is compile number \theversion.

\immediate\write18{/usr/bin/attr -s version -V \theversion \space \jobname.tex}

\write18{/usr/bin/mv \jobname.pdf \jobname.\theversion.pdf}

\end{document}

相关内容