当结合列表和 JetBrains Mono * 字形时会下降到基线(并且太大)

当结合列表和 JetBrains Mono * 字形时会下降到基线(并且太大)

准备一本书,我使用JetBrains MonoGithub仓库) (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 = truea 让其他有趣的事情发生但这超出了这里的范围。)

后来我注意到只需使用

\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行会产生

在此处输入图片描述

相关内容