ฉันจะแปลงไฟล์ซอร์สโค้ดทั้งหมดในโฟลเดอร์ (เรียกซ้ำ) เป็น PDF เดียวโดยอัตโนมัติพร้อมกับการเน้นไวยากรณ์ได้อย่างไร


29

ฉันต้องการแปลงซอร์สโค้ดของโครงการไม่กี่โครงการเป็นไฟล์ที่พิมพ์ได้หนึ่งไฟล์เพื่อบันทึกบน usb และพิมพ์ออกมาได้อย่างง่ายดายในภายหลัง ฉันจะทำสิ่งนั้นได้อย่างไร

แก้ไข

ก่อนอื่นฉันต้องการชี้แจงว่าฉันต้องการพิมพ์ไฟล์และไดเรกทอรีที่ไม่ได้ซ่อนไว้เท่านั้น (ดังนั้นจึงไม่มีเนื้อหาของ.gitเช่น)

ในการรับรายการไฟล์ที่ไม่ได้ซ่อนทั้งหมดในไดเรกทอรีที่ไม่ได้ซ่อนไว้ในไดเรกทอรีปัจจุบันคุณสามารถเรียกใช้find . -type f ! -regex ".*/\..*" ! -name ".*"คำสั่งตามที่เห็นว่าเป็นคำตอบในชุดข้อความนี้

เป็นข้อเสนอแนะในหัวข้อเดียวกันกับที่ผมพยายามทำไฟล์ PDF ไฟล์โดยใช้คำสั่งfind . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdfแต่โชคร้ายไฟล์ PDF ที่ส่งผลให้เป็นระเบียบสมบูรณ์


ไม่ทราบว่ามันเหมาะกับความต้องการของคุณหรือไม่ แต่a2ps -P file *.srcคุณสามารถสร้างไฟล์ postscript ได้จากซอร์สโค้ดของคุณ แต่ไฟล์ PS จะต้องมีการแปลงและรวมภายหลัง
mpy

ใช้การแปลง ( linux.about.com/od/commands/l/blcmdl1_convert.htm , imagemagick) จากนั้นคุณควรจะสามารถสร้าง pdf หนึ่งไฟล์จากไฟล์ ps
SBI

คุณสามารถแสดงความคิดเห็นสิ่งที่คุณหมายถึงด้วย "ระเบียบสมบูรณ์"? ( i.stack.imgur.com/LoRhv.png ) นี้ดูไม่เลวสำหรับฉันโดยใช้a2ps -1 --delegate=0 -l 100 --line-numbers=5 -P pdf- ฉันเพิ่ม-l100 chars ต่อแถวเพื่อป้องกันการตัดคำและหมายเลขบรรทัด แต่นั่นเป็นเพียงการตั้งค่าส่วนตัว
mpy

สำหรับการแปลงโปรเจ็กต์นี้ (ไฟล์ที่ไม่ซ่อนที่ไม่ได้ซ่อนไว้ 4 ไฟล์แต่ละไฟล์มีหน้ายาวในไดเรกทอรีที่ไม่ได้ซ่อนไว้) เป็น pdf ฉันมีซอร์สโค้ดประมาณ 5 หน้าและ 39 หน้าซึ่งพูดพล่อยๆ
Bentley 4

คำตอบ:


47

ฉันรู้สึกทึ่งกับคำถามของคุณและได้หายไป โซลูชันนี้จะสร้างไฟล์ PDF ที่ดีพร้อมดัชนีที่คลิกได้และรหัสสีที่เน้น มันจะค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยและสร้างส่วนในไฟล์ PDF สำหรับแต่ละไฟล์ (ดูหมายเหตุด้านล่างสำหรับวิธีทำให้คำสั่ง find ของคุณเฉพาะเจาะจงมากขึ้น)

มันต้องการให้คุณมีการติดตั้งต่อไปนี้ (คำแนะนำการติดตั้งสำหรับระบบที่ใช้เดเบียน แต่สิ่งเหล่านี้ควรมีอยู่ในที่เก็บของการแจกจ่ายของคุณ):

  • pdflatex, colorและlistings

    sudo apt-get install texlive-latex-extra latex-xcolor texlive-latex-recommended

    สิ่งนี้ควรติดตั้งระบบ LaTeX พื้นฐานหากคุณยังไม่ได้ติดตั้ง

เมื่อติดตั้งแล้วให้ใช้สคริปต์นี้เพื่อสร้างเอกสาร LaTeX ด้วยซอร์สโค้ดของคุณ เคล็ดลับคือการใช้listings(ส่วนหนึ่งtexlive-latex-recommended) และcolor(ติดตั้งโดยlatex-xcolor) แพ็คเกจ LaTeX นี่\usepackage[..]{hyperref}คือสิ่งที่ทำให้รายชื่อในสารบัญสามารถคลิกลิงก์ได้

#!/usr/bin/env bash

tex_file=$(mktemp) ## Random temp file name

cat<<EOF >$tex_file   ## Print the tex file header
\documentclass{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color}  %% Allow color names
\lstdefinestyle{customasm}{
  belowcaptionskip=1\baselineskip,
  xleftmargin=\parindent,
  language=C++,   %% Change this to whatever you write in
  breaklines=true, %% Wrap long lines
  basicstyle=\footnotesize\ttfamily,
  commentstyle=\itshape\color{Gray},
  stringstyle=\color{Black},
  keywordstyle=\bfseries\color{OliveGreen},
  identifierstyle=\color{blue},
  xleftmargin=-8em,
}        
\usepackage[colorlinks=true,linkcolor=blue]{hyperref} 
\begin{document}
\tableofcontents

EOF

find . -type f ! -regex ".*/\..*" ! -name ".*" ! -name "*~" ! -name 'src2pdf'|
sed 's/^\..//' |                 ## Change ./foo/bar.src to foo/bar.src

while read  i; do                ## Loop through each file
    name=${i//_/\\_}             ## escape underscores
    echo "\newpage" >> $tex_file   ## start each section on a new page
    echo "\section{$i}" >> $tex_file  ## Create a section for each filename

   ## This command will include the file in the PDF
    echo "\lstinputlisting[style=customasm]{$i}" >>$tex_file
done &&
echo "\end{document}" >> $tex_file &&
pdflatex $tex_file -output-directory . && 
pdflatex $tex_file -output-directory .  ## This needs to be run twice 
                                           ## for the TOC to be generated    

เรียกใช้สคริปต์ในไดเรกทอรีที่มีไฟล์ต้นฉบับ

bash src2pdf

ที่จะสร้างไฟล์ที่เรียกว่าall.pdfในไดเรกทอรีปัจจุบัน ฉันลองสิ่งนี้กับไฟล์ต้นฉบับแบบสุ่มสองไฟล์ที่ฉันพบในระบบของฉัน (โดยเฉพาะไฟล์สองไฟล์จากแหล่งที่มาvlc-2.0.0) และนี่เป็นภาพหน้าจอของสองหน้าแรกของ PDF ที่เป็นผลลัพธ์:

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


ความคิดเห็นที่สอง:

  • สคริปต์จะไม่ทำงานหากชื่อไฟล์ซอร์สโค้ดของคุณมีช่องว่าง เนื่องจากเรากำลังพูดถึงซอร์สโค้ดฉันจะถือว่าพวกเขาไม่ได้
  • ฉันเพิ่ม! -name "*~"เพื่อหลีกเลี่ยงไฟล์สำรอง
  • ฉันขอแนะนำให้คุณใช้findคำสั่งที่เฉพาะเจาะจงมากขึ้นเพื่อค้นหาไฟล์ของคุณมิฉะนั้นไฟล์สุ่มใด ๆ จะรวมอยู่ใน PDF หากไฟล์ของคุณทั้งหมดมีนามสกุลเฉพาะ ( .cและ.hตัวอย่าง) คุณควรแทนที่findสคริปต์ด้วยสิ่งนี้

    find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
  • เล่นกับlistings ตัวเลือกต่างๆคุณสามารถปรับแต่งสิ่งนี้ให้ตรงตามที่คุณต้องการ

1
ว้าวนั่นคือสิ่งที่ฉันเรียกว่าคำตอบ! :)
mpy

1
OMG terdon คุณเป็นเจ้าของคำถามนั้น ^^ สำหรับคนอื่นที่ลองใช้สคริปต์: หากคุณพบเจอsrc2pdf: line 36: warning: here-document at line 5 delimited by end-of-file (wanted EOF')เมื่อใช้งานสคริปต์คุณต้องลบช่องว่างในบรรทัด EOFเพื่อให้สามารถใช้งานได้
Bentley4

1
หากไฟล์ของคุณถูกเรียกsrc2pdfแล้วใส่! -name "src2pdf"ในfindบรรทัดในสคริปต์เช่นนี้find . -type f ! -regex ".*/\..*" ! -name "src2pdf" ! -name ".*" ! -name "*~" |จะละเว้นไว้ในรูปแบบไฟล์ PDF
Bentley 4

1
@ Bentley4 ขอบคุณ! ฉันลบช่องว่าง (มันเพิ่มเมื่อฉันวางสคริปต์ลงในคำตอบ) และเพิ่มตัวกรองเพื่อลบสคริปต์ออกจากfindผลลัพธ์ (ฉันบันทึกสคริปต์ไว้ในไดเรกทอรีอื่นที่อยู่ใน $ PATH ของฉันดังนั้นฉันจึงไม่ได้ ปัญหา). นอกจากนี้คุณยังสามารถเปลี่ยนภาษาที่ใช้สำหรับไฟล์ที่มาจะมีมาร์กอัปที่ดีขึ้นโดยการเปลี่ยนlanguage=C++สิ่งที่คุณต้องการก็สามารถจัดการกับภาษาที่แตกต่างกันให้ดูที่นี่
terdon

1
@ quodup ฉันไม่รู้จริงๆ LaTeX และ UTF8 อาจเป็นเรื่องยาก มันควรจะทำงานกับ\usepackage[utf8]{inputenc} \ usepackage [german] {babel} `แต่มันล้มเหลวในการทดสอบของฉัน อย่างไรก็ตามฉันคิดว่าฉันไม่ได้ให้อาหารมันเป็นจริง utf8 นั่นอาจเป็นคำถามที่คุ้มค่า แต่ฉันแนะนำให้คุณถามTeX - LaTeXพวกเขาควรรู้
terdon

2

(จากStackOverflow )

for i in *.src; do echo "$i"; echo "---"; cat "$i"; echo ; done > result.txt

สิ่งนี้จะทำให้ result.txt ประกอบด้วย:

  • ชื่อไฟล์
  • ตัวแยก (---)
  • เนื้อหาของไฟล์. src
  • ทำซ้ำจากด้านบนจนกระทั่งไฟล์ * .src ทั้งหมดเสร็จสิ้น

หากซอร์สโค้ดของคุณมีนามสกุลต่างกันเพียงแค่เปลี่ยนตามที่จำเป็น นอกจากนี้คุณยังสามารถแก้ไข echo bit เพื่อเพิ่มข้อมูลที่จำเป็น (อาจ echo "ชื่อไฟล์ $ 1" หรือเปลี่ยนตัวคั่นหรือเพิ่มตัวคั่นจุดสิ้นสุดของไฟล์)

ลิงก์มีวิธีอื่นดังนั้นใช้วิธีใดก็ได้ที่คุณชอบที่สุด ฉันพบว่าอุปกรณ์นี้มีความยืดหยุ่นมากที่สุดแม้ว่าจะมาพร้อมกับช่วงการเรียนรู้เล็กน้อย

รหัสจะทำงานได้อย่างสมบูรณ์แบบจากเครื่องทุบตี (ทดสอบเพียงบน VirtualBox Ubuntu)

หากคุณไม่สนใจชื่อไฟล์และสนใจเนื้อหาของไฟล์ที่รวมเข้าด้วยกัน:

cat *.src > result.txt

จะทำงานได้อย่างสมบูรณ์แบบ

วิธีอื่นที่แนะนำคือ:

grep "" *.src > result.txt

ซึ่งจะนำหน้าทุกบรรทัดด้วยชื่อไฟล์ซึ่งอาจดีสำหรับบางคนโดยส่วนตัวแล้วฉันพบว่ามีข้อมูลมากเกินไปดังนั้นทำไมคำแนะนำแรกของฉันคือลูปด้านบน

มอบเครดิตให้กับผู้ที่อยู่ในฟอรัม StackOverflow

แก้ไข: ฉันเพิ่งรู้ว่าคุณอยู่หลัง HTML หรือ PDF โดยเฉพาะเป็นผลลัพธ์สุดท้ายโซลูชันบางอย่างที่ฉันเห็นคือพิมพ์ไฟล์ข้อความลงใน PostScript แล้วแปลง PostScript เป็น PDF ฉันเห็นบางรหัส:

groff -Tps result.txt > res.ps

แล้วก็

ps2pdf res.ps res.pdf 

(คุณต้องมีผี)

หวังว่านี่จะช่วยได้


ใช้งานได้กับไฟล์ของส่วนขยายเฉพาะ (.src) เท่านั้น แต่ฉันต้องการให้ทุกไฟล์ใส่ใน pdf นั้นโดยไม่คำนึงถึงนามสกุล ฉันต้องการละเว้น dirs ที่ไม่ได้ซ่อนไว้และไฟล์ที่ไม่ได้ซ่อนไว้ ฉันแก้ไขโพสต์ดั้งเดิมคุณช่วยลองดูหน่อยได้ไหม
Bentley 4

2

ฉันรู้ว่าฉันช้าเกินไป แต่คนที่กำลังมองหาวิธีแก้ปัญหาอาจพบว่ามีประโยชน์

จากคำตอบของ @ terdon ฉันได้สร้างสคริปต์ BASH ที่ทำงาน: https://github.com/eljuanchosf/source-code-to-pdf


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