我读到过 ConTeXt 可以生成 XML 输出。我们有时也会遇到有关将 LaTeX 转换为不同格式的问题。基于“TeX 的唯一解析器是 tex”,如果 latex 可以生成文本输出而不是 PDF,那么就可以编写样式文件来转换合理的输入不同的标记语言。
这可能吗?
背景介绍:我在以下情况下遇到了“我们可以从 LaTeX 转换吗?”问题实验室输入格式是 Markdown+iTeX(iTeX 与 Knuth 的提议无关,而是 LaTeX 到 MathML 转换器的一个子集),但人们经常会有一些他们想要包含的 LaTeX 文章片段。因此,通过 tex4ht 等方式将其完全转换为 XHTML+MathML 并不是正确的选择。我编写了一个 Perl 脚本,重新实现了 TeX 的大部分功能来执行此操作,但这样做之后,我意识到我的样式文件可以在普通的 LaTeX 中工作并产生“正确”的输出,只是它们会嵌入到 PDF 中。因此,如果我能说服 TeX 生成文本,我就快成功了。当然,我可以尝试从 PDF 中提取文本,但“感觉不对”,我担心多余的东西会意外潜入其中。
答案1
当然,ConTeXt 和 LaTeX 的底层解决方案是相同的:您需要有一种方法来更改宏的功能,以便它们编写正确的输出而不是排版。这也与 tex4ht 非常相似。ConTeXt 的优势在于宏主要由一个专注的小组提供,并且它们包含必要的“后端”以使转换变得容易。要对 LaTeX 执行相同操作,您需要处理可能存在的所有宏,考虑到 LaTeX 包的数量和种类,这是一个问题。因此,虽然原则上是可能的,但实施是一个严峻的挑战。
(戴上我的“LaTeX3 帽子”,在定义更新格式时,这是一个需要牢记的明显领域。要做到这一点,你需要有比目前 LaTeX 文件更“常规”的语法和输入。同样,我认为 ConTeXt 展示了如何做到这一点,因为它已经很好地将输入保持在自己的结构中。)
答案2
只要你不想让 TeX 充当解析器,就可以实现你想要的。在我看来,TeX 成功的部分原因是它多年来成功地将自己转变为一种语言转换工具。首先是 TeX->Postscript,现在是 TeX->pdf。Tralics 在制作 TeX->XML 方面相当成功。
但是,我认为我们需要从不同的角度看待这个问题。利用当今可用的技术,我们需要一种“通用标记语言”。Markdown 和 Yaml 是精简版工具,永远无法成为完整的文档描述语言,因此走这条路会限制我们的努力。
不久前,我设计了一个基于文本文件的 CMS。所有标记都是纯文本和来自 Wikipedia 标记语言的片段。我将通过 php 加载文本文件,然后过滤输入并生成 HTML 页面。
<!--
{{feature-image: http://localhost/images/sample102.jpg }}
{{feature: A collection is like a puzzle...}}
-->
是feature-image
和div
标题feature-text
。我有 的命令image-credits
和类似的东西。
现在使用 TeX 实现这一点并不困难。所以我的建议是实际使用 TeX 在文本文件中编写中间标记,然后使用您选择的语言进行解析以实现您的愿望。
根据目标的工作流程可以是以下之一:
TeX->Intermediate MarkUp->HTML
TeX->pdf
TeX->plain text
Intermediate MarkUp->Translator (javascript, perl, python,
ruby, php, your language) ->TeX
简而言之,保留 TeX 并输出为新的标记语言。Markdown 和其他技术可以作为其中的一部分。
\documentclass{article}
\usepackage[demo]{graphicx}
\usepackage{verbdef}
\begin{document}
\makeatletter
%% create file and open it to write
\newwrite\file
\immediate\openout\file=wikimark.wiki
\newif\if@wikimark
\newif\if@html
\@wikimarktrue
\def\image#1#2{%
\if@wikimark
\image@@{#1}{#2}
\else
\includegraphics{dummy.png}
\fi
}
\def\Section#1{%
\if@wikimark
\section@@{#1}\relax
\else
\section{#1}
\fi
}
\def\image@@#1#2{%
\immediate\write\file{\string{\string{img:#1\string}\string}}
\immediate\write\file{\string{\string{img-caption:#2\string}\string}}
}
\edef\hash@@{\string#\string#}
\def\section@@#1{%
\immediate\write\file{\hash@@ #1}
}
\makeatother
\Section{Test Section}
\image{http://tex.stackexchange.com/questions/15440/parsing-files-through-lua-tex}{This is the caption}
\closeout\file
\end{document}
最小值只是一个概念证明。这里的主要思想不是重新定义 LaTeX 命令,而是添加带有其他标记开关的新命令。
答案3
为了完整起见,我觉得我应该记录我目前的解决方案(我的直觉告诉我这是最好的方法,但具体实现可能还需要改进)。那就是借鉴 ConTeXt 的经验,使用 LuaTeX。LuaTeX 为我提供了一些钩子,让我可以在 TeX 装箱和发货之前获取其处理后的输出。
具体来说,我使用钩子pre_linebreak_filter
来挖掘每行的内容。实际上,这与 StrondBad 的答案的想法相差不远,只是没有所有不必要的东西,并且对分组等内容有更多的控制。
我的实现可以在我的github 存储库对于我的项目。我认为它不能直接剪切粘贴到其他东西中,因为它与我的项目的其他部分集成在一起,所以想要使用这个想法的人需要稍微理清一下。关键文件是 Lua 文件textoutput.lua
,主要是函数list_elements
,以及 TeX 文件internettext.code.tex
,特别是第 53 行条件的“真”分支\@ifundefined{directlua}
(在撰写本文时)。
另外,正如我在一开始所说的,虽然我认为这是正确的战略,这可能不是最好的实现。
答案4
这wordcount
软件包设置 LaTeX,以便将每个字符、空格、换行符等添加到日志文件中。这意味着
\documentclass{article}
\begin{document}
Hello World
ff and fi
\(y=\alpha x+\beta\)
\begin{tabular}{c|c|c}
a&b&c\\
\end{tabular}
\end{document}
生成一个日志文件,其中包含以下内容:
...\3.08632 H
...\3.08632 e
...\3.08632 l
...\3.08632 l
...\3.08632 o
...\3.08632 W
...\3.08632 o
...\3.08632 r
...\3.08632 l
...\3.08632 d
...\3.08632 ^^[ (ligature ff)
...\3.08632 a
...\3.08632 n
...\3.08632 d
...\3.08632 ^^\ (ligature fi)
...\3.08632 y
...\3.08632 =
...\3.08632
...\3.08632 x
...\3.08632 +
...\3.08632 ^^L
.......\3.08632 a
.......\3.08632 b
.......\3.08632 c
我不确定是否可以让 LaTeX 在单独的文件中写出更清晰的输出,或者如何处理全套 unicode 字符,但整个想法是wordcount
您可以解析日志文件中的字符和空格。