如何在 metapost 中支持 unicode 字符?

如何在 metapost 中支持 unicode 字符?

我有一个通过 mpost 编译的 metapost 文件。此文件包含特殊字符,当我将文件包含在 latex 中时无法显示这些字符。我需要在 latex 中输入 inputenc utf8。

有人知道这个问题的答案吗?

答案1

你没有过多谈论你的环境,所以我只是猜测。

以下是在Metapost中设置unicode字符的三种方法。

传统乳胶

要在标签字符串中使用 UTF8,您可以执行以下操作:

prologues := 3;
outputtemplate := "%j%c.eps";
verbatimtex 
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
etex
beginfig(1);
label.top(btex sprichwörtlichen etex, origin);
draw (left--right) scaled 2cm;
endfig;
end.

为了让 Metapost 能够latex处理这个问题,您需要使用以下命令进行编译:

mpost -tex=latex <filename>

在我的系统上,这会产生:

在此处输入图片描述

使用此设置,您应该能够使用utf8编码所识别的任何 Unicode 字符。您可能会发现,在将生成的文件包含到文件中之前,将其转换.eps为文件会更方便。.pdf.tex

现代 LuaLaTeX

我个人目前倾向于使用lualatex该库来完成 Metapost 的所有工作luamplib。这样做的好处是,整个fontspec环境都可以为您工作,并且您可以使用任何已安装的适当 OTF 字体。在这里,我使用了Linux Libertine O字体,它定义了一系列 Unicode 字符。

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
    label.top("☞ sprichwörtlichen", origin);
    draw (left--right) scaled 2cm;
endfig;
\end{mplibcode}
\end{document}

你用它编译lualatex <filename>它会产生:

在此处输入图片描述

如果您还没有准备好将其lualatex作为您的主要 LaTeX 引擎,那么您可以按照我在这里所做的那样,使用该类standalone为您的 MP 图形生成一个独立的 PDF 文件。

老式朴素的 Metapost

(真不要這樣做……)

如果您想坚持使用老式的普通 Metapost,而根本不使用 LaTeX,那么仍然可以使用内置运算符支持至少一个 UTF8 子集infont

考虑以下 MP 程序:

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

def U primary s = if string s: decode(s) fi enddef;

vardef decode(expr given) = 
    save a, i, s, out; string s, out; numeric a, i;
    out = ""; i=0;
    forever:
        s := substring (i, incr i) of given; 
        a := ASCII s;
        if a < 128: 
        elseif a = 194: 
            s := substring (i, incr i) of given;
        elseif a = 195: 
            s := char (64 + ASCII substring (i, incr i) of given);
        else: 
            s := "?";
        fi
        out := out & s;
        exitif i >= length given;
    endfor
    out
enddef;

beginfig(1);
    defaultfont := "phvr8r";
    label.top(U"sprichwörtlichen", origin);
    draw (left--right) scaled 2cm;
endfig;
end.

mpost这可以使用没有任何选项的普通旧版本进行编译,它会产生:

在此处输入图片描述

但请注意,这个简单、快速且粗糙的decode例程仅支持非常有限的 UTF8 子集,并且它正在将其所做的转换为 ISO8859-1,或者更确切地说,转换为字体8r使用的编码提供的与 ISO8859-1 非常接近的编码phvr8r。另一方面,它很快……

笔记

  • 的主循环decode展示了一种“巧妙”的遍历字符串的方法。incr宏来自普通的 MP:它将数字变量的值增加 1,然后返回该值。这正是我们substring读取字符串中每个字符所需要的。

相关内容