情况: 在方程式表,类似词汇表或记忆帮助列表 用户 Alastor发布了一个 Latex 文档,其中包含几个方程环境。假设他老师的真实文档太长,无法手动提取,因此要求进行一些自动化。
问题:如何提取 Latex 文档中的方程环境(或其他块)?
答案1
解决方案:使用简单的Perl-script
。
我在上面的链接中概述了应该做什么,并讨论了一些替代方案。请在此处找到一些特定的 Perl 代码,这些代码将执行所需的提取。
步骤 1:创建 Perl 脚本(extractEq.pl)
阅读、摘录、整理、发布。完成
#!/usr/bin/perl
use strict; use warnings;
# ~~~ reading the original Latex-doc ~~~~~~~~~
my $in = "latexOrig.tex"; open F, '<', $in or die "can't open $in\n";
my $out = "latexEq.tex";
my @x = <F>;
my $x = join " ", @x;
# ~~~ finding equation environments ~~~~~~~~~~
my @l = split/begin\{equation\*?\}/, $x; # splits at begin{...
shift @l; # get rid of preamble etc. from this list (= array)
# ~~~ finding and removing text after \end{equation... ~~~~
for (my $i = 0; $i < @l; $i++) { # each list item
my @s = split/end\{equation\*?\}/, $l[$i]; # now split at end
$l[$i] = $s[0]; # just keep the equation part
}
# ~~~ assembling output in Latex-format ~~~~~~~
my $s = '';
foreach my $l (@l) {
$s .= "\\begin{equation*}"; # we removed it above
$s .= $l; # this is the equation part
$s .= "end{equation*}\n\n"; # we removed it above, and Perl left some \\
}
# ~~~ put out ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
open G, '>', $out or die "can't open $out\n";
print G $s;
第 2 步:从命令 shell(DOS、bash……)运行它
> ...\TEX-forum\4. eq table>perl extractEq.pl
将其写入$out
设置为的latexEq.tex
,并且仅包含,即去除教师文档中的所有其他“噪音”:
\begin{equation*}\label{formula 1}
\frac{\partial^{2} f}{\partial x \partial y}=\frac{\partial^{2} f}{\partial y \partial x}.
\end{equation*}
\begin{equation*}
F(x)=\int_{a}^{x} f(t) d t \label{formula 2}
\end{equation*}
\begin{equation*}
\int_{a}^{b} f(t) d t=g(b)-g(a) \label{formula 3}
\end{equation*}
步骤 3:创建一个新的 Latex 文档来显示提取的方程式(EQ.tex)
即只需用一条语句替换文档内容\input
:
\documentclass[12pt,a4papper]{article}
% this all remains unchanged
\usepackage[T1]{fontenc}
\usepackage[spanish]{babel}
\usepackage{titlesec}
\titleformat{\section}[frame]
{\small}{\filcenter\small
\filleft UNIDAD \thesection \ }
{3pt}{\Large\bfseries\filcenter}
\usepackage[left=2.5cm,top=2cm,right=2.5cm,bottom=1.5cm]{geometry}
\usepackage{amsthm} %para usar \theoremstyle
\usepackage{xcolor}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{thmtools}
\declaretheoremstyle[
spaceabove=7pt, spacebelow=7pt,
headfont=\normalfont\bfseries,
notefont=\mdseries\bfseries\itshape, notebraces={(}{)},
bodyfont=\normalfont\itshape,
postheadspace=.5em, %
numberlike=section,
name=Teorema,
thmbox=M,
%shaded={bgcolor={rgb}{1,1,1}},
headformat=\NAME~\NUMBER \NOTE %
%qed=$\blacksquare$
]{Teorema}
\declaretheorem[style=Teorema]{teo}
% here the new thing starts
\begin{document}
\input{latexEq} % <<< <<< <<<
\end{document}
特点:
use strict
A)根据经验和观察程序员,包含和总是一个好主意use warnings
,它们需要命名空间变量my
:预防性编程,尽早失败。
B) Perl 中的列表以 开头@
。想象一个灵活的数组。例如,@x
是在打开的文件中找到的所有代码行的列表,可通过索引 0..n 访问,而$x
是其扁平对应部分,即只有一个长字符串。
C)通过使用它们作为要匹配的模式,再次分解为子字符串,找到所有\begin
或部分。不需要的片段将被丢弃。因此,过了一会儿,在这种情况下,只有 3, 行,其中包含任意数量的 Latex 方程式行。\end
$x
@l
笔记:split/end\{equation\*?\}/,
匹配两者end{equation}
...end{equation*}
甚至 Perl 有时也需要反斜杠。
笔记:如果您想提取其他环境,这是您更改关键字的地方,即匹配模式。
D) 对于这个例子,我决定不对方程式进行编号。\label{formula XYZ}
仍可作为参考,但当然不会被打印出来。 根据需要进行修改。
答案2
解决方案:使用包extract
。它承诺提取任何环境。
手册https://mirror.marwan.ma/ctan/macros/latex/contrib/extract/extract.pdf第 3 页显示了一些代码,似乎与您的情况相符。我在这里复制了它,没有对您的代码进行任何修改,因为从示例本身就应该很清楚了。
包含“太多文本”的文件:(抱歉,只是截图,因为从 pdf 复制的……不好)
结果: