访问 TeX 令牌或导出过滤后的纯文本

访问 TeX 令牌或导出过滤后的纯文本

根据获得的信息进行更新

在从任意(La)TeX 文档中提取关键字并对其进行简单操作(自动注释)的情况下,我希望能够做以下事情:

  1. 访问包含构建树状表示所需信息的标记流(即,我需要知道环境何时开始、何时结束、何时出现数学公式)
  2. 导出文档的纯文本表示形式,同时能够过滤命令(例如,删除方程式或某些部分)。

我已经有一个用 C++ 编写的非常复杂的 LaTeX 解析器,但仍然无法避免命令扩展的问题。

基本上,如果作者定义了一个\keyword只打印的命令keyword,我无法以一般方式处理这个问题。(人们确实这样做,并且倾向于对最重要的关键字这样做!)

因此,一方面,我需要获取文档的纯文本表示形式,同时过滤掉数学语句,并且不丢失有关命令和环境位置的信息(以帮助句子标记器和关键字提取器)。

另一方面,对于任意的 TeX 文档,我需要找到其中包含特定单词的节点,对其进行操作(删除/替换/换行链接),然后编译该文档。

我模糊地知道这应该可以使用 LuaTeX 或 ConTeXt 来实现,但我无法在 LuaTeX wiki 上找到可访问的示例。


更新:我想我需要澄清一下,我无法控制传入的文档,所以目标是分析和操纵任意有效的 LaTeX 代码。

赏金更新:现有的答案提供了许多有价值的信息,关于如何在 ConTeXt 中编写输入文档来实现我的目标,但不幸的是,这并不适用

赏金更新2:为了给您提供规模:我们需要处理超过一百万份文件,而且数量还在增加。

答案1

在 ConTeXt 中,一种选择是将文档导出为 XML。然后,您可以使用您喜欢的编程语言中的标准 XML 工具来操作生成的 XML 文档。

举例来说,考虑以下例子:

\setupbackend[export=yes]
\setupinteraction[state=start]

\starttext
\startsection[title={Test of export}]
  This is to test how \CONTEXT\ export works. First, we input a test file
  below.

  \startnarrower
    \input ward
  \stopnarrower

 Let's see some other environments, such as\footnote{Note that we define a
 float in \in{Figure}[fig:mill].}

  \startitemize[n]
    \item A table:

      \startTABLE
        \NC 1 \NC 2 \NC 3 \NC \NR
        \NC 1 \NC 2 \NC 3 \NC \NR
        \NC 1 \NC 2 \NC 3 \NC \NR
      \stopTABLE

    \item A formula

      \startformula
        α^2 + β^2 = 2
      \stopformula

    \item A figure

      \externalfigure[mill.png][width=5cm]

  \stopitemize

  \startplacefigure
      [title={This is a Mill}, reference={fig:mill}]
    \externalfigure[mill.png][width=5cm]
  \stopplacefigure

\stopsection
\stoptext

并使用 进行处理。这将创建具有以下结构的context filename目录:\jobname-export

\jobname-export
|
+-- images
|   +--- <image file1>
|   +---- ....
+-- style
|   +-- \jobname-defaults.css
|   +-- \jobname-images.css
|   +-- \jobname-styles.css
|   +-- \jobname-template.css
+-- \jobname-div.xhtml
+-- \jobname-pub.lua
+-- \jobname-raw.xml
+-- \jobname-tag.xhtml

其中,\jobname-raw.xml包含完整文档的 AST。对于上述文档,它是:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

<!--

    input filename   : test
    processing date  : Tue Jun 14 19:58:26 2016
    context version  : 2016.06.02 21:28
    exporter version : 0.34

-->

<?xml-stylesheet type="text/css" href="styles/test-defaults.css" ?>
<?xml-stylesheet type="text/css" href="styles/test-images.css" ?>
<?xml-stylesheet type="text/css" href="styles/test-styles.css" ?>

<document date="Tue Jun 14 19:58:26 2016" file="test" context="2016.06.02 21:28" language="en" xmlns:m="http://www.w3.org/1998/Math/MathML" version="0.34">
 <metadata>
 </metadata>
 <section detail="section" chain="section" implicit="1" level="3">
  <sectionnumber>1</sectionnumber>
   <sectiontitle>Test of export</sectiontitle>
  <sectioncontent>
This is to test how ConTEXt export works. First, we input a test file below.
   <break/>
The Earth, as a habitat for animal life, is in old age and has a fatal illness. Several, in fact. It would be happening whether humans had ever evolved or not. But our presence is like the effect of an old-age patient who smokes many packs of cigarettes per day <subsentencesymbol symbol="middle">—</subsentencesymbol> and we humans are the cigarettes.
   <break/>
Let’s see some other environments, such as<descriptionsymbol detail="footnote" insert="1"><sup>1</sup></descriptionsymbol> 
   <itemgroup detail="itemize" chain="itemize" level="1" symbol="n">
    <item>
     <itemtag>1.</itemtag>
     <itemcontent>A table:<table><tablerow><tablecell align="flushleft"> 1 </tablecell><tablecell align="flushleft"> 2 </tablecell><tablecell align="flushleft"> 3 </tablecell></tablerow><tablerow><tablecell align="flushleft"> 1 </tablecell><tablecell align="flushleft"> 2 </tablecell><tablecell align="flushleft"> 3 </tablecell></tablerow><tablerow><tablecell align="flushleft"> 1 </tablecell><tablecell align="flushleft"> 2 </tablecell><tablecell align="flushleft"> 3 </tablecell></tablerow></table></itemcontent>
    </item>
    <item>
     <itemtag>2.</itemtag>
     <itemcontent>A formula<formula> <formulacontent><m:math display="block" xmlns:m="http://www.w3.org/1998/Math/MathML"><m:mrow><m:msup><m:mi>

答案2

我有点犹豫是否发布此内容,因为我不确定它是否适合您的情况,但我希望它能够为您指明正确的方向,所以就在这里。

我一直在开发一个系统,它允许我使用 LaTeX 编写文档,并将输出文件写成各种格式的文本文件。我目前的主要用例是输出 HTML5 文档,并将数学作为 MathML。它正在开发中,我修复了我需要的东西,而没有过多关注它可能具备的“大局”。

无论如何,最近的一个调整是使用 LuaTeX 的功能直接进行文本输出。以前,我一直写入 PDF 并使用 pdftotext 提取文本,但这不稳定。所以我尝试了一下 LuaTeX,找到了一种实现我想要的方法:直接输出到文本文件。

执行此操作的 lua 文件可以作为我的latex 到互联网github 上的存储库(忽略 README,它已经过时了)。具体文件是文本输出.lua(其中有相当一部分内容涉及将数学转换为 MathML,我不知道这是否相关)。您还需要查看第 53 行至第 104 行互联网文本.代码.tex因为这些安装了用于输出到文本的钩子。

正如我所说,这个系统对我来说很有效。我的网站以完全可编译的 LaTeX 文档形式编写,我的系统将其转换为 HTML5+MathML 文件(图形自然是用 TikZ 完成的)。但它可能需要进行一些调整才能适用于您的系统,特别是因为您无法控制输入文件。

答案3

XML 导出的部分解决方案

在信息检索的情况下,@DavidCarlisle建议我来看看 LaTeXML。在项目的网站上,我发现了一个过时的实验关于从以下来源导出约 73 万份科学预印本arXiv.org转换为 XML 格式。这项实验于 2013 年结束,但当时

Result                  count   %
-------------------------------------
none                    0       0.00
incomplete              40575   5.80
complete with errors    234047  33.46
success                 424800  60.74
-------------------------------------

也就是说,只有 60% 的试卷通过。大多数错误都是缺少宏,我无法立即判断是否可以修复。

arXiv 是我的文章来源之一,所以这非常相关。这看起来不是一件实用的事情,但绝对值得一提。

相关内容