LaTeXでのソースコードの強調表示


196

LaTeXでソースコードを強調表示する必要があります。パッケージlistingsはほとんどのユースケースにとって最良の選択のようであり、私にとっては今までそうでした。

しかし、今はもっと柔軟性が必要です。一般的に、私が探しているのは本物のレクサーです。特に、(独自の言語定義のために)独自の番号スタイルを定義(そして強調表示)する必要があります。listingsコード内の数値を強調表示することはできません。ただし、次のようなものを作成する必要があります。

必要な結果

listingsまた、文字列の任意の区切り文字にも対応できません。次の有効なRubyコードを検討してください。

s = %q!this is a string.!

ここで!は、ほとんどすべての区切り文字で置き換えることができます。

listingsUnicodeを処理できないこともかなり厄介ですが、それは別の問題です。)

理想的には、listingsより複雑な字句解析ルールを提供できる拡張機能を探しています。しかしそれを除いて、私は実行可能な代替案も探しています。

他のスレッドは、LaTeX出力を生成できるPygmentsの使用を提案しています。texments移行を容易にするためのパッケージもあります。

ただし、これには機能が非常に不足しています。特に、Iはに興味listingsスタイル行番号、ソースコード行参照、ソースコード(オプションラテックスを埋め込む可能性texclmathescapelistings)。

例として、listings置換が提供する必要のあるもののいくつかを示すソースコードタイプセットを次に示します。

LaTeXリストの例:横方向追加 [ビットサイドリングハックから変更された「サイドウェイの追加」]


Pygmentsなどの外部ツールの導入に消極的でない場合は、ドキュメントのMakefileを作成しないでください。
マイカ

6
これはtex.stackexchange.comに移行されるべきではありませんか?^^
Matthias

1
@Matthiasわかりません。私が投稿したときはtex.seはありませんでしたが、ここでは非常に便利なようです–質問は途方もない反響がありましたが、TeX.SEでは今まで誰も同様の質問を投稿していません。さらに、それは実際にはプログラミングとプログラミングツールに特に関連しているので、プログラマーはそれから恩恵を受ける人々だと思います
コンラートルドルフ

1
現在書いているドキュメントのLaTeXを忘れてしまう人のために:Office WordまたはLibreOffice Writerを使用すると、Eclipseなどからコードをコピーしてそこに貼り付けるだけで、色を保持できます。
MohamedEzz 2014年

3
@MemoryLeaksこのアドバイスが誰に役立つかわかりません:OfficeソフトウェアはLaTeXの有効な代替品ではありません(これはOfficeソフトウェアではなく、デスクトップパブリッシングシステムです。つまり、デスクトップパブリッシングシステムです。つまり、はるかに優れたタイポグラフィを提供します。 、オフィスソフトウェアに対する他のすべての利点は別として)。
Konrad Rudolph

回答:


352

Normanのアドバイスを心に留めて、ハイライトに(パッチを当てた)Pygmentsを使用して、バーストせずにできるだけ多くの機能を押し込んだソリューションをハッキングしました;-)

Pygmentsパッチがバージョン1.2でリリースされたら、LateXパッケージも作成しました…

ミントを提示

鋳造は、ラテックス中のハイライト表示一流の構文を提供するために、Pygmentsを使用したパッケージです。たとえば、次の出力が可能です。

派手なLaTeXの例

上記のコードを再現するための最小限のファイルを次に示します(Unicode文字を含めるには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

(しかし、ミントlatexand でも動作しpdflatexます…)

minted.styと同様にtexments.sty機能しますが、追加機能を使用できます。

入手方法

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


19
LaTeXでpygmentsを使用する方法を何時間も検索した後、さらに自分のソリューションをハッキングしようと何時間も費やした後、これは私が見つけた最高のものです。さらに良いことに、それは実際に機能します。これをありがとう。
sykora 2010年

2
ここでは、あなたがこれまでに行ってきた作業を感謝するために;)!
FilipDupanović2010

4
@Paul:Windowsでは全体がかなり厄介です。:-(うまくいけば、Pygmentsの次のバージョンは、ややこれを軽減ではなく、多くの場合、(それゆえとPythonでの作業を行う人々のためになるeasy_install)プロセスは非常にスムーズになることはありません。
コンラートルドルフ


1
@Paŭloありがとう。私はパッケージのすべての言及を読んでみます(私はGoogleアラートを持っています)が、いつも成功するとは限りません。あなたが私が実際に読んだと言った質問(どうやら:私はそれを支持したが、私は思い出せない)が、それはまったく簡単ではない。これにTikZを使用する "Ab"は悪いハックのようです…
Konrad Rudolph

6

TeXは(有名に)チューリング完全ですが、この拡張機能を自分で作成する必要があると確信しています。ドキュメントにより、元の作者がlistings2004年に孤立したこと、および2006年以降更新されていないことが明らかになっています。パッケージは数値リテラルのフォーマットを上書きするように設計されていませんが、の定義\lst@ProcessDigit。それが機能しない場合は、「識別子スタイル」オプションがどのように機能するかを詳細に理解する必要があり、数値リテラルに対してそのメカニズムを複製する必要があります。

外部ツールをツールチェーンに導入することにそれほど抵抗している理由がよくわかりませんが、そのため、余分な作業を行う必要があります。ソースコードを確認した後、変更listingsは可能だと思いますが、個人的には、代わりにLaTeXを前処理することを選択します。


私は外部ツールを導入することに全く消極的ではありません。実際、Pygmentsを使用することがおそらく最良の解決策だと思います。質問はどのように私はまだラテックスにエスケープを持ってできるように、スマートな方法でこれを行うために\labelコードの中です。
Konrad Rudolph、

の変更listingsについては、すでにその出典を確認しましたが、残念ながらまったくわかりません。私のTeXスキルはそのレベルにはほど遠いです。今まで、私はとにかくTeXのLaTeXサブセットしか使用していませんでした。
Konrad Rudolph、

1
外部ツールを導入する際の最大の問題は、公開している場合だと思います。多くの雑誌出版社(咳をするSPRINGERなど)は、生のLaTexで提出する必要があり、それをサーバーでコンパイルします。言うまでもなく、サードパーティのツールがサーバー上にない場合は、前処理をしない限りSOLになります(これにより、Texをドライブするユーティリティのほとんどが無効になります)。
Namey

ドキュメントが正しい場合、listingsパッケージは引き続き維持されますが、メンテナは変更され、バグ修正を受け取りました。ctan.org
pkg

1
@Namey、単なるデータポイント:mintedSpringerのLNCSパブリッシングプロセスを使用して論文をこっそりとこっそりと盗みました。
Volker Stolz

3

これは、構文を強調表示してソースコードをTeXおよびLaTeXに変換するパッケージです。カスタムプログラミング言語の定義を簡単に追加できます。

ハイライトは100のプログラミング言語をサポートし、50のカラーテーマを含みます。コードの再フォーマットとインデントを備えています。

私はそれがどのように機能するかを知るためにそれを使用していませんが、私が知っている誰かがそれがかなりうまく機能したと言いました。機会があれば自分で試してみます。


1
highlightピグメントのすべての問題を共有します。特に、その説明にあるとおり、これはLaTeXパッケージではありません。単にスタンドアロンのプログラムです。問題は、Pygmentsと同様に、LaTeX内から意味のある方法で使用し、すべての優れた機能を提供する方法ですlistings
Konrad Rudolph、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.