Como oferecer suporte a caracteres Unicode no metapost?

Como oferecer suporte a caracteres Unicode no metapost?

Eu tenho um arquivo metapost que compilo via mpost . Este arquivo contém caracteres especiais que não podem ser exibidos quando incluo o arquivo no latex. Eu exigi inputenc utf8 em látex.

Alguém sabe uma resposta para isso?

Responder1

Você não fala muito sobre o seu ambiente, então estou supondo.

Aqui estão três maneiras de definir caracteres Unicode no Metapost.

Látex Tradicional

Para usar UTF8 em suas strings de rótulo, você pode fazer o seguinte:

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.

Para que o Metapost use latexpara processar isso, você precisa compilá-lo com:

mpost -tex=latex <filename>

No meu sistema isso produz:

insira a descrição da imagem aqui

Usando esta configuração, você poderá usar quaisquer caracteres Unicode que a utf8codificação conheça. Você pode achar mais conveniente converter o .epsarquivo produzido em um .pdfarquivo antes de incluí-lo em seu .texarquivo.

LuaLaTeX moderna

Minha preferência pessoal hoje é usar lualatexpara todos os trabalhos do Metapost com a luamplibbiblioteca. A vantagem é que você faz com que todo o fontspecambiente funcione para você e pode usar qualquer uma das fontes OTF adequadas que você instalou. Aqui usei Linux Libertine Ocomo fonte, que possui uma boa variedade de caracteres Unicode definidos.

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

Você compila isso com lualatex <filename>o qual produz:

insira a descrição da imagem aqui

Se você não está pronto para adotar o lualatexLaTeX como seu mecanismo principal, então você pode fazer o que fiz aqui e usar a standaloneclasse para gerar um arquivo PDF independente para seu gráfico MP.

Metapost simples à moda antiga

(Realmente não faça isso...)

Se você quiser usar o antigo Metapost simples e não usar LaTeX, ainda é possível suportar pelo menos um subconjunto de UTF8 com o infontoperador integrado.

Considere este seguinte programa 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.

Isso pode ser compilado com o simples e antigo, mpostsem opções e produz:

insira a descrição da imagem aqui

mas tome cuidado, pois a rotina simples e rápida decodesuporta apenas um subconjunto muito limitado de UTF8 e está convertendo o que faz para ISO8859-1, ou melhor, para a aproximação de ISO8859-1 que é fornecida pela 8rcodificação usada com a phvr8rfonte. Por outro lado é rápido...

Notas

  • O loop principal de decodemostra uma maneira "elegante" de percorrer uma string. A incrmacro é do MP simples: aumenta o valor de uma variável numérica em 1 e depois retorna esse valor. É exatamente isso que precisamos usar substringpara ler cada caractere da string.

informação relacionada