Wie unterstützt man Unicode-Zeichen in Metapost?

Wie unterstützt man Unicode-Zeichen in Metapost?

Ich habe eine Metapost-Datei, die ich über mpost kompiliere. Diese Datei enthält Sonderzeichen, die nicht angezeigt werden können, wenn ich die Datei in Latex einbinde. Ich habe inputenc utf8 in Latex erforderlich.

Weiß jemand eine Antwort darauf?

Antwort1

Sie sagen nicht viel über Ihre Umgebung, also ist das nur eine Vermutung.

Hier sind drei Möglichkeiten, Unicode-Zeichen in Metapost festzulegen.

Traditionelles Latex

Um UTF8 in Ihren Beschriftungszeichenfolgen zu verwenden, können Sie Folgendes tun:

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.

Damit Metapost latexdies verarbeiten kann, müssen Sie es mit folgendem kompilieren:

mpost -tex=latex <filename>

Auf meinem System erzeugt dies:

Bildbeschreibung hier eingeben

Mit dieser Einstellung sollten Sie alle Unicode-Zeichen verwenden können, die die utf8Kodierung kennt. Möglicherweise ist es praktischer, die .epserstellte Datei in eine .pdfDatei zu konvertieren, bevor Sie sie in Ihre .texDatei einfügen.

Modernes LuaLaTeX

lualatexIch persönlich bevorzuge es heute , für alle Metapost-Arbeiten die Bibliothek zu verwenden luamplib. Der Vorteil besteht darin, dass die gesamte fontspecUmgebung für Sie arbeitet und Sie alle von Ihnen installierten OTF-Schriftarten verwenden können. Hier habe ich Linux Libertine Odie Schriftart verwendet, die eine gute Auswahl an Unicode-Zeichen definiert hat.

\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}

Sie kompilieren dies, wodurch lualatex <filename>Folgendes entsteht:

Bildbeschreibung hier eingeben

Wenn Sie noch nicht bereit sind, es lualatexals Ihre primäre LaTeX-Engine zu übernehmen, können Sie es so machen wie ich hier und die standaloneKlasse verwenden, um eine, äh, eigenständige PDF-Datei für Ihre MP-Grafik zu generieren.

Altmodischer, schlichter Metapost

(Tu das wirklich nicht ...)

Wenn Sie beim altmodischen, einfachen Metapost bleiben und LaTeX überhaupt nicht verwenden möchten, ist es dennoch möglich, mit dem integrierten infontOperator zumindest eine Teilmenge von UTF8 zu unterstützen.

Betrachten Sie das folgende MP-Programm:

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.

Dies kann mit dem normalen Verfahren mpostohne Optionen kompiliert werden und erzeugt:

Bildbeschreibung hier eingeben

aber beachten Sie, dass die einfache, schnelle und einfache decodeRoutine nur eine sehr begrenzte Teilmenge von UTF8 unterstützt und das, was sie tut, in ISO8859-1 konvertiert, oder eher in die enge Annäherung an ISO8859-1, die durch die 8rmit der Schriftart verwendete Kodierung bereitgestellt wird phvr8r. Andererseits ist es schnell...

Anmerkungen

  • Die Hauptschleife decodezeigt eine „elegante“ Möglichkeit, einen String durchzugehen. Das incrMakro stammt aus einfachem MP: Es erhöht den Wert einer numerischen Variablen um 1 und gibt dann diesen Wert zurück. Das ist genau das, was wir verwenden müssen, substringum jedes Zeichen im String zu lesen.

verwandte Informationen