1. ホーム
  2. ラテックス

[解決済み】LaTeXのソースコードハイライト機能

2022-04-11 01:37:48

質問

LaTeXでソースコードをハイライトする必要があります。パッケージ listings は、ほとんどのユースケースで最良の選択と思われますし、私にとっても、これまではそうでした。

しかし、今はもっと柔軟性が必要です。一般的に、私が求めているのは リアル レクサーです。特に、私は(独自の言語定義のために)独自の数値スタイルを定義する(そして強調する!)必要があります。 listings はコード中の数字をハイライトすることができません。しかし、私はこのようなものを作成する必要があります。

listings は、文字列の任意の区切り文字に対応することができません。次のようなRubyの有効なコードを考えてみましょう。

s = %q!this is a string.!

ここです。 ! はほぼ置き換えることができます。 任意の というデリミタがあります。

(その listings がUnicodeを扱えないのもかなり悩ましいところですが、それはまた別の問題です)。

理想を言えば、私は listings より複雑なレキシングルールを提供することができます。しかし、それを除けば、私はまた、実行可能な代替手段を探しています。

その他のスレッド を使用することを提案しています。 ピグメント LaTeXの出力が可能です。パッケージもあります texments - を使えば、移行を容易にすることができます。

しかし、これでは機能が不足しています。特に、私が興味を持っているのは listings -スタイルの行番号,ソースコードの行参照,ソースコードにLaTeXを埋め込む可能性(オプション texclmathescapelistings ).

例として、次のようなソースコードのタイプセットを示します。 listings これは、置き換えが提供すべきもののいくつかを示しています。

<サブ [Bit Twiddling Hacksより「横付け」修正] 。

解決するには?

ノーマンのアドバイスを真摯に受け止め、私は、(a)(b)(c)を使った解決策をハックしました。 パッチド ) Pygmentsでハイライトを行い、破裂することなく可能な限り多くの機能を押し込んでいます;-)

また、LateXのパッケージも作成しました。 バージョン1.2 ...

プレゼン ミンテッド

鋳造された は、Pygmentsを使ってLaTeXで一流のシンタックスハイライトを提供するパッケージです。例えば、以下のような出力が可能です。

上記のコードを再現するための最小限のファイルを以下に示します(ユニコード文字を含めるとXeTeXが必要になるかもしれないことに注意してください)!

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{minted}

\setsansfont{Calibri}
\setmonofont{Consolas}

\begin{document}
\renewcommand{\theFancyVerbLine}{
  \sffamily\textcolor[rgb]{0.5,0.5,0.5}{\scriptsize\arabic{FancyVerbLine}}}

\begin{minted}[mathescape,
               linenos,
               numbersep=5pt,
               gobble=2,
               frame=lines,
               framesep=2mm]{csharp}
  string title = "This is a Unicode π in the sky"
  /*
  Defined as $\pi=\lim_{n\to\infty}\frac{P_n}{d}$ where $P$ is the perimeter
  of an $n$-sided regular polygon circumscribing a
  circle of diameter $d$.
  */
  const double pi = 3.1415926535
\end{minted}
\end{document}

これは、次のコマンドでタイプセットできます。

xelatex -shell-escape test.tex

(ただし 造幣局 も動作します。 latexpdflatex ...)

minted.sty と同じように動作します。 texments.sty が、追加機能を許可しています。

入手方法

改めて、このパッケージを作成する動機付けをしてくれたNormanに感謝します。