如何更改 metauml 的字体?

如何更改 metauml 的字体?

我使用该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.mpMetaUML 使用非常低级的文本管理。使用的字体在包含以下内容的文件中定义:

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节省您每次输入相同内容的时间。

相关内容