有或没有框架时列表对齐行为很奇怪

有或没有框架时列表对齐行为很奇怪

aboveskip考虑以下代码,它对列表进行对齐实验。我们对有和belowskip没有框架的行为感兴趣。

% ---------------------------------------------------------------------------- %
% File
\begin{filecontents*}{\jobname.cpp}
int main(int argc, char* argv[])
{
    return 0;
}
\end{filecontents*}
% ---------------------------------------------------------------------------- %
% Preamble
\documentclass[letterpaper, 12pt, onecolumn]{article}
% ---------------------------------------------------------------------------- %
% Packages
\usepackage{listings}
\usepackage{xcolor}
% ---------------------------------------------------------------------------- %
% Listings options
\lstset{
    language = C++,
    framesep = 0pt,
    rulesep = 0pt,
    aboveskip = 0pt,
    belowskip = 0pt,
    backgroundcolor = \color[RGB]{200, 200, 200},
}
% ---------------------------------------------------------------------------- %
% Commands
\newcommand{\alphabet}{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz}
\newcommand{\makelisting}[1]{
  \newpage\noindent\alphabet
  \lstinputlisting[frame = lines, basicstyle = \fontfamily{cmtt}\selectfont#1]{\jobname.cpp}
  \alphabet
  \lstinputlisting[basicstyle = \fontfamily{cmtt}\selectfont#1]{\jobname.cpp}
  \alphabet
}
% ---------------------------------------------------------------------------- %
% Document
\begin{document}
\makelisting{\tiny}
\makelisting{\scriptsize}
\makelisting{\footnotesize}
\makelisting{\small}
\makelisting{\normalsize}
\makelisting{\large}
\makelisting{\Large}
\makelisting{\LARGE}
\makelisting{\huge}
\makelisting{\Huge}
\end{document}
% ---------------------------------------------------------------------------- %

它产生的一些结果:


尺寸小巧 微小的


巨大的规模 在此处输入图片描述


有了框架,列表顶部总是与上方的文本锚定在相同的顶部位置(底部文本也是如此)。但是,当没有设置框架时,距离会随着列表中文本的大小而变化,这很烦人。

当没有设置框架时,如何始终以相同的方式锚定列表相对于上方和下方的文本,而不管列表中的字体大小?

答案1

包中定义水平规则的框架排版的位置listings是在宏的定义中\lst@frameH。我试图理解该代码,但它是嵌套装箱和尺寸调整的疯狂混合。我最好的猜测是,添加规则后,\vskip列表和周围文本之间的间距是固定的,而没有任何规则时,TeX 的标准行间间距规则处于活动状态,这些规则会根据当前活动的字体大小/基线距离添加间距。

一个可能的解决方法是始终添加框架但另外设置framerule = 0pt,这实际上不会添加可见框架但保持间距一致:

\newcommand{\makelisting}[1]{
  \newpage\noindent\alphabet
  \lstinputlisting[frame = lines, basicstyle = \fontfamily{cmtt}\selectfont#1]{\jobname.cpp}
  \alphabet
  \lstinputlisting[frame = lines, framerule = 0pt, basicstyle = \fontfamily{cmtt}\selectfont#1]{\jobname.cpp}
  \alphabet
}

微小的输出: 在此处输入图片描述

巨大的输出: 在此处输入图片描述

相关内容