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

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

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

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

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

s = %q!this is a string.!

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

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

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

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

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

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

Пример листинга LaTeX: добавление сбоку[«добавление сбоку» изменено из взломов Bit Twiddling] < / sub>


person Konrad Rudolph    schedule 27.12.2009    source источник
comment
если вы не против использования внешних инструментов, таких как пигменты, то почему бы просто не написать make-файл для вашего документа?   -  person Mica    schedule 30.12.2009
comment
Разве это не следует перенести на tex.stackexchange.com? ^^   -  person Matthias    schedule 14.06.2012
comment
@Matthias Не уверен. Когда я его разместил, там не было tex.se, но теперь он кажется весьма полезным - вопрос вызвал огромное эхо, в то время как на TeX.SE никто до сих пор не отправлял аналогичный вопрос. Более того, это на самом деле относится именно к программированию и инструментам программирования, поэтому я полагаю, что программисты - это люди, которым это выгодно.   -  person Konrad Rudolph    schedule 14.06.2012
comment
Те, у кого есть, могут забыть LaTeX для документа, который они сейчас пишут: обратите внимание, что с Office Word или LibreOffice Writer вы просто копируете / вставляете туда свой код, например, из Eclipse, и сохраняете свои цвета !!   -  person MohamedEzz    schedule 26.10.2014
comment
@MemoryLeaks Я не уверен, кому этот совет ужасно полезен: программное обеспечение Office не является действительной заменой LaTeX (которое не является офисным программным обеспечением, это настольная издательская система, которая, в двух словах, означает, что он обеспечивает гораздо лучшую типографику, помимо всех других преимуществ по сравнению с офисным программным обеспечением).   -  person Konrad Rudolph    schedule 26.10.2014
comment
@KonradRudolph, мой комментарий ни в коем случае не является сравнением обоих и не предназначен для столь популярных дебатов. Мне нужно было раздать задание, содержащее код Python, я потратил много времени, пытаясь поместить его в LaTeX с выделением цвета, примерно через 30 минут работы над этим я попытался вставить свой код LibreOffice Writer, и все было идеально в 5 секунд. Я считаю очень полезным экономить чужое время в ситуации, похожей на мою. Помните, что это комментарий, а не ответ.   -  person MohamedEzz    schedule 26.10.2014


Ответы (3)


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

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

Представляем отчеканенный

чеканили < / strong> - это пакет, который использует 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

(Но minted также работает с latex и pdflatex…)

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

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

Еще раз спасибо Норману за мотивацию к созданию этого пакета.

person Konrad Rudolph    schedule 31.12.2009
comment
После нескольких часов поиска того, как использовать пигменты с LaTeX, и нескольких часов попыток собрать собственное решение, это лучшее, что я нашел. А еще лучше, это действительно работает. Спасибо за это. - person sykora; 12.01.2010
comment
здесь просто чтобы оценить проделанную вами работу в хорошей манере;)! - person Filip Dupanović; 05.07.2010
comment
На то, чтобы все настроить, у меня ушло много времени, но в конце концов оно того стоило. Установка через MiKTeX у меня не сработала (без проблем); Пришлось установить несколько пакетов отдельно. Также Python easy_install не получил рабочий Pygments EGG, поэтому я загрузил его отдельно и установил через easy_install.exe pygments*.egg. Наконец, не забудьте запустить latex или pdflatex с помощью переключателя --shell-escape ... и скрестите пальцы! - person Paul Lammertsma; 26.07.2010
comment
@Paul: Это правда, что в Windows все довольно беспорядочно. :-( Надеюсь, следующая версия Pygments немного облегчит это, но для людей, которые не часто работают с Python (и, следовательно, easy_install), этот процесс никогда не будет очень гладким. - person Konrad Rudolph; 26.07.2010
comment
На сайте TeX SE теперь есть довольно много вопросов о вашем пакете, и я просто нажал один с своего рода запросом функции (скрытым в комментариях). Возможно, вы захотите взглянуть. - person Paŭlo Ebermann; 06.11.2011
comment
@ Palo Спасибо. Я пытаюсь прочитать все упоминания о пакете (у меня есть оповещение от Google), но мне не всегда это удается. Вопрос, который вы упомянули, я действительно прочитал (очевидно: я проголосовал за него, но не могу вспомнить), но это совсем не так. «Ab», использующий TikZ для этого, кажется плохим хаком ... - person Konrad Rudolph; 06.11.2011
comment
Можно ли определить пользовательский шаблон пигментов в латексе с чеканкой? Я хочу выделить язык dsl, сделанный на заказ. - person aphex; 27.12.2012
comment
@aphex Не внутри LaTeX, вы должны сделать это на Python, как показано в документации Pygments. - person Konrad Rudolph; 27.12.2012
comment
Есть ли удача с попыткой связать автоматический pdflatex Кайла и это? - person Ivan; 25.01.2013
comment
Чего ждать!? Первая версия minted была создана менее чем за два дня от первоначальной идеи до готового продукта? Что это за безумный мир? - person thymaro; 22.01.2018

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

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

person Norman Ramsey    schedule 29.12.2009
comment
Я вовсе не против введения внешних инструментов - на самом деле, я думаю, что использование Pygments, вероятно, является лучшим решением. Вопрос в том, как сделать это разумно, чтобы у меня все еще оставались выходы в LaTeX и \labels внутри кода. - person Konrad Rudolph; 29.12.2009
comment
Что касается изменения listings, я уже ознакомился с его источником - и, к сожалению, я его совсем не понимаю. Мои навыки TeX и близко не стоят к этому уровню. До сих пор я в любом случае использовал только подмножество TeX для LaTeX. - person Konrad Rudolph; 29.12.2009
comment
Я бы сказал, что самая большая проблема с внедрением внешнего инструмента - это то, что вы публикуете. Многие издатели журналов (cough-cough SPRINGER и другие) требуют отправки в необработанном LaTex, который затем компилируется на их серверах. Излишне говорить, что если ваш сторонний инструмент не находится на их сервере, вы - СОЛНЕЧНЫЙ, если только вы не выполните предварительную обработку (что сводит на нет большую часть полезности, позволяющей управлять Tex). - person Namey; 16.08.2012
comment
Если документация верна, пакет listings все еще поддерживается, однако сопровождающий изменился и получил исправления: ctan.org/pkg/listings?lang=en - person DetlevCM; 25.05.2016
comment
@Namey, всего лишь точка данных: мне только что удалось успешно украсть статью, используя minted через процесс публикации LNCS Springer. - person Volker Stolz; 08.09.2016

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

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

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

person homerj    schedule 27.12.2009
comment
Однако highlight разделяет все проблемы Pygments. В частности, это не пакет LaTeX, несмотря на то, что сказано в его описании. Это просто отдельная программа. Проблема, как и в случае с Pygments, заключается в том, как использовать его осмысленно из LaTeX и предоставить все те приятные вещи, которые есть у listings. - person Konrad Rudolph; 28.12.2009