总而言之,问题是如何在 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.mp
simple_supported_single_span_load_diagram
MiKTex 2.9
mpost.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
声音。没有帮助。\mathsf
mpost.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.
可以使用mpost
或mpost.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
在本地尝试。