我正在使用 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)产生 £ 符号。