GNU m4:转义反引号(`)

Pie*_*rre 6 escaping m4 backticks

一个简单的GNU m4问题,但我找不到正确的答案.我想打印一个开始/结束代码部分的markdown标题:

```
echo Hello
```
Run Code Online (Sandbox Code Playgroud)

如何创建包含3个反引号的GNU M4宏?就像是

define(`md_code',````')
md_code
echo Hello
md_code
Run Code Online (Sandbox Code Playgroud)

Pie*_*rre 7

得到了Eric Blake在M4邮件列表上的答案:http://lists.gnu.org/archive/html/m4-discuss/2015-04/msg00004.html

changequote是你的朋友.这样做:

define(`md_code', changequote([, 
])[changequote([,])```changequote(`,')]changequote(`,'))
Run Code Online (Sandbox Code Playgroud)

我必须两次更改引号:一次围绕宏定义,因为定义本身打算以不平衡的方式使用(反引号); 再次在宏观扩张中,由于扩张将以不平衡的方式输出反推; 对于每个更改的报价,必须恢复原始报价.这假设在整个m4运行期间默认引用保持在(反引号)'.

虽然在你的情况下,我建议事先将changequote用于其他东西,并在这些引用规则下全局写输入而不是默认(反引号)'引用规则.请记住,autoconf故意使用[]作为引号字符,因为它们很可能在输出中平衡,而不是(反引号)和'在shell脚本中没有出现在平衡对中.事实上,选择2或3字节的引号字符串更不明确,尽管它需要更多的输入.