Làm nổi bật mã nguồn trong LaTeX


196

Tôi cần làm nổi bật mã nguồn trong LaTeX. Gói listingsdường như là sự lựa chọn tốt nhất cho hầu hết các trường hợp sử dụng và đối với tôi, cho đến bây giờ.

Tuy nhiên, bây giờ tôi cần linh hoạt hơn. Nói chung, những gì tôi đang tìm kiếm là một từ vựng thực sự . Cụ thể, tôi cần (đối với một định nghĩa ngôn ngữ riêng) để xác định (và tô sáng!) Các kiểu số riêng. listingskhông cho phép đánh dấu các số trong mã. Tuy nhiên, tôi cần phải sản xuất một cái gì đó như thế này:

Kết quả bắt buộc

listingscũng không thể đối phó với các dấu phân cách tùy ý cho các chuỗi. Hãy xem xét mã Ruby hợp lệ sau:

s = %q!this is a string.!

Ở đây, !có thể được thay thế bằng hầu như bất kỳ dấu phân cách.

(Điều đó listingskhông thể xử lý Unicode cũng khá khó chịu, nhưng đó là một vấn đề khác.)

Lý tưởng nhất, tôi đang tìm kiếm một phần mở rộng listingscho phép tôi cung cấp các quy tắc từ vựng phức tạp hơn. Nhưng để ngăn chặn điều đó, tôi cũng đang tìm kiếm các lựa chọn thay thế khả thi.

Các luồng khác đã đề xuất sử dụng Pygments có thể tạo đầu ra LaTeX. Thậm chí còn có một gói - texments- để dễ dàng chuyển đổi.

Tuy nhiên, điều này vô cùng thiếu tính năng. Cụ thể, tôi quan tâm đến việc listingsđánh số dòng kiểu, tham chiếu dòng mã nguồn và khả năng nhúng LaTeX vào mã nguồn (tùy chọn texclmathescapetrong listings).

Ví dụ, đây là một loại mã nguồn listingscho thấy một số điều mà một sự thay thế cũng sẽ cung cấp:

Ví dụ về danh sách LaTeX: Bổ sung Sideways [Thêm Sideways bổ sung, cải tiến từ hack Twiddling]


nếu bạn không ngần ngại mang theo các công cụ bên ngoài như pygments, thì tại sao bạn không viết một makefile cho tài liệu của bạn?
Mica

6
Không nên chuyển nó sang tex.stackexchange.com ? ^^
Matthias

1
@Matthias Không chắc chắn. Khi tôi đăng nó không có tex.se nhưng bây giờ nó có vẻ khá hữu ích ở đây - câu hỏi đã có tiếng vang rất lớn, trong khi trên TeX.SE cho đến nay không ai đăng một câu hỏi tương tự. Hơn nữa, nó thực sự liên quan cụ thể đến các công cụ lập trình và lập trình nên tôi đoán các lập trình viên là những người được hưởng lợi từ nó.
Konrad Rudolph

1
Đối với những người có thể quên LaTeX cho tài liệu họ đang viết: Lưu ý rằng với Office Word hoặc LibreOffice Writer, bạn chỉ cần sao chép / dán mã của mình từ ví dụ Eclipse vào đó và giữ cho màu sắc của bạn được bảo toàn !!
MohamedEzz

3
@MemoryLeaks Tôi không chắc chắn ai lời khuyên này là terribly hữu ích: Phần mềm văn phòng không phải là một sự thay thế hợp lệ cho LaTeX (đó là không một phần mềm văn phòng, đó là một hệ thống xuất bản máy tính để bàn, trong đó, trong Tóm lại, phương tiện mà nó cung cấp nhiều typography vượt trội , ngoài tất cả các lợi thế khác của nó so với phần mềm văn phòng).
Konrad Rudolph

Câu trả lời:


352

Nắm bắt lời khuyên của Norman, tôi đã cùng nhau tìm ra một giải pháp sử dụng (một bản vá ) Pygments để làm nổi bật và đẩy vào càng nhiều tính năng càng tốt mà không bị vỡ ;-)

Tôi cũng đã tạo gói lateX, khi bản vá Pygments của tôi được phát hành trong phiên bản 1.2 .

Trình bày đúc

minted là gói sử dụng Pygments để cung cấp tô sáng cú pháp hàng đầu trong LaTeX. Ví dụ, nó cho phép đầu ra sau.

ví dụ LaTeX ưa thích

Đây là một tệp tối thiểu để sao chép mã ở trên (lưu ý rằng bao gồm các ký tự Unicode có thể yêu cầu 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}

Đây có thể là kiểu chữ bằng cách sử dụng lệnh sau:

xelatex -shell-escape test.tex

(Nhưng đúc cũng hoạt động với latexvà Giáo dục pdflatex)

minted.styhoạt động tương tự texments.stynhưng cho phép các tính năng bổ sung.

Làm thế nào để có được nó

Một lần nữa, cảm ơn Norman đã thúc đẩy tôi sản xuất gói này.


19
Sau nhiều giờ tìm kiếm về cách sử dụng pygments với LaTeX và thêm nhiều giờ cố gắng để cùng nhau tìm ra giải pháp của riêng tôi, đây là cách tốt nhất tôi tìm thấy. Tốt hơn nữa, nó thực sự hoạt động. Cảm ơn vì điều đó.
sykora

2
ở đây chỉ để đánh giá cao công việc bạn đã thực hiện theo cách trở thành;)!
Filip Dupanović

4
@Paul: Đúng là toàn bộ mọi thứ khá lộn xộn trên Windows. :-( Hy vọng, phiên bản tiếp theo của Pygments sẽ giảm bớt phần nào điều này, nhưng đối với những người không thường xuyên làm việc với Python (và do đó easy_install) thì quá trình sẽ không bao giờ suôn sẻ.
Konrad Rudolph

1
Trên trang TeX SE hiện có khá nhiều câu hỏi về gói của bạn và tôi chỉ đánh một câu với một loại yêu cầu tính năng (ẩn trong các bình luận) . Bạn có thể muốn có một cái nhìn.
Paŭlo Ebermann

1
@ Paŭlo Cảm ơn. Tôi cố gắng đọc tất cả các đề cập của gói (tôi đã nhận được thông báo của Google) nhưng tôi không luôn thành công. Câu hỏi mà bạn đề cập tôi thực sự đã đọc (rõ ràng: Tôi đã nêu lên nhưng tôi không thể nhớ được) nhưng nó hoàn toàn không đơn giản. Sử dụng TikZ cho điều này có vẻ như là một vụ hack tồi
Konrad Rudolph

6

TeX (nổi tiếng) Turing-perfect, nhưng tôi khá chắc chắn rằng bạn sẽ phải tự viết phần mở rộng này. Tài liệu cho thấy rõ rằng tác giả gốc của listingsnó mồ côi năm 2004 và nó chưa được cập nhật từ năm 2006. Gói không được thiết kế để ghi đè định dạng của chữ số, nhưng bạn có thể sửa đổi nó bằng cách thay đổi định nghĩa của \lst@ProcessDigit. Nếu điều đó không hiệu quả, bạn sẽ phải hiểu chi tiết cách các tùy chọn "kiểu định danh" hoạt động và bạn sẽ phải sao chép máy móc đó cho chữ số của mình.

Tôi hoàn toàn không hiểu tại sao bạn lại miễn cưỡng giới thiệu một công cụ bên ngoài vào chuỗi công cụ của bạn, nhưng vì bạn là vậy, bạn sẽ phải làm thêm. Sau khi xem mã nguồn, tôi hy vọng rằng việc sửa đổi listingslà có thể, nhưng cá nhân tôi sẽ chọn xử lý trước LaTeX của mình.


Tôi hoàn toàn không ngần ngại giới thiệu các công cụ bên ngoài - thực tế, tôi nghĩ rằng sử dụng Pygments có lẽ là giải pháp tốt nhất. Câu hỏi là làm thế nào để làm điều này một cách thông minh để tôi vẫn có thể thoát khỏi LaTeX và \labels bên trong mã.
Konrad Rudolph

Về việc thay đổi listings, tôi đã xem xét nguồn gốc của nó - và thật không may, tôi hoàn toàn không hiểu gì về nó. Kỹ năng TeX của tôi không ở đâu gần mức đó. Cho đến bây giờ, tôi chỉ mới sử dụng tập hợp con LaTeX của TeX.
Konrad Rudolph

1
Tôi muốn nói rằng vấn đề lớn nhất khi giới thiệu một công cụ bên ngoài là nếu bạn xuất bản. Rất nhiều nhà xuất bản tạp chí (XUÂN ho và những người khác) yêu cầu nộp bản thô LaTex, sau đó được biên dịch trên máy chủ của họ. Không cần phải nói, nếu công cụ bên thứ 3 của bạn không có trên máy chủ của họ, bạn sẽ là SOL trừ khi bạn xử lý trước (điều này đánh bại hầu hết các tiện ích cho phép ổ đĩa Tex).
Tên

Nếu tài liệu là chính xác, gói danh sách vẫn được duy trì - tuy nhiên người bảo trì đã thay đổi và nó đã nhận được lỗi: ctan.org/pkg/listings?lang=en
DetlevCM

1
@Namey, chỉ là một điểm dữ liệu: Tôi vừa quản lý để lén thành công một bài báo bằng cách sử dụng mintedquy trình xuất bản LNCS của Springer.
Volker Stolz

3

Đây là gói chuyển đổi mã nguồn thành TeX và LaTeX với cú pháp tô sáng. Có thể thêm các định nghĩa ngôn ngữ lập trình tùy chỉnh một cách dễ dàng.

Highlight hỗ trợ 100 ngôn ngữ lập trình và bao gồm 50 chủ đề màu. Nó có tính năng định dạng lại mã và thụt lề.

Tôi đã không sử dụng nó để biết nó hoạt động như thế nào, nhưng một người khác mà tôi biết nói rằng nó hoạt động khá tốt. Nếu tôi có cơ hội, tôi sẽ tự mình thử và xem.


1
highlightchia sẻ tất cả các vấn đề của Pygments, mặc dù. Đặc biệt, nó không phải là gói LaTeX , mặc dù mô tả của nó nói gì. Nó chỉ đơn giản là một chương trình độc lập. Vấn đề, giống như với Pygments, là làm thế nào để sử dụng nó một cách có ý nghĩa từ bên trong LaTeX và cung cấp tất cả những điều tốt đẹp listingscó.
Konrad Rudolph
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.