在m4 ifdef语句中转义逗号

时间:2017-03-06 16:40:44

标签: markdown m4

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

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

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

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

我现在的,丑陋的解决方案是使用一个虚拟的逗号'这可以通过管道传输,并由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陈述中。

我通过反复试验学到了什么:

  • m4似乎忽略前缀为#
  • 的行上的任何内容或定义
  • [,]不会逃避逗号
  • [[,]]不会转义逗号

1 个答案:

答案 0 :(得分:2)

最好的想法是使用字符串分隔符。默认字符串分隔符不是最佳解决方案(我认为) - 但您可以使用success()更改它们。

您可以更改评论分隔符(默认为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()