在 m4 ifdef 语句中转义逗号

Escaping Commas in m4 ifdef Statements

我正在使用 markdown 和 m4 的组合来生成文档的三个不同版本,具体取决于开头给出的标志。我们称它们为金、银和铜。

我遇到的问题是,如果我有一个部分出现在带有逗号的 ifdef 语句中,m4 会认为该部分的其余部分是错误的。

ifdef(`GOLDANDSILVER',dnl
## Here's a subsection header

### Subsubsection about this, that, and the other thing

Aren't examples fun? Here's some punctuation, failure, and misfortune.
)dnl

有趣的是,它没有在小节上失败,但在正文中失败了。

我目前的丑陋解决方案是使用 'dummy comma' 可以通过管道传输到 sed 并由 sed 替换。

ifdef(`GOLDANDSILVER',dnl
## Here's a subsection header

### Subsubsection about thisREPLACE_ME_COMMA thatREPLACE_ME_COMMA and the other thing

Aren't examples fun? Here's some punctuationREPLACE_ME_COMMA failureREPLACE_ME_COMMA and misfortune.
)dnl

我正在寻找一种更简洁、最好是仅 m4 的解决方案,它允许我在 ifdef 语句的正文中包含“,”。


我通过反复试验学到的东西:

最好的办法是使用字符串定界符。默认的字符串定界符不是最好的解决方案(我认为)——但您可以使用 changequote.

更改它们

您可以更改注释分隔符(默认为 # 和换行符)- 甚至可以禁用它们。

我认为以下内容对您有好处:

ifdef(`GOLDANDSILVER',changequote(XXX,YYY)dnl
XXX## Here's a subsection header

### Subsubsection about this, that, and the other thing

Aren't examples fun? Here's some punctuation, failure, and misfortune.YYY changequote()
)dnl

请注意 changequote(XXX,YYY):引用以 XXX 开头并以 YYY 结尾。在这种情况下,以 # 开头的行不是注释,因为它是字符串的一部分。请注意 changequote():它恢复默认的字符串定界符。

$  cat x.m4 | m4 -DGOLDANDSILVER # GOLDANDSILVER is defined
## Here's a subsection header

### Subsubsection about this, that, and the other thing

Aren't examples fun? Here's some punctuation, failure, and misfortune.
$  cat x.m4 | m4 # GOLDANDSILVER isn't defined
$