我正在我的 beamer 文档中包含一些代码。我想删除所有边距,以便可以包含尽可能多的代码。这是我正在尝试的代码:
\documentclass[]{beamer}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage{caption}
\usepackage{color}
\definecolor{comentaryGreen}{rgb}{0,0.6,0}
\lstset{
basicstyle=\tiny ,
numbers=none,
tabsize=1,
extendedchars=true,
breaklines=true,
language=Java,
keywordstyle=\color{blue},
commentstyle=\color{comentaryGreen},
rulecolor=\color{black},
showspaces=false,
showtabs=false,
showstringspaces=false,
xleftmargin=0pt,
framexleftmargin=0pt,
framexrightmargin=0pt,
framexbottommargin=0pt,
}
\lstloadlanguages{
Java
}
\usetheme{Antibes}
\usecolortheme{dolphin}
\begin{frame}
\lstinputlisting[linerange={529-550}]{source/cGaussianBlur.java}
\end{frame}
\end{document}
(我使用的代码可以在http://imagej.nih.gov/ij/source/ij/plugin/filter/GaussianBlur.java)
结果如下:
我怎样才能消除这些边距?
答案1
正如 dcmst 在他(她?)的评论例如,你可以关注Paul Gaborit 的方法局部增加文本宽度:
\begin{frame}
\begin{columns}
\column{\dimexpr\paperwidth-10pt}
\lstinputlisting{cGaussianBlur.java}
\end{columns}
\end{frame}
然而,左边仍然会有一些空白:
为什么?因为你的源文件缩进,并将listings
在输出中包含该缩进;它将/可以不是去掉它。
实际上,确实listings
提供了一个gobble
键,用于删除列表每行开头的指定数量的空格。此外,Martin Scharrer 的lstautogobble
软件包对此进行了改进,提供了一个名为的键autogobble
,它会自动测量需要删除的空格数,这样您就不必自己指定该数字,如在MaxNoe 的回答。
但是,这两种方法仅与“嵌入式”列表兼容,即存在于文件内.tex
、lstlisting
环境内(或类似环境)的列表。它们确实不是适用于外部列表,即位于外部文件中并通过\lstinpulisting
宏插入的列表。
为了解决这个问题,我写道,一会儿回来,一个小包叫lstautodedent
。它定义了一个名为 的键autodedent
,其工作原理与lstautogobble
的autogobble
键非常相似。主要区别在于它既适用于嵌入式列表,也适用于外部列表。只有一个警告:它不能很好地与制表符配合使用。
我还没有在 CTAN 上提交这个包,但你可以.sty
从我的GitHub 帐户。
要使用它,请lstautodedent
在您的前言中加载,autodedent
像设置其他布尔键一样设置键listings
,并且(假设您的源代码以空格字符而不是制表符缩进)您不会在左侧得到任何空格:
完整代码
\documentclass[]{beamer}
\usepackage{lstautodedent}
% this is only to write a fraction of your source file to
% an external file and make my answer self-contained
\usepackage{filecontents}
\begin{filecontents*}{cGaussianBlur.java}
public float[][] makeGaussianKernel(final double sigma, final double accuracy, int maxRadius) {
int kRadius = (int)Math.ceil(sigma*Math.sqrt(-2*Math.log(accuracy)))+1;
if (maxRadius < 50) maxRadius = 50; // too small maxRadius would result in inaccurate sum.
if (kRadius > maxRadius) kRadius = maxRadius;
float[][] kernel = new float[2][kRadius];
for (int i=0; i<kRadius; i++) // Gaussian function
kernel[0][i] = (float)(Math.exp(-0.5*i*i/sigma/sigma));
if (kRadius < maxRadius && kRadius > 3) { // edge correction
double sqrtSlope = Double.MAX_VALUE;
int r = kRadius;
while (r > kRadius/2) {
r--;
double a = Math.sqrt(kernel[0][r])/(kRadius-r);
if (a < sqrtSlope)
sqrtSlope = a;
else
break;
}
for (int r1 = r+2; r1 < kRadius; r1++)
kernel[0][r1] = (float)((kRadius-r1)*(kRadius-r1)*sqrtSlope*sqrtSlope);
}
\end{filecontents*}
\usepackage{listings}
\usepackage{color}
\definecolor{comentaryGreen}{rgb}{0,0.6,0}
\lstset{
basicstyle=\tiny ,
numbers=none,
tabsize=1,
extendedchars=true,
breaklines=true,
language=Java,
keywordstyle=\color{blue},
commentstyle=\color{comentaryGreen},
rulecolor=\color{black},
showspaces=false,
showtabs=false,
showstringspaces=false,
xleftmargin=0pt,
framexleftmargin=0pt,
framexrightmargin=0pt,
framexbottommargin=0pt,
autodedent,
}
\lstloadlanguages{
Java
}
\usetheme{Antibes}
\usecolortheme{dolphin}
\begin{document}
\begin{frame}
\begin{columns}
\column{\dimexpr\paperwidth-10pt}
\lstinputlisting{cGaussianBlur.java}
\end{columns}
\end{frame}
\end{document}
答案2
您的“问题”是您的代码的正确缩进。lstlisting
是一个逐字环境,因此它会排版您的缩进的制表符。
该问题的解决方案由 -package 提供lstautogobble
:
\usepackage{listings}
\usepackage{lstautogobble}
\lstset{autogobble,
...,
...,
}
它会减去适当数量的制表符,因此不会考虑您的 LaTeX 代码缩进。