问题

问题

问题

我为 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 脚本指定正确的绝对/相对路径。

相关内容