การแทรกรหัสในเอกสาร LaTeX นี้ด้วยการเยื้อง


426

ฉันจะแทรกรหัสลงในเอกสาร LaTeX ได้อย่างไร มีบางอย่างเช่น:

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

สิ่งเดียวที่ฉันต้องการจริงๆคือการเยื้องและแบบอักษรความกว้างคงที่ การเน้นไวยากรณ์อาจทำได้ดีแม้ว่าไม่จำเป็นต้องใช้แน่นอน


ไม่ใช่คำตอบที่ซ้ำกัน แต่คำตอบนั้นครอบคลุมพื้นที่เดียวกัน: ดูstackoverflow.com/questions/741985/…
Charles Stewart

ฉันมีคำถามติดตามที่นี่: stackoverflow.com/questions/3408996/…
sixtyfootersdude

คำตอบ:


630

ใช้listingsแพ็คเกจ

การกำหนดค่าอย่างง่ายสำหรับส่วนหัว LaTeX (ก่อนหน้า\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
}

\lstset{language=Java}คุณสามารถเปลี่ยนภาษาเริ่มต้นในช่วงกลางของเอกสารที่มี

ตัวอย่างการใช้งานในเอกสาร:

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

นี่คือผลลัพธ์:

ภาพตัวอย่าง


3
ฉันมีคำถามติดตามที่เกี่ยวข้องกับรหัสของคุณ ดูถ้าคุณได้รับโอกาส: stackoverflow.com/questions/3408996/…
sixtyfootersdude

1
มีวิธีการลดช่องว่างระหว่างบรรทัดของรหัสหรือไม่
sukhvir

เป็นไปได้หรือไม่ที่จะเพิ่มข้อความเล็ก ๆ ใต้โค้ดขนาดเล็กคล้ายกับข้อความที่เขียนใต้รูปภาพใน Latex?
Brian J

@Brian ฉันไม่ทราบว่า บางทีการมีโค้ดใน a figureอาจทำให้ได้ผล
Cloudanger

ฉันได้ยินมาว่าแพ็คเกจนี้ล้าสมัยแล้ว!
xxx ---

165

คุณยังสามารถใช้สภาพแวดล้อมคำต่อคำ

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

57
มีปัญหากับการใช้แท็บภายในสภาพแวดล้อมคำต่อคำ หากแท็บถูกแปลงเป็น "ช่องว่าง" ปัญหาจะหายไป
midtiby

1
สิ่งนี้เป็นสิ่งที่ดีสำหรับการแสดงตัวอย่างเนื้อหาไฟล์ข้อความ (เช่นข้อมูลต้นฉบับที่โปรแกรมอ่าน / ประมวลผล)
nalyd88

สำหรับบทความคอลัมน์สองคอลัมน์มันไม่ได้จัดการระยะขอบที่ดี
Sazzad Hissain Khan

115

นี่คือวิธีการเพิ่มรหัสแบบอินไลน์:

คุณสามารถเพิ่มโค้ดใกล้เคียงกับที่หรือ{\tt code } \texttt{ code }หากคุณต้องการจัดรูปแบบรหัสแบบอินไลน์จะเป็นการดีที่สุดหากคุณต้องการคำสั่งของคุณเอง

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

นอกจากนี้โปรดทราบว่าสามารถบล็อกรหัสจากไฟล์อื่นด้วย

\lstinputlisting[breaklines]{source.c}

breaklinesไม่จำเป็น แต่ฉันคิดว่ามันมีประโยชน์ โปรดทราบว่าคุณจะต้องระบุ\usepackage{ รายชื่อ }สำหรับรายการนี้

อัปเดต:แพคเกจรายการยังรวมถึง\lstinlineคำสั่งซึ่งมีคุณลักษณะการเน้นไวยากรณ์เหมือนกับคำสั่ง\lstlistingและ\lstinputlisting(ดูคำตอบของ Cloudanger สำหรับรายละเอียดการกำหนดค่า) ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ อีกสองสามรายการนอกจากนี้ยังมีแพ็คเกจมิ้นต์ที่ให้\mintinlineคำสั่ง ชอบ\lstinline, \mintinlineให้ไวยากรณ์เดียวกันไฮไลต์เป็นประจำป้องกันรหัสมิ้นต์:

\documentclass{article}

\usepackage{minted}

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

1
เป็นวิธีที่ดีกว่าสำหรับรหัสแบบอินไลน์ซึ่งเปิดใช้งานสีคำหลักอื่น ๆ ?
nano

ใช่. ฉันอัปเดตคำตอบของฉันเพื่อหารือเกี่ยวกับพวกเขา
ลัน

คุณแทรกระยะห่าง / แท็บเพื่อทำให้อ่านง่ายขึ้นได้อย่างไร
Charlie Parker

32

แพคเกจเฉพาะเช่นmintedซึ่งต้องอาศัย Pygments เพื่อทำการจัดรูปแบบมีข้อได้เปรียบที่หลากหลายกว่าlistingsแพ็คเกจ อ้างจากmintedคู่มือ

Pygments ให้การเน้นไวยากรณ์ที่เหนือกว่ามากเมื่อเทียบกับแพคเกจทั่วไป ตัวอย่างเช่นรายชื่อจะเน้นเฉพาะสตริงความคิดเห็นและคำหลักเท่านั้น ในทางกลับกัน Pygments สามารถปรับแต่งได้อย่างสมบูรณ์เพื่อเน้นโทเค็นชนิดใด ๆ ที่ภาษาต้นฉบับอาจสนับสนุน ซึ่งอาจรวมถึงลำดับการจัดรูปแบบพิเศษภายในสตริงตัวเลขตัวระบุชนิดต่างๆและโครงสร้างที่แปลกใหม่เช่นแท็ก HTML


1
ฉันลองทำเสร็จแล้วเอกสารค่อนข้างตรงไปตรงมา สไตล์เริ่มต้นจะออกจากดี
2262504

5
นี่อาจเป็นโซลูชันที่ไม่น่าพอใจสำหรับผู้ใช้หลายคนเนื่องจากต้องใช้การโทรจากภายนอกเพื่อ Pygmentsic โดยเฉพาะอย่างยิ่งความต้องการที่จะเรียกลาเท็กซ์โดยใช้-shell-escapeคำสั่งนั้นเป็นสิ่งที่ดีที่สุดคือการปรับเปลี่ยนเล็กน้อยเพื่อสร้างระบบการสร้างและที่แย่ที่สุดไม่สามารถใช้ร่วมกับการตั้งค่าความปลอดภัยของผู้ใช้บางคนได้
KDN

12

ใช้Mintedมิ้นต์

มันเป็นแพ็คเกจที่อำนวยความสะดวกในการเน้นไวยากรณ์ที่แสดงออกใน LaTeX โดยใช้ห้องสมุดPygmentsอันทรงพลัง แพคเกจยังมีตัวเลือกในการปรับแต่งการส่งออกซอร์สโค้ดที่เน้นสีโดยใช้fancyvrb fancyvrb

มันพัฒนาและปรับแต่งได้มากกว่าแพ็คเกจอื่น ๆ !


อย่างไรก็ตามตามที่กล่าวไว้แล้วในคำตอบที่คล้ายกัน-shell-escapeอาจดูดสำหรับบางคน
Egor Hans

8

มิ้นต์ทำงานในOverleaf , TeX Live และ MiKTeX

ตัวอย่าง:

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

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่


6

เนื่องจากยังไม่ได้กล่าวถึงที่นี่จึงอาจคุ้มค่าที่จะเพิ่มอีกหนึ่งตัวเลือกแพ็คเกจspverbatim(ไม่มีการเน้นไวยากรณ์):

\documentclass{article}
\usepackage{spverbatim}

\begin{document}

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

\end{document}

นอกจากนี้หากไม่จำเป็นต้องเน้นไวยากรณ์ให้ทำแพ็กเกจalltt:

\documentclass{article}
\usepackage{alltt}

\begin{document}

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

\end{document}

1
นี่คือสิ่งที่ฉันต้องการมากกว่าหรือน้อยกว่า แต่ฉันไม่สามารถเยื้องกับแท็บได้ คุณเยื้อง / มีแพคเกจที่คล้ายกันที่ช่วยให้การเยื้องง่ายขึ้น?
Darokrithia

1
@Darokrithia ฉันแก้ไขคำตอบของฉัน: คุณสามารถตรวจสอบ / เผชิญหน้าเยื้องหรือไม่? :)
MattAllegro

1
ดูเหมือนจะไม่ทำงาน ฉันสามารถส่งรหัสที่ฉันใช้ให้คุณ แต่การจัดรูปแบบถูกทำลายในความคิดเห็น BTW ฉันใช้คำตอบที่ต่างออกไปและมันใช้งานได้ดี แต่ฉันรู้สึกว่าเรื่องนี้ควรได้รับการแก้ไขสำหรับผู้อ่านในอนาคต
Darokrithia

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.