
Я использую minted
для подсветки кода в Python. В некоторых случаях я хочу смешать код с выводом, который увидит пользователь. Это дает мне красные поля синтаксических ошибок, например, вот так:
А иногда у меня не возникает никаких ошибок, но я хотел бы отключить подсветку (вторая строка):
Поэтому я хотел бы узнать, можно ли отключить подсветку нескольких строк, сохранив при этом такие опции, как нумерация строк и фон.
МВЭ:
\documentclass{article}
\usepackage{minted}
\definecolor{bg}{rgb}{0.95,0.95,0.95}
\newminted{python3}{bgcolor=bg, linenos=true, tabsize=4}
\begin{document}
I want lines 2 and 4 not to be highlighted but still keep the background and line numbering.
\begin{python3code}
>>> type(3.14)
<class 'float'>
>>> print(name)
NameError: name 'name' is not defined
\end{python3code}
\end{document}
Редактировать:Для ясности: есть строки, которые я хочу выделить, которые начинаются с , >>>
и есть строки, которые я хочу выделить, которые не начинаются с >>>
. Есть также строки, которые я не хочу выделять. Поэтому по умолчанию должно быть выделение строки, но я могу добавить исключение для некоторых строк.
решение1
Короче говоря, это так: напишите специальный лексер. Но вам повезло, он уже есть, просто используйте его pycon
как язык.
\newminted{pycon}{bgcolor=bg, linenos=true, tabsize=4}
решение2
Очень простое решение вашей проблемы — предварительно обработать код, добавив #
перед каждой строкой, которая не начинается с >>>
, что по крайней мере будет выглядеть нормально, хотя и не будет идеальной копией вывода консоли python. Это можно сделать во многих редакторах с помощью опции regex или с помощью других инструментов ( sed
например) в Unix.
Хотя лидирование >>>
все еще может сбить лексер Python. В этом случае вы можете удалить их (вы потеряете больше точности к оригиналу, но он будет читаемым, поскольку вывод будет выглядеть как комментарии).
решение3
Из беглого взгляда на minted
документацию, похоже, что пакет не поддерживает эту функцию. В любом случае указание конкретных номеров строк кажется действительно уродливым способом сделать это.
Но он использует pygmentize
как бэкэнд и строки, которые вы хотитенетигнорировать соответствует очень специфическому шаблону, все они начинаются с >>>
, и поэтому их должно быть легко обнаружить и игнорировать программно.
Смотря надокументация pygments о написании собственного лексера, похоже, можно указать, что для некоторых шаблонов (регулярных выражений) вы хотите, чтобы другой лексер обрабатывал строку. Затем вы могли бы обработать строки, которые не начинаются с , >>>
и передать те, которые начинаются (без >>>
), обычному лексеру Python.