我正在用 latex 写一篇论文。我的导师要求我做一些修改,所以在查看了这个网站后,我找到了几种跟踪修改的解决方案,最后决定使用 changes 包。
我把包含 100 多处修改的文档发给他。他几乎批准了所有修改,然后又提出了几处新修改……并要求我发送一份仅包含新修改内容的新文档。
我知道使用更改包我可以使用“最终”选项来禁用更改标记,但我的乳胶代码仍然具有所有 \added{} \replaced{}{} 和 \deleted{},所以我的问题是:
有没有什么简单的方法可以隐藏修订版 1 中的更改并显示我现在要添加的新更改?
编辑:正如建议的那样,我添加了一个示例来显示我所拥有的内容,以及另一个我正在寻找的内容。
这是我的第一篇修订文本可能的样子:
\documentclass{article}
\usepackage{changes}
% Example of what first revision may be
\begin{document}
This is \added{new} text.
This is \deleted{unnecessary}text.
This is \replaced{nice}{bad} text.
\end{document}
这就是我想要的第二个修订文本(当然,我不想手动删除 \added、\deleted、\replaced 命令,只是希望更改包忽略它们)
\documentclass{article}
\usepackage{changes}
% Example of what second revision should look like
\begin{document}
This is new text.
This is text.
This is nice text.
\added{This should be seen as a change in revision 2 of document}
\end{document}
因此,如果您编译这两个文档,您就会明白我想要实现的目标,但显然无需手动删除 \added、\deleted、\replaced 命令。
我正在使用 Miktex+Texmaker(Windows 端口),它默认使用 pdflatex 进行编译。
提前致谢
答案1
在源文件中用 替换每个实例。适当定义\added
。对其他两个更改命令执行相同操作。您可以使用 awk(如下所示)或在您喜欢的编辑器中使用搜索和替换来执行此操作。\xadded
\xadded
版本1.tex:
\documentclass{article}
\usepackage{changes}
% Example of what first revision may be
\newcommand{\xadded}[1]{#1}
\newcommand{\xdeleted}[1]{}
\newcommand{\xreplaced}[2]{#1}
\begin{document}
This is \added{new} text. This is more \added{new text with
\emph{embedded} \TeX{} on more than one line.}
This is \deleted{unnecessary}text.
This is \replaced{nice}{bad} text.
\end{document}
version2.tex,替换后:
\documentclass{article}
\usepackage{changes}
% Example of what first revision may be
\newcommand{\xadded}[1]{#1}
\newcommand{\xdeleted}[1]{}
\newcommand{\xreplaced}[2]{#1}
\begin{document}
This is \xadded{new} text. This is more \xadded{new text with
\emph{embedded} \TeX{} on more than one line.}
This is \xdeleted{unnecessary}text.
This is \xreplaced{nice}{bad} text.
\end{document}
我使用的脚本:
#!/usr/bin/awk
# Rename a few TeX macros
#
{
gsub(/\\added/,"\\xadded",$0);
gsub(/\\deleted/,"\\xdeleted",$0);
gsub(/\\replaced/,"\\xreplaced",$0);
print
}
暂时搁置我原来那个尴尬的部分解决方案。
awk
这是扩展这三个宏的程序的开始。
#!/usr/bin/awk
# Expand a few TeX macros
#
# delete the macro name
# leaving the parentheses doesn't hurt
/\\added/ {
sub(/\\added/,"",$0)
}
# delete the macro name and its argument
/\\deleted/ {
sub(/\\deleted.*\}/,"",$0)
}
# should delete the macro name and its SECOND argument
/\\replaced/ {
sub(/\\replaced/,"",$0)
}
{print}
调用 OP 的输入文件 expandsome.tex,命令
$ awk -f expand.awk < expandsome.tex > expanded.tex
生产
documentclass{article}
\usepackage{changes}
% Example of what first revision may be
\begin{document}
This is {new} text.
This is text.
This is {nice}{bad} text.
\end{document}
我还没有弄清楚删除的第二个参数的正则表达式语法\replace
。我现在没时间。如果有人愿意贡献,那么我就不必明天或后天找时间了……
这不是一个可靠的解决方案。如果更改涉及多行,它将失败。如果任何一行中有多个类似的更改,它也会失败。
答案2
您会使用Vim
文本编辑器吗?
如何删除\added
在正常模式下输入以下内容:(注意:不要输入<esc>
和,而是按下键盘上的<enter>
实际键esc和。)enter
<esc>qa/\\added\><enter>dt{yi{da{"0P<esc>q
1000@a
第一行记录并将一个宏存储到寄存器中,该宏a
查找并替换单个— 即使其本身包含嵌套分组 — 例如,变成。\added{...}
...
...
\added{123\emph{foo}456}
123\emph{foo}456
第二行执行该宏 1000 次。
如何删除\deleted
<esc>qb/\\deleted\><enter>dt{da{<esc>q
1000@b
第一行记录并将宏存储到寄存器中,b
该宏查找并删除单个\deleted{...{...}...}
。
第二行执行b
1000次。
如何删除\replaced
<esc>qc/\\replaced\><enter>dt{yi{da{da{"0P<esc>q
1000@c
等等等等
据我所知,perl
或脚本的难点在于找到一种可靠的方法来解析嵌套分组。awk
TeX
答案3
正如有人提到的那样,如果必须多次跟踪更改,则使用更改包跟踪更改并不是可行的方法。
如果我是你,我会花时间学习和设置 git、cvs。你不需要了解太多,只需要了解最基本的命令(git add、git commit,还有什么?)。
然后,您必须删除用于标记更改的命令:\add
,\changed
以及\deleted
可能。
之后将其作为第一个版本签入。要比较使用 git 签入的任何版本,请使用 latexbatchdiff,请参见此处:https://tex.stackexchange.com/a/44092/4736。
答案4
我认为您不应该隐藏先前的更改,而应该接受已批准的更改并创建一个包含更改的新文件。然后照常在此新版本的文件中添加新更改。
对于此更改,软件包提供了一个名为 delcmdchanges 的 bash 脚本,位于<texpath>/scripts/changes/
,其中<texpath>
通常是系统中 texlive 的安装路径/usr/share/texlive/texmf-dist
。以交互方式运行此脚本,并-i
选择接受所有已批准的更改。
delcmdchanges.bash [options] <inputfile> <outputfile>