2017-03-06 6 views
1

私はmarkdownとm4の組み合わせを使って、最初に与えられたフラグに応じて3つの異なるバージョンのドキュメントを生成しています。ゴールド、シルバー、ブロンズと呼ぼう。m4でエスケープするifdef文

私が遭遇した問題は、ifdef文内にカンマを含むセクションがあると、残りのセクションがfalseとみなされるということです。興味深いことに、サブサブセクションでは失敗しませんが、本文テキストでは失敗します。

私の現在の、醜い解決策は、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 

Iは、好ましくはM4のみ、クリーナーのために私は私のifdef文の本文に「」を持つことを可能にするソリューションを探しています。

私は試行錯誤によって学んだことを

  • m4は、カンマをエスケープしません[、]#
  • で始まる行に任意のコンテンツや定義を無視しているようだ
  • [[、]]カンマをエスケープしない
+0

私の答えは見ましたか?それは動作しますか? – uzsolt

+0

これは小規模に機能しますが、何らかの理由でドキュメント内にHTMLにコンパイルされなくなるものがあります。 今のところ、私はREPLACE_ME_COMMAに固執します。 – aepksbuck

+0

あなたが複雑な例を提示した場合、私はそれを確認することができます。 – uzsolt

答えて

1

文字列区切り文字を使用することをお勧めします。デフォルトの文字列区切り文字は最良の解決策ではありませんが、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 
$