Menyoroti kode sumber di LaTeX

196

Saya perlu menyoroti kode sumber di LaTeX. Paket tersebut listingstampaknya menjadi pilihan terbaik untuk sebagian besar kasus penggunaan dan bagi saya, sampai sekarang.

Namun, sekarang saya perlu lebih banyak fleksibilitas. Secara umum, apa yang saya cari adalah lexer nyata . Secara khusus, saya perlu (untuk definisi bahasa sendiri) untuk mendefinisikan (dan menyoroti!) Gaya nomor sendiri. listingstidak mengizinkan penyorotan angka dalam kode. Namun, saya perlu membuat sesuatu seperti ini:

Hasil yang dibutuhkan

listingsjuga tidak dapat mengatasi pembatas acak untuk string. Pertimbangkan kode Ruby yang valid berikut:

s = %q!this is a string.!

Di sini, !dapat diganti oleh hampir semua pembatas.

(Itu listingstidak bisa menangani Unicode juga cukup menjengkelkan, tapi itu masalah lain.)

Idealnya, saya mencari perpanjangan listingsyang memungkinkan saya untuk memberikan aturan lexing yang lebih kompleks. Tetapi selain itu, saya juga mencari alternatif yang layak.

Utas lain menyarankan menggunakan Pygments yang dapat menghasilkan keluaran LaTeX. Bahkan ada paket - texments- untuk memudahkan transisi.

Namun, ini sangat kekurangan fitur. Secara khusus, saya tertarik pada listingspenomoran baris-gaya, referensi baris kode sumber, dan kemungkinan menanamkan LaTeX dalam kode sumber (opsi texcldan mathescapedalam listings).

Sebagai contoh, inilah set kode sumber listingsyang menunjukkan beberapa hal yang harus disediakan oleh pengganti:

Contoh daftar LaTeX: Tambahan sideways ["Tambahan Sideways" dimodifikasi dari Bit Twiddling Hacks]

Konrad Rudolph
sumber
jika Anda tidak enggan membawa alat eksternal seperti pygments, lalu mengapa tidak menulis makefile untuk dokumen Anda?
Mica
6
Bukankah ini harus dimigrasikan ke tex.stackexchange.com ? ^^
Matthias
1
@Matithias Tidak yakin. Ketika saya mempostingnya tidak ada tex.se tapi sekarang tampaknya cukup berguna di sini - pertanyaannya memiliki gema yang luar biasa, sementara di TeX.SE sejauh ini tidak ada yang memposting pertanyaan serupa. Lebih jauh lagi, ini sebenarnya berhubungan secara khusus dengan pemrograman dan alat pemrograman jadi saya kira programmer adalah orang-orang yang mendapat manfaat darinya.
Konrad Rudolph
1
Bagi mereka yang sudah bisa melupakan LaTeX untuk dokumen yang sedang mereka tulis: Perhatikan bahwa dengan Office Word, atau LibreOffice Writer, Anda cukup menyalin / menempelkan kode Anda dari misalnya Eclipse ke sana dan mempertahankan warna Anda !!
MohamedEzz
3
@MemoryLeaks Saya tidak yakin siapa saran ini yang sangat berguna: Perangkat lunak perkantoran bukan pengganti yang valid untuk LaTeX (yang bukan perangkat lunak perkantoran, ini adalah sistem penerbitan desktop, yang, singkatnya, berarti memberikan tipografi yang jauh lebih unggul , terlepas dari semua keunggulan lainnya atas perangkat lunak perkantoran).
Konrad Rudolph

Jawaban:

352

Mengambil nasihat Norman ke dalam hati, saya telah meretas bersama solusi yang menggunakan Pygments ( tambalan ) untuk menyoroti dan mendorong sebanyak mungkin fitur tanpa meledak ;-)

Saya juga telah membuat paket LateX, setelah patch Pygments saya dirilis di versi 1.2 ...

Menyajikan dicetak

minted adalah paket yang menggunakan Pygments untuk memberikan highlight sintaksis terkemuka di LaTeX. Sebagai contoh, ini memungkinkan output berikut.

contoh LaTeX yang mewah

Berikut adalah file minimal untuk mereproduksi kode di atas (perhatikan bahwa termasuk karakter Unicode mungkin memerlukan 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}

Ini dapat diketik menggunakan perintah berikut:

xelatex -shell-escape test.tex

(Tapi dicetak juga bekerja dengan latexdan pdflatex...)

minted.stybekerja serupa dengan texments.stytetapi memungkinkan fitur tambahan.

Bagaimana cara mendapatkannya

Sekali lagi, terima kasih kepada Norman karena telah memotivasi saya untuk memproduksi paket ini.

Konrad Rudolph
sumber
19
Setelah berjam-jam mencari cara menggunakan pygments dengan LaTeX, dan lebih banyak waktu mencoba meretas solusi saya sendiri, ini adalah yang terbaik yang saya temukan. Lebih baik lagi, itu benar-benar berfungsi. Terima kasih untuk ini.
sykora
2
di sini hanya untuk menghargai pekerjaan yang telah Anda lakukan;)!
Filip Dupanovic
4
@ Paul: Memang benar semuanya berantakan di Windows. :-( Mudah-mudahan, versi Pygments berikutnya akan sedikit meringankan ini, tetapi bagi orang-orang yang tidak sering bekerja dengan Python (dan karenanya easy_install) prosesnya tidak akan pernah sangat mulus.
Konrad Rudolph
1
Di situs TeX SE sekarang ada beberapa pertanyaan tentang paket Anda , dan saya baru saja menekan satu dengan semacam permintaan fitur (tersembunyi di komentar) . Anda mungkin ingin melihatnya.
Paŭlo Ebermann
1
@ Paŭlo Terima kasih. Saya mencoba membaca semua menyebutkan paket (saya punya Google alert) tetapi saya tidak selalu berhasil. Pertanyaan yang Anda sebutkan sebenarnya sudah saya baca (rupanya: saya menaikkannya tetapi saya tidak bisa mengingatnya) tetapi itu sama sekali tidak langsung. "Ab" menggunakan TikZ untuk ini sepertinya hack yang buruk ...
Konrad Rudolph
6

TeX (terkenal) Turing-complete, tapi saya cukup yakin Anda harus menulis ekstensi ini sendiri. Dokumentasinya memperjelas bahwa penulis asli listingsmenjadi yatim piatu pada tahun 2004, dan belum diperbarui sejak 2006. Paket ini tidak dirancang untuk mengganti format literal angka, tetapi Anda mungkin dapat memodifikasinya dengan mengubah definisi\lst@ProcessDigit . Jika itu tidak berhasil, Anda harus memahami secara detail bagaimana opsi "gaya pengenal" bekerja, dan Anda harus menduplikasi mesin itu untuk literal numerik Anda.

Saya tidak begitu mengerti mengapa Anda begitu enggan untuk memperkenalkan alat eksternal ke dalam rantai alat Anda, tetapi karena Anda, Anda harus melakukan pekerjaan ekstra. Setelah melihat kode sumber, saya berharap bahwa memodifikasi listingsharus dimungkinkan, tetapi saya pribadi akan memilih untuk memproses ulang LaTeX saya sebagai gantinya.

Norman Ramsey
sumber
Saya sama sekali tidak enggan untuk memperkenalkan alat eksternal - pada kenyataannya, saya pikir menggunakan Pygments mungkin adalah solusi terbaik. Pertanyaannya adalah bagaimana melakukan ini dengan cara yang cerdas sehingga saya masih bisa lolos ke LaTeX dan \labels di dalam kode.
Konrad Rudolph
Mengenai perubahan listings, saya sudah melihat sumbernya - dan sayangnya, saya tidak mengerti sama sekali. Keterampilan TeX saya jauh dari level itu. Sampai sekarang, saya hanya pernah menggunakan subset LaTeX dari TeX.
Konrad Rudolph
1
Saya akan mengatakan bahwa masalah terbesar dengan memperkenalkan alat eksternal adalah jika Anda menerbitkan. Banyak penerbit jurnal (batuk-batuk SPRINGER, dan lain-lain) memerlukan pengajuan dalam LaTex mentah, yang kemudian dikompilasi di server mereka. Tidak perlu dikatakan, jika alat pihak ke-3 Anda tidak ada di server mereka, Anda SOL kecuali Anda melakukan pra-proses (yang mengalahkan sebagian besar utilitas membiarkan Tex drive).
Namey
Jika dokumentasinya benar, paket listing masih dipertahankan - namun pengelola berubah dan telah menerima perbaikan bug: ctan.org/pkg/listings?lang=en
DetlevCM
1
@Namey, hanya titik data: Saya hanya berhasil menyelinap menggunakan kertas mintedmelalui proses penerbitan LNCS Springer.
Volker Stolz
3

Ini adalah paket yang mengubah kode sumber ke TeX dan LaTeX dengan penyorotan sintaksis. Dimungkinkan untuk menambahkan definisi bahasa pemrograman kustom dengan mudah.

Sorot mendukung 100 bahasa pemrograman dan termasuk 50 tema warna. Ini fitur pemformatan ulang dan indentasi kode.

Saya belum menggunakannya untuk mengetahui cara kerja BAIK, tetapi orang lain yang saya kenal mengatakan itu bekerja dengan cukup baik. Jika saya mendapat kesempatan, saya akan mencobanya sendiri dan melihat.

homerj
sumber
1
highlightberbagi semua masalah Pygments. Secara khusus, ini bukan paket LaTeX , terlepas dari apa yang dikatakan oleh deskripsinya. Ini hanyalah program yang berdiri sendiri. Masalahnya, seperti halnya dengan Pygments, adalah bagaimana menggunakannya secara bermakna dari dalam LaTeX dan menyediakan semua hal-hal baik yang listingsdimiliki.
Konrad Rudolph