我正在尝试使用该命令latexdiff
来标记两个相似的 latex 文档之间的更改。我已经使用过该achemso
软件包,并希望继续这样做。它显示了正文和图形标题中的更改,但没有显示作者姓名、标题或摘要。我在下面提供了一个 mwe;old.tex 是原始文档,new.tex 有五个更改:
- 更改标题(未显示在 diff.pdf 上)
- 更改为作者姓名首字母(diff.pdf 上未显示)
- 更改为摘要文本(未显示在 diff.pdf 上)
- 更改为正文(显示标记)
- 更改为参考(显示标记)
为了得到这个结果,我在包含 old.tex 和 new.tex 的同一目录中运行以下 bash 脚本(见下文)。我使用的 latexdiff 的基本命令是:
latexdiff --append-context2cmd="\twocolumn,\abstract,\@twocolumnfalse,\title" old.tex new.tex > diff.tex
在阅读了一些其他在线资源后,我尝试了该--append...
选项,但仍然无法在生成的 diff.pdf 文件中显示更改。
在此先感谢您的帮助。
old.tex 的内容:
\documentclass[journal=jacsat,manuscript=communication]{achemso}
\setkeys{acs}{articletitle = true}
% manuscript title
\title{My title}
\SectionsOn
\SectionNumbersOff
% author list
\author{A. N. Other}
\affiliation[Latex]{Latex University}
\altaffiliation{Contributed equally to this work}
\author{B. N. Other}
\affiliation[Latex]{Latex University}
\altaffiliation{Contributed equally to this work}
\email{[email protected]}
\usepackage[hidelinks]{hyperref} % Provide convenient links throughout
\usepackage{achemso} % ACS formatting
\renewcommand*\titlesize{\Large}
\let\oldmaketitle\maketitle
\let\maketitle\relax
\begin{document}
\begin{filecontents}{oldrefs.bib}
@article{ref1,
title = {Paper Title},
volume = {70},
journal = {Nature},
author = {Smith, J. H.},
year = {1942},
pages = {1--31},
}
\end{filecontents}
\twocolumn[
\begin{@twocolumnfalse}
\oldmaketitle
\begin{abstract}
My abstract.
\end{abstract}
\end{@twocolumnfalse}
]
\section*{Introduction}
Main text.\cite{ref1}
\bibliography{oldrefs}
\end{document}
new.tex 的内容:
\documentclass[journal=jacsat,manuscript=communication]{achemso}
\setkeys{acs}{articletitle = true}
% manuscript title
\title{My title has changed}
\SectionsOn
\SectionNumbersOff
% author list
\author{A. N. Other}
\affiliation[Latex]{Latex University}
\altaffiliation{Contributed equally to this work}
\author{C. N. Other}
\affiliation[Latex]{Latex University}
\altaffiliation{Contributed equally to this work}
\email{[email protected]}
\usepackage[hidelinks]{hyperref} % Provide convenient links throughout
\usepackage{achemso} % ACS formatting
\renewcommand*\titlesize{\Large}
\let\oldmaketitle\maketitle
\let\maketitle\relax
\begin{document}
\begin{filecontents}{newrefs.bib}
@article{ref1,
title = {Paper Title},
volume = {70},
journal = {Nature},
author = {Smithsonian, J. H.},
year = {1942},
pages = {1--31},
}
\end{filecontents}
\twocolumn[
\begin{@twocolumnfalse}
\oldmaketitle
\begin{abstract}
My abstract has some new information.
\end{abstract}
\end{@twocolumnfalse}
]
\section*{Introduction}
Main TEXT.\cite{ref1}
\bibliography{newrefs}
\end{document}
产生结果的脚本(diff.tex 和 diff.pdf):
#!/bin/bash
latex -src -interaction=nonstopmode old.tex
bibtex old.aux
latex -src -interaction=nonstopmode old.tex
pdflatex -synctex=1 -interaction=nonstopmode old.tex
latex -src -interaction=nonstopmode new.tex
bibtex new.aux
latex -src -interaction=nonstopmode new.tex
pdflatex -synctex=1 -interaction=nonstopmode new.tex
latexdiff --append-context2cmd="\twocolumn,\abstract,\@twocolumnfalse,\title" old.bbl new.bbl > diff.bbl
latexdiff --append-context2cmd="\twocolumn,\abstract,\@twocolumnfalse,\title" old.tex new.tex > diff.tex
latex -src -interaction=nonstopmode diff.tex
pdflatex -synctex=1 -interaction=nonstopmode diff.tex
答案1
TL;DR:根据您的 MWE,latexdiff
检测并标记标题中的更改涉及对latexdiff
您使用的命令的简单更改;但是,检测并标记作者和摘要中的更改(特别是在您的 MWE 的情况下,但并非总是如此)超出了当前的设计范围latexdiff
。详情如下:
latexdiff
您列出了三个未标记更改的部分:
- 更改标题
您可以通过将标题设为 a 来解决这个问题replace-context2cmd
,如下所示:
latexdiff --replace-context2cmd="title" old.tex new.tex > diff.tex
请参阅#2 以了解为什么append-context2cmd
你的 MWE shell 脚本不起作用。
- 更改为作者首字母
摘自latexdiff-man
2022 年 9 月 25 日的第 7 页,其中的replace-context2cmd
和append-context2cmd
论点:
context2 命令也是序言中唯一一个参数将以逐字模式处理的命令(仅当它们在序言中出现不超过一次时才有效)。该算法目前无法处理序言中重复的 context2 命令,因为它们出现在某些期刊样式(但不在标准样式)中的 \author 参数中。如果检测到这样的重复,整个序言将以逐行模式处理。在这种情况下,使用 --replace-context2cmd 选项仅选择应处理且不会在序言中重复使用的命令。
换句话说,latexdiff
无法检测到作者的变化,但当只有一个命令实例时能够检测并标记变化\author
。
- 更改为摘要文本
我通常将序言中的抽象视为\abstract{}
而不是 之后的环境\begin{document}
。如果这是你的情况,你可以使用与上述 #1 相同的技术,replace-context2cmd
。但由于你的抽象环境包含在命令的参数中,因此适用以下内容(latexdiff-man
,日期为 2022 年 9 月 25 日,第 3 页):
命令及其所有参数通常作为一个单元进行比较,即,不会在命令的参数中插入任何标记。但是,对于选定数量的命令(例如,\caption 和所有分段命令),最后一个参数已知为文本。此文本被拆分为单词并像普通文本一样进行区分(使用选项显示和更改文本命令列表,见下文)。
因为命令的最后一个参数\twocolumn
不仅仅是文本,所以您不能将其附加为安全命令或文本命令。 latexdiff
必须将此命令视为单个块。