구문 강조 표시를 사용하여 폴더의 모든 소스 코드 파일을 (재귀 적으로) 단일 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)를 사용하면 ps 파일에서 하나의 pdf를 만들 수 있습니다.
SBI

"완전 엉망"이란 말의 의미는 무엇입니까? 이 ( i.stack.imgur.com/LoRhv.png )는 다음을 사용하여 나쁘지 않게 보입니다 .-- 줄 바꿈과 줄 번호를 방지하기 위해 행 당 100 문자를 a2ps -1 --delegate=0 -l 100 --line-numbers=5 -P pdf추가 -l했지만 개인 취향 만입니다.
mpy

변환 프로젝트를 내가 소스 코드의 5 페이지와 횡설수설의 39 페이지에 대해 한 PDF (4 비어 있지 않은 파일을 숨겨지지 않은 디렉토리에있는 긴 페이지에 대한 각을 숨겨지지 않은).
Bentley4

답변:


47

나는 당신의 질문에 흥미를 느꼈고 약간 쫓겨났습니다. 이 솔루션은 클릭 가능한 색인과 색상으로 강조 표시된 코드로 멋진 PDF 파일을 생성합니다. 현재 디렉토리와 하위 디렉토리에서 모든 파일을 찾고 PDF 파일에서 각 파일에 대한 섹션을 만듭니다 (찾기 명령을보다 구체적으로 만드는 방법은 아래 참고 사항 참조).

다음을 설치해야합니다 (설치 지침은 데비안 기반 시스템 용이지만 배포 리포지토리에서 사용할 수 있어야합니다).

  • pdflatex, colorlistings

    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++를 원하는대로 변경 하여 마크 업이 향상되도록 변경할 수 있습니다 . 다양한 언어를 처리 할 수 ​​있습니다 ( 여기 참조) .
terdon

1
@qubodup 나는 정말로 모른다. LaTeX와 UTF8은 까다로울 수 있습니다. 그것은 해야 작업 \usepackage[utf8]{inputenc} \ usepackage [독일어] {바벨}`하지만 내 테스트에 실패합니다. 그러나 나는 그것이 진정한 utf8을 먹이지 않고 있다고 생각합니다. 그것은 자체 질문의 가치가 있지만 TeX-LaTeX 에 대해 물어볼 것을 제안합니다 .
terdon

2

( 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로 인쇄 한 다음 포스트 스크립트를 PDF로 변환하는 것입니다. 내가 본 일부 코드 :

groff -Tps result.txt > res.ps

그때

ps2pdf res.ps res.pdf 

(고스트 스크립트가 필요합니다)

이것이 도움이되기를 바랍니다.


이것은 특정 확장자 (.src)의 파일에서만 작동하지만 확장자에 관계없이 모든 파일을 해당 PDF에 넣기를 원합니다. 숨겨지지 않은 dirs 및 숨겨지지 않은 파일을 생략하고 싶습니다. 원본 게시물을 수정했습니다. 살펴볼 수 있습니까?
Bentley4

2

나는 너무 늦었다는 것을 알고 있지만 해결책을 찾는 사람이 이것이 유용 할 수 있습니다.

@ terdon의 답변을 기반으로 작업을 수행하는 BASH 스크립트를 작성했습니다. https://github.com/eljuanchosf/source-code-to-pdf


링크 된 페이지가 변경되면 답변이 유효하지 않을 수 있으므로 참조 링크에서 답변의 필수 부분을 인용하십시오.
DavidPostill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.