การไฮไลต์ซอร์สโค้ดใน LaTeX


196

ฉันต้องการไฮไลต์ซอร์สโค้ดใน LaTeX แพคเกจlistingsน่าจะเป็นตัวเลือกที่ดีที่สุดสำหรับการใช้งานส่วนใหญ่และสำหรับฉันมันคือจนถึงตอนนี้

อย่างไรก็ตามตอนนี้ฉันต้องการความยืดหยุ่นมากขึ้น โดยทั่วไปสิ่งที่ฉันกำลังมองหาคือlexer ตัวจริง โดยเฉพาะอย่างยิ่งฉันต้องการ (สำหรับคำจำกัดความภาษาของตัวเอง) เพื่อกำหนด (และเน้น!) รูปแบบตัวเลขของตัวเอง listingsไม่อนุญาตการเน้นตัวเลขในรหัส อย่างไรก็ตามฉันต้องผลิตสิ่งนี้:

ผลลัพธ์ที่จำเป็น

listingsยังไม่สามารถรับมือกับตัวคั่นโดยพลการสำหรับสตริง พิจารณารหัสทับทิมที่ถูกต้องต่อไปนี้:

s = %q!this is a string.!

ที่นี่!สามารถถูกแทนที่ด้วยตัวคั่นเกือบทุกตัว

(ที่listingsไม่สามารถจัดการ Unicode ก็ค่อนข้างรบกวน แต่นั่นเป็นปัญหาอื่น)

เป็นการดีที่ฉันกำลังมองหาส่วนขยายlistingsที่ช่วยให้ฉันสามารถกำหนดกฎการ lexing ที่ซับซ้อนมากขึ้นได้ แต่นอกจากนี้ฉันยังค้นหาทางเลือกที่ทำงานได้

เธรดอื่น ๆแนะนำให้ใช้Pygmentsซึ่งสามารถสร้างเอาต์พุต LaTeX ได้ มีแม้กระทั่งแพ็คเกจ - texments- เพื่อให้ง่ายต่อการเปลี่ยนแปลง

อย่างไรก็ตามคุณสมบัตินี้ค่อนข้างขาดคุณสมบัติ โดยเฉพาะอย่างยิ่งฉันสนใจในการกำหนดlistingsหมายเลขบรรทัดสไตล์การอ้างอิงบรรทัดซอร์สโค้ดและความเป็นไปได้ของการฝัง LaTeX ในซอร์สโค้ด (ตัวเลือกtexclและmathescapeในlistings)

ดังตัวอย่างต่อไปนี้เป็นชุดโค้ดต้นฉบับlistingsที่แสดงบางสิ่งที่การแทนที่ควรมี:

ตัวอย่างรายชื่อ LaTeX: การเพิ่มด้านข้าง [“ การเพิ่มด้านข้าง” ดัดแปลงจาก Bit Twiddling Hacks]


หากคุณไม่เต็มใจที่จะใช้เครื่องมือภายนอกเช่น pygments ทำไมไม่เพียงเขียนไฟล์สำหรับเอกสารของคุณ
ไมกา

6
ไม่ควรย้ายข้อมูลนี้ไปที่tex.stackexchange.comหรือไม่ ^^
Matthias

1
@ Matias ไม่แน่ใจ เมื่อฉันโพสต์มันไม่มี tex.se แต่ตอนนี้ดูเหมือนว่ามีประโยชน์มากที่นี่ - คำถามมีเสียงก้องมากในขณะที่ใน TeX.SE ไม่มีใครโพสต์คำถามที่คล้ายกัน นอกจากนี้มันเกี่ยวข้องกับการเขียนโปรแกรมและเครื่องมือการเขียนโปรแกรมโดยเฉพาะดังนั้นฉันคิดว่าโปรแกรมเมอร์คือผู้ที่ได้รับประโยชน์จากมัน
Konrad Rudolph

1
สำหรับผู้ที่สามารถลืม LaTeX สำหรับเอกสารที่พวกเขากำลังเขียนอยู่: โปรดทราบว่าด้วย Office Word หรือ LibreOffice Writer คุณเพียงแค่คัดลอก / วางรหัสของคุณจากเช่น Eclipse ไปที่นั่นและทำให้สีของคุณถูกรักษาไว้ !!
MohamedEzz

3
@MemoryLeaks ฉันไม่แน่ใจว่าคำแนะนำนี้มีประโยชน์มากแค่ไหน: ซอฟต์แวร์ Office ไม่ใช่ซอฟต์แวร์ทดแทนที่ถูกต้องสำหรับ LaTeX (ซึ่งไม่ใช่ซอฟต์แวร์สำนักงานมันเป็นระบบการเผยแพร่บนเดสก์ท็อป นอกเหนือจากข้อดีอื่น ๆ ทั้งหมดของซอฟต์แวร์ Office)
Konrad Rudolph

คำตอบ:


355

ด้วยการนำคำแนะนำของนอร์แมนมาสู่หัวใจฉันได้แฮ็ควิธีแก้ปัญหาที่ใช้Pygments (ที่มีการแพตช์ ) เพื่อเน้นและผลักดันฟีเจอร์ต่างๆให้มากที่สุดเท่าที่จะทำได้โดยไม่ระเบิด ;-)

ฉันได้สร้างแพ็คเกจ LateX แล้วเมื่อแพตช์ Pygments ของฉันเปิดตัวในเวอร์ชัน 1.2 ...

นำเสนอมิ้นต์

mintedเป็นแพคเกจที่ใช้ Pygments เพื่อให้การเน้นไวยากรณ์บนบากใน LaTeX ตัวอย่างเช่นจะช่วยให้การส่งออกต่อไปนี้

ตัวอย่างน้ำยางแฟนซี

นี่คือไฟล์ขั้นต่ำในการทำซ้ำรหัสข้างต้น (โปรดสังเกตว่าการรวมอักขระ Unicode อาจต้องใช้ 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}

สิ่งนี้สามารถเรียงพิมพ์โดยใช้คำสั่งต่อไปนี้:

xelatex -shell-escape test.tex

(แต่มิ้นต์ก็ใช้ได้กับlatexและpdflatex…)

minted.styทำงานคล้ายกับtexments.styแต่อนุญาตคุณสมบัติเพิ่มเติม

วิธีรับ

ขอขอบคุณนอร์แมนอีกครั้งที่ทำให้ฉันสร้างแพ็คเกจนี้ขึ้นมา


19
หลังจากผ่านไปหลายชั่วโมงของการค้นหาวิธีใช้ pygments ด้วย LaTeX และอีกหลายชั่วโมงของการพยายามแฮ็คเข้าด้วยกันโซลูชันของฉันเองนี่เป็นสิ่งที่ดีที่สุดที่ฉันค้นพบ ยังดีกว่าใช้งานได้จริง ขอบคุณสำหรับสิ่งนี้.
sykora

2
ที่นี่เพียงเพื่อชื่นชมงานที่คุณทำในลักษณะที่เป็น;)!
Filip Dupanović

4
@ พอล: มันเป็นความจริงที่ว่าสิ่งทั้งหมดค่อนข้างยุ่งบน Windows :-( หวังว่าเวอร์ชั่นถัดไปของ Pygments จะบรรเทาปัญหานี้บ้าง แต่สำหรับผู้ที่ไม่ได้ทำงานกับ Python บ่อยนัก (และด้วยเหตุนี้easy_install) กระบวนการนี้จะไม่ราบรื่นมาก
Konrad Rudolph

1
บนเว็บไซต์เท็กซ์ SE มีตอนนี้ค่อนข้างคำถามบางอย่างเกี่ยวกับแพคเกจของคุณและฉันก็ตีหนึ่งกับชนิดของการร้องขอคุณสมบัติ (ที่ซ่อนอยู่ในการแสดงความคิดเห็นบริการ) คุณอาจต้องการดู
Paŭlo Ebermann

1
@ Paŭloขอบคุณ ฉันพยายามอ่านทั้งหมดที่กล่าวถึงของแพคเกจ (ฉันได้รับการแจ้งเตือนของ Google) แต่ฉันไม่ประสบความสำเร็จเสมอ คำถามที่คุณพูดถึงฉันอ่านแล้ว (เห็นได้ชัดว่า: ฉันยกมันขึ้นมา แต่ฉันจำไม่ได้) แต่ก็ไม่ได้ตรงไปตรงมา “ Ab” ใช้ TikZ สำหรับสิ่งนี้ดูเหมือนจะเป็นแฮ็คที่ไม่ดี…
Konrad Rudolph

6

TeX เป็นที่รู้จักกันดีในนามทัวริง แต่ฉันค่อนข้างแน่ใจว่าคุณจะต้องเขียนส่วนขยายนี้ด้วยตัวเอง เอกสารทำให้ชัดเจนว่าผู้แต่งดั้งเดิมของlistingsกำพร้าในปี 2004 และยังไม่ได้รับการปรับปรุงตั้งแต่ปี 2006 แพคเกจไม่ได้ออกแบบมาเพื่อแทนที่การจัดรูปแบบของตัวอักษรตัวเลข แต่คุณอาจจะสามารถแก้ไขได้โดยการเปลี่ยน \lst@ProcessDigitความหมายของ หากวิธีนี้ใช้ไม่ได้ผลคุณจะต้องเข้าใจในรายละเอียดว่าตัวเลือก "รูปแบบตัวระบุ" ทำงานอย่างไรและคุณจะต้องทำซ้ำเครื่องจักรดังกล่าวสำหรับตัวอักษรตัวเลขของคุณ

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


ฉันไม่ลังเลเลยที่จะแนะนำเครื่องมือภายนอก - อันที่จริงฉันคิดว่าการใช้ Pygments น่าจะเป็นทางออกที่ดีที่สุด คำถามคือวิธีการทำอย่างชาญฉลาดเพื่อให้ฉันยังคงสามารถหนีไปยัง LaTeX และ\labels ภายในรหัส
Konrad Rudolph

สำหรับการเปลี่ยนแปลงlistingsฉันได้ดูที่มาของมันไปแล้ว - และน่าเสียดายที่ฉันไม่เข้าใจเลย ทักษะ TeX ของฉันไม่มีที่ไหนใกล้กับระดับนั้น จนถึงตอนนี้ฉันเคยใช้ชุดย่อย LaTeX ของ TeX อยู่แล้ว
Konrad Rudolph

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

หากเอกสารถูกต้องแพคเกจรายชื่อจะยังคงอยู่ - อย่างไรก็ตามผู้ดูแลการเปลี่ยนแปลงและได้รับการแก้ไขข้อผิดพลาด
DetlevCM

1
@ ชื่อเพียงแค่จุดข้อมูล: ฉันเพิ่งจะประสบความสำเร็จในการแอบกระดาษโดยใช้mintedกระบวนการเผยแพร่ LNCS ของ Springer
Volker Stolz

3

นี่คือแพ็คเกจที่แปลงซอร์สโค้ดเป็น TeX และ LaTeX พร้อมการเน้นไวยากรณ์ เป็นไปได้ที่จะเพิ่มคำจำกัดความภาษาการเขียนโปรแกรมที่กำหนดเองได้อย่างง่ายดาย

ไฮไลต์รองรับ 100 ภาษาโปรแกรมและรวมถึง 50 ธีมสี มันมีการจัดรูปแบบรหัสและเยื้อง

ฉันไม่ได้ใช้มันเพื่อดูว่ามันทำงานได้ดี แต่มีคนอื่นที่ฉันรู้ว่ามันใช้งานได้ดี ถ้าฉันมีโอกาสฉันจะลองด้วยตัวเองและดู


1
highlightแบ่งปันปัญหาทั้งหมดของ Pygments โดยเฉพาะอย่างยิ่งมันไม่ใช่แพ็คเกจ LaTeXแม้จะมีคำอธิบายของมัน มันเป็นเพียงโปรแกรมแบบสแตนด์อะโลน ปัญหาเช่นเดียวกับ Pygments คือวิธีการใช้อย่างมีความหมายจากภายใน LaTeX และให้สิ่งที่ดีทั้งหมดที่listingsมี
Konrad Rudolph
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.