简单描述在
Forester
中 \def 的使用方式。从语法开始。
从 grammar 看 \def 语法大致由三个部分组成:ident,binder,arg。考虑一个完整的 \def 实例:
分别来看组成部分:
-
\def 是关键词,表示一个宏定义的开始。
-
\lam 是 ident,表示正在 \def 的宏的名字。
-
[x] 是 binder,即绑定参数名的位置,这里绑定的参数名是 x。
-
\lambda\x\mathpunct{.} 是 arg,parser 中写作 arg 也许是想表示其作为 \def 参数的意思,不过实际上可以看作正在定义的宏的 body。观察 body,可以发现 binder 中绑定的参数名在其中被用到:\x。
这个通过 \def 定义出的名为 \lam 的宏被设计为在 \(\LaTeX \) 环境中使用,使用 ## { } 进入。
##{
\begin{aligned}
\lam{x} \\
\lam{x y} \\
\lam{x}\lam{y} \\
\end{aligned}
}
可以注意到参数是如何传递给 \lam 宏的,在宏后面写一对花括号,花括号中的任意字符都是会传递给该宏的参数。这里三次传递的参数分别是 x,x y 以及 x 和 y。
##{
\begin{aligned}
\lambda\x\mathpunct{.} \\
\lambda\x y\mathpunct{.} \\
\lambda\x\mathpunct{.}\lambda\y\mathpunct{.} \\
\end{aligned}
}
观察展开后的样子,可以看到这些参数分别出现在了各自原先 \x 的位置,这可以看作一种重写或替换。
渲染的效果就像下面这样:
\[ \begin {aligned} \lambda x\mathpunct {.} \\ \lambda x y\mathpunct {.} \\ \lambda x\mathpunct {.}\lambda y\mathpunct {.} \\ \end {aligned} \]
\def 的参数可以不止一个,在 binder 的位置写任意数量的参数都是允许的。
每个 binder 都需要用方括号括起来,每个绑定参数的名字都在方括号中;绑定了的参数名可以在 arg 中使用。
\SubSup{x}{y} => \(_{x}^{y}\)。
传参的时候也是写多个花括号,要传递的参数按顺序对应。
最后看一个更简单的例子:
在这个例子中,binder 被省略,这意味着这个宏不需要绑定参数。使用不需要参数的宏非常简单直接,只需要不写花括号提供参数。
\forester is a experimental forest markup language.
会被展开成:
[ocaml-forester](https://git.sr.ht/~jonsterling/ocaml-forester) is a experimental forest markup language.
ocaml-forester is a experimental forest markup language.