GNU/Linux >> Linux の 問題 >  >> Linux

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

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

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

  • pdflatexcolorlistings

    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 のソースからの 2 つのファイル) でこれを試しました。 ) そして、これは結果の PDF の最初の 2 ページのスクリーンショットです:

いくつかのコメント:

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

    find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
    
  • listings で遊んでみる 必要に応じて正確に調整できます。

(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 が必要です)

これがお役に立てば幸いです。


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

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


Linux
  1. LinuxでファイルをUTF-8エンコーディングに変換する方法

  2. Linuxで1つの特定のファイルを除いてフォルダ内のすべてのファイルを削除する方法

  3. ディレクトリ内のファイル サイズがゼロ (0) バイトのすべてのファイルを再帰的に検索する方法

  1. フォルダー階層内の個別のファイル拡張子をすべて見つけるにはどうすればよいですか?

  2. 各フォルダにファイルを作成するにはどうすればよいですか?

  3. Linuxのviでfindによって返されたすべてのファイルを編集するにはどうすればよいですか?

  1. ディレクトリ(およびそのサブディレクトリ)内のすべてのpdfファイルを単一の出力ディレクトリに再帰的にコピーするにはどうすればよいですか?

  2. PDF ファイルの Evince ハイライトを元に戻すにはどうすればよいですか?

  3. bzip されていないすべてのファイルを再帰的に bzip2 するにはどうすればよいですか?