Minted 在遇到美元时出错

Minted 在遇到美元时出错

我正在使用 minted 尝试列出并着色一些 plpgsql(PostgreSQL 的 plsql),即一些函数和触发器。当我将美元写为

$$

或者

$BODY$

它们是指定函数主体所必需的。以下是示例:

\begin{minted}{postgresql}


CREATE EXTENSION IF NOT EXISTS dblink;
CREATE OR REPLACE FUNCTION update_vendite()
RETURNS int
AS

$BODY$
DECLARE
    quantitaV int;
    tot double precision;
BEGIN

    SELECT INTO quantitaV qta
          FROM vendite_ft WHERE id=2'
    RETURN quantitaV;

END;

$BODY$
LANGUAGE 'plpgsql';
\end{minted}

当我尝试编译时(我使用的是适用于 OS X Lion 的 TexShop 3.11)我从 pygments 收到此错误:

*** Error while highlighting:
TypeError: 'NoneType' object is not subscriptable
   (file "/Library/Python/2.7/site-packages/Pygments-1.5-py2.7.egg/pygments/formatters/latex.py", line 133, in _get_ttype_name)

(./es_progetto.out.pyg)

看起来好像不支持该语法(忽略错误并继续编译会打印列出的代码并在第一个$BODY$包含的代码处停止,$BODY$从代码中删除 s 不会产生任何错误)。

我在使用 minted 时遗漏了什么吗?我该如何避免这种情况?

更新:我发现了这个相关的问题这里这让我怀疑您是否可以重现该错误,或​​者只有我遇到了该错误。

更新2 这是一个仍然导致我出现错误的 mwe:

\documentclass[11pt]{article}
\usepackage{minted}

\begin{document}
\begin{minted}{postgresql}

CREATE EXTENSION IF NOT EXISTS dblink;
CREATE OR REPLACE FUNCTION update_vendite()
RETURNS int
AS

$BODY$
DECLARE
quantitaV int;
tot double precision;
BEGIN

SELECT INTO quantitaV qta
    FROM dblink('hostaddr=127.0.0.1 port=5433 dbname=autoricambi 
                 user=foodmart password=foodmart', 
             'SELECT qta, pz_unit FROM vendite_ft WHERE id=2')
    AS t(qta int, pz_unit double precision);

    RETURN quantitaV;

END;

$BODY$
LANGUAGE 'plpgsql';
\end{minted}
\end{document}

更新 3 这是一个有趣的问题:如果我$BODY$用 plpgsql 注释 syle( '--') minted 注释该行,不会出现错误,但在输出中美元会被替换为英镑符号!

美元兑英镑

有人可以确认这个问题吗?这与本地化有关吗?

更新 4 基于 pygment 词法分析器存在问题的假设,我尝试仅使用它$BODY并且它可以工作,问题在于无法识别最后一个美元符号。看来 pygments 对以美元符号开头的字符串使用了外部词法分析器...

答案1

保存你的 postgre 代码而不注释掉美元test.pyg并运行

pygmentize -l postgresql -f latex -F tokenmerge -P verboptions=  -o test.out.pyg test.pyg

(与使用的命令行相同,minted但用\jobname替换test)产生错误(我也使用 Pygments 1.5)。

pygmentize因此,这是与而不是 的问题minted,这可能不是寻求帮助的最佳场所。(此外,我不熟悉postgresql语法,因此建议您也重新检查美元是否有效!)

另一方面,注释掉美元符号后,LaTeX 输出结果包含美元符号的pygmentize命令,显示为\PYZdl{}\show\PYZdl

\char \`\$

£在我的系统上也显示为s。在环境\renewcommand{\PYZdl}{\textdollar}之前执行minted解决了该部分问题。这可能是一个错误,minted但我无法进一步诊断它,因为我无法轻松找出\PYZdl宏定义最初来自哪里。

答案2

我今天也遇到了这个错误。对我来说,关键是确保使用正确的字体编码:

\usepackage[T1]{fontenc}

默认编码(使用 pdfLatex)产生 £ 符号。

相关内容