LaTeX'te kaynak kodu vurgulama


196

LaTeX kaynak kodu vurgulamak gerekiyor. Paket listings, çoğu kullanım durumu için en iyi seçim gibi görünüyor ve benim için şimdiye kadar öyleydi.

Ancak şimdi daha fazla esnekliğe ihtiyacım var. Genellikle aradığım şey gerçek bir sözlük. Özellikle, (kendi dil tanımı için) kendi sayı stillerini tanımlamak (ve vurgulamak!) Gerekir. listingskoddaki sayıların vurgulanmasına izin vermez. Ancak, böyle bir şey üretmek gerekir:

Gerekli sonuç

listingsdizeler için isteğe bağlı sınırlayıcılarla başa çıkamaz. Aşağıdaki geçerli Ruby kodunu göz önünde bulundurun:

s = %q!this is a string.!

Burada, !hemen hemen her sınırlayıcı ile değiştirilebilir .

(Bu listingsUnicode'la başa çıkamaz da oldukça sinir bozucu, ama bu başka bir sorun.)

İdeal olarak, bunun listingsdaha karmaşık lexing kuralları sağlamamı sağlayan bir uzantı arıyorum . Ancak bunu engellemek için, uygulanabilir alternatifler de arıyorum.

Diğer dişler , LaTeX çıktısı üretebilen Pygments kullanılmasını önerdi . texmentsGeçişi kolaylaştırmak için bir paket bile var .

Ancak, bu özelliklerden yoksundur. Özellikle, ilgileniyorum listingstarzı Satır numaralandırma, kaynak kod satırı referanslar ve kaynak kodunda (seçeneklerden LaTeX gömme olasılığı texclve mathescapede listings).

Örnek olarak, listingsbir değiştirme işleminin de sağlaması gereken bazı şeyleri gösteren bir kaynak kodu dizisi:

LaTeX listeleri örneği: Yanlara ekleme [“Twiddling Hacks'den değiştirilen“ yandan ekleme ”


Eğer pygments gibi harici araçlar getirmek konusunda isteksiz değilseniz, neden sadece belgeniz için bir makefile yazmıyorsunuz?
Mica


1
@Matthias Emin değilim. Ben yayınladı zaman tex.se yoktu ama şimdi burada oldukça yararlı görünüyor - soru muazzam bir yankı vardı, TeX.SE üzerinde şimdiye kadar hiç kimse benzer bir soru yayınlamadı. Ayrıca, özellikle programlama ve programlama araçları ile ilgilidir, bu yüzden programcılar bundan faydalanan insanlardır.
Konrad Rudolph

1
Şu anda yazdıkları belge için LaTeX'i unutabilenler için: Office Word veya LibreOffice Writer ile kodunuzu örneğin Eclipse'den oraya kopyalayıp yapıştırdığınızı ve renklerinizi koruduğunuzu unutmayın!
MohamedEzz

3
@MemoryLeaks Bu tavsiyenin kimin çok yararlı olduğundan emin değilim: Ofis yazılımı LaTeX için geçerli bir alternatif değil (bu bir ofis yazılımı değil , kısacası, çok daha üstün tipografi sağladığı anlamına gelen bir masaüstü yayıncılık sistemidir. , ofis yazılımlarına göre diğer tüm avantajları dışında).
Konrad Rudolph

Yanıtlar:


355

Norman'ın kalbine tavsiyesini alarak, vurgulamak ve patlamaksızın olabildiğince çok özelliği itmek için ( yamalı ) Pygments kullanılan bir çözümü hackledim ;-)

Ayrıca Pygments düzeltme eki 1.2 sürümünde yayımlandıktan sonra bir LateX paketi oluşturdum ...

Darp ediliyor

NANELİ kullanımları Pygments LaTeX'de vurgulama üst seviye sözdizimi temin etmek üzere bir pakettir. Örneğin, aşağıdaki çıktıya izin verir.

süslü LaTeX örneği

Yukarıdaki kodu yeniden oluşturmak için minimal bir dosya (Unicode karakterleri dahil XeTeX gerektirebilir dikkat edin)!

\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}

Bu, aşağıdaki komut kullanılarak yazılabilir:

xelatex -shell-escape test.tex

(Ama darp ile de çalışır latexve pdflatex…)

minted.stybenzer şekilde çalışır, texments.styancak ek özelliklere izin verir.

Nasıl alınır?

Norman'a bu paketi üretmem için motive ettiği için bir kez daha teşekkürler.


19
Pigmentleri LaTeX ile nasıl kullanacağınızı araştırdıktan ve kendi çözümümü hacklemeye çalıştığım saatler sonra, bulduğum en iyisi bu. Daha da iyisi, aslında işe yarıyor. Bunun için teşekkürler.
sykora

2
burada sadece yaptığınız işi takdir etmek için;)!
Filip Dupanović

4
@ Paul: Her şeyin Windows üzerinde oldukça dağınık olduğu doğrudur. :-( Umarım, Pygments'ın bir sonraki versiyonu bunu biraz hafifletir, ancak Python (ve dolayısıyla easy_install) ile sık sık çalışmayan insanlar için süreç asla çok düzgün olmayacaktır.
Konrad Rudolph


1
@ Paŭlo Teşekkürler. Paketin tüm açıklamalarını okumaya çalışıyorum (Google uyarısı aldım) ama her zaman başarılı olamıyorum. Bahsettiğiniz soru aslında okudum (görünüşe göre: Onu iptal ettim ama hatırlayamıyorum) ama hiç de kolay değil. Bunun için TikZ kullanarak “Ab” kötü bir saldırı gibi görünüyor…
Konrad Rudolph

6

TeX (ünlü) Turing-complete, ancak bu uzantıyı kendiniz yazmak zorunda kalacağınızdan eminim. Belgeler, orijinal yazarın listings2004 yılında yetim ettiğini ve 2006'dan beri güncellenmediğini açıkça ortaya koyuyor . Paket, sayısal değişmezlerin biçimlendirmesini geçersiz kılacak şekilde tasarlanmamıştır, ancak nedir, anlamı \lst@ProcessDigit,. Bu işe yaramazsa, "tanımlayıcı stili" seçeneklerinin nasıl çalıştığını ayrıntılı bir şekilde anlamanız ve bu makineleri sayısal değişmezleriniz için çoğaltmanız gerekir.

Neden araç zincirinize harici bir araç tanıtmak konusunda bu kadar isteksiz olduğunuzu tam olarak anlamıyorum, ancak olduğunuz için ekstra iş yapmanız gerekecek. Kaynak koduna baktıktan sonra değiştirmenin listingsmümkün olmasını bekliyorum , ancak şahsen bunun yerine LaTeX'imi önişlemeyi tercih ediyorum.


Dış araçları tanıtmak konusunda hiç isteksiz değilim - aslında, Pygments'ı kullanmanın muhtemelen en iyi çözüm olduğunu düşünüyorum. Soru, hala kod içinde LaTeX ve s kaçar böylece akıllı bir şekilde nasıl yapılacağıdır \label.
Konrad Rudolph

Değişime gelince listings, kaynağına zaten baktım - ve ne yazık ki, hiç anlamıyorum. TeX becerilerim bu seviyeye yakın değil. Şimdiye kadar, sadece TeX'in LaTeX alt kümesini zaten kullandım.
Konrad Rudolph

1
Harici bir araç tanıtmakla ilgili en büyük sorunun yayınlı olmanızdır. Çok sayıda dergi yayıncısı (öksürük öksürük SPRINGER ve diğerleri) ham LaTex'e gönderilmesini gerektirir ve bu da daha sonra sunucularında derlenir. Söylemeye gerek yok, 3. taraf aracınız sunucularında değilse, ön işlem yapmadıkça (Tex sürücüsüne izin verme yardımcı programının çoğunu yenen) SOL'sunuz.
Namey

Dokümantasyon doğruysa, giriş paketi hala korunur - ancak bakımcı
DetlevCM

1
@Namey, sadece bir veri noktası: mintedSpringer'in LNCS yayınlama sürecini kullanarak başarılı bir şekilde bir kağıt gizlice başardım .
Volker Stolz

3

Bu , sözdizimi vurgulamasıyla kaynak kodunu TeX ve LaTeX'e dönüştüren bir pakettir. Özel programlama dili tanımlarını kolayca eklemek mümkündür.

Vurgulama 100 programlama dilini destekler ve 50 renk teması içerir. Kod yeniden biçimlendirme ve girintileme özelliklerine sahiptir.

Nasıl çalıştığını bilmek için kullanmadım, ama tanıdığım biri oldukça iyi çalıştığını söyledi. Eğer bir şansım olursa, kendim deneyeceğim ve göreceğim.


1
highlightyine de Pygments'ın tüm sorunlarını paylaşıyor. Özellikle, açıklamasına rağmen, bir LaTeX paketi değildir . Bu sadece bağımsız bir programdır. Sorun, tıpkı Pygments'ta olduğu gibi, LaTeX içinden anlamlı bir şekilde nasıl kullanılacağı ve listingssahip olduğu tüm güzel şeyleri nasıl sağlayacağıdır .
Konrad Rudolph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.