使用通常被认为是排版语言的东西,可以做一些有趣的事情。例如,您可以使用postscript构造Mandelbrot集。
在此MathOverflow问题中建议LaTeX可能是Turing-complete的。这意味着可以编写任意程序(尽管可能并不容易!)。有人知道LaTeX中这种程序的任何具体示例吗,这在语言上有什么异常之处?
使用通常被认为是排版语言的东西,可以做一些有趣的事情。例如,您可以使用postscript构造Mandelbrot集。
在此MathOverflow问题中建议LaTeX可能是Turing-complete的。这意味着可以编写任意程序(尽管可能并不容易!)。有人知道LaTeX中这种程序的任何具体示例吗,这在语言上有什么异常之处?
Answers:
在《The Monad Reader》的第13期中,Stephen Hicks写了关于在TeX中实现ICFP竞赛(涉及火星漫游导航)的解决方案以及大量使用宏的方法。有趣的是,排版时解决方案的输出是流动站路径的后记映射。
该pgfmath
库仍然让我感到吃惊。但需要注意的是与图灵相关的更多信息:可以按照http://en.literateprograms.org/Turing_machine_simulator_(LaTeX)在TeX中编写实际的图灵机。这只是在TeX中使用扩展的好方法。
PostScript的Turing也很完善,如果您阅读了该手册,则会对它的常规编程功能感到惊讶(至少我是这样)。
我不确定这本身是否适合编程,但是我最近开始在LaTeX中做一些类似于面向对象的工作。(您不需要知道任何数学就可以遵循以下内容。)在最近的论文中,我一直在写有关具有对象和态射的类别。既然有很多这样的东西,所以我想要一个一致的样式,例如𝒞是具有典型对象C和典型射晶c的类别。那我也有D和d。因此,我定义了一个“类”,说“类别”(您需要成为一个数学家才能理解那里的笑话),并声明C是此类的实例,然后可以访问\ ccat,\ cobj,\ cmor等等。不使用\ cat {c},\ obj {c}和\ mor {c}等的原因是,有时这些类别具有特殊名称,因此在声明实例之后,我可以非常轻松地修改其名称(只需重新定义\ ccat-好吧,实际上是\ mathccat,因为\ ccat是在数学模式下选择\ mathccat和在文本模式下选择\ textccat的包装器)。(当然,它比上面的建议要复杂一些,并且当我想将新类别定义为旧类别的变体时,面向对象的东西真的很有用(它甚至可以处理旧类别没有的情况)还不存在。)。
尽管它可能不符合实际的编程要求,但我在论文中使用了它,并且确实发现它很有用-到目前为止,其他答案更像是炫耀LaTeX的功能,而不是对实际问题的明智解决方案。