KTUGFaq

KTUG FAQ

로그인:
비밀번호:
가입
Good news from afar can bring you a welcome visitor.
FrontPage › SourceCodeListing

Source Code Listing 방법

목차

1 Source Code Listing 방법
1.1 일반적인 안내
1.2 간단하게 줄번호만 넣기
1.3 verbatim-like 소스코드 리스팅
1.3.1 verbatim 환경
1.3.2 verbatim 패키지 이용
1.3.3 sverb 패키지
1.3.4 fancyvrb 패키지를 이용한 소스코드 리스팅
1.3.5 alltt 패키지를 이용하는 법
1.3.6 Moreverb Package 를 사용하는 법
1.4 verbfile을 이용해서 외부 file을 읽어 들이기
1.4.1 sverb 패키지의 \verbinput
1.4.2 verbatim 패키지의 외부 파일 처리
1.4.3 moreverb 패키지의 \verbatimtabinput
1.4.4 verbfile 패키지
1.4.4.1 listing을 이용하면 파일에 line number를 추가해준다.
1.4.4.2 verbfile을 이용하면 눈에보이는 그대로 파일을 출력한다.
1.5 Programming Language에 특화된 리스팅
1.5.1 TeX 의 c_pascal 을 사용하는 법
1.5.2 Algorithmic Package를 사용하는 법
1.5.3 Program Package 를 사용하는 법
1.5.4 Listings Package 를 사용하는 법
1.6 Float 과 결합하여 예쁘게 만들기
1.6.1 floatstyle을 이용하는 방법
1.6.2 algorithm 패키지
1.7 팁: 한장 이상의 소스 Listing + TOC-like 첨가하기
1.7.1 카운터 만들기
1.7.2 TOC like 기능 추가
1.7.3 environment 만들기
1.7.4 실제 사용
1.8 기타
1.8.1 소스코드에 라인번호 추가 유틸리티(python)
1.8.2 framed 패키지 이용
1.8.3 소스코드를 LaTeX 코드로 변환하는 유틸리티
1.8.4 C++2LaTeX S/W
1.9 LGrind Package를 사용하는 법
1.9.1 LGrind 사용법
1.9.2 예제 코드
1.9.3 버그
1.9.4 자동화
1.10 Highlight
1.11 예제 소스

1.2 간단하게 줄번호만 넣기

KTUGOperate:20535
\usepackage{fancyvrb}

\begin{Verbatim}[fontfamily=cmtt,frame=single,baselinestretch=1,fontsize=
\footnotesize,numbers=left]
...
\end{Verbatim}

혹은

\usepackage{moreverb}
...
\begin{listing}{1}
[page 1 0 0 0 0 0 0 0 0 0]
fnt: cmr10 at 50pt
set: 'Hello, World!'
\end{listing}
...
위의 \begin{listing}{num} 에서 num 은 시작번호를 나타내고 \begin{listing}{num} 이전에 \let\listinglabelsize\footnotesize 와 같이 숫자크기를 조절할 수 있다.

1.3 verbatim-like 소스코드 리스팅

1.3.1 verbatim 환경

verbatim 환경을 이용합니다.
\begin{verbatim}
for (int i = 0; i < 10; i++) {
  ...
} 
\end{verbatim}

1.3.2 verbatim 패키지 이용

\usepackage{verbatim}
\verbatiminput{alltttest.tex}

verbatim 패키지를 이용하는 이유는 다음과 같습니다.
  • verbatim environment를 사용하는경우 memory overflow가 일어날 수 있다고 합니다. 이 문제를 해결합니다.
  • comment 환경을 이용해서 TeX 문서에 commenting을 해줄 수가 있습니다.
  • \verbatiminput을 제공합니다.

1.3.3 sverb 패키지

1.3.4 fancyvrb 패키지를 이용한 소스코드 리스팅


  • 줄나누기 논의 - KTUGOperate:15019
  • Environment 에서 Verbatim -KTUGOperate:15016
  • listings 패키지의 한글주석 처리 버그 - KTUGOperate:11425

listings 패키지는 주석문의 한글을 이상하게 표시합니다. 그러나 fancyvrb 패키지는 주석의 한글을 표시하는데 문제가 없습니다. 게다가 글꼴을 지정하고 행번호를 붙일 수 도 있습니다.

\documentclass{article}
\usepackage{hangul}
\usepackage{fancyvrb}

\title{fancyvrb 패키지 테스트}

\begin{document}
이것은 테스트입니다.
\begin{Verbatim}
[fontfamily=cmtt,frame=single,baselinestretch=1,fontsize=\footnotesize,numbers=left]
int main(int argc, char *argv[])
{
        //한글 주석1
        /*
                한글주석2
        */
        printf("헬로우 월드\n\n\n");
        printf("Hello, world\n");
        return 0;
}
\end{Verbatim}

\end{document}

계속 같은 옵션을 쓰기 싫다면 \DefineVerbatimEnvironment 를 쓸 수 있습니다.

\DefineVerbatimEnvironment
    {source}{Verbatim}
    {frame=single, baselinestretch=1,
     fontsize=\footnotesize, numbers=left}

\begin{source}
void hello {
    printf("hello world");
}
\end{source}

1.3.5 alltt 패키지를 이용하는 법

\documentclass{article}
\usepackage{alltt}

\begin{document}
\begin{alltt}
void main(void)\{
    printf("Hello, world");
    printf("Hello,world");
    /*
      \emph{강조도 사용가능함}
    */
\}
\end{alltt}
\end{document}
가끔 TeX 소스와 함께 프로그램 소스를 사용하고 싶을 경우가 있다. 이때에는 alltt package를 사용한다.
  • 프로그램중의 { 를 사용하기 위해서는 \{라고 써준다.
  • \emph{} 같이 TeX 명령어를 사용할 수 있다.

1.3.6 Moreverb Package 를 사용하는 법

from KTUGOperate:3173 (by Progress)

moreverb 패키지는 리스팅 환경을 제공합니다. 프로그램 같은 구문의 왼쪽에 줄을 달아주는 것이지요.

\begin{listing}[1]{1}
\begin{equation*}
\begin{CD}
A \cap B @>j>\mbox{\small projection}>B \\
@V i V \mbox{\small injection} V @VVgV \\
A @<f<k< A\cup B
\end{CD}
\end{equation*}
\end{listing}

여기서 \begin{listing}[1]{1}를 주의합니다.

[1]에 들어있는 1은 리스팅 번호가 매겨질 line 숫자를 의미합니다. 1로 했으니 1줄마다 번호가 붙지요. 만약 [2]로 했으면 두 번째 줄마다 번호가 붙습니다.

{1}에 들어있는 1은 line 숫자(줄번호)의 시작을 말합니다. 만약 {3}으로 하면 첫 줄line 번호가 3부터 시작합니다.

예를 들면 다음과 같습니다.
\begin{listing}[2]{3}
\begin{equation*}
\begin{CD}
A \cap B @>j>\mbox{\small projection}>B \\
@V i V \mbox{\small injection} V @VVgV \\
A @<f<k< A\cup B
\end{CD}
\end{equation*}
\end{listing}

비슷하게 \begin{listing} ~~ \end{listing}도 유효합니다.

1.4 verbfile을 이용해서 외부 file을 읽어 들이기

  • Uploads:verbfile.sty여기에서 verbfile.sty 파일을 다운로드 한다.

1.4.1 sverb 패키지의 \verbinput


1.4.2 verbatim 패키지의 외부 파일 처리


1.4.3 moreverb 패키지의 \verbatimtabinput

\verbatimtabinputtab_size{input_file} 은 탭사이즈를 조절하면서 외부 파일을 불러들인다. \listinginput{input_file} 은 외부 파일을 불러들이면서 라인 번호를 붙여준다.

1.4.4 verbfile 패키지

1.4.4.1 listing을 이용하면 파일에 line number를 추가해준다.

\usepackage{verbfile}
\listing{code/hello.c}

1.4.4.2 verbfile을 이용하면 눈에보이는 그대로 파일을 출력한다.

\usepackage{verbfile}
\verbfile{code/hello.c}

1.5 Programming Language에 특화된 리스팅

1.5.1 TeX 의 c_pascal 을 사용하는 법

c_pascal은 LaTeX의 패키지로 제공되지 않고 TeX 의 def 형태로 제공된다.
  1. TEXMF\generic\c_pascal 에서 cap_c.tex (C의 경우), cap_pascal(PASCAL)을 복사한다.
  2. \BeginC --- \EndC 안에 소스코드를 넣는다.
  3. \InputC{filename} 를 이용한다.
  4. \font\tenrm=cmtt10 를 추가한다.

\documentclass{article}
\font\tenrm=cmtt10

\input cap_c
\begin{document}

{\Large InputC example}\\
\InputC{./hello.c}
\\

{\Large BeginC/EndC example}\\
\BeginC
// this is a short demo program
/* both kinds of comment are recognised */

// some compiler directives
#pragma hdrfile "hello.sym" #include <stdio.h> #include
<sys/stat.h> #pragma hdrstop

// words not recognised as keywords are considered
// to be identifiers and are typeset in italic
void main() {
  int n;
  hello(0x1C);
  silly_funct();
} \EndC
\end{document}
실행결과 c_pascal.jpg

1.5.2 Algorithmic Package를 사용하는 법

Algorithm 실행결과 algorithmic.jpg

1.5.3 Program Package 를 사용하는 법

\documentclass{article}
\usepackage{program}
\begin{document}

\begin{programbox}
\mbox{A fast exponential procedure:}
\BEGIN
 \FOR i := 1 \TO 10 \STEP 1 \DO
   |expt|(2,i);
   |newline|
 \OD
 \WHERE \rcomment{A comment here}
 \PROC |expt|(x,n) \BODY
   z := 1;
   \DO \IF n = 0 \THEN \EXIT \FI;
     \DO \IF |odd|(n) \THEN \EXIT \FI;
       n := n/2; x := x*x;
     \OD;
     n := n-1;
     z := z*x
   \OD;
   |print|(z) \ENDPROC
\END
\end{programbox}

\end{document}

실행결과 prog.jpg

1.5.4 Listings Package 를 사용하는 법

KTUGOperate:8421 (by hoze)

\documentclass{article}
\usepackage{listings}

\begin{document}
\lstset{numbers=left, numberstyle=\tiny, stepnumber=1, numbersep=5pt}
\begin{lstlisting}
fileviewer(Dir) :-
    new(F, frame('File Viewer')),
    send(F, append(new(B, browser))),
    send(new(D, dialog), below(B)),
    send(D, append(button(view,
                  message(@prolog, view,
                      B?selection?key)))),
    send(D, append(button(quit,
                  message(F, destroy)))),
    send(B, members(directory(Dir)?files)),
    send(F, open).

view(F) :-
    send(new(V, view(F)), open),
    send(V, load(F)).
\end{lstlisting}
\end{document}

/!\ Listings 패키지에서 소스 코드에 한글이 들어 있을 경우 이를 잘 표현해주지 못한다. 한 줄 안에서만 표현하려면 한글 부분을 escape 범위 안에 둠으로써 문제를 일부 피해갈 수 있다. escape 범위의 시작과 끝을 나타내는 문자는 listing하려고 하는 언어에서 유보문자로 사용되지 않는 글자 중에서 골라야 할 것이다. 예를 들면 tilde 문자를 escape로 사용하기로 한다면
\begin{lstlisting}[escapeinside=~~]
#include <stdio.h>

int main(int argc, char *argv[])
{
	//~헬로우 월드를 출력~
        /*~여러 줄 주석의 경우에는 행별로~
           ~escape 범위를 설정해준다.~ */
	printf("Hello, world\n");
        printf("~안녕하세요~\n");
	return 0;
}
\end{lstlisting}
아쉬운 대로 한글 문제는 이렇게 하여 그럭저럭 처리할 수 있는 것으로 보임.

1.6 Float 과 결합하여 예쁘게 만들기

1.6.1 floatstyle을 이용하는 방법

\floatstyle{ruled}
\newfloat{Program}{thp}{lop}[section]

\listof{Program}{Program Listing}

\begin{Program}
\listing{png2jpgs.py}
\caption{The Program}
\end{Program}
The LaTeX Companion p.148 참고.

1.6.2 algorithm 패키지

참고 Algorithm

1.7 팁: 한장 이상의 소스 Listing + TOC-like 첨가하기

위에서본 float 을 이용하면, 자동으로 listof 에 내용을 만들어 주고, 간단한 장식을 해준다. 그러나 한장 이상의 소스를 리스팅하기 위해서는 직접 비슷한 환경을 만들어 주어야 한다.

1.7.1 카운터 만들기

\newcounter{example}[section] % section 에 자동으로 카운터를 0로 만들어 준다.
\setcounter{example}{1}

1.7.2 TOC like 기능 추가

\makeatletter
\newcommand{\listofexamples}{\@starttoc{xmp}}
\newcommand{\ecaption}[1]{\addcontentsline{xmp}{example}{#1}
  \begin{centering}
    \bf Example \thesection .\theexample : #1 \\[1cm]
  \end{centering}
}
\newcommand{\l@example}[2]{\par\noindent#1 \dotfill {\itshape #2}}
\makeatother

1.7.3 environment 만들기

\newenvironment{slist}{\noindent\rule{\textwidth}{1pt}\begin{list}{}{}\item[]}
{\end{list}\noindent\rule{\textwidth}{1pt} \stepcounter{example}}

1.7.4 실제 사용

\begin{slist}
\verbatiminput{biorhythm.rb}
\end{slist}
\ecaption{안녕하세요?}

더 좋은 방법이 있으면 추가해 주시기 바랍니다. --smcho

1.8 기타

1.8.1 소스코드에 라인번호 추가 유틸리티(python)

코드에 라인번호를 추가하는 것은 다음과 같은 Utility를 이용할 수 있습니다.
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import string
import os.path

ADDED_SPLIT = "_lineadd"

class AddLine:
    def __init__(self, fileName_):
        self._fileName = fileName_
        # 파일의 이름에서 확장자만을 분리해 낸다
        [name,ext] = os.path.splitext(fileName_)
        self._fileNameNew = name + ADDED_SPLIT + ext
        print self._fileNameNew
    def append(self):
        try:
            fp = open(self._fileName)
            fp2 = open(self._fileNameNew,"w")
            lines = fp.readlines();
            # 일단 line strip을 한다. 
            count = 1
            for line in lines:
                #line = string.rstrip(line)
                newline = "%4d: %s" % (count, line)
                count += 1
                fp2.write(newline)

        except IOError:
            print "ERROR opening file"

if __name__ == "__main__":
    line = AddLine("add_line.py")
    line.append()


1.8.2 framed 패키지 이용

framed 패키지를 이용하면 소스 주위에 쉽게 선을 두를 수가 있다. 소스코드가 1장이 넘어가도 문제없이 동작한다.

\begin{framed}
\verbatiminput{framed.sty}
\end{framed}

1.8.3 소스코드를 LaTeX 코드로 변환하는 유틸리티

1.9 LGrind Package를 사용하는 법

[http]http://www.ctan.org/tex-archive/support/lgrind/?action=/tex-archive/support/ 위의 주소에서 소스코드를 다운로드 받을 수 있으나 그냥 컴파일은 되지 않는다. 위의 소스코드를 Win32 환경에서 컴파일링 한 것은 여기에서 다운로드 받으면 된다. Uploads:lgrind.zip

1.9.1 LGrind 사용법

lgrind -i -lc -d lgrindef lgutil.c  > res.tex
파스칼 코딩의 경우 -lpascal 등으로 변경할 수 있다. 자세한 사항은 lgrind.pdf 참조.

1.9.2 예제 코드

\usepackage[leftno,lineno5]{lgrind}
\usepackage{color}

\LGnuminterval=1 % numbering interval
\def\LGfsize{\small} % font size
\def\BGfont{\ttfamily\color{cyan}} % default
%\def\CMfont{\ttpfamily\bfseries\color{blue}}
\def\KWfont{\ttfamily\color{blue}} % keyword
\def\NOfont{\bfseries\color{red}} % Number
\def\STfont{\ttfamily\color{green}} % String
\def\TTfont{\ttfamily\upshape}
\def\VRfont{\ttfamily\color{black}\small} % variable

...

\lgrindfile{code/chap1/cradle.tex}

csource.jpg

1.9.3 버그

생성된 tex 파일의 제일 마지막에 공란을 하나 두어야 한다. 그렇지 않으며 \LGnuminterval=1 로 만들어, 모든 라인에 번호를 붙이는 경우에 문제가 생긴다.

1.9.4 자동화

다음과 같은 배치 파일을 만들어서 path 에 저장한다.
lgrind -i -l%1 -d d:\prog\bin\lgrindef %2  > %3
rem 자동으로 생성된 파일의 제일 마지막에 공란을 추가하는 기능을 추가하여야 한다.
python d:\prog\bin\addblankline.py %3

자동으로 제일 마지막에 공란을 넣는 python 프로그램은 다음과 같다.
#!/usr/bin/python
import sys

def process(val_):
    try:
        f = open(val_,"r+")
    except IOError:
        print "Error! no such file"
        sys.exit()
    f.seek(0,2)
    f.write('\n')
    f.close()

if __name__ == '__main__':
    try:
        val = sys.argv[1]
    except IndexError:
        print "Error! no argumnet"
        sys.exit()
    process(val)

사용법은 다음과 같다.
lg pascal cradle.dpr cradle.tex

1.10 Highlight

다양한 테마와 스타일을 제공하는 소스 코드 리스팅의 최적의 툴. smcho 님의 노력으로 저자와 접촉한 끝에 한글(EUC-KR, UTF-8) 주석문의 처리가 가능해진 베타 버전이 나왔다.

1.11 예제 소스

이제까지 나온 도구들을 종합하여 다음과 같은 간단한 예를 만들었다. 이는 python 소스를 hightlight 를 이용하여 LaTeX 으로 만든다음 이를 listofsource 등의 환경을 이용하여 처리한 것이다. PDFHyperLink 를 이용해서 pdf 상에서 다른 소스나 프로그램을 실행시키는 것도 가능하다. 단 이경우에 python interpreter 가 깔려 있어야 한다.


Contributors: smcho



^
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2007-02-18 04:44:39
Processing time 0.1136 sec