(根据获得的信息进行更新)
在从任意(La)TeX 文档中提取关键字并对其进行简单操作(自动注释)的情况下,我希望能够做以下事情:
- 访问包含构建树状表示所需信息的标记流(即,我需要知道环境何时开始、何时结束、何时出现数学公式)
- 导出文档的纯文本表示形式,同时能够过滤命令(例如,删除方程式或某些部分)。
我已经有一个用 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 是我的文章来源之一,所以这非常相关。这看起来不是一件实用的事情,但绝对值得一提。