简介

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,存储字符串

用法:

  1. 存储内容
    divert(编号)
    内容
    divert

  1. 释放内容
    undivert(`1')

    ⇒This text is diverted.

tag:释放时有两行空行。