我习惯lstlistings
将代码包含在文档中。我希望我的代码被框起来,并且其框架可以调整为实际代码内容的大小。以下是我现在所拥有的:
\lstset{numbers=left, numberstyle=\small, numbersep=8pt, frame = single, language=Pascal, framexleftmargin=15pt}
\begin{lstlisting}
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{lstlisting}
框架绘制在页面的整个宽度上,而不是缩小到列表内容。右侧有很多无用的空白空间。
我可以手动设置列表的行宽或将其包装在手动调整大小的迷你页面中。但是,当使用许多列表时,这会导致大量的手动工作,我希望避免这种情况。
有什么方法可以使列表的框架大小或线宽自动适应列表的内容?
答案1
另一个选择是使用linewidth
选项来lstlisting
控制宽度:
\documentclass{article}
\usepackage{listings}
\lstset{
numbers=left,
numberstyle=\small,
numbersep=8pt,
frame = single,
language=Pascal,
framexleftmargin=15pt}
\begin{document}
\begin{lstlisting}
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{lstlisting}
\begin{lstlisting}[linewidth=5.4cm]
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{lstlisting}
\end{document}
答案2
彩色盒子package 为框架和彩色框提供了环境。其中一个库旨在与listings
package 交互,而其中一个捕获模式hbox
会自动调整框架以适应其内容。结合这两个元素,可以轻松创建具有调整宽度的框架列表。
当然,您还可以使用 提供的所有其他增强功能来装饰您的列表tcolorbox
。
更新:虽然 OP 没有提到,但是在使用时无法自动中断页面之间的长列表hbox
。
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{listings,skins}
\lstdefinestyle{mystyle}{
numbers=left,
numberstyle=\small,
numbersep=8pt,
language=Pascal
}
\newtcblisting{mylisting}[2][]{
arc=0pt, outer arc=0pt,
listing only,
listing style=mystyle,
title=#2,
#1
}
\begin{document}
\begin{mylisting}{}
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{mylisting}
\begin{mylisting}[hbox]{}
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{mylisting}
\begin{mylisting}[hbox,enhanced,drop shadow]{Pascal program}
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{mylisting}
\end{document}
答案3
您应该将整个放在lstlisting
限制水平宽度的环境中,例如minipage
:
\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\begin{document}
\lstset{numbers=left, numberstyle=\small, numbersep=8pt, frame = single, language=Pascal, framexleftmargin=15pt}
\begin{lstlisting}
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{lstlisting}
\noindent\begin{minipage}{.5\linewidth}
\begin{lstlisting}
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{lstlisting}
\end{minipage}
\end{document}
答案4
frame=
该包的关键字总是listings
根据当前线宽来排版框架。因此,我建议使用其他命令或环境来绘制框架。
一个基本的解决方案(无需其他软件包)是将列表呈现在 中\fbox
,但是,作为宏,它不接受逐字材料作为参数。因此,列表必须先在 lrbox 中排版。
或者,可以使用某些框架环境(在下面的示例中我使用adjustbox
,但这里实际上有几十种可能性),这样就不需要绕行 lrbox。
最后(下面未介绍)您可以定义自己的 PASCAL 环境\lstnewenvironment{PASCAL}{<begin code>}{<end code>}
(参见listings
文档),将任一方法与列表环境相结合以获得最大的舒适度。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{adjustbox} % For Option 2 only
\begin{document}
\lstset{numbers=left, numberstyle=\small, numbersep=8pt, language=Pascal}
% Option 1: Typeset in an LR-box and use \fbox{} to draw the frame
\newsavebox{\Lst}
\begin{lrbox}{\Lst}
\begin{lstlisting}
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{lstlisting}
\end{lrbox}
% draw frame an Listing. The \hskip enlarges the box to have numbers within the frame
\noindent\fbox{\hskip15pt\usebox{\Lst}}
% Option 2: Use some framing environment. There are lots of possibilities!
% I have just use adjustbox, which is a kind of swiss army knife for boxing
\begin{adjustbox}{padding=15pt 0pt 0pt 0pt, fbox}
\begin{lstlisting}
PROGRAM afficher_bonjour;
BEGIN WRITE('Bonjour');
END.
\end{lstlisting}
\end{adjustbox}
\end{document}