Как отметить разрыв строк в длинных линиях?
У меня есть код 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 ...
Ответы
Ответ 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.