假设我有一个 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
当前输出格式成为文件扩展名,这可能就是您想要的。