有没有办法将最后的 git 提交日期插入到文档中而不必添加 git 钩子(就像 gitinfo 包所做的那样)?
我不是 100% 确定 LaTeX 包如何工作,但如果它们可以在编译时访问当前目录,并且如果它们可以执行外部命令,那么这应该很容易实现......
答案1
但任何命令行都是svn
一样的。
根据您的配置,您可能需要
pdflatex --enable-write18 filename
使其能够\write18
成为执行 shell 命令的钩子。
这将使用 shell escape 写入临时文件,然后输入
\documentclass{article}
\begin{document}
\immediate\write18{svn info \jobname.tex | grep "Changed Date" > \jobname.info }
\fbox{\input{\jobname.info}}
\end{document}
答案2
我最终使用自定义 Makefile 来插入修订信息。
当创建 Makefile 而不是使用--enable-write18
编译器标志时,您需要人们使用特定的编译方法。这很糟糕。但 write18 也是如此,因为人们必须配置他们的编译器以允许可能不安全的系统访问。通过使用 Makefile,write18 的安全风险会降低,同时提供一种几乎跨平台的文档编译方法(Make
在 Windows 上使用 cygwin 时可用;cygwin 通常随 git 一起提供)。要(智能地)编译文档本身,您可以使用latexmk在 Linux 和 OS X 上(自带 TeXLive)和特克化在 Windows 上(附带 MiKTeX)。
这是 Makefile:
TARGET=main.pdf
LL=latexmk -pdf
CLEAN=latexmk -C
all: revision.tex $(TARGET)
pdf: revision.tex $(TARGET)
.PHONY : clean revision.tex $(TARGET)
revision.tex:
echo "% Autogenerated, do not edit" > revision.tex
echo "\\newcommand{\\revisiondate}{`git log -1 --format=\"%ad\" --date=short`}" >> revision.tex
echo "\\newcommand{\\revision}{`git log -1 --format=\"%h\"`}" >> revision.tex
$(TARGET): $(TARGET:%.pdf=%.tex) $(SRC)
$(LL) $<
clean:
$(CLEAN)
rm -f revision.tex
如果人们想直接从他们最喜欢的 IDE 构建 PDF,他们可以告诉 IDE 触发“make”。这应该适用于大多数软件。例如,当您使用 vim 时,您可以使用如下映射:
map <leader>m :w<CR> :!make<CR><CR>
Makefile 创建一个名为的文件revision.tex
,如下所示:
% Autogenerated, do not edit
\newcommand{\revisiondate}{2012-10-17}
\newcommand{\revision}{e8e5238}
要将其插入到主文档中,只需使用\input{revision}
,然后在所需位置插入\revisiondate
或。\revision
答案3
这是与一起运行的替代解决方案gitinfo2
。因此我真的很喜欢gitinfo2
;所提出的钩子机制从未让我满意。
我最终编写了 Makefile 和 shell 脚本,但它们无法被我的 LaTeX 编辑器正确处理,并且无法在所有平台上运行。
最后,我最终为 编写了一种插件latexmk
。
gitinfo2-latexmk
此插件名为GitHub
免责声明:我是该插件的作者。
设置非常简单:
- 下载插入
gitinfo2.pm
(Perl 模块) .latexmkrc
在您的文件中添加一行
一旦完成这两个小步骤,就不再需要样板了。每次您或您的 LaTeX 编辑器运行 时latexmk
,git 信息就已为包准备好了gitinfo2
。
答案4
我用了达尼洛的方法,但是我在 Windows 上使用 makefile,因此需要进行一些调整才能创建修订文件。
我分享它是为了让任何人受益并改进:
revision.tex:
powershell "echo '\newcommand{\revisiondate}{' | Out-File revision.tex -NoNewLine -Encoding UTF8"
powershell 'git log -1 --format="%ad" --date=short | Out-File revision.tex -Append -NoNewLine -Encoding UTF8'
powershell "echo '}' | Out-File source\_revision.md -Append -Encoding UTF8"
powershell "echo '\newcommand{\revision}{' | Out-File revision.tex -Append -NoNewLine -Encoding UTF8"
powershell "git describe --always --tags | Out-File revision.tex -Append -NoNewLine -Encoding UTF8"
powershell "echo '}' | Out-File revision.tex -Append -Encoding UTF8"