使用命令行选项将 MetaPost 文件导出为多种格式?

使用命令行选项将 MetaPost 文件导出为多种格式?

假设我有一个 MetaPost 代码需要导出为多种格式。根据 MetaPost 手册,MetaPost 本身可以导出三种不同的文件类型(EPS、SVG 和 PNG)。

指定输出文件格式的“正确”方法是在源文件中添加一行:

outputformat := "svg"

但由于我希望它们具有多种格式,因此我需要一个命令行选项,而不是每次需要更改输出格式时都编辑文件,我发现了以下命令:

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

但我收到这个警告:

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

而且它只输出 EPS 文件。是否有命令行选项可以让它直接输出 SVG 文件(如其声称的那样)?

答案1

这似乎是调用的 shell 的问题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 使用的 shell 会“误解”双引号。尝试将它们加倍?或者使用反斜杠?

补充说明

顺便说一句,如果您能找到正确传递引号的方法mpost,您可能希望将其设置在 MP 源的顶部附近:

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

这使得mpost当前输出格式成为文件扩展名,这可能就是您想要的。

相关内容