Как поддерживать символы Юникода в MetaPost?

Как поддерживать символы Юникода в MetaPost?

У меня есть файл metapost, который я компилирую через mpost. Этот файл содержит специальные символы, которые не могут быть отображены, когда я включаю файл в latex. Мне потребовался inputenc utf8 в latex.

Кто-нибудь знает ответ на этот вопрос?

решение1

Я так предполагаю, вы не очень много говорите о своем окружении.

Вот три способа установки символов Юникода в Metapost.

Традиционный латекс

Чтобы использовать 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библиотекой. Преимущество в том, что вы получаете всю 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>, что дает:

введите описание изображения здесь

Если вы не готовы использовать lualatexLaTeX в качестве основного движка, то вы можете сделать то, что сделал я, и использовать standaloneкласс для создания, э-э, автономного PDF-файла для вашей графики MP.

Старомодный простой метапост

(Не делайте этого на самом деле...)

Если вы предпочитаете придерживаться старого доброго Metapost и вообще не использовать LaTeX, все равно можно поддерживать по крайней мере подмножество UTF8 с помощью встроенного infontоператора.

Рассмотрим следующую программу депутата:

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, или, скорее, в близкое приближение к ISO8859-1, которое обеспечивается кодировкой, 8rиспользуемой со phvr8rшрифтом. С другой стороны, это быстро...

Примечания

  • Основной цикл decodeпоказывает "ловкий" способ пройти по строке. Макрос incrвзят из простого MP: он увеличивает значение числовой переменной на 1, а затем возвращает это значение. Это именно то, что нам нужно использовать substringдля чтения каждого символа в строке.

Связанный контент