รายชื่อรหัส LaTeX เหมือนในหนังสือมืออาชีพ


329

รายการซอร์สโค้ดของลาเท็กซ์ควรมีลักษณะอย่างไรในการสร้างผลลัพธ์เช่นเดียวกับในหนังสือที่รู้จักตัวอย่างเช่นสำหรับ Spring Framework ฉันได้ลองใช้แพคเกจรายชื่อลาเท็กซ์ แต่ไม่สามารถผลิตสิ่งที่ดูดีเหมือนด้านล่าง ดังนั้นฉันจึงสนใจที่จะจัดรูปแบบคำแนะนำเพื่อผลิตบางอย่างเช่นตัวอย่างด้านล่าง (จากบทตัวอย่างของ Manning สำหรับSpring in Action ):

จาก Spring in Action ของ Manning

แก้ไข ด้วยความช่วยเหลือโดยเฉพาะอย่างยิ่งของTormod Fjeldskårนี่เป็นตัวอย่างที่สมบูรณ์ในการสร้างรูปลักษณ์ที่ต้องการ:

\usepackage{listings}
\usepackage{courier}
\lstset{
    basicstyle=\footnotesize\ttfamily, % Default font
    % numbers=left,              % Location of line numbers
    numberstyle=\tiny,          % Style of line numbers
    % stepnumber=2,              % Margin between line numbers
    numbersep=5pt,              % Margin between line numbers and text
    tabsize=2,                  % Size of tabs
    extendedchars=true,
    breaklines=true,            % Lines will be wrapped
    keywordstyle=\color{red},
    frame=b,
    % keywordstyle=[1]\textbf,
    % keywordstyle=[2]\textbf,
    % keywordstyle=[3]\textbf,
    % keywordstyle=[4]\textbf,   \sqrt{\sqrt{}}
    stringstyle=\color{white}\ttfamily, % Color of strings
    showspaces=false,
    showtabs=false,
    xleftmargin=17pt,
    framexleftmargin=17pt,
    framexrightmargin=5pt,
    framexbottommargin=4pt,
    % backgroundcolor=\color{lightgray},
    showstringspaces=false
}
\lstloadlanguages{ % Check documentation for further languages ...
     % [Visual]Basic,
     % Pascal,
     % C,
     % C++,
     % XML,
     % HTML,
     Java
}
% \DeclareCaptionFont{blue}{\color{blue}} 

% \captionsetup[lstlisting]{singlelinecheck=false, labelfont={blue}, textfont={blue}}
\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{\colorbox[cmyk]{0.43, 0.35, 0.35,0.01}{\parbox{\textwidth}{\hspace{15pt}#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white, singlelinecheck=false, margin=0pt, font={bf,footnotesize}}

ใช้กับสิ่งนี้ในเอกสารของคุณ:

\lstinputlisting[label=samplecode, caption=A sample]{sourceCode/HelloWorld.java}

โปรดแม่นยำยิ่งขึ้น สำหรับฉันรายการที่ฉันโพสต์ "ดูเหมือนว่าในหนังสือมืออาชีพ" และ "ดูดีมาก" เหมือนกับที่คุณโพสต์
Bastien Léonard

2
โปรดใช้ตัวอย่างที่โพสต์ในรูปแบบของภาพหน้าจอเป็นผลลัพธ์ที่ฉันต้องการเก็บถาวร
Mork0075

8
เพื่อความสมบูรณ์คุณอาจต้องการเพิ่ม \ usepackage {color} ลงใน tex ที่คุณโพสต์ เอาฉันสักครู่ก่อนที่ฉันจะสังเกตเห็นว่ามันหายไป
Robert Massaioli

1
การทำงานที่ดี! ฉันต้องเพิ่ม \ usepackage {caption} และ \ usepackage {graphics} แม้ว่าและดูเหมือนว่าจะแปลงคำพูดเดียว
hakunin

สวัสดีมอร์คฉันต้องวางไฟล์ต้นฉบับไว้ที่ไหน? ในตัวอย่าง Hello.java ของคุณ
RoflcoptrException

คำตอบ:


186

สำหรับฉันแล้วสิ่งที่คุณต้องการคือการปรับแต่งรูปลักษณ์ของคำอธิบายภาพ วิธีนี้ทำได้ง่ายที่สุดโดยใช้captionแพ็คเกจ สำหรับคำแนะนำวิธีการใช้แพคเกจนี้ให้ดูที่คู่มือ (PDF) คุณอาจต้องสร้างรูปแบบคำบรรยายเฉพาะที่กำหนดเองตามที่อธิบายไว้ในบทที่ 4 ในคู่มือ

แก้ไข:ทดสอบด้วย MikTex:

\documentclass{report}

\usepackage{color}
\usepackage{xcolor}
\usepackage{listings}

\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{\colorbox{gray}{\parbox{\textwidth}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white}

% This concludes the preamble

\begin{document}

\begin{lstlisting}[label=some-code,caption=Some Code]
public void here() {
    goes().the().code()
}
\end{lstlisting}

\end{document}

ผลลัพธ์:

ดูตัวอย่าง


1
ฉันต้องการกำหนดรูปแบบคำอธิบายภาพเฉพาะสำหรับสิ่งต่าง ๆ ในส่วน \ lstinputlisting (เช่น myCaption) คุณมีคำใบ้ว่าจะทำอย่างไร?
Mork0075

1
ลอง / captionsetup [lstlisting] {ตัวเลือกของคุณ}
Tormod Fjeldskår

มันใช้งานได้ดีขอบคุณ คุณมีความคิดวิธีรู้พื้นหลังสีเทาด้านหลังคำบรรยายภาพ (เช่นในตัวอย่างโพสต์เริ่มต้นของฉัน)? ไม่พบสิ่งใดในเอกสาร
Mork0075

ฉันคิดว่า \ colorbox {grey} {\ parbox {\ textwidth} {\ textcolor {white} {ข้อความไปที่นี่}}} น่าจะอยู่ใกล้ ๆ กับตัวอย่างโพสต์เริ่มต้นของคุณ
Tormod Fjeldskår

2
มันดูดี แต่กล่องคำอธิบายภาพของฉันถูกเยื้อง (ไม่ใช่ข้อความ ฉันไม่ทราบสาเหตุเนื่องจากรายชื่อไม่ได้เยื้อง
Johan

49

ฉันมีความสุขกับlistingsแพ็คเกจ:

ตัวอย่างรายการ

นี่คือวิธีที่ฉันกำหนดค่า:

\lstset{
language=C,
basicstyle=\small\sffamily,
numbers=left,
numberstyle=\tiny,
frame=tb,
columns=fullflexible,
showstringspaces=false
}

ฉันใช้มันแบบนี้:

\begin{lstlisting}[caption=Caption example.,
  label=a_label,
  float=t]
// Insert the code here
\end{lstlisting}

1
@lamba: หากฉันจำได้ถูกต้องมันจะบอกให้ Latex ทำการวางไว้ที่ด้านบนของหน้า
Bastien Léonard

7
ใช่รายชื่อในแบบอักษรที่มีสัดส่วนนั้นน่าเกลียดอย่างมาก (บวกด้วยเหตุผลทางวัฒนธรรมพวกเขาอ่านยากสำหรับบางคน (อย่างน้อยคนญี่ปุ่นหลายคนหรืออาจเป็นชาวเอเชียคนอื่น ๆ ))
mirabilos

1
@ mirabilos: ใช่ฉันคิดว่าฉันจะเปลี่ยนมันในภายหลัง มันดูดีสำหรับรายชื่อนี้ แต่ไม่ใช่ที่คนอื่น ๆ ที่มีการเยื้อง / ซ้อนมากขึ้น
Bastien Léonard

32

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

ลองตั้งค่าแบบอักษรความกว้างคงที่ด้วยวิธีนี้:

\lstset{basicstyle=\ttfamily}

3
ฉันใช้คอลัมน์ = fullflexible ด้วย basicstyle = \ small \ sffamily โดยส่วนตัวแล้วในตัวอย่างที่ฉันโพสต์ด้านบน ตัวละครไม่ได้อยู่ในแนวตั้ง แต่ฉันคิดว่าพวกเขาดูดีกว่า \ ttfamily คุณพบตัวอย่างที่ฉันโพสต์ด้านบนน่าเกลียด?
Bastien Léonard

ตัวอย่างเฉพาะของคุณดูดี แต่ผมจะเกลียดมันมีงบสารประกอบที่ซ้อนกันที่เยื้องเหมาะสม (การจัดตำแหน่งคอลัมน์) เป็นขนาดใหญ่ช่วยให้เห็นขอบเขตของคำสั่งสารประกอบ ({} บล็อก)
zvrba

ฉันกำลังคิดในสิ่งเดียวกัน แต่จนถึงทุกรายการของฉันดูดี
Bastien Léonard

ตกลงคุณได้เชื่อฉันฉันจะลองตั้งค่าของคุณอีกครั้ง :-)
zvrba

1
คำสั่งผสมซ้อนกันเป็นปลาเฮอริ่งแดง เนื่องจากการเยื้องทั้งหมดประกอบด้วยช่องว่างการเยื้องจะเรียงกันโดยไม่คำนึงถึงความกว้างของอักขระอื่น ๆ
jwg

27

ฉันสงสัยว่าทำไมไม่มีใครพูดถึงแพ็คเกจMinted มันมีการเน้นไวยากรณ์ที่ดีกว่าแพคเกจรายชื่อ LaTeX มันใช้Pygments

$ pip install Pygments

ตัวอย่างใน LaTeX:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{minted}

\begin{document}
\begin{minted}{python}
import numpy as np

def incmatrix(genl1,genl2):
    m = len(genl1)
    n = len(genl2)
    M = None #to become the incidence matrix
    VT = np.zeros((n*m,1), int)  #dummy variable

    #compute the bitwise xor matrix
    M1 = bitxormatrix(genl1)
    M2 = np.triu(bitxormatrix(genl2),1) 

    for i in range(m-1):
        for j in range(i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            for k in range(len(r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;

                if M is None:
                    M = np.copy(VT)
                else:
                    M = np.concatenate((M, VT), 1)

                VT = np.zeros((n*m,1), int)

    return M
\end{minted}
\end{document}

ซึ่งผลลัพธ์ใน:

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

คุณต้องใช้การตั้งค่าสถานะ-shell-escapeด้วยคำสั่ง pdflatex

สำหรับข้อมูลเพิ่มเติม: https://www.sharelatex.com/learn/Code_Highlighting_with_minted


2
+1 Minted เป็นแพ็คเกจสำหรับการเรียงพิมพ์ซอร์สโค้ดใน LaTeX ไม่เพียง แต่จะใช้งานง่ายคุณลักษณะที่หลากหลายและมีเอกสารที่ดี แต่ยังไม่มีปัญหากับอักขระ Unicode ในซอร์สโค้ด (ไม่เหมือนlistings)
ScumCoder

ความดีของฉัน! ดีขึ้นมาก! ขอบคุณมากสำหรับคำแนะนำ
Dmitry Zotikov

21

ลองlistingsแพ็คเกจดูสิ นี่คือตัวอย่างของสิ่งที่ฉันใช้เวลาที่ผ่านมาเพื่อมีรายชื่อ Java สี:

\usepackage{listings}

[...]

\lstset{language=Java,captionpos=b,tabsize=3,frame=lines,keywordstyle=\color{blue},commentstyle=\color{darkgreen},stringstyle=\color{red},numbers=left,numberstyle=\tiny,numbersep=5pt,breaklines=true,showstringspaces=false,basicstyle=\footnotesize,emph={label}}

[...]

\begin{lstlisting}
public void here() {
    goes().the().code()
}

[...]

\end{lstlisting}

คุณอาจต้องการปรับแต่งที่ มีการอ้างอิงหลายรายการของแพคเกจรายการ แค่ google พวกเขา


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

9

ดูalgorithmsแพ็คเกจโดยเฉพาะalgorithmสภาพแวดล้อม


1
ขอบคุณ ชุดนี้ดูเหมือนจะแข็งแกร่งมากในการสนทนาทางทฤษฎีมากกว่าฉันรู้จากหนังสือคณิตศาสตร์หลายเล่ม แต่ฉันจะไม่เน้นสิ่งนี้มาก (prerequsites ถ้าอื่น ๆ ) ฉันต้องการที่จะมีการจัดรูปแบบเหมือนคนข้างต้น
Mork0075

4
ฉันเป็นเพียงการพูดคุยเกี่ยวกับสภาพแวดล้อมที่ไม่algorithm เป็นภาชนะลอยตัวซึ่งดูสวยดี คุณสามารถใส่สิ่งที่คุณต้องการภายในแม้แต่กล่าวถึง elsethread algorithmicalgorithmlisting
avakar

8

มีหลายสิ่งที่คุณสามารถทำได้เช่นการเลือกแบบอักษรใหม่:

\documentclass[10pt,a4paper]{article}
% ... lots of packages e.g. babel, microtype, fontenc, inputenc &c.
\usepackage{color}    % Leave this out if you care about B/W printing, obviously.
\usepackage{upquote}  % Turns curly quotes in verbatim text into straight quotes. 
                      % People who have to copy/paste code from the PDF output 
                      % will love you for this. Or perhaps more accurately: 
                      % They will not hate you/hate you less.
\usepackage{beramono} % Or some other package that provides a fixed width font. q.v.
                      % http://www.tug.dk/FontCatalogue/typewriterfonts.html
\usepackage{listings} 
\lstset {                 % A rudimentary config that shows off some features.
    language=Java,
    basicstyle=\ttfamily, % Without beramono, we'd get cmtt, the teletype font.
    commentstyle=\textit, % cmtt doesn't do italics. It might do slanted text though.
    \keywordstyle=        % Nor does cmtt do bold text.
        \color{blue}\bfseries,
    \tabsize=4            % Or whatever you use in your editor, I suppose.
}
\begin{document} 
\begin{lstlisting}
public final int ourAnswer() { return 42; /* Our final answer */ }
\end{lstlisting} 
\end{document}

2
ฉันเชื่อว่าใน \ keywordstyle และ \ tabsize แบ็กสแลชควรถูกลบทิ้งเนื่องจากไม่ได้ผลเช่นนี้ อย่างไรก็ตามมีประโยชน์มาก!
Xiphias

2

สำหรับรหัส R ฉันใช้

\usepackage{listings}
\lstset{
language=R,
basicstyle=\scriptsize\ttfamily,
commentstyle=\ttfamily\color{gray},
numbers=left,
numberstyle=\ttfamily\color{gray}\footnotesize,
stepnumber=1,
numbersep=5pt,
backgroundcolor=\color{white},
showspaces=false,
showstringspaces=false,
showtabs=false,
frame=single,
tabsize=2,
captionpos=b,
breaklines=true,
breakatwhitespace=false,
title=\lstname,
escapeinside={},
keywordstyle={},
morekeywords={}
}

และมันก็เป็นแบบนี้

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

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