问题
我为 Python (3.11) 中的伪代码语言创建了一个自定义词法分析器。该文件保存在与我的 TeX 项目相同的目录中。我用它pdflatex
来编译我的项目,它有标志--enable-write18
(因此shell-escape
已启用)通过 TeXMaker 添加了编译命令。
然而,每次我编译文档时,它都会短暂地出现一个错误,提示如下:
Error: no lexer for alias 'pseudocodefile.py:MyCustomLexer -x' found
因此,我的伪代码也无法打印。我真的不知道这是 LaTeX 问题还是 Python 问题。如果这太离题了,我很乐意将其提交给 StackOverflow。
平均能量损失
词法分析器代码(Python 3.11)
from pygments.lexer import RegexLexer, words
from pygments.token import *
class MyCustomLexer(RegexLexer):
name = 'Pseudocode'
aliases = ['mycustomthingo']
filenames = ['*.pseudocode']
tokens = {
'root': [
(words(('and', 'not', 'or', 'xor', 'Return', 'True', 'False'), suffix=r'\b'), Keyword), # Logic and return
(words(('If', 'Then', 'Else'), suffix=r'\b'), Keyword), # Control flow
(words(('For', 'From', 'To', 'Step', 'EndFor', 'While', 'EndWhile', 'Define', 'Print'), suffix=r'\b'), Keyword), # Loops, function definitions, and custom functions
(r'\b(\d+(\.\d+)?)\b', Number), # Numeric data types
(r"('[^']*'|\"[^\"]*\")", String), # Strings
(r'\b[A-Za-z_][A-Za-z0-9_]*\b', Name), # Identifiers
]
}
MyLexer = MyCustomLexer
TeX 文件
\documentclass[12pt,a4paper]{article}
\usepackage[cache=false]{minted}
\title{Minted test}
\begin{document}
\maketitle
\section{Introduction}
% Indentation removed from environment
\begin{minted}{pseudocodefile.py:MyCustomLexer -x}
Define f(x):
Return x * x
\end{minted}
\end{document}
答案1
作为2023 年 12 月 10 日, 这铸造乳胶包文档没有详细说明如何从用户定义的 Python 脚本中指定自定义词法分析器,所以我不确定这是否是预期的功能。然而,在查看了铸造代码库和Pygments 文档,我发现了一个快速破解方法,你可以用 minted 将其应用到你的代码中版本 2.8这样你就可以使用自定义词法分析器了。我还想说,它是正确的,而且对你来说仍然是必不可少的,shell-escape
因为这是 minted 工作所必需的;然而,它并不是导致错误的原因:Error: no lexer for alias 'pseudocodefile.py:MyCustomLexer -x' found
解决方案
使用引号围绕使用命令行选项 -x 指定自定义词法分析器位置的参数。确保这些引号的内容和外部花括号周围没有任何空格。此外,需要使用的引号类型取决于您是否使用 Windows 进行编译。
修正了 Windows 上的段编译
\begin{minted}{"pseudocodefile.py:MyCustomLexer -x"}
Define f(x):
Return x * x
\end{minted}
修正了 Linux/Macos 上的段编译
\begin{minted}{'pseudocodefile.py:MyCustomLexer -x'}
Define f(x):
Return x * x
\end{minted}
如果您想要一个独立于平台的解决方案,请考虑使用\ifwindows
宏。但是,\ifwindows
逻辑必须位于表示参数的大括号之外。这是因为参数在后台被去标记化,这意味着被认为是评估 latex 命令的内容实际上是逐字文本。
为什么这样做有效
这里使用的引号实际上是为了转义 minted 环境在后台围绕该参数的引号。如果这些引号没有转义,minted 将调用该命令(假设是 Windows 操作系统,但与其他操作系统类似):
pygmentize -l "pseudocodefile.py:MyCustomLexer -x" ...
分析您的代码段。但是"pseudocodefile.py:MyCustomLexer -x"
被视为一个参数,而不是两个不同的参数pseudocodefile.py:MyCustomLexer
和-x
,这会导致您遇到的错误。用额外的引号包裹参数有效地抵消了 minted 在幕后创建的引号,因为引号现在在语法上表示 在 前面添加一个空字符pseudocodefile.py:MyCustomLexer
并在 后面附加一个空字符-x
:
""pseudocodefile.py:MyCustomLexer -x""
相当于pseudocodefile.py:MyCustomLexer -x
如果仍然不起作用
检查您pseudocodefile.py
调用 latex 命令的当前工作目录,或者为您的词法分析器 python 脚本指定正确的绝对/相对路径。