缩小列表包的等宽字体样式

缩小列表包的等宽字体样式

我正在写一篇论文,并整理了一份“漂亮”的清单。我正在考虑为代码视图设置一个小字体样式。我这里有:

\usepackage{listings}
\lstset{language=C,
numberstyle=\footnotesize,
basicstyle=\footnotesize,
numbers=left,
stepnumber=1,
frame=shadowbox,
breaklines=true}
%\usepackage[subsection]{placeins}
\usepackage{float}

但这是以典型的字距调整字体显示的,而我正在寻找较小的等宽字体,例如 10 点左右。

答案1

使用默认

basicstyle=\footnotesize\ttfamily,...

或更好的包microtype

\usepackage[T1]{fontenc}
\usepackage[scaled]{beramono}
\newcommand\Small{\fontsize{9}{9.2}\selectfont}
\newcommand*\LSTfont{\Small\ttfamily\SetTracking{encoding=*}{-60}\lsstyle}
...
\begin{lstlisting}[basicstyle=\LSTfont,...]
...

这会带来更好的结果。

答案2

\ttfamily您在 中缺少basicstyle。如果这不能提供您想要的大小,请尝试\scriptsize或 甚至\tiny代替\footnotesize。您不需要numberstyle再次为 增加相同的大小,因为basicstyle默认用于所有内容。

\documentclass{article}
\usepackage{listings}
\lstset{language=C,
numberstyle=\footnotesize,
basicstyle=\ttfamily\footnotesize,
numbers=left,
stepnumber=1,
frame=shadowbox,
breaklines=true}

\begin{document}
Normal text

\begin{lstlisting}
    int a, b, c;
    b = 2;
    c = b++;
    a = b + c;
\end{lstlisting}

Normal text
\end{document}

答案3

“kerned” 外观源自包的默认设置listings

默认设置basicstyle=\ttfamily

包默认listings使用columns=fixed。它提供了最佳的垂直对齐方式,您可以在源代码编辑器中看到等宽字体的代码。设置意味着,字符被放置在宽度为的框中0.6em

\documentclass{article}
% Quick alignment test: 
%   MMMM a
%   iiii a
\usepackage{listings}
\lstset{
  basicstyle  = \ttfamily,
  % basewidth = {.5em,0.5em},
  % columns   = flexible,
  % columns   = fullflexible,
}
% \usepackage[T1]{fontenc}
% \usepackage[variablett]{lmodern}
\begin{document}
  \lstinputlisting[
    language={[LaTeX]{TeX}},
  ]{\jobname.tex}
\end{document}

采用默认设置的结果

优化basewidth

固定列的宽度0.6em考虑到较宽的字符也应适合框而不与相邻字符重叠。但是等宽字体的所有字符已经有固定的宽度。字符的宽度通常为0.5em,其中字体设计者已经压缩了较宽的字形。因此,我们可以将 其basewidth从减少0.6em,0.45em0.5em,0.5em。第二个值用于columns=flexible。此模式不对齐所有字符,而是对齐单词。单词通常具有较窄和较宽的字符,因此平均值小于最宽字符的宽度。但这对等宽字体没有意义。小于字形宽度的值只会扰乱垂直对齐。

\documentclass{article}
% Quick alignment test:
%   MMMM a
%   iiii a
\usepackage{listings}
\lstset{
  basicstyle = \ttfamily,
  basewidth  = {.5em,0.5em},
  % columns  = flexible,
  % columns  = fullflexible,
}
% \usepackage[T1]{fontenc}
% \usepackage[variablett]{lmodern}
\begin{document}
  \lstinputlisting[
    language={[LaTeX]{TeX}},
  ]{\jobname.tex}
\end{document}

优化 <code>basewidth</code> 的结果

可变宽度打字机字体

如果垂直对齐不是太重要(如\lstset示例中的行),则可以使用可变宽度的打字机字体。拉丁现代字体(计算机现代字体的进一步发展)提供了这种字体,可以通过variablett包的选项启用lmodern。(也\fontfamily{lmvtt}\selectfont可以使用。)

因为在固定列中设置可变宽度字体看起来比使用等宽字体更丑陋,所以示例中使用了columns=flexible。此外,basewidth将缩减为0.4em(默认会0.45em留下太多间隙)。

\documentclass{article}
% Quick alignment test:
%   MMMM a
%   iiii a
\usepackage{listings}
\lstset{
  basicstyle = \ttfamily,
  basewidth  = {.5em,0.4em},
  columns    = flexible,
  % columns  = fullflexible,
}
\usepackage[T1]{fontenc}
\usepackage[variablett]{lmodern}
\begin{document}
  \lstinputlisting[
    language={[LaTeX]{TeX}},
  ]{\jobname.tex}
\end{document}

使用 lmvtt 和灵活列的结果

  • 灵活的列设置有一个缺点,即行内的垂直对齐可能会丢失。不过,行缩进可以正常工作。
  • 作为额外的优势,拉丁现代字体提供了粗体版本(也有等宽变体)。

具有完全灵活列的可变宽度打字机字体

现在来看设置示例columns=fullflexible

\documentclass{article}
% Quick alignment test:
%   MMMM a
%   iiii a
\usepackage{listings}
\lstset{
  basicstyle = \ttfamily,
  basewidth  = {.5em,0.4em},
  % columns  = flexible,
  columns    = fullflexible,
}
\usepackage[T1]{fontenc}
\usepackage[variablett]{lmodern}
\begin{document}
  \lstinputlisting[
    language={[LaTeX]{TeX}},
  ]{\jobname.tex}
\end{document}

具有完整灵活列的结果

概括

  • 我会使用拉丁现代字体而不是计算机现代字体,因为它们提供更多字体变体,包括粗体。

  • 如果源代码包含某种表格,并且垂直对齐很重要,则basewidth可以使用调整后的等宽字体:

    \lstset{
      basicstyle=\ttfamily,
      basewidth={0.5em,0.5em},
    }
    \usepackage[T1]{fontenc}
    \usepackage{lmodern}
    
  • 如果源代码仅要求缩进行作为垂直对齐,则可以使用可变宽度的打字机字体:

    \lstset{
      basicstyle=\ttfamily,
      % basewidth={0.5em,0.4em}, % for other columns settings
      columns=fullflexible,
    }
    \usepackage[T1]{fontenc}
    \usepackage[variablett]{lmodern}
    

    如果代码包含许多无法容纳在行的可用空间中的长行,这也会减少行的长度,这是一个优势。

相关内容