我使用该emp
包是为了metauml
绘制 UML 模型。到目前为止一切顺利。
这是一个最小的例子:
\documentclass{scrartcl}
\usepackage{emp}
\ifx\pdftexversion\undefined
\usepackage[dvips]{graphicx}
\else
\usepackage[pdftex]{graphicx}
\DeclareGraphicsRule{*}{mps}{*}{}
\fi
\begin{document}
\begin{empfile}
\begin{empcmds}
input metauml;
\end{empcmds}
\begin{figure}
\centering
\begin{emp}[classdiag](20, 20)
Class.A("A")()();
Class.B("B")()();
B.e = A.w + (-20, 0);
drawObjects(A, B);
link(inheritance)(B.e -- A.w);
\end{emp}
\caption{A class diagram}
\end{figure}
\end{empfile}
\end{document}
图表中的文本似乎使用了 Time New Roman。
我怎样才能将字体更改为其他字体?
我已经尝试过类似的事情\empaddtoTeX{\usepackage[default]{lato}}
,但并没有改变任何事情。
答案1
metauml_defaults.mp
MetaUML 使用非常低级的文本管理。使用的字体在包含以下内容的文件中定义:
if known _metauml_defaults_mp:
expandafter endinput
fi;
_metauml_defaults_mp:=1;
% txbtt
if not known metauml_defaultFont:
string metauml_defaultFont;
metauml_defaultFont := "ptmr8r";
fi;
if not known metauml_defaultFontOblique:
string metauml_defaultFontOblique;
metauml_defaultFontOblique := "ptmro8r";
fi;
if not known metauml_defaultFontBold:
string metauml_defaultFontBold;
metauml_defaultFontBold := "ptmb8r";
fi;
if not known metauml_defaultFontBoldOblique:
string metauml_defaultFontBoldOblique;
metauml_defaultFontBoldOblique := "ptmbo8r";
fi;
您可以在系统中找到它,将其复制到当前目录中并修改字体名称。请注意,对编码的支持是不存在,所以对于重音字符,您就没那么幸运了。我认为,真正支持哪些字体取决于您使用的 Metapost 版本。
设置字体的另一种方法是写
\begin{empcmds}
_metauml_defaults_mp := 1 ; % avoid loading metauml_defaults.mp
string metauml_defaultFont;
metauml_defaultFont := "cmr10";
string metauml_defaultFontOblique;
metauml_defaultFontOblique := "cmti10";
string metauml_defaultFontBold;
metauml_defaultFontBold := "cmbx10";
string metauml_defaultFontBoldOblique;
metauml_defaultFontBoldOblique := "cmbxti10";
input metauml;
\end{empcmds}
我在这里使用了常用的 Computer Modern 字体。
使用 Lato 字体的完整版本将是:
\documentclass{scrartcl}
\usepackage{emp}
\usepackage{graphicx}
\usepackage{ifpdf}
\ifpdf
\DeclareGraphicsRule{*}{mps}{*}{}
\fi
\begin{document}
\begin{empfile}
\begin{empcmds}
_metauml_defaults_mp:=1;
string metauml_defaultFont;
metauml_defaultFont:="Lato-Reg-t1";
string metauml_defaultFontOblique;
metauml_defaultFontOblique := "Lato-RegIta-t1";
string metauml_defaultFontBold;
metauml_defaultFontBold := "Lato-Bol-t1";
string metauml_defaultFontBoldOblique;
metauml_defaultFontBoldOblique := "Lato-BolIta-t1";
input metauml;
\end{empcmds}
\begin{figure}
\centering
\begin{emp}[classdiag](20, 20)
Class.A("Abcde")()();
Class.B("Bmno")()();
B.e = A.w + (-20, 0);
drawObjects(A, B);
link(inheritance)(B.e -- A.w);
\end{emp}
\caption{A class diagram}
\end{figure}
\end{empfile}
\end{document}
(我改变了您声明 PDF 设置扩展的方式。)
最后需要说明的是,MetaUML 字体管理依赖于打印字符串,而不是 Metapost 和 TeX 之间的交互。因此字体的选择受到一定限制,并且具有重大局限性。
OT1 编码中的字体,例如cmr10
在空格的位置有一个“lslashslash”,因此带有空格的 MetaUML 标签(“ABC DEF”)将导致类似
ABC-DEF
T1 编码的字体在该位置有一个“可见空间”,上面的字符串将变成
ABC└┘DEF
(以符号为基线)。
因此,如果需要空格,选择仅限于 8r 编码的字体(这就是默认字体为 的原因ptmr8r
)。
答案2
经过 80 个月的尝试,这个问题现在变得更容易解决了luamplib
:
\documentclass{article}
\usepackage{luamplib, luatex85}
\usepackage{fontspec}
\usepackage{lipsum}
\setmainfont{Lato}
\mplibtextextlabel{enable}
\everymplib{input metauml; beginfig(0);}
\everyendmplib{endfig;}
\begin{document}
\section{UML diagrams}
\lipsum[1]
\begin{figure}
\[
\begin{mplibcode}
Class.A("Class A with spaces")()();
Class.B("B")()();
B.e = A.w + (-42, 0);
drawObjects(A, B);
link(inheritance)(B.e -- A.w);
\end{mplibcode}
\]
\caption{A Class diagram}
\end{figure}
\end{document}
笔记
使用
luamplib
意味着你必须使用lualatex
因此用来
fontspec
设置字体但您可以使用任何系统安装的字体
mplibtextextlabel{enable}
使 MetaUML / Metapost 将所有文本字符串放入其中,textext()
这意味着它们与文档的其余部分在相同的环境中排版everymplib
节省您每次输入相同内容的时间。