如何提取 Latex 文档中的方程环境(或其他块)?

如何提取 Latex 文档中的方程环境(或其他块)?

情况: 在方程式表,类似词汇表或记忆帮助列表 用户 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 strictA)根据经验和观察程序员,包含和总是一个好主意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 复制的……不好)

文档包含太多信息

结果

提取的文本

答案3

很多年前我写过一个程序mathgrep在 LaTeX 文档中对数学执行类似 grep 的代码。要提取所有数学代码,只需执行以下操作:

mathgrep '/.*/' document.tex

(注意:如果你使用美元来划分数学,那么你应该先运行debuck来纠正这个问题。

相关内容