2009-12-27 10 views
23

Tengo un código de látex similar al siguiente:¿Cómo marcar la ruptura de líneas largas?

\usepackage{listings} 
\lstset{ 
    breaklines  = true, 
    numbers  = left, 
    stepnumber  = 5, 
} 
\begin{lstlisting} 
for (int i = 0, j = 0, k = 1; i <= 10, j < foo; i++, j *= factor, k--) { // a comment here 
    % something code here ... 
} 
\end{lstlisting} 

La larga línea con el bucle de forma automática se rompe en algún punto intermedio, porque el papel es demasiado estrecho. Eso es justo lo que quiero, de lo contrario la línea desaparecería al final del papel. Pero ahora mi pregunta es si hay una manera de marcar o indicar que esta línea se rompió. De lo contrario, parece que se creó una nueva línea.

Algo así es lo que yo quiero (con números de línea, observe la flecha):

10 for (int i = 0, j = 0, k = 1; i <= 10, j < foo; 
    ↳  i++, j *= factor, k--) { // a comment here 
11  % something code here ... 

Respuesta

12

Al parecer, esto se puede lograr con prebreak/postbreak opciones. Consulte la documentación del paquete listings, vinculada desde its CTAN page (está en la parte inferior de la página 33 y en la parte superior de la página 34 en el pdf).

Editar: un enlace directo a the Listings Package's manual. Además, creo que puedo reproducir el bit relevante aquí - así que aquí va:

prebreak=<tokens> (default {}) 
postbreak=<tokens> (default {}) 

<tokens> aparecen al final de la línea actual, respectivamente, al comienzo de la próxima (parte rota de la) de la línea.

No debe usar el espacio dinámico (en espacios particulares) ya que internamente usamos \\discretionary. Sin embargo, \\space se redefine para su uso dentro de <tokens>.

Edición 2: En cuanto a la colocación del marcador de salto de línea, algo cercano a la aparición del ejemplo proporcionado en la pregunta se puede lograr mediante el establecimiento de breakindent a 0pt, breakautoindent a false y la mano-padding el marcador con, por ejemplo, \\space.

Por ejemplo, el uso postbreak={\textbf{marker}\\space\\space\\space\\space} para un buen marcador negrita composición tipográfica, donde una nueva línea normalmente empezar, a continuación, cuatro espacios, y luego el resto del contenido de la línea quebrada. Estas opciones están documentadas justo después de prebreak/postbreak en el manual listings '. :-)

+0

Gracias, "postbreak" parece ser/casi/lo que he estado buscando, supongo que es la mejor manera. ¿Podría haber una forma de posicionar el token de "postbreak" al comienzo de la línea? Tal vez restablecer su posición? – watain

+0

Sí, puede manipular la sangría e incluir espacios duros en el marcador de salto de línea para empujar los contenidos reales de la línea discontinua hacia la derecha. He editado mi respuesta para incluir los detalles relevantes. Espero que funcione para ti. :-) –

+0

Muchas gracias Michał. Eso es solo querer lo que quería :) Debería haber leído todo el manual de Listings primero;) – watain

43

listados Configurar como sigue: Código fuente

\lstset{prebreak=\raisebox{0ex}[0ex][0ex] 
     {\ensuremath{\rhookswarrow}}} 
\lstset{postbreak=\raisebox{0ex}[0ex][0ex] 
     {\ensuremath{\rcurvearrowse\space}}} 
\lstset{breaklines=true, breakatwhitespace=true} 
\lstset{numbers=left, numberstyle=\scriptsize} 

ejemplo en el documento: resultado

\begin{lstlisting}[language=C++, numbers=left, linewidth=5.1cm] 
    if (line.length() > line.max_length()) 
    { 
     line.wrap(); 
    } 
\end{lstlisting} 

Ejemplo:

enter image description here

Nota: tienes que \usepackage{MnSymbol} para poder usar \rhookswarrow una d \rcurvearrowse. Para evitar la dependencia adicional, puede usar \hookrightarrow y \hookleftarrow que se incluyen en los paquetes predeterminados.

Fuente: http://www.bollchen.de/blog/2011/04/good-looking-line-breaks-with-the-listings-package/. Lea allí para una explicación más detallada. También pdf.

Cuestiones relacionadas