コマンドラインオプションを使用して MetaPost ファイルを複数の形式でエクスポートしますか?

コマンドラインオプションを使用して MetaPost ファイルを複数の形式でエクスポートしますか?

複数の形式でエクスポートする必要がある MetaPost コードがあるとします。MetaPost のマニュアルによると、MetaPost 自体は 3 つの異なるファイル タイプ (EPS、SVG、PNG) をエクスポートできます。

出力ファイル形式を指定する「適切な」方法は、ソース ファイルに次の行を追加することです。

outputformat := "svg"

しかし、複数の形式で出力したいので、出力形式を変更するたびにファイルを編集するのではなく、コマンド ライン オプションが必要になります。そこで、次のコマンドを見つけました。

mpost -s 'outputformat="svg"' xxx.mp

しかし、次のような警告が表示されます:

Warning: 'outputformat=0: variable does not exist, assignment ignored.

また、EPS ファイルのみを出力します。主張どおりに SVG ファイルを直接出力するためのコマンドライン オプションはありますか?

答え1

mpostこれはMetapost の問題ではなく、呼び出しているシェルの問題であると思われます。

私のメインの Mac システムでは、次のようになります:

bash-3.2$ mpost -s outputformat="svg" wavelength.mp
This is MetaPost, version 2.00 (TeX Live 2019) (kpathsea version 6.3.1)
(/usr/local/texlive/2019/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2019/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./wavelength.mp
Warning: outputformat=0: value has the wrong type, assignment ignored.
[1{psfonts.map}<cmr10.pfb>] )
1 output file written: wavelength1.eps
Transcript written on wavelength.log.

これは OP が抱えていた問題と同じです。

ただし、引数を-s一重引用符で囲んでいないことに注意してください。

二重引用符をエスケープすると、期待どおりに動作します。

bash-3.2$ mpost -s outputformat=\"svg\" wavelength.mp
This is MetaPost, version 2.00 (TeX Live 2019) (kpathsea version 6.3.1)
(/usr/local/texlive/2019/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2019/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./wavelength.mp [1{psfonts.map
}<cmr10.pfb>] )
1 output file written: wavelength1.svg
Transcript written on wavelength.log.

二重引用符を一重引用符でエスケープすることもできます。これも機能します:

bash-3.2$ mpost -s 'outputformat="svg"' wavelength.mp
This is MetaPost, version 2.00 (TeX Live 2019) (kpathsea version 6.3.1)
(/usr/local/texlive/2019/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2019/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./wavelength.mp [1{psfonts.map
}<cmr10.pfb>] )
1 output file written: wavelength1.svg
Transcript written on wavelength.log.

テストするための Windows システムにアクセスできませんが、OP が使用していたシェルが二重引用符を「誤って解釈」しているのではないかと思います。二重引用符を 2 つ使用してみてはいかがでしょうか。または、バックスラッシュを使用してはいかがでしょうか。

補足事項

ちなみに、引用符を適切に渡す方法が見つかった場合はmpost、MP ソースの上部近くにこれを設定することをお勧めします。

outputtemplate := "%j%c.%{outputformat}";

これにより、mpost現在の出力形式がファイル拡張子として使用されます。これはおそらく必要なことです。

関連情報