XML到TeX或如何从类似XHTML的源获取漂亮的PDF

时间:2012-04-08 12:02:58

标签: xml xsl-fo tex docbook

从表面上看,一个简单的问题是:如何从我的XML文档中获得外观精美的PDF?实际上,我的输入是XHTML的一个子集,添加了一些自定义属性(以保存引用源的一些信息等)。我一直在探索一些路线,并希望得到一些反馈,如果有人之前尝试了一些。

注意:我已经考虑过XSL-FO生成PDF但是听说开源工具的印刷质量仍然落后于TeX。猜猜最先进的是Apache FOP。但我真的对看起来很棒的PDF感兴趣(否则我可以使用浏览器的打印对话框)。有什么想法,更新吗?

所以我一直在考虑使用XSLT将我的自定义XML / XHTML方言转换为DocBook并从那里(DocBook via XSLT到正确的HTML似乎工作得很好,所以我也可以使用它来做到这一点)。但是如何从DocBook转到TeX?我遇到了很多解决方案。

  • dblatex一组输出LaTeX的XSLT样式表。
  • db2latex作为dblatex的克隆开始,但现在提供与LaTex软件包的更紧密集成,并提供单个脚本来输出PDF,这非常好。
  • passiveTex它使用用TeX编写的XML解析器而不是XSLT。
  • TeXML本质上是LaTeX语言的XML序列化,可以用作中间格式和随附的python工具,从该XML格式转换为LaTeX / ConTeXt。他们claimed这避免了现有解决方案的特殊符号问题,丢失了一些括号或空格,只支持latin-1编码。 (这仍然是这种情况吗?)

由于我的输入XML可能包含Unicode中表示的很多特殊字符,因此最后一点对我来说尤为重要。我一直在考虑使用XeTeX而不是pdfTeX来解决这个问题。 (虽然我可能会放弃一些印刷质量,但可能仍然比现有的开源XSL-FO处理器更好?)所以db2latex和TeXML似乎是最受欢迎的。那么有人可以评论那些人的稳健性吗?

或者,我可能会更直接地使用ConTeXt,因为似乎有一些interest in the ConTeXt community in XML。特别是,我可能会更深入地了解"My Way: Getting Web Content and pdf-Output from One Source""Dealing with XML in ConTeXt MkIV"。两篇文档都描述了使用ConTeXt结合LuaTeX的方法。 (DocBook In ConTeXt似乎也是如此,但最新版本是2003年。)第二份文件指出:

  

你可能想知道为什么我们在TEX中进行这些操作而不是使用xslt。该   集成方法的优点是它简化了使用。想想不仅要处理a   文档,但也使用xml来管理同一次运行中的资源。一个xslt   方法同样冗长(毕竟,你仍然需要生成TEX代码)并且可能   不太可读。在MkIV的情况下,综合方法也更快,并给我们   使用Lua在运行时操作内容的选项。

您如何看待这个?请记住,我对XSLT和TeX都有一些经验,但从来没有深入到其中任何一个。从未尝试过许多不同的LaTeX软件包或替代品,如ConTeXt(或XeTeX / LuaTeX而不是pdfTeX),但我愿意学习一些新东西来最终获得我漂亮的PDF文件;)

另外,我偶然发现Pandoc,但找不到任何与其他提到的方法相比的信息。最后,链接到how to use TeXML with ConTeXt上的一些相当广泛的文档。

4 个答案:

答案 0 :(得分:2)

我过去做过类似的事情(也就是说,用XML维护文档的主版本,并希望从中生成LaTeX输出)。

我过去曾使用过PassiveTeX,但我发现创建样式表是一项艰苦的工作 - 这是通常一次编写两种语言的结果。我得到了它的工作,结果看起来非常好,但它可能比它的价值更多的努力。也就是说,如果您需要添加的样式数量为 small ,那么这可能是一条好路线,因为它只是一步。

最成功的路线(读取,灵活且有吸引力)是使用XSLT将文档转换为结构LaTeX,它与结果文档的预期结构相匹配,但不会尝试做最小的格式化。根据您的文档,可能是看似正常的LaTeX,或者它可能有定制的结构。然后编写或调整LaTeX样式表或类文件,将输出格式化为有吸引力的东西。这样,你就可以使用XSLT来实现它的优势(而不是超越它们,这很快就会变得非常令人沮丧),使用LaTeX 的优势,而不是让自己感到困惑。

也就是说,这或多或少与前两个选项的方法相匹配,无论你是使用它们,还是编写/自定义具有定制输出的LaTeX样式表,都是你对LaTeX样式表感觉舒适的一个功能,以及需要做多少复杂或专门的格式化。

既然你说你需要在输入中处理Unicode字符,那么是的,XeLaTeX对于管道的LaTeX部分来说是个不错的选择。

答案 1 :(得分:1)

您可能需要查看questions tagged with XML on TeX.sx,尤其是this。我建议你使用ConTeXt;当前版本没有Unicode问题,可以完美地处理OpenType - 它可以在Lua中编程。 LaTeX最常用的替代方法是XMLTeX,但这需要大量的TeX foo。

如果您的文档可以由pandoc处理,请使用:您将拥有多个输出选项,而不是任何基于TeX的系统。

答案 2 :(得分:1)

最后,我决定选择Pandoc,似乎是非常优雅和稳固的代码库。一个潜在的缺点是,您必须将自己限制在Pandoc内部表示中可用的标记功能的数量,这些功能基本上与其extended markdown一对一映射。

因为我不认为从类似XHTML的源代码生成markdown是一个好主意,所以我成功地发起了一个pandoc component that reads DocBook,它目前在Pandoc开发回购的主分支中。所以现在我有一个简单的XSLT样式表,可以从我的XHTML方言转换为DocBook(也是XML),然后我使用Pandoc导出到其他格式的提升,包括通过ConTeXt的PDF。

答案 3 :(得分:0)

如果您想要更多关于如何自定义 TeX 输出的选项,我建议您使用:

xml2tex

它基于声明式配置,您可以在其中指定从 XML 到 TeX 的映射。 MathML 和 XML 表(HTML 和 CALS)会自动转换为 TeX。因此,它是开源的,并为 DocBook 和 DITA 提供现成的配置。