我有一個透過 mpost 編譯的 metapost 檔案。該文件包含特殊字符,當我將該文件包含在乳膠中時,這些特殊字符無法顯示。我需要在乳膠中輸入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
不帶任何選項,並產生:
但請注意,簡單、快速而骯髒的例程僅支援非常有限的 UTF8 子集,並且它將其所做的轉換為 ISO8859-1,或者更確切地說,轉換為所使用的編碼decode
提供的ISO8859 -1 的近似值8r
與phvr8r
字體。另一方面,速度很快...
筆記
- 主循環
decode
顯示了一種「靈活」的方式來單步執行字串。該incr
巨集來自普通 MP:它將數值變數的值加 1,然後傳回該值。這正是我們需要用來substring
讀取字串中每個字元的方法。