Подсветка исходного кода в LaTeX

196

Мне нужно выделить исходный код в LaTeX. Пакет, listingsкажется, лучший выбор для большинства вариантов использования, и для меня это было до сих пор.

Однако сейчас мне нужно больше гибкости. Вообще то, что я ищу, это настоящий лексер. В частности, мне нужно (для определения собственного языка) определить (и выделить!) Собственные стили чисел. listingsне позволяет выделять цифры в коде. Тем не менее, мне нужно произвести что-то вроде этого:

Требуемый результат

listingsтакже не может справиться с произвольными разделителями для строк. Рассмотрим следующий допустимый код Ruby:

s = %q!this is a string.!

Здесь !можно заменить практически любой разделитель.

(Это listingsне может справиться с Unicode, также довольно неприятно, но это другая проблема.)

В идеале я ищу расширение, listingsкоторое позволит мне предоставить более сложные правила лексизма. Но, кроме этого, я также ищу жизнеспособные альтернативы.

Другие потоки предложили использовать Pygments, которые могут генерировать вывод LaTeX. Там даже пакет - texments- чтобы облегчить переход.

Тем не менее, это очень не хватает функций. В частности, меня интересует listingsнумерация строк в стиле, ссылки на строки исходного кода и возможность встраивания LaTeX в исходный код (опции texclи mathescapein listings).

В качестве примера, вот набор listingsтипов исходного кода, который показывает некоторые вещи, которые замена должна также обеспечить:

Пример списков LaTeX: боковое дополнение [«Боковое дополнение» модифицировано из «Битовых хедчей»]

Конрад Рудольф
источник
если вы не хотите вводить внешние инструменты, такие как фрагменты, то почему бы просто не написать make-файл для вашего документа?
Слюда
6
Разве это не должно быть перенесено на tex.stackexchange.com ? ^^
Матиас
1
@Matthias Не уверен. Когда я разместил его, там не было tex.se, но сейчас он кажется весьма полезным - вопрос вызвал огромный отклик, хотя на TeX.SE никто до сих пор не опубликовал подобный вопрос. Кроме того, это на самом деле относится конкретно к программированию и инструментам программирования, так что, я думаю, программисты - это те люди, которым это выгодно.
Конрад Рудольф
1
Для тех, кто может забыть LaTeX для документа, который они в настоящее время пишут: обратите внимание, что с помощью Office Word или LibreOffice Writer вы просто копируете / вставляете свой код, например, из Eclipse, и сохраняете свои цвета !!
MohamedEzz
3
@MemoryLeaks Я не уверен, кому этот совет ужасно полезен: офисное программное обеспечение не является полноценной заменой LaTeX (которое не является офисным программным обеспечением, это настольная издательская система, что, в двух словах, означает, что она обеспечивает гораздо более качественную типографику) кроме всех других его преимуществ перед офисным программным обеспечением).
Конрад Рудольф

Ответы:

355

Принимая совет Нормана близко к сердцу, я собрал воедино решение, в котором использовались ( исправленные ) фрагменты для выделения и добавления как можно большего числа функций без разрывов ;-)

Я также создал пакет LateX, как только мой патч Pygments был выпущен в версии 1.2 ...

Представление чеканился

чеканились представляет собой пакеткоторый использует Pygments обеспечить первоклассную подсветку синтаксиса в LaTeX. Например, он позволяет следующий вывод.

необычный пример LaTeX

Вот минимальный файл для воспроизведения вышеуказанного кода (обратите внимание, что для включения символов Unicode может потребоваться XeTeX)!

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{minted}

\setsansfont{Calibri}
\setmonofont{Consolas}

\begin{document}
\renewcommand{\theFancyVerbLine}{
  \sffamily\textcolor[rgb]{0.5,0.5,0.5}{\scriptsize\arabic{FancyVerbLine}}}

\begin{minted}[mathescape,
               linenos,
               numbersep=5pt,
               gobble=2,
               frame=lines,
               framesep=2mm]{csharp}
  string title = "This is a Unicode π in the sky"
  /*
  Defined as $\pi=\lim_{n\to\infty}\frac{P_n}{d}$ where $P$ is the perimeter
  of an $n$-sided regular polygon circumscribing a
  circle of diameter $d$.
  */
  const double pi = 3.1415926535
\end{minted}
\end{document}

Это может быть набрано с помощью следующей команды:

xelatex -shell-escape test.tex

(Но чеканка также работает с latexи pdflatex...)

minted.styработает аналогично, texments.styно позволяет дополнительные функции.

Как его получить

  • отчеканенных в списке на CTAN ( пакет информация )

  • документация, конечно, включена.

  • отчеканенный теперь поддерживается Джеффри Пур. Версия для разработки, включая последний .styфайл , доступна по адресу github.com/gpoore/minted и может быть клонирована оттуда.

Еще раз спасибо Норману за то, что он мотивировал меня на создание этого пакета.

Конрад Рудольф
источник
19
После нескольких часов поиска того, как использовать фрагменты с LaTeX, и нескольких часов попыток взломать мое собственное решение, это лучшее, что я нашел. А еще лучше, это на самом деле работает. Спасибо за это.
Сикора
2
здесь просто чтобы оценить работу, которую вы проделали в манере;)!
Филипп Дупанович
4
@Paul: Это правда, что все это довольно грязно в Windows. :-( Надеюсь, следующая версия Pygments несколько облегчит это, но для людей, которые не часто работают с Python (и, следовательно, easy_install), процесс никогда не будет очень гладким.
Конрад Рудольф,
1
На сайте TeX SE теперь есть довольно много вопросов о вашем пакете , и я только что ответил на один из них с запросом на функцию (скрыто в комментариях) . Возможно, вы захотите посмотреть.
Paŭlo Ebermann
1
@ Paŭlo Спасибо. Я пытаюсь прочитать все упоминания о пакете (у меня есть предупреждение Google), но у меня не всегда получается. Вопрос, который вы упомянули, я действительно прочитал (очевидно: я проголосовал за него, но не могу вспомнить), но это совсем не так просто. «Ab», использующий TikZ для этого, кажется плохим хаком…
Конрад Рудольф,
6

TeX (классно) завершен по Тьюрингу, но я уверен, что вам придется написать это расширение самостоятельно. Документация поясняет, что первоначальный автор listingsосиротел в 2004 году и не обновлялся с 2006 года. Пакет не предназначен для переопределения форматирования числовых литералов, но вы можете изменить его, изменив определение \lst@ProcessDigit. Если это не сработает, вам нужно будет подробно понять, как работают параметры «стиля идентификатора», и вам придется продублировать этот механизм для ваших числовых литералов.

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

Норман Рэмси
источник
Я совсем не хочу вводить внешние инструменты - на самом деле, я думаю, что использование Pygments - это, вероятно, лучшее решение. Вопрос в том, как сделать это разумным образом, чтобы у меня все еще могли быть экранированные символы в LaTeX и \labelвнутри кода.
Конрад Рудольф
Что касается изменений listings, я уже взглянул на их источник - и, к сожалению, я его вообще не понимаю. Мои навыки TeX не достигли этого уровня. До сих пор я когда-либо использовал только подмножество TeX LaTeX.
Конрад Рудольф
1
Я бы сказал, что самая большая проблема с внедрением внешнего инструмента - это если вы публикуете. Многие издатели журналов (SPRINGER от кашля и другие) требуют публикации в формате LaTex, который затем компилируется на их серверах. Само собой разумеется, если ваш сторонний инструмент не находится на их сервере, вы - SOL, если вы не выполняете предварительную обработку (что лишает большинство полезности использования Tex-привода).
Namey
Если документация верна, пакет списков все еще поддерживается - однако сопровождающий изменился, и он получил исправления: ctan.org/pkg/listings?lang=en
DetlevCM
1
@Namey, просто точка данных: мне просто удалось успешно украсть бумагу, используя mintedпроцесс публикации LNCS в Springer.
Фолькер Штольц
3

Это пакет, который преобразует исходный код в TeX и LaTeX с подсветкой синтаксиса. Можно легко добавить пользовательские определения языка программирования.

Highlight поддерживает 100 языков программирования и включает 50 цветовых тем. Он имеет переформатирование кода и отступ.

Я не использовал это, чтобы знать, как ХОРОШО это работает, но кто-то еще, которого я знаю, сказал, что это работало довольно хорошо. Если у меня будет шанс, я сам попробую и посмотрю.

homerj
источник
1
highlightразделяет все проблемы Pygments, хотя. В частности, это не пакет LaTeX , несмотря на то, что говорится в его описании. Это просто отдельная программа. Проблема, как и в случае с Pygments, заключается в том, как осмысленно использовать его в LaTeX и предоставлять все, что в нем listingsесть.
Конрад Рудольф