我正在使用以下示例:
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
。)