我正在尝试使用包含大量非标准 Unicode 字符的 minted 代码列表排版文档。我想使用 Ubuntu Mono 作为等宽字体。以下内容抑制 Unicode 字符:
\documentclass{book}
\usepackage{minted}
\usepackage{fontspec}
\setmonofont{Ubuntu Mono}
\begin{document}
\begin{minted}{java}
Π ⦃a : D₀⦄
\end{minted}
\end{document}
是我做错了什么还是字体没有我想要的那么完整?
答案1
您可以从包含这些字符的字体中取出缺失的字符:
\documentclass{book}
\usepackage{fontspec}
\usepackage{minted}
\usepackage{newunicodechar}
\setmonofont{Ubuntu Mono}
\newfontfamily{\freeserif}{FreeSerif}
\newunicodechar{⦃}{\makebox[.5em]{\freeserif⦃}}
\newunicodechar{⦄}{\makebox[.5em]{\freeserif⦄}}
\begin{document}
\begin{minted}{java}
Π ⦃a : D₀⦄
\end{minted}
\end{document}
红色框是一个pygmentize
问题。
这些角色也采用了 DejaVu Sans 字体;它们的外观如下(还提供了红框的解决方法):
\documentclass{book}
\usepackage{fontspec}
\usepackage{minted}
\usepackage{newunicodechar}
\AtBeginEnvironment{minted}{%
\let\MINTEDPYGdefault\PYGdefault
\renewcommand\PYGdefault[2]{%
\ifstrequal{#1}{err}%
{\MINTEDPYGdefault{n}{#2}}%
{\MINTEDPYGdefault{#1}{#2}}%
}%
}
\setmonofont{Ubuntu Mono}
\newfontfamily{\freeserif}{DejaVu Sans}
\newunicodechar{⦃}{\makebox[.5em]{\freeserif⦃}}
\newunicodechar{⦄}{\makebox[.5em]{\freeserif⦄}}
\begin{document}
\begin{minted}{java}
Π ⦃a : D₀⦄
XXXXXXXXXX
\end{minted}
\end{document}
答案2
很容易就能看出您的浏览器正在使用什么字体。
如果我在上面的代码中“检查元素”(在 FF/Windows 中查看)它会显示 Segoe UI 符号
所以
\documentclass{book}
\usepackage{minted}
\usepackage{fontspec}
\setmonofont{Segoe UI Symbol}
\begin{document}
\texttt{Π ⦃a : D₀⦄}
\begin{minted}{java}
Π ⦃a : D₀⦄
\end{minted}
\end{document}
生产
显示字体工作正常,红色框是因为 minted(或者更确切地说 pygmentize)并非不合理地认为语法是 Java 错误,但这是语言设置中的样式选择,而不是排版错误。