Listados de números de línea y figura.

Listados de números de línea y figura.

Estoy usando listingspara componer algo de C dentro de un figureentorno al lado de un diagrama, y ​​tengo los números a la izquierda. Mi problema es que en two-columnel 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 lstlistingdentro del área de texto?

Respuesta1

EllistingsEl código para escribir los números de línea se almacena en \lst@PlaceNumber. Debajo numbers=leftse define como:

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

que imprime el número como lresultado 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:

ingrese la descripción de la imagen aquí

\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ñadidoshowframepara resaltar el límite del bloque de texto y la [demo]opción degraphicxpara 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@PlaceNumberen 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.

información relacionada