Bir klasördeki tüm kaynak kod dosyalarını otomatik olarak, sözdizimi vurgulamalı olarak tek bir PDF'ye nasıl dönüştürebilirim?


29

Birkaç projenin kaynak kodunu, bir usb cihazdan tasarruf etmek ve daha sonra kolayca yazdırmak için tek bir yazdırılabilir dosyaya dönüştürmek istiyorum. Bunu nasıl yapabilirim?

Düzenle

Öncelikle sadece gizli olmayan dosyaları ve dizinleri yazdırmak istediğimi açıklığa kavuşturmak istiyorum ( .gitörneğin hiçbir içerik yok ).

Geçerli dizindeki gizli olmayan dizinlerdeki gizli olmayan tüm dosyaların bir listesini almak için find . -type f ! -regex ".*/\..*" ! -name ".*"komutu bu konudaki cevap olarak görüldüğü gibi çalıştırabilirsiniz .

Aynı iş parçacığında önerildiği gibi dosyaları kullanarak bir pdf dosyası yapmayı denedim find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdfama ne yazık ki sonuçta ortaya çıkan pdf dosyası tam bir karışıklık .


İhtiyacınıza uygun olup olmadığını bilmiyorum, ancak a2ps -P file *.srcsizinle kaynak kodunuzdan postscript dosyaları oluşturabilirsiniz. Ancak PS dosyalarının daha sonra dönüştürülmesi ve birleştirilmesi gerekiyor.
mpy

Convert'i kullanarak ( linux.about.com/od/commands/l/blcmdl1_convert.htm , imagemagick) ps dosyalarından bir pdf yapabilmelisiniz.
SBI

Komple karışıklık ile ne demek istediğinizi yorumlayabilir misiniz? Bu ( i.stack.imgur.com/LoRhv.png ) benim için çok kötü gözükmüyor , kullanma a2ps -1 --delegate=0 -l 100 --line-numbers=5 -P pdf- -lBazı kelime kaydırmalarını ve satır numaralarını önlemek için satır başına 100 karakter ekledim , ama bu sadece kişisel bir tercih.
mpy

Dönüştürmek için bu projeyi ben kaynak kodunun 5 sayfa ve anlamsız 39 sayfaları hakkında vardı pdf (4 boş olmayan dosyaları olmayan gizli dizinleri uzun bir sayfa hakkında olmayan her gizli).
Bentley4

Yanıtlar:


47

Sorunuzla ilgilenmiştim ve bir nebze uzağa taşındı. Bu çözüm, tıklanabilir bir dizin ve renk vurgulanmış kod içeren hoş bir PDF dosyası oluşturur. Geçerli dizindeki ve alt dizinlerdeki tüm dosyaları bulur ve her biri için PDF dosyasında bir bölüm oluşturur (find komutunuzu nasıl daha belirgin hale getireceğinize ilişkin aşağıdaki notlara bakın).

Aşağıdakilerin kurulu olmasını gerektirir (yükleme talimatları Debian tabanlı sistemler içindir, ancak bunlar dağıtımınızın depolarında bulunmalıdır):

  • pdflatex, colorvelistings

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

    Eğer kurulu bir sisteminiz yoksa, temel bir LaTeX sistemi de kurmalıdır.

Bunlar yüklendikten sonra kaynak kodunuzla bir LaTeX belgesi oluşturmak için bu betiği kullanın. Hile, LaTeX paketlerinin (tarafından ) ve (tarafından yüklenen ) listingsbölümünü kullanıyor . İçindekiler tıklanabilir bağlantılar tablosunda listeleri kılan budur.texlive-latex-recommendedcolorlatex-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    

Komut dosyasını kaynak dosyaları içeren dizinde çalıştırın

bash src2pdf

Bu all.pdf, geçerli dizinde adı verilen bir dosya yaratacaktır . Bunu sistemimde bulduğum bir kaç rastgele kaynak dosyayla denedim (özellikle kaynağından iki dosyayla vlc-2.0.0) ve bu sonuçta ortaya çıkan PDF'nin ilk iki sayfasının ekran görüntüsü:

görüntü tanımını buraya girin


Birkaç yorum:

  • Kaynak kod dosya adlarınız boşluk içeriyorsa kod çalışmaz. Kaynak kod hakkında konuştuğumuzdan, söylemediklerini varsayacağım.
  • ! -name "*~"Yedek dosyaları önlemek için ekledim .
  • findDosyalarınızı bulmak için daha belirli bir komut kullanmanızı öneririm , aksi takdirde herhangi bir rasgele dosya PDF'ye dahil edilir. Dosyalarınızın hepsinin belirli uzantıları varsa ( .cve .hörneğin), findkomut dosyasındaki ifadeyi bunun gibi bir şeyle değiştirmelisiniz.

    find . -name "*\.c" -o -name "\.h" | sed 's/^\..//' | 
  • listings Seçeneklerle oynayın , tam olarak istediğiniz gibi olacak şekilde ince ayar yapabilirsiniz.

1
Vay canına, buna cevap dediğim bu! :)
mpy

1
OMG terdon, bu soruyu aldın. Betiği deneyen diğer insanlara: Betiği çalıştırırken src2pdf: line 36: warning: here-document at line 5 delimited by end-of-file (wanted EOF')karşılaşırsanız, çalışması için EOF satırındaki boşlukları silmeniz gerekir.
Bentley4

1
Dosyanız denir ise src2pdfo zaman insert ! -name "src2pdf"içinde findböyle senaryodaki hat find . -type f ! -regex ".*/\..*" ! -name "src2pdf" ! -name ".*" ! -name "*~" |pdf bunu atlamak için.
Bentley4

1
@ Bentley4 teşekkürler! Boşluğu kaldırdım (betiği cevabın içine yapıştırdığım kuzeye eklendi) ve betiği findsonuçlardan kaldırmak için filtre ekledim (betiği $ PATH'imdeki başka bir dizine kaydetmiştim ; sorun). Ayrıca, kaynak dosyalarında kullanılan dili, istediğinizi değiştirerek daha iyi bir işaretlemeye sahip olacak şekilde değiştirebilirsiniz, language=C++birçok farklı dille baş edebilir, buraya bakın .
terdon

1
@qubodup Gerçekten bilmiyorum. LaTeX ve UTF8 aldatıcı olabilir. O gerektiğini çalışmak \usepackage[utf8]{inputenc} \ usepackage [Alman] {babel} `ama benim testlerde başarısız olur. Ancak, doğru utf8 beslemiyorum şüpheli. Bu kendi sorusuna değebilir ama TeX - LaTeX'e sormanızı öneririm .
terdon

2

( StackOverflow'dan )

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

Bu, aşağıdakileri içeren bir sonuç.txt ile sonuçlanır:

  • Dosya adı
  • ayırıcı (---)
  • .Src dosyasının içeriği
  • Tüm * .src dosyaları tamamlanana kadar üstten tekrarlayın.

Kaynak kodunuz farklı bir uzantıya sahipse, gerektiği şekilde değiştirin. Ayrıca, gerekli bilgileri eklemek için eko bitini düzenleyebilirsiniz (belki "1 dosya adı eko" ya da ayırıcıyı değiştirebilir veya dosya sonu ayırıcısı ekleyebilirsiniz).

bağlantı başka yöntemlere sahiptir, bu nedenle en sevdiğiniz yöntemi kullanın. Hafif bir öğrenme eğrisi ile gelmesine rağmen bunu en esnek buluyorum.

Kod bir bash terminalinden mükemmel şekilde çalışacaktır (sadece bir VirtualBox Ubuntu'da test edilmiştir)

Dosya adını umursamıyorsanız ve sadece birleştirilmiş dosyaların içeriğini önemsiyorsanız:

cat *.src > result.txt

mükemmel çalışacak.

Önerilen başka bir yöntem:

grep "" *.src > result.txt

Dosya adı ile her bir satırın önüne geçecek, bazı insanlar için iyi olabilir, şahsen çok fazla bilgi bulabilirim, bu yüzden ilk önerim yukarıdaki for döngüsüdür.

StackOverflow forumundaki kişilere teşekkür ederiz.

EDIT: Sonunda özellikle HTML veya PDF'den sonra olduğunuzu anladım, gördüğüm bazı çözümler metin dosyasını PostScript'e yazdırmak ve ardından postscript'i PDF'e dönüştürmek. Gördüğüm bazı kodlar:

groff -Tps result.txt > res.ps

sonra

ps2pdf res.ps res.pdf 

(Ghostscript olması gerekir)

Bu yardımcı olur umarım.


Bu yalnızca belirli bir uzantıdaki (.src) dosyalar için çalışır, ancak uzantıya bakmaksızın her dosyanın bu pdf'ye yerleştirilmesini istiyorum. Olsa da, gizli olmayan dir ve gizli olmayan dosyaları atlamak istiyorum. Orijinal yazıyı düzenledim, bakar mısın?
Bentley4

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.