我有一个通过 mpost 编译的 metapost 文件。此文件包含特殊字符,当我将文件包含在 latex 中时无法显示这些字符。我需要在 latex 中输入 inputenc utf8。
有人知道这个问题的答案吗?
答案1
你没有过多谈论你的环境,所以我只是猜测。
以下是在Metapost中设置unicode字符的三种方法。
传统乳胶
要在标签字符串中使用 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>
在我的系统上,这会产生:
使用此设置,您应该能够使用utf8
编码所识别的任何 Unicode 字符。您可能会发现,在将生成的文件包含到文件中之前,将其转换.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>
它会产生:
如果您还没有准备好将其lualatex
作为您的主要 LaTeX 引擎,那么您可以按照我在这里所做的那样,使用该类standalone
为您的 MP 图形生成一个独立的 PDF 文件。
老式朴素的 Metapost
(真不要這樣做……)
如果您想坚持使用老式的普通 Metapost,而根本不使用 LaTeX,那么仍然可以使用内置运算符支持至少一个 UTF8 子集infont
。
考虑以下 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
这可以使用没有任何选项的普通旧版本进行编译,它会产生:
但请注意,这个简单、快速且粗糙的decode
例程仅支持非常有限的 UTF8 子集,并且它正在将其所做的转换为 ISO8859-1,或者更确切地说,转换为字体8r
使用的编码提供的与 ISO8859-1 非常接近的编码phvr8r
。另一方面,它很快……
笔记
- 的主循环
decode
展示了一种“巧妙”的遍历字符串的方法。incr
宏来自普通的 MP:它将数字变量的值增加 1,然后返回该值。这正是我们substring
读取字符串中每个字符所需要的。