Podświetlanie kodu źródłowego w LaTeX

196

Muszę podświetlić kod źródłowy w LaTeX. Pakiet listingswydaje się najlepszym wyborem dla większości przypadków użycia i dla mnie był do tej pory.

Jednak teraz potrzebuję większej elastyczności. Zasadniczo to, czego szukam, to prawdziwy leksykon. W szczególności potrzebuję (dla własnej definicji języka), aby zdefiniować (i wyróżnić!) Własne style liczbowe. listingsnie zezwala na wyróżnianie liczb w kodzie. Muszę jednak stworzyć coś takiego:

Wymagany wynik

listingsrównież nie radzi sobie z dowolnymi ogranicznikami ciągów. Rozważ następujący poprawny kod Ruby:

s = %q!this is a string.!

Tutaj !można zastąpić prawie dowolnym separatorem.

(To listingsnie jest w stanie obsłużyć Unicode, jest również irytujące, ale to kolejny problem.)

Idealnie szukam rozszerzenia, listingsktóre pozwala mi na dostarczanie bardziej złożonych reguł leksykalnych. Ale poza tym szukam również realnych alternatyw.

Inne wątki sugerują użycie Pygments, które mogą generować wyjście LaTeX. Jest nawet pakiet - texments- ułatwiający przejście.

Jednak to bardzo brakuje funkcji. W szczególności interesuje mnie listingsnumeracja linii w stylu, odwołania do linii kodu źródłowego oraz możliwość osadzenia LaTeX w kodzie źródłowym (opcje texcli mathescapein listings).

Jako przykład podajemy zestaw kodu źródłowego, listingsktóry pokazuje niektóre rzeczy, które powinien zapewnić zamiennik:

Przykład list LaTeX: Dodawanie z boku [„Dodatek boczny” zmodyfikowany z Bit Twiddling Hacks]

Konrad Rudolph
źródło
jeśli nie masz ochoty na wprowadzanie zewnętrznych narzędzi, takich jak pigmety, to dlaczego nie napisać pliku makefile dla swojego dokumentu?
Mica
6
Czy nie powinno to zostać przeniesione do tex.stackexchange.com ? ^^
Matthias
1
@Matthias Nie jestem pewien. Kiedy go opublikowałem, nie było tex.se, ale teraz wydaje się całkiem przydatne - pytanie miało ogromne echo, podczas gdy na TeX.SE nikt jak dotąd nie zadał podobnego pytania. Co więcej, w rzeczywistości dotyczy konkretnie programowania i narzędzi programistycznych, więc myślę, że programiści to ludzie, którzy z niego korzystają.
Konrad Rudolph
1
Dla tych, którzy mogą zapomnieć o LaTeXie dla dokumentu, który obecnie piszą: Zauważ, że w Office Word lub LibreOffice Writer, po prostu kopiuj / wklej swój kod z np. Eclipse i tam zachowaj kolory !!
MohamedEzz,
3
@MemoryLeaks Nie jestem pewien, komu ta rada jest bardzo przydatna: oprogramowanie Office nie jest właściwym substytutem LaTeX (który nie jest oprogramowaniem biurowym, to system do publikacji na pulpicie, co w skrócie oznacza, że ​​zapewnia znacznie lepszą typografię , oprócz wszystkich innych zalet w porównaniu z oprogramowaniem biurowym).
Konrad Rudolph

Odpowiedzi:

353

Biorąc porady Normana do serca, mam posiekany wspólnie rozwiązanie, które stosowane (a połatany ) Pygments do wyróżniania i pchnął w tak wielu funkcji, jak to możliwe bez rozerwania ;-)

Stworzyłem również pakiet LateX, kiedy moja łatka Pygments została wydana w wersji 1.2

Prezentacja wybita

wybite to pakiet, który wykorzystuje Pygments celu zapewnienia najwyższej klasy podświetlanie składni w LaTeX. Na przykład pozwala na następujące dane wyjściowe.

fantazyjny przykład LaTeXa

Oto minimalny plik do odtworzenia powyższego kodu (zauważ, że włączenie znaków Unicode może wymagać 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}

Można to wpisać za pomocą następującego polecenia:

xelatex -shell-escape test.tex

(Ale wybite również współpracuje z latexi pdflatex...)

minted.stydziała podobnie, texments.styale umożliwia dodatkowe funkcje.

Jak to zdobyć

Jeszcze raz dziękuję Normanowi za motywowanie mnie do wyprodukowania tego opakowania.

Konrad Rudolph
źródło
19
Po wielu godzinach poszukiwań, jak używać piggetów z LaTeX i kolejnych godzinach próbach zhakowania mojego własnego rozwiązania, jest to najlepsze, jakie znalazłem. Jeszcze lepiej, to naprawdę działa. Dzięki za to.
sykora
2
tutaj, aby docenić pracę, którą wykonałeś w sposób stawający się;)!
Filip Dupanović,
4
@Paul: Prawdą jest, że cała sprawa jest dość niechlujna w systemie Windows. :-( Mam nadzieję, że kolejna wersja Pygments nieco to złagodzi, ale dla osób, które często nie pracują z Pythonem (i stąd easy_install), proces ten nigdy nie będzie bardzo płynny.
Konrad Rudolph
1
Na stronie TeX SE jest teraz sporo pytań na temat twojego pakietu , a ja właśnie trafiłem na jedno z prośbą o funkcję (ukrytą w komentarzach) . Możesz rzucić okiem.
Paŭlo Ebermann
1
@ Paŭlo Dzięki. Próbuję przeczytać wszystkie wzmianki o pakiecie (otrzymałem alert Google), ale nie zawsze mi się to udaje. Pytanie, które wspomniałeś, przeczytałem (najwyraźniej: głosowałem za nim, ale nie pamiętam), ale wcale nie jest proste. „Ab” używający do tego TikZ wydaje się złym hackem…
Konrad Rudolph
6

TeX jest (słynny) w pełni Turinga, ale jestem pewien, że będziesz musiał napisać to rozszerzenie samodzielnie. Dokumentacja wyjaśnia, że ​​oryginalny autor listingsosierocił go w 2004 r. I że nie był aktualizowany od 2006 r. Pakiet nie został zaprojektowany w celu zastąpienia formatowania literałów liczbowych, ale można go zmodyfikować, zmieniając definicja \lst@ProcessDigit. Jeśli to nie zadziała, musisz szczegółowo zrozumieć, w jaki sposób działają opcje „stylu identyfikatora”, i będziesz musiał powielić tę maszynerię dla literałów liczbowych.

Nie do końca rozumiem, dlaczego jesteś tak niechętny wprowadzeniu zewnętrznego narzędzia do swojego zestawu narzędzi, ale ponieważ jesteś, będziesz musiał wykonać dodatkową pracę. Po zapoznaniu się z kodem źródłowym oczekuję, że modyfikacja listingspowinna być możliwa, ale osobiście wolałbym zamiast tego wstępnie przetworzyć mój LaTeX.

Norman Ramsey
źródło
Nie jestem wcale niechętny wprowadzaniu narzędzi zewnętrznych - w rzeczywistości uważam, że korzystanie z Pygments jest prawdopodobnie najlepszym rozwiązaniem. Pytanie brzmi: jak to zrobić w inteligentny sposób, aby nadal móc mieć ucieczki do LaTeXa \labelwewnątrz kodu.
Konrad Rudolph
Co do zmiany listings, to już widziałem jej źródło - i niestety w ogóle go nie rozumiem. Moje umiejętności TeX nie są nigdzie w pobliżu tego poziomu. Do tej pory i tak korzystałem tylko z podzbioru LaTeX TeX-a.
Konrad Rudolph,
1
Powiedziałbym, że największym problemem z wprowadzeniem zewnętrznego narzędzia jest to, że publikujesz. Wielu wydawców czasopism (kaszel SPRINGER i inni) wymaga złożenia w surowym LaTexie, który jest następnie kompilowany na ich serwerach. Nie trzeba dodawać, że jeśli twoje narzędzie innej firmy nie znajduje się na ich serwerze, jesteś SOL, chyba że wstępnie przetworzysz (co pokona większość narzędzia pozwalającego na jazdę Texem).
Namey
Jeśli dokumentacja jest poprawna, pakiet list jest nadal utrzymywany - jednak opiekun zmienił się i otrzymał poprawki: ctan.org/pkg/listings?lang=pl
DetlevCM
1
@Namey, tylko punkt danych: po prostu udało mi się pomyślnie przekraść gazetę za mintedpomocą procesu publikowania LNCS Springera.
Volker Stolz
3

Jest to pakiet, który konwertuje kod źródłowy na TeX i LaTeX z podświetlaniem składni. Możliwe jest łatwe dodawanie niestandardowych definicji języka programowania.

Highlight obsługuje 100 języków programowania i zawiera 50 motywów kolorystycznych. Zawiera formatowanie i wcięcie kodu.

Nie użyłem go, żeby wiedzieć, jak DOBRZE działa, ale ktoś inny, kogo znam, powiedział, że działa całkiem dobrze. Jeśli będę miał okazję, sam to wypróbuję i zobaczę.

homerj
źródło
1
highlightpodziela jednak wszystkie problemy Pygments. W szczególności nie jest to pakiet LaTeX , pomimo tego, co mówi jego opis. Jest to po prostu samodzielny program. Problem, podobnie jak w przypadku Pygments, polega na tym, jak używać go w sposób znaczący z poziomu LaTeX i zapewniać wszystkie miłe rzeczy listings.
Konrad Rudolph