Подтвердить что ты не робот

Как отметить разрыв строк в длинных линиях?

У меня есть код Latex, похожий на следующий:

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

Длинная строка с циклом for автоматически разбивается где-то посередине, потому что бумага слишком узкая. Это то, что я хочу, иначе линия исчезнет в конце статьи. Но теперь мой вопрос заключается в том, есть ли способ отметить или указать, что эта строка была нарушена. В противном случае создается впечатление, что была создана новая строка.

Что-то вроде того, что я хочу (с номерами строк, заметьте стрелку):

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

Ответ 1

По-видимому, это можно сделать с помощью опций prebreak/postbreak. См. Документацию пакета listings, связанную с на странице CTAN (внизу страницы 33 и в верхней части страницы 34 в pdf).

Изменить: прямая ссылка на руководство по пакетам листинга. Кроме того, я думаю, я могу воспроизвести соответствующий бит здесь - так вот:

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

<tokens> появляются в конце текущей строки соответственно в начале следующей (сломанной части) строки.

Вы не должны использовать динамическое пространство (в частности, пробелы), так как внутри мы используем \\discretionary. Однако \\space переопределяется для использования внутри <tokens>.

Изменить 2: Что касается размещения маркера линии, то что-то близкое к появлению примера, представленного в вопросе, может быть достигнуто установкой breakindent в 0pt, breakautoindent в false добавьте маркер, скажем, \\space.

Например, используйте postbreak={\textbf{marker}\\space\\space\\space\\space} для красивого жирного маркера, где обычно начинается новая строка, затем четыре пробела, а затем оставшееся содержимое ломаной линии. Эти параметры задокументированы сразу после prebreak/postbreak в listings '.: -)

Ответ 2

Настройте списки следующим образом:

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

Пример исходного кода в документе:

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

Результат:

enter image description here

Примечание: вы должны \usepackage{MnSymbol} использовать \rhookswarrow и \rcurvearrowse. Чтобы предотвратить дополнительную зависимость, вы можете использовать \hookrightarrow и \hookleftarrow, которые включены в пакеты по умолчанию.

Источник: http://www.bollchen.de/blog/2011/04/good-looking-line-breaks-with-the-listings-package/. Читайте там для более подробного объяснения. Также pdf.