了解 Pygments 如何处理 LaTeX 输入

了解 Pygments 如何处理 LaTeX 输入

是否可以调整mintedPygments 以突出显示环境名称?我希望得到以下输出

在此处输入图片描述

但我得到的只有

在此处输入图片描述

ie{itemize}不是粗体。我猜想可以通过更改 Latex 控制杆或类似的东西来实现,但我不知道从哪里开始。

平均能量损失

\documentclass[parskip = full]{scrartcl}

\usepackage[T1]{fontenc}

\usepackage{beramono}
\usepackage{minted}

\usemintedstyle{bw}

\begin{document}

This input code

\begin{minted}{latex}
\begin{itemize}[label = {--}]% comment
   \item Text
\end{itemize}
\end{minted}

should result in an output like from the following code

\ttfamily
\textbf{\textbackslash begin\{itemize\}}[label = \{-\/-\}]\textit{\% comment}\\
\strut\ \strut\ \strut\ \textbf{\textbackslash item} Text\\
\textbf{\textbackslash end\{itemize\}}

\end{document}

答案1

它似乎minted完全依赖 Pygments 来处理输入代码。文档本身没有提及直接更改输出内容的方法minted。剩下的解决方案是使用自定义 Pygments 词法分析器。那里有相当详细的文档:http://pygments.org/docs/lexerdevelopment。我将提供一步一步的解决方案,以防其他人想要定制词法分析器。

了解 Pygments 如何处理 LaTeX 输入

转到lexersPygments 安装文件夹中的文件夹。在我的例子中,在 Windows 上,它位于<python_path>/Lib/site-packages/pygments/lexers/;在 macOS 上,它类似于/Library/Python/2.7/site-packages/Pygments-2.2.0-py2.7.egg/pygments/lexers/。我还没有在 Linux 上尝试过。您会在文件中找到每个词法分析器的路径_mapping.py

为了TeX/LaTeX,这是TexLexer班级,里面markup.py

让我们看看它如何处理\begin{itemize}。主要“状态”是root。当程序发现\后跟一个或多个字母(298 升),它将所有内容视为Keyword(在我们的例子中,即\+ begin,将以粗体显示。),然后在command状态中解析其余部分。command状态会检查方括号或星号,但不处理花括号。{itemize}然后将在状态中解析root,并将其打印为简单文本。

创建自定义词法分析器

如果我理解正确,那么只需要以不同于其他命令的方式解析\begin和。让我们创建一个自定义 TeX 词法分析器,它继承自原始词法分析器并在状态中添加这两个特定匹配项。\endTexLexerroot

这是我在一个新的 Python 文件中编写的内容。我没有详细介绍所有内容,因为它非常具体,而且官方文档非常准确(例如,请参阅这里关于继承)。

from pygments.lexer import inherit
from pygments.token import Keyword
from pygments.lexers.markup import TexLexer

__all__ = ['CustomTexLexer']

class CustomTexLexer(TexLexer):
    aliases = ['xtex', 'xlatex']

    tokens = {
        'root': [
            (r'\\begin\{[a-zA-Z\*]+\}', Keyword, 'command'),
            (r'\\end\{[a-zA-Z\*]+\}', Keyword),
            inherit,
        ],
    }

也可能可以将其添加到与 相同的文件中TexLexer,但我不确定这样做是否安全。在这两种情况下,您都需要提供 newaliases并将类名添加到__all__

重建词法分析器映射

文档说使用以下命令进行构建:

$ make mapfiles

但我找不到相应的 Makefile。这里的文档可能已经过时了,因为该_mapping.py文件已被制作成可以自我更新的脚本:

$ python _mapping.py

(在 macOS 上,必须执行此操作才能sudo授予树中的写访问权限/Library/。)

结果

我们现在有两个 LaTeX 词法分析器可供使用:

\documentclass{article}

\usepackage{polyglossia}
\setmonofont{Courier New}

\usepackage{minted}
\usemintedstyle{bw}

\begin{document}

Original lexer:
\begin{minted}{latex}
\begin{itemize}[label = {--}]% comment
   \item Text
\end{itemize}
\end{minted}

Custom lexer:
\begin{minted}{xlatex}
\begin{itemize}[label = {--}]% comment
   \item Text
\end{itemize}
\end{minted}

\end{document}

(由于技术问题,我不得不简化序言,它与当前问题无关。)

输出:

使用原始和自定义词法分析器进行输出

小更新

我更新了自定义词法分析器,以便它以与宏的可选参数相同的方式处理环境的可选参数。此时听起来更合适。请注意,这在 MWE 中没有任何区别,因为类bw不强调相关对象Name.Attribute。仅供展示,这是默认样式的样子:

更新输出

相关内容