我将 LaTeX 文档存储在本地 GIT 存储库中。完成文档的适当部分后,我会将其编译为 PDF 并将其发送给不熟悉 LaTeX 或 GIT 的主管。
但是,他要求我用红色标记自上一个 PDF 以来所做的所有更改。目前,我手动执行此操作,因此一旦更改被接受,我也需要将其从文档中删除。这很耗时,而且容易出错。
是否有任何自动化的方法来:
- 选择 GIT 提交或特定日期,用于与当前文档版本进行比较,
- 将当前文档复制到临时文件,并在该临时文件中用红色字体标记所有差异,
- 将临时文件编译为 PDF?
答案1
git show
我使用和的组合完成了此操作latexdiff
。需要注意的是:这适用于单文件文档,如果您将文档拆分为多个文件并使用\input
/ ,则可能会更复杂\include
。
首先从以前的提交中获取文件的版本,使用
git show <commit>:filename.tex > tmp.tex
运行
latexdiff
生成一个新.tex
文件,其中突出显示了差异:latexdiff tmp.tex filename.tex > tmpdiff.tex
tmpdiff.tex
照常编译。
我认为git show
您需要在存储库中指定完整路径,因此如果它放在子文件夹中,则需要path/to/filename.tex
。
我写了一个脚本来自动化这个过程,并清理残余部分。诚然,我还没有用过这个脚本,但它可能是一个起点。
#!/bin/bash
git show $1:file.tex > tmp.tex
latexdiff tmp.tex file.tex > tmpdiff.tex
latexmk -pdf -interaction=nonstopmode tmpdiff.tex
mv -v tmpdiff.pdf Diffed.pdf
rm -v tmp.tex tmpdiff.*
答案2
作为替代方案,这是我过去做过的事情。它很简单,但不是特定于 git 的(碰巧我当时正在使用 git,尽管不太好)。它更接近您的手动方法,但使用适当的工具来减少错误:
我用的是变化标记更改的包当我制作它们时。它需要进行一些定制才能满足我的需求(类似于我需要将突出显示的 pdf 交给非 LaTeX 用户):
\usepackage[authormarkup=none]{changes}
\setaddedmarkup{{\color{blue!75!black}#1}}
\setdeletedmarkup{\protect{\color{blue!25!gray}\sout{#1}}}
\definechangesauthor[name={Chris}]{CH}
\DeclareRobustCommand{\add}[1]{\added[id=CH]{#1}}
\DeclareRobustCommand{\del}[1]{\deleted[id=CH]{#1}}
\DeclareRobustCommand{\rep}[2]{\replaced[id=CH]{#1}{#2}}
\setremarkmarkup{\footnote{#1:\textcolor{blue}{#2}}}
这三行\DeclareRobustCommand
仅仅是方便的宏。
\listofchanges
这也允许我使用。
但是它没有发现我所做的自动(基于查找和替换/正则表达式)更改(equation~\ref
-> Equation~\ref
,很多acronym
\ac
s ->\acl
等)。我本可以编写一个正则表达式查找/替换来执行此操作,但在这种情况下,这会产生不必要的混乱(并产生巨大的listofchanges
)。
请注意,通过传递[final]
到\documentclass
或通过\usepackage[final]{changes}
不会显示更改。
基于 git diff插入 和 宏的脚本\added
无疑\deleted
是\replaced
可行的,但这几乎会重新发明一个糟糕的 latexdiff 版本,所以我不推荐它。
答案3
git-latexdiff
正是为此而写的:https://gitlab.com/git-latexdiff/git-latexdiff
由于我是主要作者,因此我显然有强烈的偏见,但它似乎是迄今为止最先进的工具。
另请参阅此问题:将 latexdiff 与 git 结合使用。
答案4
我认为latex-diff
可以做到这一点。您可能需要更新才能获得此特定功能。基本上,就像Torbjørn T. 的回答作为 的一部分实现latex-diff
。还有一些依赖项可能在 Windows 上不可用。
你需要做类似的事情
latexdiff-vc --git --pdf -r rev file.tex
rev
您要比较的提交的哈希值在哪里。它甚至可以与标签一起使用
手册有详细信息。