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 latex
para processar isso, você precisa compilá-lo com:
mpost -tex=latex <filename>
No meu sistema isso produz:
Usando esta configuração, você poderá usar quaisquer caracteres Unicode que a utf8
codificação conheça. Você pode achar mais conveniente converter o .eps
arquivo produzido em um .pdf
arquivo antes de incluí-lo em seu .tex
arquivo.
LuaLaTeX moderna
Minha preferência pessoal hoje é usar lualatex
para todos os trabalhos do Metapost com a luamplib
biblioteca. A vantagem é que você faz com que todo o fontspec
ambiente funcione para você e pode usar qualquer uma das fontes OTF adequadas que você instalou. Aqui usei Linux Libertine O
como 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:
Se você não está pronto para adotar o lualatex
LaTeX como seu mecanismo principal, então você pode fazer o que fiz aqui e usar a standalone
classe 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 infont
operador 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, mpost
sem opções e produz:
mas tome cuidado, pois a rotina simples e rápida decode
suporta 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 8r
codificação usada com a phvr8r
fonte. Por outro lado é rápido...
Notas
- O loop principal de
decode
mostra uma maneira "elegante" de percorrer uma string. Aincr
macro é do MP simples: aumenta o valor de uma variável numérica em 1 e depois retorna esse valor. É exatamente isso que precisamos usarsubstring
para ler cada caractere da string.