Saya tertarik dengan pertanyaan Anda dan agak terbawa suasana. Solusi ini akan menghasilkan file PDF yang bagus dengan indeks yang dapat diklik dan kode warna yang disorot. Ini akan menemukan semua file di direktori dan subdirektori saat ini dan membuat bagian di file PDF untuk masing-masingnya (lihat catatan di bawah untuk cara membuat perintah find Anda lebih spesifik).
Anda harus menginstal yang berikut (petunjuk penginstalan adalah untuk sistem berbasis Debian tetapi ini harus tersedia di repositori distribusi Anda):
-
pdflatex
,color
danlistings
sudo apt-get install texlive-latex-extra latex-xcolor texlive-latex-recommended
Ini juga harus menginstal sistem LaTeX dasar jika Anda belum menginstalnya.
Setelah terinstal, gunakan skrip ini untuk membuat dokumen LaTeX dengan kode sumber Anda. Caranya adalah menggunakan listings
(bagian dari texlive-latex-recommended
) dan color
(dipasang oleh latex-xcolor
) paket LaTeX. \usepackage[..]{hyperref}
adalah apa yang membuat cantuman di daftar isi menjadi tautan yang dapat diklik.
#!/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
Jalankan skrip di direktori yang berisi file sumber
bash src2pdf
Itu akan membuat file bernama all.pdf
di direktori saat ini. Saya mencobanya dengan beberapa file sumber acak yang saya temukan di sistem saya (khususnya, dua file dari sumber vlc-2.0.0
) dan ini adalah tangkapan layar dari dua halaman pertama hasil PDF:
Beberapa komentar:
- Skrip tidak akan berfungsi jika nama file kode sumber Anda berisi spasi. Karena kita berbicara tentang kode sumber, saya akan menganggap mereka tidak melakukannya.
- Saya menambahkan
! -name "*~"
untuk menghindari file cadangan. -
Saya sarankan Anda menggunakan
find
yang lebih spesifik perintah untuk menemukan file Anda, jika tidak, file acak apa pun akan disertakan dalam PDF. Jika semua file Anda memiliki ekstensi tertentu (.c
dan.h
misalnya), Anda harus menggantifind
dalam skrip dengan sesuatu seperti inifind . -name "*\.c" -o -name "\.h" | sed 's/^\..//' |
- Bermain-main dengan
listings
opsi, Anda dapat mengubah ini menjadi persis seperti yang Anda inginkan.
(dari StackOverflow)
for i in *.src; do echo "$i"; echo "---"; cat "$i"; echo ; done > result.txt
Ini akan menghasilkan result.txt yang berisi:
- Nama file
- pemisah (---)
- Isi file .src
- Ulangi dari atas hingga semua file *.src selesai
Jika kode sumber Anda memiliki ekstensi yang berbeda, ubah saja seperlunya. Anda juga dapat mengedit bit gema untuk menambahkan informasi yang diperlukan (mungkin gema "nama file $1" atau mengubah pemisah, atau menambahkan pemisah akhir file).
tautan memiliki metode lain, jadi gunakan metode apa pun yang paling Anda sukai. Menurut saya yang satu ini paling fleksibel, meskipun memiliki sedikit kurva pembelajaran.
Kode akan berjalan dengan sempurna dari terminal bash (baru diuji di VirtualBox Ubuntu)
Jika Anda tidak peduli dengan nama file dan hanya peduli dengan konten file yang digabungkan:
cat *.src > result.txt
akan bekerja dengan sangat baik.
Metode lain yang disarankan adalah:
grep "" *.src > result.txt
Yang akan mengawali setiap baris dengan nama file, yang mungkin bagus untuk sebagian orang, secara pribadi saya menemukan terlalu banyak informasi, oleh karena itu mengapa saran pertama saya adalah for loop di atas.
Penghargaan untuk orang-orang di forum StackOverflow.
EDIT:Saya baru menyadari bahwa Anda secara khusus menginginkan HTML atau PDF sebagai hasil akhirnya, beberapa solusi yang saya lihat adalah mencetak file teks menjadi PostScript dan kemudian mengubah postscript menjadi PDF. Beberapa kode yang saya lihat:
groff -Tps result.txt > res.ps
lalu
ps2pdf res.ps res.pdf
(Anda harus memiliki ghostscript)
Semoga ini bisa membantu.
Saya tahu saya sangat terlambat, tetapi seseorang yang mencari solusi mungkin menganggap ini berguna.
Berdasarkan jawaban @terdon, saya telah membuat skrip BASH yang berfungsi:https://github.com/eljuanchosf/source-code-to-pdf