Ich war fasziniert von Ihrer Frage und wurde irgendwie mitgerissen. Diese Lösung generiert eine schöne PDF-Datei mit einem anklickbaren Index und farblich hervorgehobenem Code. Es findet alle Dateien im aktuellen Verzeichnis und in den Unterverzeichnissen und erstellt für jede Datei einen Abschnitt in der PDF-Datei (siehe die Hinweise unten, um zu erfahren, wie Sie Ihren Suchbefehl spezifischer gestalten können).
Es erfordert, dass Sie Folgendes installiert haben (die Installationsanweisungen gelten für Debian-basierte Systeme, aber diese sollten in den Repositories Ihrer Distribution verfügbar sein):
-
pdflatex
,color
undlistings
sudo apt-get install texlive-latex-extra latex-xcolor texlive-latex-recommended
Dies sollte auch ein grundlegendes LaTeX-System installieren, falls Sie noch keines installiert haben.
Sobald diese installiert sind, verwenden Sie dieses Skript, um ein LaTeX-Dokument mit Ihrem Quellcode zu erstellen. Der Trick besteht darin, die listings
zu verwenden (Teil von texlive-latex-recommended
) und color
(installiert von latex-xcolor
) LaTeX-Pakete. Die \usepackage[..]{hyperref}
macht die Einträge im Inhaltsverzeichnis zu anklickbaren Links.
#!/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
Führen Sie das Skript in dem Verzeichnis aus, das die Quelldateien enthält
bash src2pdf
Dadurch wird eine Datei namens all.pdf
erstellt im aktuellen Verzeichnis. Ich habe dies mit ein paar zufälligen Quelldateien versucht, die ich auf meinem System gefunden habe (insbesondere zwei Dateien aus der Quelle von vlc-2.0.0
) und dies ist ein Screenshot der ersten beiden Seiten der resultierenden PDF-Datei:
Ein paar Kommentare:
- Das Skript funktioniert nicht, wenn Ihre Quellcode-Dateinamen Leerzeichen enthalten. Da wir über Quellcode sprechen, gehe ich davon aus, dass dies nicht der Fall ist.
- Ich habe
! -name "*~"
hinzugefügt Sicherungsdateien zu vermeiden. -
Ich empfehle Ihnen, einen spezifischeren
find
zu verwenden Befehl, um Ihre Dateien zu finden, andernfalls wird eine zufällige Datei in das PDF aufgenommen. Wenn Ihre Dateien alle bestimmte Erweiterungen haben (.c
und.h
zum Beispiel) sollten Siefind
ersetzen im Skript mit so etwasfind . -name "*\.c" -o -name "\.h" | sed 's/^\..//' |
- Spielen Sie mit
listings
herum Optionen können Sie dies genau so anpassen, wie Sie es möchten.
(von StackOverflow)
for i in *.src; do echo "$i"; echo "---"; cat "$i"; echo ; done > result.txt
Dies ergibt eine result.txt mit:
- Dateiname
- Trennzeichen (---)
- Inhalt der .src-Datei
- Wiederholen Sie von oben, bis alle *.src-Dateien fertig sind
Wenn Ihr Quellcode eine andere Erweiterung hat, ändern Sie sie einfach nach Bedarf. Sie können auch das Echo-Bit bearbeiten, um notwendige Informationen hinzuzufügen (vielleicht Echo "Dateiname $1" oder das Trennzeichen ändern oder ein Dateiende-Trennzeichen hinzufügen).
Der Link hat andere Methoden, also verwenden Sie die Methode, die Ihnen am besten gefällt. Ich finde dieses hier am flexibelsten, obwohl es mit einer leichten Lernkurve einhergeht.
Der Code wird perfekt von einem Bash-Terminal ausgeführt (gerade auf einem VirtualBox Ubuntu getestet)
Wenn Sie sich nicht für den Dateinamen interessieren und sich nur für den Inhalt der zusammengeführten Dateien interessieren:
cat *.src > result.txt
wird einwandfrei funktionieren.
Eine andere vorgeschlagene Methode war:
grep "" *.src > result.txt
Dadurch wird jeder einzelnen Zeile der Dateiname vorangestellt, was für manche Leute gut sein kann. Ich persönlich finde es zu viele Informationen, weshalb mein erster Vorschlag die for-Schleife oben ist.
Vielen Dank an die Leute im StackOverflow-Forum.
BEARBEITEN:Ich habe gerade festgestellt, dass Sie als Endergebnis speziell HTML oder PDF suchen. Einige Lösungen, die ich gesehen habe, bestehen darin, die Textdatei in PostScript zu drucken und dann PostScript in PDF zu konvertieren. Einige Codes, die ich gesehen habe:
groff -Tps result.txt > res.ps
dann
ps2pdf res.ps res.pdf
(Erfordert Ghostscript)
Hoffe das hilft.
Ich weiß, dass ich viel zu spät bin, aber jemand, der nach einer Lösung sucht, könnte dies nützlich finden.
Basierend auf der Antwort von @terdon habe ich ein BASH-Skript erstellt, das die Arbeit erledigt:https://github.com/eljuanchosf/source-code-to-pdf