Estoy usando listings
para componer algo de C dentro de un figure
entorno al lado de un diagrama, y tengo los números a la izquierda. Mi problema es que en two-column
el modo los números de línea aparecen en lo que debería ser el margen, fuera del área de texto (es decir, los números no están justificados en el lado izquierdo de la columna, sino ligeramente a la izquierda de la justificación). El código que estoy usando es:
\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*}
¿Hay alguna manera de mantener los números de línea lstlisting
dentro del área de texto?
Respuesta1
Ellistings
El código para escribir los números de línea se almacena en \lst@PlaceNumber
. Debajo numbers=left
se define como:
\def\lst@PlaceNumber{\llap{\normalfont
\lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}%
que imprime el número como l
resultado lap
, lo que provoca los "problemas" que experimenta. Podrías simplemente empujar todolstlisting
todoal menosla cantidad anterior (digamos, 1em+\lst@numbersep
) para permitir que la superposición izquierda aún esté dentro del límite del bloque 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}
he añadidoshowframe
para resaltar el límite del bloque de texto y la [demo]
opción degraphicx
para ejecutar el MWE. No son necesarios en su documento final.
Alternativamente, puede configurar los números que se mostrarán a la izquierdaglobalmente(usando \lstset{numbers=left}
) y luego redefinir \lst@PlaceNumber
en consecuencia:
\makeatletter%
\def\lst@PlaceNumber{\makebox[\dimexpr 1em+\lst@numbersep][l]{\normalfont
\lst@numberstyle{\thelstnumber}}}%
\makeatother%
La configuración global es necesaria para que la redefinición dure más allá de \begin{lstlisting}
.
Respuesta2
Supongo que una solución sencilla podría ser utilizar la xleftmargin=...
configuración en el entorno de listados. Eche un vistazo a la documentación de los listados.