有没有办法在 MetaPost 中获取 TeX 标签的轮廓,其中包含一些相当复杂的东西,比如:$\sum_{x=0}^{10}x^2$
?我知道我可以使用获取单独字形的轮廓glyph
,但如何保留布局?
答案1
这就是图片变量的作用。考虑这个小例子for e within p
:p
input TEX
picture p; p = TEX("$\sum_{x=0}^{10}x^2$");
for e within p:
if textual e:
message "(" & decimal xpart e & "," & decimal ypart e & ") "
& fontpart e & " " & textpart e;
elseif stroked e:
show pathpart e;
fi
endfor
end
如果你通过简单运行它,mpost
你应该得到这个输出:
(0,7.472) cmex10 P
(10.5162,5.0091) cmr7 10
(10.5162,-2.9888) cmmi7 x
(15.0339,-2.9888) cmr7 =0
(27.2797,0) cmmi10 x
(32.9736,3.6154) cmr7 2
它会告诉您位置、所用的字体以及该字体中使用的 ASCII 字符。(请注意,中的和符号为“P” cmex10
)。然后您可以使用它glyph
来获取字符串中每个字符的轮廓textpart
。
根据我的实验,这只适用于普通的mpost
。我没有从lualatex
+获得相同的输出luamplib
——我猜是因为字体管理太不一样了。
稍微完整一点的例子
prologues := 3;
outputtemplate := "%j%c.eps";
input TEX
beginfig(1)
picture p; p = TEX("$\displaystyle\sum_{x=0}^{10}x^2$");
for e within p:
if textual e:
pair o; o = (xpart e, ypart e) scaled 100/8;
for i=1 upto length textpart e:
string s; s = substring (i-1, i) of textpart e;
picture g; g = glyph ASCII s of fontpart e scaled 1/8;
picture out; out = image(
for ee within g:
draw pathpart ee;
endfor);
draw out shifted o;
o := o + (xpart lrcorner out, 0);
endfor
fi
endfor
endfig;
end
但我不确定我是否完全理解了间距和缩放信息。文档有点稀疏……
兼容性luamplib
请注意(目前)此处展示的想法仅适用于普通的 Metapost。TEX()
提供的内置宏luamplib
(用于lualatex
)返回的图片只有一个“部分”,并且该部分中没有“文本”元素,唯一的“描边”部分是排版文本的边界框。