如何区分Metafont和MetaPost?

如何区分Metafont和MetaPost?

背景

我正在尝试根据 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

解释:在 下Metafontcolor Wolfgang Amadeus Mozart将是一个未知数字,因为颜色不是关键字Metafont。但在 中MetaPostWolfgang Amadeus Mozart将是一个未知数字,因此不是颜色。因此color Wolfgang Amadeus Mozart将是一个假布尔值,它是一个已知值。使用 的原因Wolfgang Amadeus Mozart是选择一些不太可能先前定义的东西。我有时会使用巴赫之一,或一些鲜为人知的罗马尼亚民间舞蹈的标题,但我最喜欢的是Maurits Cornelis Escher

有时我会把它放在let color = numericMetafont(以便某些代码可以在 和 中运行MetaPostMetafont,但我在设置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

相关内容