我正在使用在图表旁边的环境listings
中排版一些 C figure
,并且左侧有数字。我的问题是在two-column
模式下,行号出现在应该是边距的位置,在文本区域之外(即,数字没有与列的左侧对齐,而是略微偏向对齐的左侧)。我使用的代码是:
\begin{figure*}
\begin{minipage}{.45\textwidth}
\begin{lstlisting}[numbers=left]
i = 0;
j = 1;
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}{.45\textwidth}
\includegraphics{figure}
\end{minipage}
\caption{My caption}
\label{fig:blah}
\end{figure*}
有没有办法保留lstlisting
文本区域内的行号?
答案1
这listings
写入行号的代码存储在 中\lst@PlaceNumber
。numbers=left
其下定义为:
\def\lst@PlaceNumber{\llap{\normalfont
\lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}%
这会将数字打印为l
eft over lap
,从而导致您遇到的“问题”。您可以将整个lstlisting
over推至少上述数量(例如1em+\lst@numbersep
)允许左重叠仍然在文本块边界内:
\documentclass[twocolumn]{article}
\usepackage[demo]{graphicx}% http://ctan.org/pkg/graphicx
\usepackage{showframe}% http://ctan.org/pkg/showframe
\usepackage{listings}% http://ctan.org/pkg/listings
\begin{document}
\begin{figure*}
\makeatletter%
\hspace*{\dimexpr 1em+\lst@numbersep}%
\makeatother%
\begin{minipage}{.4\textwidth}
\begin{lstlisting}[numbers=left]
i = 0;
j = 1;
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}{.4\textwidth}
\includegraphics{figure}
\end{minipage}
\caption{My caption}
\label{fig:blah}
\end{figure*}
\end{document}
我已经添加showframe
突出显示文本块边界,以及[demo]
选项graphicx
以便运行 MWE。最终文档中不需要它们。
或者,你可以设置左侧显示的数字全球(使用\lstset{numbers=left}
),然后\lst@PlaceNumber
相应地重新定义:
\makeatletter%
\def\lst@PlaceNumber{\makebox[\dimexpr 1em+\lst@numbersep][l]{\normalfont
\lst@numberstyle{\thelstnumber}}}%
\makeatother%
需要全局设置才能使重新定义持续到之后\begin{lstlisting}
。
答案2
我猜一个简单的解决方案可能是使用xleftmargin=...
listings 环境中的设置。请查看 listings 文档。