简介
m4是一个宏处理器。有内部宏和用户自定义宏。
文档阅读手册¶
此文档的提示符:输出用⇒
,错误信息用error→
,命令行使用$
$ command line to invoke m4
Example of input line
⇒Output line from m4
error→and an error message
m4的无参宏调用只要写名字name
即可;如果加了括号name()
,那么调用时有一个空字符串参数传入,而不是无参调用。
为了防止宏调用,可以加上选项-P
,这样在每次调用内置宏的时候,都需要加上前缀m4_
,这对自定义的宏没有影响
自定义宏¶
eg.
define(`foo', `Hello world.')
重复定义会覆盖pushdef最高的定义,如果使用undefined删除,那么所有的定义都会被删除
define(foo, one)
⇒
define(foo, two)
⇒
one
⇒two
可以使用$n
代表第n个输入参数,$0
代表宏名
define(`exch', `$2, $1')
⇒
exch(`arg1', `arg2')
⇒arg2, arg1
如果想要引用的text成为扩展text的一部分,那么使用双重引用
define(`foo', `This is macro `foo'.')
⇒
foo
⇒This is macro foo.
重命名宏¶
defn(name…)
如果name是自定义宏,那么久只是简单的引用。如果只有一个name并且是内置宏,扩展只是一个特殊的标记,指向内部定义。
执行shell命令¶
与子进程共享输入,即子进程会处理下一个输入。
syscmd(shell-command)
不会输出执行结果和错误信息,使用
esyscmd(shell-command)
即可输出。
dnl¶
从当前开始删除到下一行
define(`foo', `Macro `foo'.')dnl A very simple macro, indeed.
foo
⇒Macro foo.
改变引用符号¶
changequote(`[', `]')
⇒
define([foo], [Macro [foo].])
⇒
foo
⇒Macro foo.
改变注释的分隔符¶
changecom([start], [end = ‘NL’])
输入指定文件¶
两个命令都是调用m4读取文件。
include(file)
、
sinclude(file)
。要与-I
选项配合使用
文件内容可能会影响到m4的输出,可以配合divert使用。
divert,存储字符串¶
用法:
- 存储内容
divert(编号)
内容
divert
⇒
- 释放内容
undivert(`1')
⇒
⇒This text is diverted.
⇒
tag:释放时有两行空行。