Выделение исходного кода в LaTeX

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

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

Required result

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

s = %q!this is a string.!

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

(То, что listings не может обрабатывать Юникод, также довольно досадно, но это еще одна проблема.)

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

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

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

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

LaTeX listings example: Sideways addition [ "Боковое добавление", измененное с помощью бит Twiddling Hacks]

Ответ 1

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

Ive также создал пакет LateX, как только патч Pyigs был выпущен в версия 1.2...

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

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

fancy LaTeX example

Ищите минимальный файл для воспроизведения вышеуказанного кода (обратите внимание, что в том числе символы 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, но допускает дополнительные функции.

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

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

Ответ 2

TeX (классно) Turing-complete, но я уверен, что вам придется писать это расширение самостоятельно. В документации ясно, что оригинальный автор listings потерял ее в 2004 году и не обновлялся с 2006 года. Пакет не был предназначен для переопределения форматирования числовых литералов, но вы могли бы его модифицировать изменив определение \[email protected]. Если это не сработает, вам нужно будет детально понять, как работают опции "стиль идентификатора", и вам придется дублировать это оборудование для ваших числовых литералов.

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

Ответ 3

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

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

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