web-dev-qa-db-ja.com

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

いくつかのプロジェクトのソースコードを1つの印刷可能なファイルに変換して、USBに保存し、後で簡単に印刷したいと考えています。どうやってやるの?

編集する

最初に、非表示ではないファイルとディレクトリのみを印刷することを明確にしたいと思います(つまり、.gitの内容はありません)。

現在のディレクトリ内の非表示でないディレクトリにあるすべての非表示でないファイルのリストを取得するには、 this thread の回答として表示されるfind . -type f ! -regex ".*/\..*" ! -name ".*"コマンドを実行できます。

同じスレッドで示唆されているように、find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdfコマンドを使用してファイルのpdfファイルを作成しようとしましたが、残念ながら結果のpdfファイルは完全に混乱していますです。

29
Bentley4

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

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

  • pdflatexcolor および listings

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

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

これらがインストールされたら、このスクリプトを使用して、ソースコードを含むLaTeXドキュメントを作成します。トリックは listingstexlive-latex-recommendedの一部)と colorlatex-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のソースからの2つのファイル)でこれを試しました。これは、結果のPDFの最初の2ページのスクリーンショットです。

enter image description here


いくつかのコメント:

  • ソースコードファイル名にスペースが含まれている場合、スクリプトは機能しません。私たちはソースコードについて話しているので、彼らはそうではないと思います。
  • バックアップファイルを避けるために! -name "*~"を追加しました。
  • ただし、より具体的なfindコマンドを使用してファイルを見つけることをお勧めします。そうしないと、ランダムファイルがPDFに含まれます。すべてのファイルに特定の拡張子(たとえば、.cおよび.h)がある場合、スクリプトのfindを次のようなものに置き換える必要があります

    find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
    
  • listingsoptions をいじってみてください。これを好きなように微調整できます。
47
terdon

私は手遅れだと知っていますが、解決策を探している誰かがこれが役立つと思うかもしれません。

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

2
eljuanchosf

(- StackOverflow から)

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

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

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

ソースコードの拡張子が異なる場合は、必要に応じて変更してください。エコービットを編集して必要な情報を追加することもできます(「ファイル名$ 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が必要です)

お役に立てれば。

2
Darius