帮助使用 listings 包定义 PDF 语法

帮助使用 listings 包定义 PDF 语法

我正在尝试为 listings 包创建 pdf 语言定义,但无法使字符串定义正常工作。这是我定义的:

\lstdefinelanguage{pdf}{
alsoletter={/,(,)},
morekeywords={/Type,/Outlines, /Count, /Kids, /Page,
    /Parent, /Resources, /MediaBox, /Contents, /Length, /ProcSet, /PDF, /Size,
    /Root, /Pages, /Catalog, /Font, /F1, /F2, /Text, /Subtype, /Type1, /Name,
    /BaseFont, /Helvetica-Bold, /Encoding, /MacRomanEncoding, /Helvetica},
morecomment=[l]{\%},
morestring=[s]{(}{)}
}

您可以在这里看到结果:

在此处输入图片描述

它应该从 ( 到 ),或者从 BT 到 ET (这是 vim 所做的)。


好的。所以我明白了。由于某些原因,使用breaklines=true会产生此错误。

这是一个产生错误的最小工作示例:

\documentclass[a4paper,english]{article}
\usepackage[T1]{fontenc}               
\usepackage[utf8]{inputenc}             
\usepackage{babel, listings, color}
\definecolor{darkviolet}{rgb}{0.5,0,0.4}
\definecolor{darkgreen}{rgb}{0,0.4,0.2} 
\definecolor{darkblue}{rgb}{0.1,0.1,0.9}

\lstset{ %
    keywordstyle=\color{darkviolet},
    commentstyle=\color{darkgreen},
    stringstyle=\color{darkblue},
    breaklines=true,% Produces the error in the highlighting
}

\lstdefinelanguage{pdf}{
    alsoletter={/},
    morekeywords={/Length, /F1},
    morecomment=[l]{\%},
    morestring=[s]{(}{)}
}

\begin{document}
\begin{lstlisting}[language=pdf]
%PDF-1.0

5 0 obj
<< /Length 44 >>        
stream
BT
/F1 27 Tf
100 100 Td (Hello World) Tj
ET
endstream
endobj

%%EOF
\end{lstlisting}
\end{document}

但我需要将 breaklines 设置为 true。那么有人知道为什么会发生这种情况吗?或者这只是 listings 包中的一个错误?

答案1

当断线处于活动状态时,会出现特殊代码“当前仅适用于)”(listings.dtx 1.4,l.12576):

% \begin{macro}{\lst@breakProcessOther}
% is the same as |\lst@ProcessOther| except that it also outputs the current
% token string. This inserts a potential linebreak point.
% Only the closing parenthesis uses this macro yet.
%    \begin{macrocode}
\gdef\lst@breakProcessOther#1{\lst@ProcessOther#1\lst@OutputOther}
\lst@AddToHook{SelectCharTable}
    {\lst@ifbreaklines \lst@Def{`)}{\lst@breakProcessOther)}\fi}
%    \end{macrocode}

可能有更好的方法可以再次将其从钩子中移除,但是当放在序言中时,这似乎可以做到:

\makeatletter
\def\uglypatch #1\lst@ifbreaklines#2\fi#3\uglypatch{%
  \long\def\lsthk@SelectCharTable{#1#3}%
}
\lst@ifbreaklines
\expandafter\uglypatch\lsthk@SelectCharTable\uglypatch
\fi
\makeatother

相关内容