有没有办法为每次编译创建具有不同版本的不同输出文件(pdf)?例如:
- 编译 -> V0.1
- 编译 -> 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}