真实的 MetaPost 空间

真实的 MetaPost 空间

在 MetaPost 中,我用以下标签标记某些内容:

标签(1)(百分比,“,269 GiB”)(向内,0)带有颜色(1,1,0);

不幸的是,逗号后的空格和 269 和 GiB 之间的空格在输出中用连字符表示。

如何获得一个真实的空间?

prologues := 3 ; 
input piechartmp; 

beginfig(1) ; 
  SetupColors((0.7, 0.7), this, this) ; 
  SetupPercent(this, "%") ; 
  Segment(64, "acc") ; 
  Segment(24, "bak") ; 
  Segment(12, "ext") ; 
  SegmentState(3, this, 0.3) ; 
  PieChart(2cm, 0.15, 60, 0,0) ; 
  Label.auto(0) (name) (outwards, 0) ; 
  Label(1)(percent, ", 269 GiB") (inwards, 0) withcolor (1, 1, 0) ; 
  Label(2)(percent, ", 100 GiB") (inwards, 0) withcolor (1, 1, 0) ;
  Label(3)(percent, ", 48 GiB") (inwards, 0) withcolor (1, 1, 0) ;
  pickup pencircle scaled 2pt ; 
endfig ; 

end.

示例输出

答案1

问题是,当 Metapost 将字符串转换为图片时,它只是以最简单的方式进行转换,将字符串中的每个 ASCII 码转换为适当的字形(我猜也是使用字体度量)。使用 TeX 字体时,排版不需要空格字符(ASCII 32),因此它用于一个有趣的小对角线,当 Metapost 执行其操作时,您会看到它。

最简单的解决方案是让 Metapost 要求 TeX 排版您的标签,方法是用 替换"269 GiB"btex 269 GiB etex或者使用 TEX.mp 文件中的 TEX() 命令。

更新:我注意到下面的评论说这不适用于 metapost 包piechartmp.mp。这是因为btex ... etex生成图片而Label命令需要一个字符串。我不熟悉这个包,并假设该命令更像普通的 metapost 命令,label它适用于文本、图片等。

我查看了文件piechartmp.mp,发现有几层宏构建了一个字符串,然后将其传递给命令_makeText,该命令在第 864-886 行定义:

vardef _makeText primary s =
    if ( pc_sTextScheme > 0 ) :
        write "verbatimtex" to pc_TeXFile ;
        if ( pc_sTextScheme = 3 ):
            write "%&latex" to pc_TeXFile ;
        else:
            write pc_sTeXFormat to pc_TeXFile ;
        fi;
        if ( pc_sTextScheme > 1 ):
            write "\documentclass{minimal}" to pc_TeXFile ;
            write pc_sTeXSettings to pc_TeXFile ;
            write "\begin{document}" to pc_TeXFile ;
        else:
            write pc_sTeXSettings to pc_TeXFile ;
        fi;
        write "etex" to pc_TeXFile ;
        write "btex "&s&" etex" to pc_TeXFile;
        write EOF to pc_TeXFile;
        scantokens ("input " & pc_TeXFile )
    else:
        s infont defaultfont scaled defaultscale
    fi
enddef;

从中您可以看到,如果sTextScheme > 1这样,就会创建一个包含btex ... etex分隔符的小型 metapost 文件,然后将其读回。(顺便说一句,这就是TEX()所做的。)

所以这个包的作者已经实现了这个功能——我们只需要找出如何使用它!在第 1016 行,命令SetupText设置了它。

软件包文档的第 17 页piechartmp.mp告诉您该命令SetupText用于控制标签的排版。我尝试让它在您的示例文件上运行,但无法让它运行。

所以我的答案几乎完整,除了“MWE”中的“W”。

更新 2:我刚刚看到 Franck Pastor 实际上找到了一些文档告诉我们他是如何让它工作的。

答案2

根据《LaTeX Graphics Companion》(第二版)本身的第 174 和 175 页,您应该插入如下行:

SetupText(1, "", "");

这一条命令告诉 PieChartMP 使用 TeX 作为排版引擎,从而解决了 Andrew Kepert 上面解释的问题:空格字符串字符现在可由 TeX 适当处理。有关其他选项的更多信息(尤其是使用 LaTeX 时),请参阅 LGC2。

另外,更换

SetupPercent(this, " %") ;

经过

SetupPercent(this, " \%") ;

以下程序应该可以和你的安装一起工作,就像和我的安装一起工作一样:

prologues := 3;
input piechartmp; 

beginfig(1) ; 
  SetupColors((0.7, 0.7), this, this) ; 
  SetupText(1, "", "");
  SetupPercent(this, " \%") ; 
  Segment(64, "acc") ; 
  Segment(24, "bak") ; 
  Segment(12, "ext") ; 
  SegmentState(3, this, 0.3) ; 
  PieChart(2cm, 0.15, 60, 0,0) ; 
  Label.auto(0) (name) (outwards, 0) ; 
  Label(1)(percent, ", 269 GiB") (inwards, 0) withcolor (1, 1, 0) ; 
  Label(2)(percent, ", 100 GiB") (inwards, 0) withcolor (1, 1, 0) ;
  Label(3)(percent, ", 48 GiB") (inwards, 0) withcolor (1, 1, 0) ;
  pickup pencircle scaled 2pt ; 
endfig ; 

end.

在此处输入图片描述

答案3

这里的实际问题是 Metapost 使用的默认字体cmr10具有纯 TeXtextfont0编码;由于它在代码点 32 处没有空格,因此这是一个特别糟糕的选择!

您可以通过将默认字体更改为具有更有用的编码的字体来解决这个问题。尝试在文件顶部添加以下内容:

defaultfont := "phvr8r";

这将使用“8r”编码(与 ISO Latin 1 和 Windows 1252 非常相似)设置 Helvetica 中的所有文本。

如果您想坚持使用“Computer Modern”,请使用以下命令:

defaultfont := "texnansi-lmr10";

它使用“Latin Modern”(看起来与“Computer Modern”相同)和“TeX and ANSI”编码,这与 ISO Latin 1 非常相似。

要查看 Metapost 可用的更多字体,请查看本地psfonts.map文件。

您将遇到的下一个问题是标签不再适合您的饼图切片,因此您需要将字体缩小一点。您可以通过设置默认字体比例来实现这一点。这是您的输出,顶部添加了以下两行:

defaultfont := "phvr8r";
defaultscale := 0.5;

一些馅饼

相关内容