简单描述在
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.