我正在尝试为 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