如何在 Metapost 中支援 unicode 字元?

如何在 Metapost 中支援 unicode 字元?

我有一個透過 mpost 編譯的 metapost 檔案。該文件包含特殊字符,當我將該文件包含在乳膠中時,這些特殊字符無法顯示。我需要在乳膠中輸入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不帶任何選項,並產生:

在此輸入影像描述

但請注意,簡單、快速而骯髒的例程僅支援非常有限的 UTF8 子集,並且它將其所做的轉換為 ISO8859-1,或者更確切地說,轉換為所使用的編碼decode提供的ISO8859 -1 的近似值8rphvr8r字體。另一方面,速度很快...

筆記

  • 主循環decode顯示了一種「靈活」的方式來單步執行字串。該incr巨集來自普通 MP:它將數值變數的值加 1,然後傳回該值。這正是我們需要用來substring讀取字串中每個字元的方法。

相關內容