メタポストで Unicode 文字をサポートするにはどうすればよいですか?

メタポストで Unicode 文字をサポートするにはどうすればよいですか?

mpost でコンパイルした metapost ファイルがあります。このファイルには、latex でファイルをインクルードしたときに表示できない特殊文字が含まれています。latex で inputenc utf8 が必要になりました。

これに対する答えを知っている人はいますか?

答え1

あなたは自分の環境についてあまり語っていないので、推測しているだけです。

Metapost で Unicode 文字を設定する方法は 3 つあります。

伝統的なラテックス

ラベル文字列で 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>

私のシステムでは、次の結果が生成されます:

ここに画像の説明を入力してください

この設定を使用すると、エンコードが認識するすべての Unicode 文字を使用できるようになります。生成されたファイルをファイルに変換する前に、それをファイルに含める方utf8が便利な場合があります。.eps.pdf.tex

最新の LuaLaTeX

lualatex現在、私の個人的な好みは、Metapost のすべての作業にライブラリを使用することですluamplib。利点は、環境全体が機能し、インストールされている適切な OTF フォントを使用できることです。ここでは、適切な範囲の Unicode 文字が定義されている フォントをfontspec使用しました。Linux Libertine O

\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>次のようになります。

ここに画像の説明を入力してください

メインの LaTeX エンジンとして採用する準備ができていない場合はlualatex、ここで行ったように、クラスを使用してstandaloneMP ​​グラフィックのスタンドアロン PDF ファイルを生成できます。

昔ながらのシンプルなメタポスト

(本当にやっちゃダメだよ…)

昔ながらの単純な Metapost を使い続け、LaTeX をまったく使用しない場合でも、組み込みinfont演算子を使用して少なくとも UTF8 のサブセットをサポートすることは可能です。

次の 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これはオプションなしでplain old でコンパイルでき、次の結果が生成されます。

ここに画像の説明を入力してください

ただし、このシンプルで手抜きのdecodeルーチンは UTF8 の非常に限られたサブセットのみをサポートしており、変換は ISO8859-1、またはフォント8rで使用されるエンコーディングによって提供される ISO8859-1 に近いものに変換されることに注意してくださいphvr8r。その一方で、これは迅速です...

ノート

  • のメイン ループは、decode文字列をステップスルーする「巧妙な」方法を示しています。マクロは単純な MP からのもので、数値変数の値を 1 増やし、その値を返します。これは、文字列内の各文字を読み取るためにincr使用する必要があるものとまったく同じです。substring

関連情報