每当 OCaml 文字字符'"'
出现在源中时,OCaml 的列表语法突出显示就会中断。
语言定义不可能将单引号视为字符串文字的分隔符,因为单引号也用于类型变量(例如'a list
)
以下文档显示了该问题。在输出的最后一行,let
关键字应该以粗体显示。但事实并非如此,因为 listings 认为它位于字符串文字内。如果我们将单引号视为字符串文字分隔符,则第一行会中断后续行的渲染。
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[scaled]{beramono}
\usepackage{listings}
\lstset{
language=caml,
columns=[c]fixed,
basicstyle=\small\ttfamily,
keywordstyle=\bfseries,
upquote=true,
commentstyle=,
breaklines=true,
showstringspaces=false}
\begin{document}
\begin{lstlisting}
type 'a t = ..
let double_quote = '"'
let broken_highlight = ()
\end{lstlisting}
\end{document}
有没有办法配置 OCaml 的 listing 包以避免发生这个问题?
答案1
在这种特殊情况下,您可以使用literate
不会因双引号字符串或其他突出显示而中断的选项:
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
%\usepackage[scaled]{beramono}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
language=caml,
columns=[c]fixed,
% basicstyle=\small\ttfamily,
keywordstyle=\bfseries,
upquote=true,
commentstyle=,
breaklines=true,
showstringspaces=false,
stringstyle=\color{blue},
literate={'"'}{\textquotesingle "\textquotesingle}3
}
\begin{document}
\begin{lstlisting}
type 'a t = ..
let double_quote = "foo"
let double_quote = '"'
let double_quote = 'a'
let double_quote = "'"
let broken_highlight = ()
\end{lstlisting}
\end{document}
答案2
您可以考虑切换到minted
,它可以正确处理此输入。 选项提供黑白风格style=bw
。
梅威瑟:
\documentclass{article}
\usepackage{minted}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[scaled]{beramono}
\begin{document}
\begin{minted}{ocaml}
type 'a t = { name : string; mutable info : 'a};;
let p = { name = "John"; info = 23 };;
let double_quote = '"'
let broken_highlight = ()
\end{minted}
\begin{minted}[style=bw]{ocaml}
type 'a t = { name : string; mutable info : 'a};;
let p = { name = "John"; info = 23 };;
let double_quote = '"'
let broken_highlight = ()
\end{minted}
\end{document}
结果:
答案3
该软件包piton
可以毫无问题地处理此输入。该软件包piton
需要 LuaLaTeX,但不使用任何外部软件。
\documentclass{article}
\usepackage{piton,xcolor}
\begin{document}
\begin{Piton}[language=ocaml]
type 'a t = { name : string; mutable info : 'a};;
let p = { name = "John"; info = 23 };;
let double_quote = '"'
let broken_highlight = ()
\end{Piton}
\end{document}