准备一本书,我使用JetBrains Mono(Github仓库) (JBM) 的代码我注意到,在所有列表中,* 字符渲染得太深(在基线上)并且很大。此外,*** 连字符显示为三个(下落的)* 字形。
此时,JBM 被宣布为一个新的家族:
\newfontfamily\JBMmdfamily{JetBrains Mono}[
UprightFont = *-Regular,
ItalicFont = *-Italic,
BoldFont = *-Bold,
BoldItalicFont = *-BoldItalic
]
经过一番尝试,我发现在键入{*}{*}1 {***}{{***}}3
中添加条目似乎有效。所以我自己交换了这些字符,这很有趣,但它确实有效。有点。仔细观察后,我注意到在输出空间中literate
\lstset{}
后这些字符消失了。添加 keepspaces 设置可以解决这个问题,因此:
\lstset{
keepspaces = true,
% showspaces = false,
literate = {*}{*}1 {***}{{***}}3
}
(showspaces = true
a 让其他有趣的事情发生但这超出了这里的范围。)
后来我注意到只需使用
\setmonofont{JetBrains Mono}[…]
代替
\newfontfamily\JBMmdfamily{JetBrains Mono}[…]
用同样的身体解决全部这些问题,不需要其他 \foo。我只是不明白它是如何工作的。有人愿意解释一下吗?
我现在的新问题是,我需要 \texttt
(等等)切换到文本打字机类型。
以下是 MWE 的一种:
%!TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec,listings}
\setmonofont{JetBrains Mono}[
UprightFont = *-Regular,
ItalicFont = *-Italic,
BoldFont = *-Bold,
BoldItalicFont = *-BoldItalic,
]
\newfontfamily\JBMmdfamily{JetBrains Mono}[
UprightFont = *-Regular,
ItalicFont = *-Italic,
BoldFont = *-Bold,
BoldItalicFont = *-BoldItalic,
]
\parskip=3mm
\parindent=0pt
\begin{document}
\subsection*{Both bindings seem to function:}
ttfamily: {\ttfamily x*y * z + a *** b }
JBMmdfamily: {\JBMmdfamily x*y * z + a *** b }
\subsection*{listings needs either \textbackslash{}ttfamily:}
lstlisting/ttfamily: \lstinline[basicstyle = \ttfamily]! x*y * z + a *** b !
lstlisting/JBMmdfamily: \lstinline[basicstyle = \JBMmdfamily]! x*y * z + a *** b !
\begin{lstlisting}[basicstyle = \ttfamily]
\ttfamily: x*y * z + a *** b
\end{lstlisting}
\begin{lstlisting}[basicstyle = \JBMmdfamily]
\JBMmdfamily: x*y * z + a *** b
\end{lstlisting}
\subsection*{… or keepspace \& literate:}
\lstset{
keepspaces = true,
% showspaces = true,
literate = {*}{*}1 {***}{{***}}3
}
lstlisting/ttfamily: \lstinline[basicstyle = \ttfamily]! x*y * z + a *** b !
lstlisting/JBMmdfamily: \lstinline[basicstyle = \JBMmdfamily]! x*y * z + a *** b !
\begin{lstlisting}[basicstyle = \ttfamily]
\ttfamily: x*y * z + a *** b
\end{lstlisting}
\begin{lstlisting}[basicstyle = \JBMmdfamily]
\JBMmdfamily: x*y * z + a *** b
\end{lstlisting}
\end{document}
有什么想法吗?感谢大家的提醒和指点……
刚刚更正了源代码并添加了我的结果图片。有一些错误,抱歉。
答案1
当包找到时,它listings
会使用;如果字体在 U+2217 处有字符,它会使用它,瞧,JetBrains Mono 字体中该位置的字符是一个降低的大星号。除非该系列是。\textasteriskcentered
*
\ttdefault
在包中我们发现
\lst@ProcessOther {"2A}{\lst@ttfamily*\textasteriskcentered}
这正是我上面所描述的。
然而,事实证明,如果将定义改为使用\lst@ttfamily**
,则连字仅在和中起作用\lstinline
,而不是在成熟的lstlisting
环境中起作用(字符以不同的方式处理)。因此literate
无论如何都需要。
注意:字体选择略有不同,因为我的系统中没有可用的字体,所以我需要通过文件名来调用它们。
\documentclass{article}
\usepackage{fontspec,listings}
\setmonofont{JetBrainsMono}[
Extension = .ttf,
UprightFont = *-Regular,
ItalicFont = *-Italic,
BoldFont = *-Bold,
BoldItalicFont = *-Bold-Italic,
]
\newfontfamily\JBMmdfamily{JetBrainsMono}[
Extension = .ttf,
UprightFont = *-Regular,
ItalicFont = *-Italic,
BoldFont = *-Bold,
BoldItalicFont = *-Bold-Italic,
]
\makeatletter
\lst@CCPutMacro\lst@ProcessOther{"2A}{\lst@ttfamily**}\@empty\z@\@empty
\makeatother
\lstset{
keepspaces = true,
% showspaces = true,
% literate = {***}{{***}}3,
}
\begin{document}
The wrong character:{\ttfamily x\textasteriskcentered y}
\bigskip
ttfamily: {\ttfamily x*y * z + a *** b }
JBMmdfamily: {\JBMmdfamily x*y * z + a *** b }
lstlisting/ttfamily: \lstinline[basicstyle = \ttfamily]! x*y * z + a *** b !
lstlisting/JBMmdfamily: \lstinline[basicstyle = \JBMmdfamily]! x*y * z + a *** b !
\begin{lstlisting}[basicstyle = \ttfamily]
\ttfamily: x*y * z + a *** b
\end{lstlisting}
\begin{lstlisting}[basicstyle = \JBMmdfamily]
\JBMmdfamily: x*y * z + a *** b
\end{lstlisting}
\end{document}
取消注释该literate
行会产生