Як я можу автоматично конвертувати всі файли вихідного коду в папці (рекурсивно) в один PDF з підсвічуванням синтаксису?


29

Я хотів би перетворити вихідний код кількох проектів в один файл для друку, щоб зберегти на 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), ви зможете зробити один pdf з файлів ps.
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 сторінок безтурботності.
Bentley4

Відповіді:


47

Мене заінтригувало ваше запитання і я захопився. Це рішення створить приємний PDF-файл із індексом, який можна натискати, та кольором, виділеним кольором. Він знайде всі файли в поточному каталозі та підкаталогах та створить розділ у файлі PDF для кожного з них (див. Примітки нижче про те, як зробити команду пошуку більш конкретною).

Для цього потрібно встановити наступні (інструкції з установки встановлені для систем на базі Debian, але вони повинні бути доступними у сховищах вашого дистрибутива):

  • pdflatex, colorіlistings

    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), і це скріншот перших двох сторінок отриманого PDF:

введіть тут опис зображення


Пара коментарів:

  • Сценарій не буде працювати, якщо назви файлів вихідного коду містять пробіли. Оскільки ми говоримо про вихідний код, я припускаю, що вони цього не роблять.
  • Я додав, ! -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 , щоб він працював.
Bentley4

1
Якщо ваш файл викликається, src2pdfтоді вставте ! -name "src2pdf"такий findрядок у сценарії, як цей, find . -type f ! -regex ".*/\..*" ! -name "src2pdf" ! -name ".*" ! -name "*~" |щоб опустити його у pdf.
Bentley4

1
@ Bentley4 дякую! Я видалив пробіл (додано, коли я вставив сценарій у відповідь) і додав фільтр, щоб видалити сам скрипт з findрезультатів (я зберег скрипт в іншій папці, яка була в моєму $ PATH, щоб у мене не було цього проблема). Крім того, ви можете змінити мову, використовувану для вихідних файлів, щоб мати кращу розмітку, змінивши language=C++потрібну, вона може мати багато різних мов, дивіться тут .
тердон

1
@qubodup Я насправді не знаю. LaTeX і UTF8 можуть бути складними. Він повинен працювати з \usepackage[utf8]{inputenc} \ usepackage [німецька] {babel} `, але він не вдається на моїх тестах. Однак я підозрюю, що не годую це правдою utf8. Це може стояти власного питання, але я пропоную вам задати питання про TeX - LaTeX , вони повинні знати.
тердон

2

(від StackOverflow )

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

Це призведе до результату.txt, що містить:

  • Ім'я файлу
  • роздільник (---)
  • Вміст файлу .src
  • Повторіть зверху, доки всі файли * .src не будуть виконані

Якщо ваш вихідний код має інше розширення, просто змініть за потребою. Ви також можете відредагувати біт ехо, щоб додати необхідну інформацію (можливо, ехо "ім'я файлу $ 1" або змінити роздільник, або додати роздільник кінця файлу).

у посилання є інші методи, тому використовуйте будь-який метод, який вам найбільше подобається. Мені здається, що це є найбільш гнучким, хоча він має незначну криву навчання.

Код буде ідеально працювати з bash-терміналу (щойно перевірений на VirtualBox Ubuntu)

Якщо ви не переймаєтесь назвою файлу та просто піклуєтесь про вміст файлів, об'єднаних разом:

cat *.src > result.txt

буде працювати прекрасно.

Ще один запропонований метод:

grep "" *.src > result.txt

Який буде префікс кожного окремого рядка з ім'ям файлу, що може бути корисним для деяких людей, я особисто вважаю, що це занадто багато інформації, отже, чому моя перша пропозиція - це цикл, наведений вище.

Подяка тим, хто в форумі StackOverflow.

EDIT: Я щойно зрозумів, що ви отримаєте конкретний HTML або PDF як кінцевий результат, я бачив деякі рішення - це надрукувати текстовий файл у PostScript, а потім перетворити постскрипт у PDF. Я бачив якийсь код:

groff -Tps result.txt > res.ps

потім

ps2pdf res.ps res.pdf 

(Потрібно мати привид ghostscript)

Сподіваюся, це допомагає.


Це працює лише для файлів конкретного розширення (.src), але я хочу, щоб кожен файл був розміщений у цьому PDF-файлі незалежно від розширення. Я хотів би опустити не приховані файли та не приховані файли. Я відредагував оригінальний пост, чи можете ви його поглянути?
Bentley4

2

Я знаю, що я запізнився занадто пізно, але хтось, хто шукає рішення, може вважати це корисним.

На основі відповіді @ terdon я створив сценарій BASH, який виконує цю роботу: https://github.com/eljuanchosf/source-code-to-pdf


Будь ласка, цитуйте основні частини відповіді із посилальних посилань (ив), оскільки відповідь може стати недійсною, якщо змінена пов’язана сторінка.
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.