![有或没有框架时列表对齐行为很奇怪](https://linux22.com/image/394430/%E6%9C%89%E6%88%96%E6%B2%A1%E6%9C%89%E6%A1%86%E6%9E%B6%E6%97%B6%E5%88%97%E8%A1%A8%E5%AF%B9%E9%BD%90%E8%A1%8C%E4%B8%BA%E5%BE%88%E5%A5%87%E6%80%AA.png)
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
}