Estou usando listings
para compor C dentro de um figure
ambiente próximo a um diagrama e tenho os números à esquerda. Meu problema está no two-column
modo 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 lstlisting
dentro da área de texto?
Responder1
Olistings
o código para escrever os números das linhas é armazenado em \lst@PlaceNumber
. Abaixo numbers=left
dele é definido como:
\def\lst@PlaceNumber{\llap{\normalfont
\lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}%
que imprime o número como l
eft over lap
, causando os "problemas" que você enfrenta. Você poderia simplesmente lstlisting
empurrar tudopelo menoso valor acima (digamos, 1em+\lst@numbersep
) para permitir que a sobreposição esquerda ainda esteja dentro do limite do bloco de texto:
\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á adicioneishowframe
para destacar o limite do bloco de texto e a [demo]
opção degraphicx
para 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@PlaceNumber
adequadamente:
\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.