我想根据变量值标记一个比例,并且我编写了像这样的元帖子代码。
$ := 1;
for i = -.3cm step .6cm until 3.6cm:
label.bot(str$,(i,-3.7cm));
$ := incr($);
endfor;
它只是用“$”来标记变量值,而不是变量值。如何输出变量值?
答案1
要获取变量的值,请使用decimal
宏。以下方法有效:
$:=1; 对于 i = -.3cm,步进 .6cm 直到 3.6cm: 标签.bot(十进制$,(i,-3.7cm)); $ := 增加($); 结束
引用 MetaPost 手册:
该
str
操作器一般仅供紧急情况下使用。
更远
该
decimal
运算符接受一个数字并返回字符串表示形式。
答案2
使用以下解决方案的问题
$ := 1;
for i = -.3cm step .6cm until 3.6cm:
label.bot(decimal $,(i,-3.7cm));
$ := incr($);
endfor;
是infont
调用运算符来排版标签。排版能力非常差,特别是数学表达式,与允许使用 TeX 和 co. 执行此任务的标志infont
相反。btex … etex
目前至少有三种方法可以通过 MetaPost 在标签中包含变量,同时将排版工作留给 (La)TeX:
使用
TEX.mp
包及其TEX
定义的函数。input TEX; beginfig(1); $ := 1; for i = -.3cm step .6cm until 3.6cm: label.bot(TEX("$n_" & decimal $ & "$"),(i,-3.7cm)); $ := incr($); endfor; endfig; end.
TEX.mp
默认情况下,它会调用 Plain TeX 来排版标签,但也可以配置为使用 LaTeX。它工作得很好,但处理一个大循环需要花费大量时间,因为每次调用该TEX
函数都会触发创建和处理新的单独文件。请参阅MetaPost 手册,第 63 和 64 页(对于 TeX Live 2014 中包含的版本)。使用更灵活的
latexmp
包及其textext
函数,灵感来自 ConTeXt 中包含的 MetaFun 格式中定义的同名函数。如果您使用独立的 MetaPost 和 LaTeX 格式来处理您的论文,这是迄今为止包含标签的最佳方式。顾名思义,它使用 LaTeX(独家)来排版标签。与 TEX 相反,它需要两次运行才能生成标签(它们可以自动化),但由于这些标签被传递到单个文件进行处理,因此无论如何它都会更快。此外,它latexmp
更容易配置以满足作者的排版需求(例如,用于重现应该包含图纸的文件的 LaTeX 序言)。latexmp
文档做得很好,提供了所有细节。input latexmp; beginfig(1); $ := 1; for i = -.3cm step .6cm until 3.6cm: label.bot(textext("$n_" & decimal $ & "$"),(i,-3.7cm)); $ := incr($); endfor; endfig; end.
将 MetaPost 程序包含在 LuaLaTeX 文件中(例如,使用类
standalone
)并使用该luamplib
包。它还具有textext
与以前具有相同属性的函数,但作者只需运行一次该文件即可生成标签。请参阅luamplib
文档。这种策略的主要优点是标签会自动排版为与一般 LuaLaTeX 文档相同的字体,因此可以在 MetaPost 绘图中使用 OpenType 字体(这在独立的 MetaPost 中是不可能做到的)。\documentclass{standalone} \usepackage{luamplib} \begin{document} \begin{mplibcode} beginfig(1); $ := 1; for i = -.3cm step .6cm until 3.6cm: label.bot(textext("$n_" & decimal $ & "$"),(i,-3.7cm)); $ := incr($); endfor; endfig; \end{mplibcode} \end{document}
也可以使用 ConTeXt 及其自身的textext
功能,但我对这种格式完全不熟悉。
每种方法都会产生相同的结果,仅使用字符串与infont
运算符的组合来达到这一目的要困难得多(如果可以通过这种方式实现的话):
答案3
如果您需要一个 TeX 格式的标签(在 btex 和 etex 之间),并且想要在那里使用变量的值,您可以执行以下操作:
a[0]:=1/2;
for t=0 upto 7:
a[t+1]:=sqrt(a[t]);
draw (a[t]*ux,a[t]*uy)--(a[t]*ux,a[t+1]*uy);
draw (a[t]*ux,a[t+1]*uy)--(a[t+1]*ux,a[t+1]*uy);
draw (a[t]*ux,-dx)--(a[t]*ux,dx);
write "label.bot (btex $x_{"&decimal(t)&"}$ etex,(a["&decimal(t)&"]*ux,-dx));"
to "mptextmp.mp";
endfor;
write EOF to "mptextmp.mp";
scantokens "input mptextmp"
另请参阅SO上的这篇文章:METAPOST:在标签中使用循环变量