我在双列文档中使用带行号的列表。当列表位于右列时,数字离左侧的文本太近了。
我尝试使用xleftmargin
,但该选项也会将标题移动到右侧。
我怎样才能将代码和行号向右移动,以便它们不再位于边距中?
平均能量 (ieeetran.cls):
\documentclass[english,conference]{IEEEtran}
\usepackage{lmodern}
\usepackage{listings}
\lstset{captionpos=b}
\lstset{basicstyle=\small\ttfamily}
\lstset{showstringspaces=false, columns=flexible, keepspaces=true}
\lstset{tabsize=2, gobble=2}
\lstset{numbers=left, numberstyle=\tiny, numbersep=5pt, numberfirstline=true, firstnumber=1, stepnumber=5}
\usepackage{blindtext}
\begin{document}
\title{The Title}
\author{author}
\maketitle
\begin{abstract}
\blindtext
\end{abstract}
\blindtext[4]
\begin{figure}
\centering
mah figure
\caption{This is a very long caption, it is so long that it spans two lines.}
\label{myfig}
\end{figure}
\begin{lstlisting}[float,caption={This is a very long caption, it is so long that it spans two lines.},label=mylisting]
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
\end{lstlisting}
\end{document}
答案1
若要改变数字而不改变标题,则需要对listings
包装进行更深入的研究。
\lst@PlaceNumber
我们定义了一个以数字为参数的命令,而\lst@FormatNumber
不是不带参数的命令。这样,我们就可以打印任何内容,但占用相同的空间。我们为不在边距中的数字numbers
调用的选项定义了一个新值LEFT
;大多数代码都是原始代码的副本。
\lst@Key{numbers}{none}{%
\def\lst@FormatNumber##1{\relax}% <<<<<<<<<<<<<<<<<<
\lstKV@SwitchCases{#1}%
{none&\\%
left&\def\lst@FormatNumber##1{\llap{\normalfont % <<<<<<<<<<<<<
\lst@numberstyle{##1}\kern\lst@numbersep}}\\%
right&\def\lst@FormatNumber##1{\rlap{\normalfont % <<<<<<<<<<<<<
\kern\linewidth \kern\lst@numbersep
\lst@numberstyle{##1}}}\\%
LEFT&\def\lst@FormatNumber##1{\makebox[\lst@LEFTmargin][r]{\normalfont % <<<<<<<<<<<<<<<<<<<<<<<<<<
\lst@numberstyle{##1}\kern\lst@numbersep}}% <<<<<<<<<<
}{\PackageError{Listings}{Numbers #1 unknown}\@ehc}}
此外,我们必须通过 else 分支扩展数字的打印,以便在未编号的行中打印“空”数字。
\gdef\lst@SkipOrPrintLabel{%
\ifnum\lst@skipnumbers=\z@
\global\advance\lst@skipnumbers-\lst@stepnumber\relax
\lst@FormatNumber{\thelstnumber}% <<<<<<<<<<<<<<<<<
\lst@numberfirstlinefalse
\else
\lst@ifnumberfirstline
\lst@FormatNumber{\thelstnumber}% <<<<<<<<<<<<<<<<<
\lst@numberfirstlinefalse
\else % <<<<<<<<<<<<<<<<<
\lst@FormatNumber{}% <<<<<<<<<<<<<<<<<
\fi
\fi
\global\advance\lst@skipnumbers\@ne
}
最后,为了控制为数字保留的宽度,我们引入了一个LEFTmargin
具有默认值的新键2em
。
\lst@Key{LEFTmargin}{2em}{\def\lst@LEFTmargin{#1}}
如果这些定义包含在序言中而不是在由 加载的文件中\usepackage
,则必须用\makeatletter
和括起来\makeatother
。
这是原始帖子中的示例代码。
\documentclass[english,conference]{IEEEtran}
\usepackage{lmodern}
\usepackage{listings}
\lstset{captionpos=b}
\lstset{basicstyle=\small\ttfamily}
\lstset{showstringspaces=false, columns=flexible, keepspaces=true}
\lstset{tabsize=2, gobble=2}
\lstset{numbers=left, numberstyle=\tiny, numbersep=5pt,
numberfirstline=true, firstnumber=1, stepnumber=5}
\usepackage{blindtext}
\makeatletter
\lst@Key{numbers}{none}{%
\def\lst@FormatNumber##1{\relax}%
\lstKV@SwitchCases{#1}%
{none&\\%
left&\def\lst@FormatNumber##1{\llap{\normalfont
\lst@numberstyle{##1}\kern\lst@numbersep}}\\%
right&\def\lst@FormatNumber##1{\rlap{\normalfont
\kern\linewidth \kern\lst@numbersep
\lst@numberstyle{##1}}}\\%
LEFT&\def\lst@FormatNumber##1{\makebox[\lst@LEFTmargin][r]{\normalfont
\lst@numberstyle{##1}\kern\lst@numbersep}}%
}{\PackageError{Listings}{Numbers #1 unknown}\@ehc}}
\gdef\lst@SkipOrPrintLabel{%
\ifnum\lst@skipnumbers=\z@
\global\advance\lst@skipnumbers-\lst@stepnumber\relax
\lst@FormatNumber{\thelstnumber}%
\lst@numberfirstlinefalse
\else
\lst@ifnumberfirstline
\lst@FormatNumber{\thelstnumber}%
\lst@numberfirstlinefalse
\else
\lst@FormatNumber{}%
\fi
\fi
\global\advance\lst@skipnumbers\@ne
}
\lst@Key{LEFTmargin}{2em}{\def\lst@LEFTmargin{#1}}
\makeatother
\begin{document}
\title{The Title}
\author{author}
\maketitle
\begin{abstract}
\blindtext
\end{abstract}
\blindtext[4]
\begin{figure}
\centering
mah figure
\caption{This is a very long caption, it is so long that it spans two lines.}
\label{myfig}
\end{figure}
\begin{lstlisting}[numbers=LEFT,LEFTmargin=1.2em,numbersep=2pt,float,caption={This is a very long caption, it is so long that it spans two lines.},label=mylisting]
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
\end{lstlisting}
\end{document}
答案2
我认为将代码向右移动的唯一方法是使用xleftmargin
。
\lstset{xleftmargin=2em} % or some other value
如果您希望标题保持不变,我建议不要使用浮动参数,而是使用单独的浮动环境。
\documentclass[english,conference]{IEEEtran}
\usepackage{lmodern}
\usepackage{listings}
\usepackage{float}
\newfloat{listing}{tbp}{lol}
\floatname{listing}{Listing}
\lstset{basicstyle=\small\ttfamily}
\lstset{showstringspaces=false, columns=flexible, keepspaces=true}
\lstset{tabsize=2, gobble=2}
\lstset{numbers=left, numberstyle=\tiny, numbersep=5pt, numberfirstline=true, firstnumber=1, stepnumber=5}
\lstset{xleftmargin=2em}
\usepackage{blindtext}
\begin{document}
\title{The Title}
\author{author}
\maketitle
\begin{abstract}
\blindtext
\end{abstract}
\blindtext[4]
\begin{figure}
\centering
mah figure
\caption{This is a very long caption, it is so long that it spans two lines.}
\label{myfig}
\end{figure}
\begin{listing}
\begin{lstlisting}
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
\end{lstlisting}
\caption{This is a very long caption, it is so long that it spans two lines.}
\label{mylisting}
\end{listing}
\blindtext
\end{document}
答案3
使用xleftmargin=1em
或类似的东西,并将columnwidth
列表减少相同的数量。
\documentclass[english,conference]{IEEEtran}
\usepackage{lmodern}
\usepackage{listings}
\lstset{captionpos=b}
\lstset{basicstyle=\small\ttfamily}
\lstset{showstringspaces=false, columns=flexible, keepspaces=true}
\lstset{tabsize=2, gobble=2}
\lstset{numbers=left, numberstyle=\tiny, numbersep=5pt,
numberfirstline=true, firstnumber=1, stepnumber=5}
\usepackage{blindtext}
\begin{document}
\title{The Title}
\author{author}
\maketitle
\begin{abstract}
\blindtext
\end{abstract}
\Blindtext
{\advance\columnwidth-1em%
\begin{lstlisting}[xleftmargin=1em,float,caption={This is a very long caption, it is so long that it spans two lines.},label=mylisting]
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
teh c0dez
\end{lstlisting}}
\end{document}