MetaPost 中的文本标签:语言支持

MetaPost 中的文本标签:语言支持

我正在使用以下示例:

beginfig(1);
label.urt("Текст на русском.", origin);
label.llft("Text in English.", origin);
endfig;

输出包含:

Missing character: There is no 208 in font cmr10!
Missing character: There is no 162 in font cmr10!
Missing character: There is no 208 in font cmr10!
...

我尝试过的:

  • 变量的不同值prologues(1、2 和 3)
  • 在文件的开头.mp我写道:
verbatimtex
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}
\nofiles
etex;
  • 我还在mpost命令中添加了一个选项-tex=latex(希望 MetaPost 能够采用 LaTeX 中的语言设置...)

据我所知,该cmr10字体包含俄语符号。那么我要告诉 MetaPost 什么才能让它“理解”这些字母呢?我查看了 MetaPost 手册并在互联网上浏览了有关该问题的信息 - 什么也没找到...

答案1

这是可能的让它与旧的 一起工作mpost,但现在是 2021 年了,坦率地说,使用它要容易得多lualatex。如果我将 OP 示例包装在 中luamplib,并选择具有良好 Unicode 支持的适当字体,如下所示:

\documentclass[border=5mm]{standalone}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\usepackage{luamplib}
\mplibtextextlabel{enable}
\begin{document}
\begin{mplibcode}
beginfig(1);
label.urt("Текст на русском.", origin);
label.llft("Text in English.", origin);
endfig;
\end{mplibcode}
\end{document}

然后编译lualatex产生如下结果:

在此处输入图片描述

这可能就是您想要的。请注意,字体选择是在 LaTeX 级别完成的,Unicode UTF8 是默认编码。

我愿意全部现在我的 MP 工作都是这样进行的,只是为了更好地与 LaTeX 集成。如果您无法将其用于lualatex文档的其余部分,那么您至少可以使用该类生成单独的 PDF 文件standalone,如我的示例所示。

如需文档,请尝试texdoc luamplib在本地系统上查看。或者查看我的第 11 和 12 节使用 Metapost 绘图文档(准备中...)。以及这个先前的答案

普通旧版 Metapost 版本

如果您(无论出于何种原因)真的被困在平原mpost,那么您也许能够摆脱这样的事情。

prologues := 3;
outputtemplate := "%j%c.eps";

def CY primary s = if string s: decode_some_cyrillic(s) infont "fcmr6z" fi enddef;

vardef decode_some_cyrillic(expr given) = 
    save a, b, i, s, out; string s, out; numeric a, b, i;
    out = ""; i=0;
    forever:
        s := substring (i, incr i) of given; 
        a := ASCII s;
        if a < 128: 
        elseif a = 208: 
            s := substring (i, incr i) of given;
            b := ASCII s;
            s := if (143 < b) and (b < 192): char (b + 48) else: "?" fi;
        elseif a = 209: 
            s := substring (i, incr i) of given;
            b := ASCII s;
            s := if (127 < b) and (b < 144): char (b + 112) else: "?" fi;
        else: 
            s := "?";
        fi
        out := out & s;
        exitif i >= length given;
    endfor
    out
enddef;

beginfig(1);
    label.top(CY"Текст на русском.", origin);
    draw (left--right) scaled 2cm;
endfig;
end

假设您的系统有一种名为的西里尔字体fcmr6z,那么用普通字体编译它mpost应该会产生:

在此处输入图片描述

仅供参考,字体布局如下:

在此处输入图片描述

luamplib解决方案是更好的方法!

答案2

可以让它像旧的 mpost 一样工作:使用最小量,其中包含一个格式文件,允许您使用 luatex,就好像它是一个独立的 metapost-to-pdf 处理器一样。

Minim-mp 基于纯 TeX,因此您必须在 metapost 文件中指定字体,如下所示:

verbatimtex
\font \cmu = {CMU Serif Roman} at 10pt
etex;

beginfig(1);
defaultfont := "cmu";
label.urt("Текст на русском.", origin);
label.llft("Text in English.", origin);
endfig;

bye

然后你可以用 来编译它luatex -fmt minim-mp <filename>.mp。(如果找不到格式文件,你应该先用 创建它luatex -ini minim-mp.ini。)

相关内容