使用 perl 修改 LaTeX 文档

使用 perl 修改 LaTeX 文档

我正在尝试使用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之间的可变数量的空格。以下表达式似乎可以满足您的需要.\citeperl

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是我们在括号中匹配的内容,因此我们将其放在后面加上..

相关内容