我听说LaTeX是图灵完备的。有没有用LaTeX编写的程序?

95

使用通常被认为是排版语言的工具,可以做出有趣的事情。例如,您可以使用PostScript构建曼德博集合

这个MathOverflow问题中提到,LaTeX可能是Turing完备的。这意味着可以编写任意程序(尽管可能并不容易!)。有人知道在LaTeX中实现这种高度不寻常的语言功能的具体示例吗?


110
你知道吗,我原本打算外出玩耍度过一个周末,摆脱电脑的束缚。然而,你发了这个问题。这就是我无法好好享受事物的原因。 - wheaties
1
/d{定义}def/u{复制}d[0 -185 u 0 300 u]连接/q 5e-3 d/m{乘}d/z{A 单位 m B 单位 m}d/r{相对线段}d/X -2 q 1{d/Y -2 q 2{d/A 0 d/B 0 d 64 -1 1{/f exch d/B A/A z sub X add d B 2 m m Y add d z add 4 gt{exit}if/f 64 d}for f 64 div setgray X Y moveto 0 q neg u 0 0 q u 0 r r r r 填充/Y}for/X}for showpage - DNA
6个回答

92

The Monad Reader 的第 13 期中,Stephen Hicks 讲述了如何使用 TeX 实现一个 ICFP 比赛的解决方案(涉及火星车导航),并广泛使用了宏。有趣的是,当编排该解决方案时,其输出结果为火星车路径的后置地图。


32

3
口译链接失效。 - Nick stands with Ukraine
2
使用Archive.org查看解释器:https://web.archive.org/web/20120707000649/http://texcatalogue.sarovar.org/entries/basix.html - Nulano

28
\def\K#1#2{#2}

\def\S#1#2#3{#1#3{#2#3}}

13
终于有人讲道理了。 - user1129682
1
这个应该做什么? - ViHdzP
3
这个链接展示了可图灵完备的S和K组合子可以用LaTeX表达。 - Chai T. Rex

13
pgfmath 库仍然让我感到惊奇。但更与图灵相关的是:在 TeX 中可以编写实际的图灵机,参见 http://en.literateprograms.org/Turing_machine_simulator_(LaTeX)。这只是在 TeX 中使用扩展的巧妙方式。

PostScript 也是图灵完备的。如果你阅读 手册,你会对其一般的编程能力感到惊奇(至少我是这样的)。


1
人们已经用PostScript编写了LISP。(读到你完全领会这种构造的奇妙之美为止)。 - new123456
PLRM手册已经是一个失效的链接,可以尝试使用这个链接代替 http://www.adobe.com/products/postscript/pdfs/PLRM.pdf‎。 - Aaron Robson

7
我不确定这是否算作编程,但是最近我开始在LaTeX中做一些类似面向对象的东西。(你不需要知道任何数学就能理解以下内容。)在最近的论文中,我写了关于“范畴”的内容,它们有“对象”和“态射”。由于这样的论文有很多,我想要一个统一的风格,比如 𝒞 是具有典型对象 C 和典型态射 c 的范畴,然后我还可以定义 𝒟 与 Dd。所以我定义了一个“类”,比如“category”(你需要成为数学家才能理解这个笑话),并声明 C 是这个类的一个实例,然后可以访问 \ccat、\cobj、\cmor 等等。之所以没有使用 \cat{c}、\obj{c} 和 \mor{c} 等等,是因为有时这些范畴有特殊名称,所以在声明实例之后,我可以非常容易地修改其名称(简单地重新定义 \ccat - 实际上是 \mathccat,因为 \ccat 是一个包装器,在数学模式下选择 \mathccat,在文本模式下选择 \textccat)。当然,它比上面描述的还要稍微复杂一些,当我想要将一个新的范畴定义为旧的范畴的变体时,这个面向对象的内容真正派上用场(它甚至可以处理旧范畴还不存在的情况。)
虽然这可能并不算实际编程,但我在论文中使用它,并发现它非常有用——其他答案(到目前为止)更像是展示LaTeX功能而不是解决实际问题的明智解决方案。

很想看看你是怎么做到的! - Nate Stemen

4

1
唔...不幸的是,我没有这段代码,并且我已经失去了编写它的人的联系。 :/ - Amber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接