
Рассмотрим следующий отчеканенный код:
\begin{minted}[escapeinside=||]{ocaml}
foo |this is escaped| bar
\end{minted}
что работает так, как и ожидалось, т.е. экранированный текст действительно экранируется.
Однако если мы изменим язык с ocaml
на prolog
, то экранированный текст больше не будет экранированным:
\begin{minted}[escapeinside=||]{prolog}
foo |this is no longer escaped| bar
\end{minted}
Это баг minted или я неправильно использовал пакет minted? Я пробовал несколько экранирующих символов, но ничего не вышло.
решение1
minted
используетПигментыдля выполнения фактического выделения, и это включает в себя escapeinside
. Реализация Pygment escapeinside
может бытьхрупкий в некоторых обстоятельствах, и не работает внутри строк или комментариев.
В данном prolog
случае foo
этотокенизирован какString.Atom
, поэтому, когда лексер достигает первого |
, он находится в неправильном режиме для начала побега. Напротив, в случае ocaml
токенизирован foo
как Name
, поэтому лексер интерпретирует |
как побег. В конечном итоге это сводится к взаимодействию между способом, которым Pygments реализует escapeinside
, и способом, которым prolog
работает лексер.