让 git-latexdiff 和 texcount 完美协作

让 git-latexdiff 和 texcount 完美协作

最佳方法是什么,可以git-latexdiff很好地查看texcount两次提交之间更改和删除的字数?

答案1

我花了很长时间才让它工作起来,以防将来其他人来寻找它!

我做的第一件事就是使用这个答案因此texcount将使用格式来latexdiff计算添加和删除的单词。

但是,将它与 一起使用有几个问题git-latexdiff。首先,它gitlatex-diff用于将或中latexpand包含的所有文件合并为一个大文件。默认情况下,这还会删除所有注释,包括用于格式化的注释。因此,您需要传递给。\input\include.tex%TC:texcount--latexpand --keep-commentsgit-latexdiff

第二个问题是,git-latexdiff将创建一个临时目录来存储 diff 文件。您可以使用git-latexdiff来告诉将这些目录放在哪里--tmpdirprefix,但是每次运行时创建的各个目录git-latexdiff都是根据进程的 PID 命名的。因此,它们不容易识别,以便texcount在生成的 diff 文件上运行。

因此基于这个答案我决定将字数统计放在文档本身的第一页。这样,git-latexdiff运行时,它将texcount自动调用并将字数统计放在文档中。然后,您可以告诉git-latexdiff将该文件输出到某个地方(或只是在查看器中查看它)并查看字数统计。这个答案为制作模板提供了一些很好的见解texcount。我使用它将其输出为可以包含在.tex文件中的格式,以便它在 pdf 中看起来不错(添加换行符等)。

但是该答案要求将输出保存在文件中,然后使用命令输入\input。问题是,第一次git-latex运行时,它将编译文档一次,这将创建字数统计文件,然后它将在将文档发送到之前将其展平latexdiff。当它展平文档时,它会将字数统计文件的内容直接放入展平的文档中。这样总字数就会正确,但不会显示任何添加或删除的单词,因为尚未制作 diff 文件latexdiff。并且它不会在此之后输入字数统计文件的内容,因为latexpand已经展平了文档。请注意,如果您给出git-latexdiff选项--no-flatten,它确实会保留单个文件;但是,它会不是将所有文件发送至latexdiff请参阅此问题)。它只会比较顶层文件。对于大型文档,这毫无用处,因为所有内容可能都位于单独的.tex文件中。

我找不到latexpand忽略这个问题的方法input。我还尝试texcount使用以下方法将命令直接放入文档中:这个答案,但latexpand仍然会扩展它并将其放入文档中(我使用的是 XeLaTeX)。我找不到latexpand忽略此命令的方法。(根据代码,它还扩展了环境\input中的命令verbatim)。

为了解决这个问题,我使用了import包,它提供了一个不扩展的命令\import\latexpand这样每次编译文档时都可以生成字数统计文件(重要的是:在最终的 diff 文档中latexdiff)。

我最后做的是只在文档处于draft模式时执行此操作。如果文档正在被编辑和更改,并且您想看到这些更改,那么只在草稿模式下执行此操作是有意义的。请参阅这个答案了解草稿模式的变化列表。我添加了来自这个答案这样我就只能在草稿模式下做事了。我总是希望我的 pdf 有一个目录(因为它很大),所以我添加了这个答案这样hyperref就会始终生成 TOC。

所以我最后在序言中添加了这一点:

\makeatletter
\def\ifdraft{\ifdim\overfullrule>\z@
  \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
\makeatother

\hypersetup{final}
\ifdraft{\usepackage{import}}{}

然后我在文档的开头添加了:

%TC:newcounter add Added
%TC:newcounter del Deleted
%TC:macro \DIFadd [add]
%TC:macro \DIFdel [del]
%TC:ignore 
\immediate\write18{texcount -relaxed -sum -total -utf8 -opt=tc_template.cfg -merge \jobname.tex > 'WC.txt'}
\ifdraft{
{\LARGE \import{}{WC.txt}}
\clearpage}{}

为了完整起见,以下是 ot 的内容tc_template.cfg

-template=
\Total Words: \textcolor{blue}{{sum}}\n\n
\Words in Text: {text}\n\n
\Words in Footnotes: {otherword}\n\n
\Words Added: \textcolor{green}{{add}}\n\n
\Words Deleted: \textcolor{red}{{del}}\n\n
\\rule{2.5in}{0.75pt}\n\n
\Words in Headers: {headerword}\n\n
\Num Headers: {header};  Floats: {float}\n\n
\Num Inline Math: {inline};  Display Math: {displaymath}\n\n

(我知道除了脚注之外otherwordtexcount可以有其他内容;但对于我的文档,几乎都是脚注。我也知道我可以将%TC:宏放在配置文件中。但我的文档中还有很多其他%TC:注释,因此texcount会忽略我的序言而不是对其进行解析,等等。所以我只是保留了它们。)

我调用的函数是:

git latexdiff --biber --xelatex --latexopt -shell-escape --main $1 --latexpand --keep-comments HEAD^1

我给它命名为主.tex文件。由于此解决方案使用\write18,请记住您需要将-shell-escape命令发送到xelatex

看起来效果不错。它会将最终的字数以及添加和删除的单词放入最终文档中,然后您可以仔细查看上次提交中的差异。

我可能有一天会把它放到 gitlab 的 CI 中,这样它就会自动生成这个文档,这样人们就可以轻松地看到发生了什么变化,等等。那是另一回事了。

相关内容