OCaml 列表和引文

OCaml 列表和引文

每当 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}

上述代码的输出

相关内容