Разрыв строк с помощью lstlisting

Разрыв строк с помощью lstlisting

Я хотел бы показать пару строк из CSV-файла с использованием пакета listings с расширением breaklines=true.

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{%
  backgroundcolor=\color{lightgray},
  basicstyle=\ttfamily\footnotesize,
  breaklines,
  showspaces
}

\begin{document}
\begin{lstlisting}
K01980;23S ribosomal RNA;11.79648646;17.54756407;16.55812848;7.070375553;9.904088434;10.33047681;11.34235283;12.84408234
K01977;16S ribosomal RNA;7.433653271;11.21805284;10.47502621;4.555449801;6.223779066;6.547853101;7.12047883;8.056722
K03046;DNA-directed RNA polymerase subunit beta' [EC:2.7.7.6];1.279373326;1.843958244;1.291530419;0.91598316;1.444456949;1.370082994;1.471863596;1.274232464
\end{lstlisting}
\end{document}

Однако результат не совсем удовлетворительный.

введите описание изображения здесь

  • Разрыв происходит очень рано, поэтому в конце первой строки много пустого места, а вторая строка превышает доступную ширину текста. Во второй строке разрыва нет.
  • После каждой строки следует пустая строка.

Я бы хотел что-то вроде этого:

K01980;23S ribosomal RNA;11.79648646;17.54756407;16.55812848;
  7.070375553;9.904088434;10.33047681;11.34235283;12.84408234
K01977;16S ribosomal RNA;7.433653271;11.21805284;10.47502621;
  4.555449801;6.223779066;6.547853101;7.12047883;8.056722
K03046;DNA-directed RNA polymerase subunit beta' [EC:2.7.7.6];
  1.279373326;1.843958244;1.291530419;0.91598316;1.444456949;
  1.370082994;1.471863596;1.274232464

решение1

listingsне разбивает куски символов, когда они принадлежат к одной и той же внутренней категории. В этом случаеписьмо,цифраидругойкатегории представляют особый интерес. По умолчанию символы назначаются категориям, как вы и ожидали, т.е. буквы относятся к категорииписьмо, цифрыцифра, и символыдругой.

Когдаписьмонайдено, все следующиеписьмоилицифрасимволы читаются до тех пор, пока не будет найдено не-письмо/не-цифранайден. Затем эта серия выводится как один фрагмент. То же самое происходит со всеми символами, которые не являютсяписьмодо следующегописьмонайдено. Обработка ввода таким образом предотвращает разрыв длинной последовательности цифр, точек и точек с запятой в вашем примере, потому что нетписьмообнаруживается, что он начинает новый фрагмент.

Вот два предложения по решению этой проблемы:

  • Переставьте категории символов так, чтобы построенные фрагменты соответствовали логическим единицам данных вашего конкретного варианта использования. Например, вы можете захотеть переместить цифры и точку также в категориюписьмо, оставив точку с запятой в качестве категориидругой. Это можно сделать, добавив

    alsoletter={0123456789.}
    

    в \lstset. Теперь переносы строк могут появляться также после всех десятичных чисел и после точки с запятой.

  • Более простым способом будет использовать literateопцию и переопределить точку с запятой в версию, которая допускает перенос строки после символа:

    literate={;}{{;\allowbreak}}1
    

Оба решения теперь дают более привлекательный результат

введите описание изображения здесь

Связанный контент