使用通常被认为是排版语言的东西可以做一些有趣的事情。例如,您可以构造 Mandelbrot 集 using postscript。
this MathOverflow question 中建议 LaTeX 可能是 Turing-complete。这意味着编写任意程序的能力(尽管这可能并不容易!)。有谁知道 LaTeX 中此类程序的任何具体示例,它对该语言做了一些非常不寻常的事情?
在 The Monad Reader 的第 13 期中,Stephen Hicks 写了关于在 TeX 中实现 ICFP 竞赛(涉及火星探测器导航)的解决方案,并大量使用宏。有趣的是,排版时解决方案的输出是漫游者路径的附记地图。
或者,Andrew Greene 写了 a BASIC interpreter in TeX (more details)。这可能算得上有点反常。
\def\K#1#2{#2}
\def\S#1#2#3{#1#3{#2#3}}
pgfmath
库仍然让我感到惊讶。但在一个更与图灵相关的说明上:可以按照 http://en.literateprograms.org/Turing_machine_simulator_(LaTeX) 在 TeX 中编写一个实际的图灵机。这只是在 TeX 中使用扩展的一种绝妙方式。
PostScript 也是图灵完备的,如果您阅读 the manual,您会惊讶于它的一般编程能力(至少,我是这样)。
我不确定这是否符合编程本身的条件,但我最近开始做一些有点像 LaTeX 中面向对象的东西。 (你不需要知道任何数学来遵循以下内容。)在最近的论文中,我一直在写关于类别的文章,它有对象和态射。因为已经有很多这样的,我想要一个一致的风格,比如说,𝒞是一个具有典型对象 C 和典型态射 c 的类别。然后我也会有 𝒟 和 D 和 d。所以我定义了一个“类”,说“类别”(你需要是一个数学家才能理解那里的笑话),并声明 C 是这个类的一个实例,然后可以访问 \ccat、\cobj、\cmor等等。不做\cat{c}、\obj{c}、\mor{c}等的原因是有时这些类别有特殊的名称,所以在声明实例后,我可以很容易地修改它的名称(只需重新定义 \ccat - 好吧,实际上 \mathccat 因为 \ccat 是一个包装器,它在数学模式下选择 \mathccat 并在文本模式下选择 \textccat)。 (当然,它比上面建议的要复杂一点,当我想将一个新类别定义为旧类别的变体时,OO 的东西真的很有用(它甚至可以处理旧类别没有的情况'还不存在。)。)
虽然它可能不符合实际编程的条件,但我在论文中使用它并且确实发现它很有用 - 其他答案(到目前为止)更多的是炫耀 LaTeX 的功能,而不是实际问题的明智解决方案。