Metapost 中的标签文本

Metapost 中的标签文本

总而言之,问题是如何在 Metapost 中显示标签文本。

我有一个 Metapost 函数simple_supported_single_span_load_diagram来绘制负载图。我可以在 Latex 中调用该函数,并且它运行良好。但是,另一方面,我想在纯 Metapost 中调用它来构建图像。听起来 Metapost 不支持字体mathsf(也许我错了),这就是我分别if..else在 latex 和 metapost 的末尾添加该部分的原因。如下面的代码所示,该if..else部分已为 latex 部分注释,它运行良好,如下图所示。但是如果我取消注释该部分,我会收到以下错误:
! ! Unable to read mpx file.
l.71 label.bot (btex
$R_1$ etex, (p6 - (0, gap))); % label R1 of left ...

下面第一部分是文件中的函数,第二部分是要调用的moi_test文件,我的工作环境是,编译命令是。test.mpsimple_supported_single_span_load_diagramMiKTex 2.9mpost.exe test.mp

有什么问题?谢谢。

在此处输入图片描述

文件moi_test

input moi_utility

vardef simple_supported_single_span_load_diagram (expr type, scale, span) =
  numeric u, len, dia, gap, force_len, UDL_len, UDL_start_height, UDL_end_height, UDL_equal_divide;
  numeric point_load_above_UDL;
  pair p[], head, tail;
  picture all;
  interim ahangle := 30;

  % initialization
  u = 1 / scale * 1mm;

  len = span * u;
  UDL_len = len / 5;
  UDL_start_height = 5mm;
  UDL_end_height = 10mm;
  UDL_equal_divide = 10;
  point_load_above_UDL = 5mm;
  dia = 2mm;
  gap = 1mm;
  force_len = 10mm;

  p0 = origin; % left support
  p1 = p0 + (len, 0); % right support
  p2 = p1 + (0, -dia / 2); % circle centre of right support
  p3 = p0 + (dia / 2, -dia); % left corner of left support
  p4 = p0 + (-dia / 2, -dia); % right corner of left support
  p5 = p0 - (0, dia + gap); % start point of left reaction force
  p6 = p5 - (0, force_len); % end point of left reaction force
  p7 = p1 - (0, dia + gap); % start point of right reaction force
  p8 = p7 - (0, force_len); % end point of right reaction force
  p9 = p0 + (len * 0.6, 0); % start point of UDL
  p10 = p9 + (UDL_len, 0); % end point of UDL
  p11 = p9 + (0, UDL_start_height); % start point of UDL - up
  p12 = p10 + (0, UDL_end_height); % end point of UDL - up
  p13 = p0 + (len * 0.3, 0); % point of point load
  p14 = p13 + (0, UDL_end_height + point_load_above_UDL); % point of point load - up
  p15 = p5 + (0, -force_len * 0.4); % dim line for UDL
  p16 = p5 + (0, -force_len * 0.9); % dim line for span
  p17 = p13 + (0, UDL_end_height + point_load_above_UDL * 0.5); % dim line for point load

  all = image(
    draw p0 -- p1; % span
    draw fullcircle scaled dia shifted p2; % circle for right support
    draw p0 -- p3 -- p4 -- cycle; % triangle for left support
    drawarrow reverse (p5 .. p6); % left reaction force line
    drawarrow reverse (p7 .. p8); % right reaction force line
    for i = 0 upto UDL_equal_divide:
      if (i = 0) or (i = UDL_equal_divide):
        if i = 0:
          draw p11 -- p12;
          drawarrow reverse (p9 .. p11); % start UDL line
        else:
          drawarrow reverse (p10 .. p12); % end UDL line
        fi
      else:
        head := p9 + (i * UDL_len / UDL_equal_divide, 0);
        tail := whatever[p11, p12]=whatever[head, (head + (0, UDL_end_height))];
        drawarrow reverse (head .. tail); % UDL lines
      fi
    endfor;
    drawarrow reverse (p13 .. p14); % point load
    dim (p5, p9, p15, 1, 0, scale, "a"); % UDL dim
    dim (p9, p10, p15, 1, 0, scale, "b"); % UDL dim
    dim (p10, p7, p15, 1, 0, scale, "c"); % UDL dim
    dim (p5, p7, p16, 1, 0, scale, "L"); % span dim
    dim (p0, p13, p17, 1, 0, scale, "A"); % point load dim
    dim (p13, p1, p17, 1, 0, scale, "B"); % point load dim

    %  if type = 0:
      label.bot (btex $R_1$ etex, (p6 - (0, gap))); % label R1 of left reaction force
      label.bot (btex $R_2$ etex, (p8 - (0, gap))); % label R2 of right reaction force
      label.bot (btex $P$ etex, (p14 + (0, 4 * gap))); % label P for point load
      label.lft (btex $q_1$ etex, 1/2[p9, p11]); % label q1 of start UDL
      label.rt (btex $q_2$ etex, 1/2[p10, p12]); % label q2 of start UDL
    %  else:
      %  label.lft (btex $\qquad\qquad$ etex, origin);
      %  label.bot (btex $\mathsf{R_1}$ etex, (p6 - (0, gap))); % label R1 of left reaction force
      %  label.bot (btex $\mathsf{R_2}$ etex, (p8 - (0, gap))); % label R2 of right reaction force
      %  label.bot (btex $\mathsf{P}$ etex, (p14 + (0, 4 * gap))); % label P for point load
      %  label.lft (btex $\mathsf{q_1}$ etex, 1/2[p9, p11]); % label q1 of start UDL
      %  label.rt (btex $\mathsf{q_2}$ etex, 1/2[p10, p12]); % label q2 of start UDL
    %  fi
  );
  draw all;
enddef;

文件test.mp

outputformat := "png";
outputtemplate := "%j-%c.%o";
hppp := 0.5;
vppp := 0.5;
warningcheck := 0;
input moi_test
beginfig(1);
numeric scale, span;
span = 600mm;
scale = 10;
simple_supported_single_span_load_diagram (0, scale, span);
endfig;
end

@Thruston:接下来是显示问题的最少代码。

  • 情况 1:如代码所示,编译失败并显示以下错误:
    ! ! Unable to read mpx file.
    l.11 label.bot (btex
    $R_1$ etex, origin); % line 11

  • 情况 2:如果我们注释掉第 10 行和第 12-14 行,它就起作用了。

  • 情况 3:如果我们注释掉第 10-12 行和第 14 行,编译就会失败,并显示以下错误:metapost 不支持
    ! ! Unable to read mpx file.
    l.13 label.bot (btex
    $\mathsf{R_1}$ etex, origin); % line 13
    声音。没有帮助。\mathsfmpost.exe -tex=latex

      outputformat := "png";
      outputtemplate := "%j-%c.%o";
      hppp := 0.8; % adjust image size
      vppp := 0.8; % adjust image size
      warningcheck := 0;
    
      beginfig(1);
        numeric type;
        type := 0;
        if type = 0: % line 10
          label.bot (btex $R_1$ etex, origin); % line 11
        else: % line 12
          label.bot (btex $\mathsf{R_1}$ etex, origin); % line 13
        fi % line 14
      endfig;
    

    结尾

答案1

所以我思考问题是您无法$\mathsf{R_1}$在标签中排版。

!Unable to read MPX file当 MP 在你的 TeX 输入中发现它无法理解的内容时,就会产生错误。在这种情况下,你包含了一个 TeX 宏 -- --\mathsf它不是清楚的TeX。因此,您要么必须使用“infont”运算符提供的内置字体支持来获取所需的字体;要么必须让 Metapost 使用 LaTeX 而不是纯 TeX。

获取 CM sans 使用infont

如果您想要的只是简单的单字母或单词标签,那么您可以使用infont任何简单的字体名称,包括"cmss10"

outputformat := "png"; hppp := 1/8; vppp := 1/8;
outputtemplate := "%j%c.%{outputformat}";
beginfig(1);
label("R" infont "cmss10", origin)
endfig;
end.

可以使用mpostmpost.exe不使用特殊选项进行编译。

使用 LaTeX 获取 CM Sans

如果您想要下标或其他数学功能,那么您需要告诉 MetaPost 使用 LaTeX 而不是纯 TeX,并且您必须添加一个verbatimtex带有合适的 LaTeX 前言的小块。

outputformat := "png"; hppp := 1/8; vppp := 1/8;
outputtemplate := "%j%c.%{outputformat}";
verbatimtex
\documentclass{article}
\begin{document}
etex
beginfig(1);
label(btex $\mathsf{R_1}$ etex, origin);
endfig;
end.

这次您需要使用mpost -tex=latex或进行编译mpost.exe -tex=latex

你应该得到如下结果:

在此处输入图片描述

详细信息请参阅MetaPost 手册——或者texdoc mpman在本地尝试。

相关内容