2009-12-27 11 views
23

Mam kod Latex podobny do następującego:Jak oznaczyć łamanie linii długich linii?

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

Długa linia z pętli for zostanie automatycznie uszkodzony gdzieś w środku, ponieważ papier jest zbyt wąski. Właśnie tego chcę, w przeciwnym razie linia zniknie na końcu gazety. Ale teraz moje pytanie brzmi, czy istnieje sposób na oznaczenie lub wskazanie, że linia ta została zerwana. W przeciwnym razie wygląda na to, że została utworzona nowa linia.

Coś w tym jest to, co chcę (z numerami linii, zauważyć strzałkę):

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

Odpowiedz

12

Najwyraźniej można to osiągnąć z prebreak/postbreak opcji. Zapoznaj się z dokumentacją pakietu listings połączoną z wersją its CTAN page (w dolnej części strony 33 i na górze strony 34 w pliku PDF).

Edytuj: bezpośredni link do the Listings Package's manual. Także myślę, że mogę odtworzyć odpowiednie trochę tutaj - tak tu idzie:

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

<tokens> pojawiają się na końcu bieżącej linii odpowiednio na początku następnego (w podziale na części) linii.

Nie wolno używać przestrzeni dynamicznej (w poszczególnych przestrzeniach), ponieważ wewnętrznie używamy \\discretionary. Jednak \\space jest na nowo zdefiniowany do użycia wewnątrz <tokens>.

Edit 2: Co do umieszczenia lineBreak markera, coś blisko wyglądem przykład podany w pytaniu może być osiągnięte poprzez ustawienie breakindent do 0pt, breakautoindent do false i ręcznie dopełnienie znacznik z, powiedzmy: \\space.

Na przykład użyj postbreak={\textbf{marker}\\space\\space\\space\\space} dla ładnego pogrubienia znacznika, gdzie normalnie rozpoczyna się nowa linia, a następnie czterech spacji, a następnie pozostałej zawartości linii przerywanej. Te opcje są udokumentowane zaraz po instrukcji "prebreak/ w. :-)

+0

Dzięki "postbreak" wydaje się być/prawie/czego szukałem, zgadnij, że to najlepszy sposób. Czy może być sposób na umieszczenie symbolu "postbreaku" na początku linii? Może zresetować swoją pozycję? – watain

+0

Tak, możesz manipulować wcięciem i dołączać twarde spacje do znacznika linii łamania, aby wypchnąć rzeczywistą zawartość przerywanej linii w prawo. Zmieniłem moją odpowiedź, aby uwzględnić odpowiednie szczegóły. Mam nadzieję, że to działa dla ciebie. :-) –

+0

Dziękuję bardzo Michał. Chciałem tylko, że chciałem :) Najpierw powinienem przeczytać całą instrukcję! – watain

43

ofert Konfiguracja następująco: kod źródłowy

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

przykład w dokumencie:

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

Przykładowy wynik:

enter image description here

Uwaga: trzeba \usepackage{MnSymbol} aby móc używać \rhookswarrow an d \rcurvearrowse. Aby zapobiec dodatkowej zależności, możesz użyć \hookrightarrow i \hookleftarrow, które są zawarte w domyślnych pakietach.

Źródło: http://www.bollchen.de/blog/2011/04/good-looking-line-breaks-with-the-listings-package/. Przeczytaj tam, aby uzyskać bardziej szczegółowe wyjaśnienie. Również pdf.

Powiązane problemy