28

Я хотел бы преобразовать исходный код нескольких проектов в один файл для печати, чтобы сэкономить на USB и распечатать позже. Как я могу это сделать?

редактировать

Прежде всего, я хочу уточнить, что я хочу печатать только не скрытые файлы и каталоги (например, без содержимого .git ).

Чтобы получить список всех не скрытых файлов в не скрытых каталогах в текущем каталоге, вы можете запустить find . -type f ! -regex ".*/\..*" ! -name ".*" рассматривается как ответ в этой теме.

Как и предлагалось в той же теме, я попытался создать pdf-файл из файлов, используя команду find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty -print0 | xargs -0 a2ps -1 --delegate no -P pdf но, к сожалению, полученный PDF-файл представляет собой полный беспорядок.

3 ответа3

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 , вы можете настроить их так, как вы хотите.
2

Я знаю, что я слишком поздно, но кто-то ищет решение может найти это полезным.

Основываясь на ответе @ terdon, я создал скрипт BASH, который выполняет эту работу: https://github.com/eljuanchosf/source-code-to-pdf

2

(из StackOverflow)

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

Это приведет к result.txt, содержащему:

  • Имя файла
  • разделитель (---)
  • Содержимое файла .src
  • Повторяйте сверху, пока все * .src файлы не будут сделаны

Если ваш исходный код имеет другое расширение, просто измените при необходимости. Вы также можете отредактировать бит echo, чтобы добавить необходимую информацию (например, echo «имя файла $ 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)

Надеюсь это поможет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .