Números de linha e figura das listagens

Números de linha e figura das listagens

Estou usando listingspara compor C dentro de um figureambiente próximo a um diagrama e tenho os números à esquerda. Meu problema está no two-columnmodo em que os números das linhas aparecem no que deveria ser a margem, fora da área de texto (ou seja, os números não são justificados com o lado esquerdo da coluna, mas sim ligeiramente à esquerda da justificação). O código que estou usando é:

\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*}

Existe uma maneira de manter os números das linhas lstlistingdentro da área de texto?

Responder1

Olistingso código para escrever os números das linhas é armazenado em \lst@PlaceNumber. Abaixo numbers=leftdele é definido como:

\def\lst@PlaceNumber{\llap{\normalfont
  \lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}%

que imprime o número como left over lap, causando os "problemas" que você enfrenta. Você poderia simplesmente lstlistingempurrar tudopelo menoso valor acima (digamos, 1em+\lst@numbersep) para permitir que a sobreposição esquerda ainda esteja dentro do limite do bloco de texto:

insira a descrição da imagem aqui

\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}

eu já adicioneishowframepara destacar o limite do bloco de texto e a [demo]opção degraphicxpara executar o MWE. Eles não são necessários em seu documento final.

Alternativamente, você pode definir os números a serem mostrados à esquerdaglobalmente(usando \lstset{numbers=left}) e então redefina \lst@PlaceNumberadequadamente:

\makeatletter%
\def\lst@PlaceNumber{\makebox[\dimexpr 1em+\lst@numbersep][l]{\normalfont
  \lst@numberstyle{\thelstnumber}}}%
\makeatother%

A configuração global é necessária para que a redefinição dure além \begin{lstlisting}.

Responder2

Acho que uma solução simples seria usar a xleftmargin=...configuração no ambiente de listagens. Dê uma olhada na documentação das listagens.

informação relacionada