フォルダー内のすべてのソースコードファイルを(再帰的に)構文強調表示付きの単一のPDFに自動的に変換するにはどうすればよいですか?


29

いくつかのプロジェクトのソースコードを1つの印刷可能なファイルに変換して、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が、ソースコードからポストスクリプトファイルを作成できます。ただし、PSファイルは後で変換して結合する必要があります。
mpy

convert(linux.about.com/od/commands/l/blcmdl1_convert.htm、imagemagick)を使用すると、psファイルから1つのpdfを作成できるはずです。
SBI

「完全な混乱」とはどういう意味ですか?これ(i.stack.imgur.com/LoRhv.png)は、私にはあまり悪くないように見えますa2ps -1 --delegate=0 -l 100 --line-numbers=5 -P pdf- -lワードラップや行番号を防ぐために行ごとに100文字を追加しましたが、それは個人的な好みです。
mpy

このプロジェクト(非非表示のディレクトリにあるページごとに4つの非空の非非表示ファイル)をpdfに変換するために約5ページのソースコードと39ページの意味不明なファイルがありました。
ベントレー

回答:


47

私はあなたの質問に興味をそそられ、ちょっと夢中になりました。このソリューションは、クリック可能なインデックスと色で強調表示されたコードを含む素敵なPDFファイルを生成します。現在のディレクトリとサブディレクトリですべてのファイルを検索し、それぞれのPDFファイルにセクションを作成します(findコマンドをより具体的にする方法については、以下のメモを参照してください)。

次のものがインストールされている必要があります(インストール手順はDebianベースのシステム用ですが、ディストリビューションのリポジトリで利用できるはずです):

  • pdflatexcolorそしてlistings

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

    インストールされていない場合、これにより基本的なLaTeXシステムもインストールされます。

これらをインストールしたら、このスクリプトを使用して、ソースコードでLaTeXドキュメントを作成します。秘Theは、LaTeXパッケージlistings(の一部texlive-latex-recommended)およびcolor(インストール者)を使用することlatex-xcolorです。これ\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により、現在のディレクトリに呼び出されるファイルが作成されます。私のシステムで見つけたいくつかのランダムなソースファイル(特に、のソースからの2つのファイルvlc-2.0.0)でこれを試しました。これは、結果のPDFの最初の2ページのスクリーンショットです。

ここに画像の説明を入力してください


いくつかのコメント:

  • ソースコードファイル名にスペースが含まれている場合、スクリプトは機能しません。ソースコードについて話しているので、そうではないと仮定します。
  • ! -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行の空白削除して動作させる必要があります。
ベントレー

1
ファイルが呼び出された場合、このようなスクリプトの行にsrc2pdf挿入! -name "src2pdf"して、pdfでそれを省略します。findfind . -type f ! -regex ".*/\..*" ! -name "src2pdf" ! -name ".*" ! -name "*~" |
ベントレー

1
@ Bentley4ありがとう!空白を削除し(答えにスクリプトを貼り付けたときに追加されました)、フィルターを追加してfind結果からスクリプト自体を削除しました(スクリプトを$ PATHにある別のディレクトリに保存していたので、それがありませんでした)問題)。また、ソースファイルに使用する言語を変更して、マークアップを向上させるlanguage=C++ことができます。必要なものに変更することで、さまざまな言語に対応できますこちらを参照してください
テルドン

1
@qubodup私は本当に知りません。LaTeXとUTF8には注意が必要です。それはすべきでは動作\usepackage[utf8]{inputenc} \ USEPACKAGE [ドイツ] {}バベル`が、それは私のテストに失敗しました。ただし、本当のutf8を供給していないのではないかと思います。それはそれ自体の質問に値するかもしれませんが、TeX-LaTeXで尋ねることをお勧めします。
テルドン

2

StackOverflowから)

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

これにより、以下を含むresult.txtが作成されます。

  • ファイル名
  • セパレーター(---)
  • .srcファイルの内容
  • すべての* .srcファイルが完了するまで、上から繰り返します

ソースコードの拡張子が異なる場合は、必要に応じて変更します。エコービットを編集して必要な情報を追加することもできます(「filename $ 1」をエコーするか、区切り文字を変更するか、ファイルの終わりの区切り文字を追加します)。

リンクには他の方法があるので、好きな方法を使用してください。これは最も柔軟性が高いと思いますが、多少の学習曲線があります。

コードはbashターミナルから完全に実行されます(VirtualBox Ubuntuでテスト済み)

ファイル名を気にせず、一緒にマージされたファイルの内容だけを気にする場合:

cat *.src > result.txt

完璧に動作します。

提案された別の方法は次のとおりです。

grep "" *.src > result.txt

これはすべての行の先頭にファイル名を付けますが、これは一部の人にとっては便利な場合がありますが、個人的には情報が多すぎるため、最初の提案は上記のforループです。

StackOverflowフォーラムの人々に感謝します。

編集:最終結果としてあなたが具体的にHTMLまたはPDFを使用していることに気付きました。私が見たいくつかの解決策は、テキストファイルをPostScriptに印刷してからPostScriptをPDFに変換することです。私が見たいくつかのコード:

groff -Tps result.txt > res.ps

それから

ps2pdf res.ps res.pdf 

(ghostscriptが必要です)

お役に立てれば。


これは特定の拡張子(.src)のファイルに対してのみ機能しますが、拡張子に関係なくすべてのファイルをそのpdfに入れたいです。ただし、非隠しディレクトリと非隠しファイルは省略したいと思います。元の投稿を編集しましたが、ご覧ください。
ベントレー

2

私は遅すぎることを知っていますが、解決策を探している人はこれが役立つかもしれません

@terdonの答えに基づいて、私は仕事をするBASHスクリプトを作成しました:https : //github.com/eljuanchosf/source-code-to-pdf


リンクされたページが変更されると回答が無効になる可能性があるため、回答の重要な部分を参照リンクから引用してください。
DavidPostill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.