Выделение исходного кода в LaTeX
-
21-09-2019 - |
Вопрос
Мне нужно выделить исходный код в LaTeX.Посылка listings
кажется, это лучший выбор для большинства вариантов использования, и для меня так было до сих пор.
Однако сейчас мне нужно больше гибкости.Как правило, то, что я ищу, - это реальный лексер.В частности, мне нужно (для определения собственного языка) определить (и выделить!) собственные числовые стили. listings
не позволяет выделять числа в коде.Однако мне нужно создать что-то вроде этого:
listings
также не может справиться с произвольными разделителями для строк.Рассмотрим следующий допустимый код Ruby:
s = %q!this is a string.!
Здесь, !
может быть заменен почти Любой разделитель.
(Это listings
не может работать с Unicode тоже довольно неприятно, но это уже другая проблема.)
В идеале, я ищу расширение listings
это позволяет мне предоставлять более сложные правила лексикации.Но, исключая это, я также ищу жизнеспособные альтернативы.
Другие потоки предложили использовать Пигменты который может производить вывод LaTeX.Там даже есть посылка – texments
– чтобы облегчить переход.
Однако этому катастрофически не хватает функций.В частности, меня интересуют listings
-стиль нумерации строк, ссылки на строки исходного кода и возможность встраивания LaTeX в исходный код (опции texcl
и mathescape
в listings
).
В качестве примера, вот исходный код, набранный с listings
который показывает некоторые вещи, которые также должна обеспечивать замена:
[“Боковое добавление”, модифицированное из взломов с поворотом бит]
Решение
Приняв совет Нормана близко к сердцу, я взломал решение, которое использовало (a залатанный) Пигменты для выделения и вставки как можно большего количества функций без разрыва ;-)
Я также создал пакет LaTeX, как только мой патч Pygments был выпущен в версия 1.2 …
Представляя отчеканенный
отчеканенный это пакет, который использует Pygments для обеспечения первоклассной подсветки синтаксиса в 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, и может быть клонирован оттуда.
Еще раз спасибо Норману за то, что побудил меня создать этот пакет.
Другие советы
TeX (классно) Turing-complete, но я почти уверен, что вам придется написать это расширение самостоятельно.Документация ясно дает понять, что первоначальный автор listings
осиротел в 2004 году, и что он не обновлялся с 2006 года.Пакет не был разработан для переопределения форматирования числовых литералов, но вы могли бы изменить его, изменив определение \lst@ProcessDigit
.Если это не сработает, вам придется подробно разобраться, как работают параметры "стиль идентификатора", и вам придется дублировать этот механизм для ваших числовых литералов.
Я не совсем понимаю, почему вы так неохотно внедряете внешний инструмент в свою цепочку инструментов, но поскольку это так, вам придется проделать дополнительную работу.После просмотра исходного кода я ожидаю, что изменение listings
должно быть возможно, но лично я бы предпочел вместо этого предварительно обработать свой LaTeX.
Это это пакет, который преобразует исходный код в TeX и LaTeX с подсветкой синтаксиса.Можно легко добавлять пользовательские определения языка программирования.
Highlight поддерживает 100 языков программирования и включает в себя 50 цветовых тем.Он включает в себя переформатирование кода и отступы.
Я не использовал его, чтобы узнать, насколько хорошо он работает, но кто-то еще, кого я знаю, сказал, что он работал довольно хорошо.Если у меня будет такая возможность, я попробую это сам и посмотрю.