我该如何在 TeX 中进行文学编程,其中 TeX 或某些变体既是使用的编程语言,又是用于排版文档的语言?是否有多种方法可以做到这一点,或者针对不同的 TeX 变体有不同的方法?我希望有一些例子。
答案1
鉴于问题是如何对 TeX 代码进行文学编程,那么正如 David 在评论中提到的那样,一个答案是使用doc
或xdoc
包进行文档编写以及docstrip.tex
生成可运行代码。
doc/docstrip 组合不是最好的处理方式(可以想象有更好的方法),但是它提供了一个巨大的优势,这可能解释了为什么现在很大一部分软件包都以这种方式记录:
- 它不需要用户端的任何附加程序,因此它可以在实现任何类型的 TeX 系统的地方工作。
- 它还提供了从相同来源生成代码变体的可能性,例如生产版本和具有附加跟踪代码的版本。
缺点
- 它要求代码按顺序构造(至少除非您想人为地处理多个输出文件)。
- 它有一些有点奇怪的惯例(正如我现在所看到的,即使我就是那个制定这些惯例的人)。其中之一是文档隐藏在
%
符号后面。最初的理由是,你可以直接将这样的文件用作代码,而无需任何处理(该docstrip
程序是后来添加的。 另一个是代码必须被
% \begin{macrocode} ... code ... % \end{macrocode}
最后一行后面必须
%
跟着 4 个空格,后面跟着\end{macrocode}
。
不过,它看起来效果还不错。文档是 LaTeX 发行版的一部分。
有关文档请查看doc.pdf
LaTeXdocstrip.pdf
发行版,有关使用示例请查看.dtx
TeX 安装中的任何文件。
答案2
ConTeXt 使用不同形式的注释来记录宏代码。例如,以 开头的行%D
(后跟空格)表示文档,以 开头的%C
行表示版权声明,以%M
表示用于编译文档的宏定义。所有 ConTeXt 基础文件都以这种方式记录。例如,请参阅系统辅助文件
要生成文档,您需要运行
mtxrun --script module --process <filename>
也可以将此功能与 plainTeX/LaTeX 一起使用。使用以下方法处理文件
mtxrun --script module --convert <filename>
这将创建一个filename.ted
文件,如下所示:
\startmoduledocumentation[type=mkiv,file=syst-aux, version=1996.03.20,title=\CONTEXT\ System Macros,subtitle=General,author=Hans Hagen,date=\currentdate,copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
\startdocumentation
Some of the macros will move to syst-obs as they might become
obsolete once we've redone the bibliography module. Of course
the handy helpers will stay.
There are some references to \LUA\ variants here but these concern
(often old) experiments, moved from local test modules to here,
cleaned up, but not really used. After all it's not that urgent
and replacing helpers is a delicate process. Don't depend on it.
\stopdocumentation
\startdefinition
\registerctxluafile{syst-aux}{1.001}
\stopdefinition
....
....
\stopmoduledocumentation
然后您可以定义适当的宏来处理\startdefinition ... \stopdefinition
和\startdocumentation ... \stopdocumentation
。
答案3
我认为一个好的选择是诺韦布.优点是:
- 它非常简单,尽可能简单;
- 它是一个工具真实的有文学编程(
doc
和docstrip
没有); - 它是“独立于语言的”,因此它可以用于每种语言,也包括 TeX 和 LaTeX;
- 您可以用 TeX、LaTeX、HTML 和 troff 编写文档部分;但您可以使用其他所有标记语言(编写适当的过滤器);
- 这是容易地可扩展,并且每种语言都可以用来扩展它:sed、awk、lua 等。我用 15-20 行 python 为 noweb 编写了一些简单的过滤器。
据我所知,没有缺点。
您可以在 上找到一些 noweb 代码的示例CTAN
。
@wasteofspace:据我所知,tweb
这是 noweb 的扩展。
答案4
还应该注意到,存在gmdoc
,它基于doc
和docstrip
,但消除了它的一些怪癖(尤其是macrocode
环境)。