Chèn mã vào tài liệu LaTeX này bằng cách thụt lề


425

Làm cách nào để tôi chèn mã vào tài liệu LaTeX? Có cái gì đó như:

\begin{code}## Heading ##
...
\end{code}

Điều duy nhất tôi thực sự cần là thụt lề và một phông chữ có chiều rộng cố định. Làm nổi bật cú pháp có thể là tốt mặc dù nó chắc chắn là không cần thiết.


Không phải là một bản sao chính xác, nhưng các câu trả lời bao gồm cùng một nền tảng: xem stackoverflow.com/questions/741985/ mẹo
Charles Stewart

Tôi cũng có một câu hỏi tiếp theo ở đây: stackoverflow.com/questions/3408996/
Khăn

Câu trả lời:


629

Sử dụng listingsgói.

Cấu hình đơn giản cho tiêu đề LaTeX (trước \begin{document}):

\usepackage{listings}
\usepackage{color}

\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}

\lstset{frame=tb,
  language=Java,
  aboveskip=3mm,
  belowskip=3mm,
  showstringspaces=false,
  columns=flexible,
  basicstyle={\small\ttfamily},
  numbers=none,
  numberstyle=\tiny\color{gray},
  keywordstyle=\color{blue},
  commentstyle=\color{dkgreen},
  stringstyle=\color{mauve},
  breaklines=true,
  breakatwhitespace=true,
  tabsize=3
}

Bạn có thể thay đổi ngôn ngữ mặc định ở giữa tài liệu với \lstset{language=Java}.

Ví dụ về cách sử dụng trong tài liệu:

\begin{lstlisting}
// Hello.java
import javax.swing.JApplet;
import java.awt.Graphics;

public class Hello extends JApplet {
    public void paintComponent(Graphics g) {
        g.drawString("Hello, world!", 65, 95);
    }    
}
\end{lstlisting}

Đây là kết quả:

Hình ảnh ví dụ


3
Tôi có một câu hỏi tiếp theo liên quan đến mã của bạn. Hãy xem nếu bạn có cơ hội: stackoverflow.com/questions/3408996/
Khăn

1
Có cách nào để giảm không gian giữa các dòng mã không?
sukhvir

Có thể thêm văn bản nhỏ bên dưới đoạn mã, tương tự như văn bản được viết dưới hình trong latex không?
Brian J

@Brian Tôi không biết điều đó. Có lẽ có mã bên trong figurecó thể đạt được hiệu quả.
Cloudanger

Tôi nghe nói gói này đã lỗi thời!
xxx ---

165

Bạn cũng có thể sử dụng môi trường nguyên văn

\begin{verbatim}
your
code
example
\end{verbatim}

57
Có một vấn đề với việc sử dụng các tab bên trong môi trường nguyên văn. Nếu các tab được chuyển đổi thành "không gian" thì vấn đề sẽ biến mất.
midtiby

1
Điều này tốt cho việc hiển thị nội dung tệp văn bản mẫu (ví dụ: dữ liệu văn bản sẽ được đọc / xử lý bởi một chương trình).
nalyd88

Đối với bài viết hai cột, nó không xử lý tốt các lề.
Sazzad Hissain Khan

115

Dưới đây là cách thêm mã nội tuyến:

Bạn có thể thêm mã nội tuyến bằng {\tt code }hoặc \texttt{ code }. Nếu bạn muốn định dạng mã nội tuyến, tốt nhất nên tạo lệnh của riêng bạn

\newcommand{\code}[1]{\texttt{#1}}

Ngoài ra, lưu ý rằng các khối mã có thể được tải từ các tệp khác với

\lstinputlisting[breaklines]{source.c}

breaklineskhông bắt buộc, nhưng tôi thấy nó hữu ích. Hãy lưu ý rằng bạn sẽ phải chỉ định \usepackage{ danh sách } cho danh sách này.

Cập nhật: Gói danh sách cũng bao gồm \lstinlinelệnh, có các tính năng tô sáng cú pháp tương tự như các lệnh \lstlisting\lstinputlisting(xem câu trả lời của Cloudanger để biết chi tiết cấu hình). Như đã đề cập trong một vài câu trả lời khác, cũng có gói đúc, cung cấp \mintinlinelệnh. Giống như \lstinline, \mintinlinecung cấp cùng một cú pháp tô sáng như một khối mã được đúc thông thường:

\documentclass{article}

\usepackage{minted}

\begin{document}
  This is a sentence with \mintinline{python}{def inlineCode(a="ipsum)}
\end{document}

1
có cách nào tốt hơn cho mã nội tuyến kích hoạt màu sắc từ khóa vv?
nano

Đúng. Tôi đã cập nhật câu trả lời của mình để thảo luận về chúng.
alan

Làm thế nào để bạn chèn khoảng cách / tab để làm cho nó dễ đọc hơn?
Charlie Parker

32

Các gói chuyên dụng như minted, dựa trên Pygments để thực hiện định dạng, cung cấp các lợi thế khác nhau so với listingsgói. Để trích dẫn từ mintedhướng dẫn,

Pygments cung cấp đánh dấu cú pháp vượt trội hơn nhiều so với các gói thông thường. Ví dụ, danh sách về cơ bản chỉ làm nổi bật chuỗi, nhận xét và từ khóa. Mặt khác, Pygments có thể được tùy chỉnh hoàn toàn để làm nổi bật bất kỳ loại mã thông báo nào mà ngôn ngữ nguồn có thể hỗ trợ. Điều này có thể bao gồm các chuỗi định dạng đặc biệt bên trong chuỗi, số, các loại định danh khác nhau và các cấu trúc kỳ lạ như thẻ HTML.


1
Tôi đã thử đúc, tài liệu khá đơn giản. Phong cách mặc định là thoát tốt.
dùng2262504

5
Đây có thể là một giải pháp không thỏa đáng cho nhiều người dùng, vì cuộc gọi bên ngoài được yêu cầu cho Pygmentsic. Cụ thể, yêu cầu gọi latex bằng -shell-escapechỉ thị là, tốt nhất, là một sửa đổi nhỏ để làm lộ hệ thống xây dựng và tệ nhất là không tương thích với các tùy chọn bảo mật của một số người dùng.
KDN

12

Sử dụng Minted .

Đây là gói hỗ trợ đánh dấu cú pháp biểu cảm trong LaTeX bằng thư viện Pygments mạnh mẽ . Gói này cũng cung cấp các tùy chọn để tùy chỉnh đầu ra mã nguồn được tô sáng bằng cách sử dụng FancyConnb .

Nó phát triển và tùy biến hơn nhiều so với bất kỳ gói nào khác!


Tuy nhiên, như đã đề cập trên một câu trả lời tương tự, -shell-escapecó thể hút một số người.
Egor Hans

8

Công việc được đúc trong Overleaf , TeX Live và MiKTeX.

Thí dụ:

\documentclass{article}
\usepackage{minted}
\begin{document}

\begin{minted}[mathescape, linenos]{python}

# Note: $\pi=\lim_{n\to\infty}\frac{P_n}{d}$
title = "Hello World"

sum = 0
for i in range(10):
 sum += i

\end{minted}

\end{document}

Đầu ra:

nhập mô tả hình ảnh ở đây


6

Vì nó chưa được đề cập ở đây, nên có thể thêm một tùy chọn, gói spverbatim(không tô sáng cú pháp):

\documentclass{article}
\usepackage{spverbatim}

\begin{document}

\begin{spverbatim}
  Your code here
\end{spverbatim}

\end{document}

Ngoài ra, nếu không cần tô sáng cú pháp, gói alltt:

\documentclass{article}
\usepackage{alltt}

\begin{document}

\begin{alltt}
  Your code here
\end{alltt}

\end{document}

1
Đây là ít nhiều những gì tôi muốn, nhưng tôi dường như không thể thụt lề với các tab. Làm thế nào để bạn thụt lề / có một gói tương tự cho phép thụt đầu dòng dễ dàng hơn?
Darokrithia

1
@Darokrithia Tôi đã chỉnh sửa câu trả lời của mình: bạn có thể kiểm tra / đối đầu với vết lõm không? :)
MattAllegro

1
Nó dường như không hoạt động. Tôi có thể gửi cho bạn mã tôi đang sử dụng, nhưng định dạng bị hủy trong các bình luận. BTW Tôi đã sử dụng một câu trả lời khác và nó hoạt động tốt, nhưng tôi cảm thấy như thế này vẫn nên được sửa cho những độc giả tương lai.
Darokrithia

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.