Memasukkan kode dalam dokumen LaTeX ini dengan indentasi

427

Bagaimana cara saya memasukkan kode ke dokumen LaTeX? Apakah ada sesuatu seperti:

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

Satu-satunya hal yang benar-benar saya butuhkan adalah lekukan dan font lebar tetap. Penyorotan sintaks bisa sangat baik meskipun jelas tidak diperlukan.

sixtyfootersdude
sumber
Bukan duplikat yang tepat, tetapi jawabannya mencakup alasan yang sama: lihat stackoverflow.com/questions/741985/…
Charles Stewart
Saya juga punya pertanyaan tindak lanjut di sini: stackoverflow.com/questions/3408996/…
sixtyfootersdude

Jawaban:

631

Gunakan listingspaket.

Konfigurasi sederhana untuk header LaTeX (sebelum \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
}

Anda dapat mengubah bahasa default di tengah dokumen dengan \lstset{language=Java}.

Contoh penggunaan dalam dokumen:

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

Inilah hasilnya:

Contoh gambar

Cloudanger
sumber
3
Saya punya pertanyaan lanjutan terkait dengan kode Anda. Coba lihat jika Anda mendapat kesempatan: stackoverflow.com/questions/3408996/…
sixtyfootersdude
1
Apakah ada cara untuk mengurangi ruang antar baris kode?
sukhvir
Apakah mungkin untuk menambahkan teks kecil di bawah potongan kode, mirip dengan teks yang ditulis di bawah angka dalam Lateks?
Brian J
@ Brian Saya tidak tahu itu. Mungkin memiliki kode di dalam figuredapat mencapai efeknya.
Cloudanger
Saya mendengar paket ini sekarang sudah usang!
xxx ---
165

Anda juga bisa menggunakan lingkungan kata demi kata

\begin{verbatim}
your
code
example
\end{verbatim}
midtiby
sumber
57
Ada masalah dengan menggunakan tab di dalam lingkungan kata demi kata. Jika tab dikonversi ke "spasi" masalah hilang.
midtiby
1
Ini bagus untuk menunjukkan contoh isi file teks (misalnya, data tekstual untuk dibaca / diproses oleh suatu program).
nalyd88
Untuk dua artikel kolom, itu tidak menangani margin dengan baik.
Sazzad Hissain Khan
115

Berikut ini cara menambahkan kode sebaris:

Anda dapat menambahkan kode sebaris dengan {\tt code }atau \texttt{ code }. Jika Anda ingin memformat kode sebaris, maka akan lebih baik untuk membuat perintah Anda sendiri

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

Juga, perhatikan bahwa blok kode dapat dimuat dari file lain dengan

\lstinputlisting[breaklines]{source.c}

breaklinestidak diperlukan, tetapi saya merasa berguna. Ketahuilah bahwa Anda harus menentukan \usepackage{ daftar } untuk yang ini.

Pembaruan: Paket listing juga mencakup \lstinlineperintah, yang memiliki fitur penyorotan sintaksis yang sama dengan \lstlistingdan \lstinputlistingperintah (lihat jawaban Cloudanger untuk perincian konfigurasi). Seperti disebutkan dalam beberapa jawaban lain, ada juga paket yang dicetak, yang menyediakan \mintinlineperintah. Seperti \lstinline, \mintinlinememberikan penyorotan sintaksis yang sama dengan blok kode yang dicetak:

\documentclass{article}

\usepackage{minted}

\begin{document}
  This is a sentence with \mintinline{python}{def inlineCode(a="ipsum)}
\end{document}
alan
sumber
1
apakah ada cara yang lebih baik untuk kode sebaris yang mengaktifkan warna kata kunci dll?
nano
Iya. Saya sudah memperbarui jawaban saya untuk membahasnya.
alan
bagaimana Anda memasukkan spasi / tab agar terlihat lebih mudah dibaca?
Charlie Parker
32

Paket khusus seperti minted, yang mengandalkan Pygments untuk melakukan pemformatan, menawarkan berbagai keunggulan dibandingkan listingspaket tersebut. Mengutip dari mintedmanual,

Pygments menyediakan penyorotan sintaksis yang jauh lebih unggul dibandingkan dengan paket konvensional. Misalnya, cantuman pada dasarnya hanya menyoroti string, komentar, dan kata kunci. Pygments, di sisi lain, dapat sepenuhnya dikustomisasi untuk menyoroti segala jenis token yang mungkin didukung oleh bahasa sumber. Ini mungkin termasuk urutan pemformatan khusus di dalam string, angka, berbagai jenis pengidentifikasi dan konstruksi eksotis seperti tag HTML.

Philipp
sumber
1
Saya sudah mencoba dicetak, dokumentasinya cukup lurus ke depan. Gaya defaultnya bagus.
user2262504
5
Ini mungkin solusi yang tidak memuaskan bagi banyak pengguna, karena panggilan eksternal diperlukan untuk Pygmentsic. Secara khusus, persyaratan untuk memanggil lateks dengan -shell-escapearahan, paling tidak, modifikasi kecil untuk sistem bangunan yang ada, dan paling buruk, tidak sesuai dengan preferensi keamanan beberapa pengguna.
KDN
12

Gunakan Minted .

Ini adalah paket yang memfasilitasi penyorotan sintaksis ekspresif di LaTeX menggunakan pustaka Pygments yang kuat . Paket ini juga menyediakan opsi untuk menyesuaikan output kode sumber yang disorot menggunakan fancyvrb .

Ini jauh lebih berkembang dan dapat dikustomisasi daripada paket lainnya!

Oussama L.
sumber
Namun, seperti yang sudah disebutkan pada jawaban serupa, -shell-escapemungkin payah bagi sebagian orang.
Egor Hans
8

Karya bermerek di Overleaf , TeX Live, dan MiKTeX.

Contoh:

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

Keluaran:

masukkan deskripsi gambar di sini

Shital Shah
sumber
6

Karena belum disebutkan di sini, mungkin perlu menambahkan satu opsi lagi, paket spverbatim(tanpa penyorotan sintaks):

\documentclass{article}
\usepackage{spverbatim}

\begin{document}

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

\end{document}

Juga, jika penyorotan sintaks tidak diperlukan, paket alltt:

\documentclass{article}
\usepackage{alltt}

\begin{document}

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

\end{document}
MattAllegro
sumber
1
Ini kurang lebih seperti yang saya inginkan, tetapi sepertinya saya tidak bisa mengindahkan tab. Bagaimana Anda indentasi / apakah ada paket serupa yang memungkinkan untuk indentasi lebih mudah?
Darokrithia
1
@Darokrithia Saya mengedit jawaban saya: dapatkah Anda memeriksa / menghadapi indentasi? :)
MattAllegro
1
Sepertinya tidak berhasil. Saya dapat mengirimi Anda kode yang saya gunakan, tetapi formatnya dihancurkan dalam komentar. BTW saya menggunakan jawaban yang berbeda dan bekerja dengan baik, tetapi saya merasa ini masih harus diperbaiki untuk pembaca masa depan.
Darokrithia
5

Gunakan Pygments !

Tarantula
sumber