基于变量值的 Metapost 标签

基于变量值的 Metapost 标签

我想根据变量值标记一个比例,并且我编写了像这样的元帖子代码。

$ := 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:在标签中使用循环变量

相关内容