背景
我正在尝试根据 Knuth 自己的代码,用他的 Dangerous Bend 符号制作一个漂亮的 SVG,显然 MetaPost 是最佳工具。但是,我更希望能够使用 Metafont 处理文件,这样我就可以更轻松地看到我可能在形状中引入哪些差异。由于这似乎会受益于cutdraw
,我目前的计划是dbend.mf
同时使用 Metafont 的plain.mf
基础和 MetaPost 的mfplain.mp
基础。
我已经有可以在这两种基础上正常工作的代码,但如果在 MetaPost 下运行,我想做一些额外的事情,比如彩色填充和重新定义pt
为等于bp
。
问题
有没有一个好的方法来确定你的代码是在 Metafont 还是 MetaPost 下运行,或者我只需要使用例如known red
?
答案1
我用
boolean metapost;
if known color Wolfgang Amadeus Mozart:
metapost:=true;
else:
metapost:=false;
fi
解释:在 下Metafont
,color Wolfgang Amadeus Mozart
将是一个未知数字,因为颜色不是关键字Metafont
。但在 中MetaPost
,Wolfgang Amadeus Mozart
将是一个未知数字,因此不是颜色。因此color Wolfgang Amadeus Mozart
将是一个假布尔值,它是一个已知值。使用 的原因Wolfgang Amadeus Mozart
是选择一些不太可能先前定义的东西。我有时会使用巴赫之一,或一些鲜为人知的罗马尼亚民间舞蹈的标题,但我最喜欢的是Maurits Cornelis Escher
。
有时我会把它放在let color = numeric
下Metafont
(以便某些代码可以在 和 中运行MetaPost
)Metafont
,但我在设置metapost
布尔值之后只在 内这样做if not metapost:...fi
。
答案2
我想到了一个不同的想法,这个想法非常简单,我可能会将其描述为愚蠢;我只需创建两个文件, a.mf
和 a .mp
,然后让 kpathsea 完成剩下的工作(名称可能会根据您的建议而更改):
% ismetapost.mf: Companion to ismetapost.mp
% If we were MetaPost, we would have read the other file, so ...
boolean is_metapost;
is_metapost := false;
% ismetapost.mp: Companion to ismetapost.mf
% Only MetaPost will see this file, so ...
boolean is_metapost;
is_metapost := true;
% Test/example driver
input ismetapost
if is_metapost:
message "Running under MetaPost";
else:
message "Running under Metafont";
fi
end
整个事情中最难的部分是:记住将其拼写为input
,而不是include
。