是否可以调整minted
Pygments 以突出显示环境名称?我希望得到以下输出
但我得到的只有
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 输入
转到lexers
Pygments 安装文件夹中的文件夹。在我的例子中,在 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 词法分析器,它继承自原始词法分析器并在状态中添加这两个特定匹配项。\end
TexLexer
root
这是我在一个新的 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
。仅供展示,这是默认样式的样子: