我正在尝试使用perl
命令来修改LaTeX
文档。事实上,我正在尝试更改引用格式,例如:
. \cite{poelma20113d}
到
\cite{poelma20113d}.
换句话说,我想找到那些前面有句点和空格的引文,并将它们替换为空白,然后放置引文,然后在其后放置一个句点。有人可以帮助我如何通过perl
一只班轮做到这一点吗?我想这样做的原因是我想将我为《流体物理学杂志》准备的稿件格式更改为《物理评论 E 杂志》。
答案1
我很确定 LaTeX 只能用 LaTeX 正确解析1在 Perl 中实现 LaTeX 将是一个真正的挑战。因此,任何简单的 Perl 解决方案在某些边缘条件下都会失败。使用以下示例
这是 cite{foo}。 \cite{foo} 这是 cite[foo]{bar}。 \cite[foo]{bar} 这是 citet{foo, bar}。\citet{foo, bar}
其中涵盖单个可选参数、多个引用、\cite
以 开头的替代形式以及和\cite
之间的可变数量的空格。以下表达式似乎可以满足您的需要.
\cite
perl
perl -pe 's/(.\s*)(\\cite)([^{]*)(\[[^\]]*\])?{([^}]*)}/\2\3\4\{\5\}./g' afile
这是 cite{foo}\cite{foo}。这是 cite[foo]{bar}\cite[foo]{bar}。这是 citet{foo, bar}\citet{foo, bar}。
答案2
这将在您查询时找到并执行交换:
$ perl -lpe 's/\. (\\cite.*)/$1./' afile
\cite{poelma20113d}.
要让单行代码对文件进行实际更改:
$ perl -i.bak -lpe 's/\. (\\cite.*)/$1./' afile
这会将原始文件保留在afile.bak
.如果您想放弃创建 .bak 文件,您可以perl
通过省略开关的任何参数来告诉不要这样做-i
:
$ perl -i -lpe 's/\. (\\cite.*)/$1./' afile
怎么运行的
上面的示例在 file 的每个字符串中查找以下位afile
。
\.
- 寻找文字.。s/.../../
- 搜索一个模式并将其替换为另一个模式。(\\cite.*)
- 查找文字的模式,\后跟字符串cite
,然后是其他任何内容。所有这些都保存在变量中,$1
因为它被括在括号中(即(....))。 笔记:(\\cite.*})
当到达右大括号时将停止}
。这样,LaTeX
\cite{}
例如 in 命令之后的下一句. \cite{poelma20113d} This is the next sentence.
将被正确处理。$1.
-$1
是我们在括号中匹配的内容,因此我们将其放在后面加上..