KTUGFaq

KTUG FAQ

로그인:
비밀번호:
가입
You will hear good news from one you thought unfriendly to you.
FrontPage › noweb

r1.30과 현재 버전의 차이점

@@ -9,7 +9,13 @@
=== PC 에서 인스톨 하기 ===
다음의 위치를 참고한다.
http://www.literateprogramming.com/noweb/nowebinstall.html
=== 맥에서 인스톨 하기1 ===
가장 쉽게 인스톨 하는 것은 port (http://www.macports.org/) 를 사용하는 것이다.
{{{
sudo port install noweb
}}}
/opt/local/bin 에 noweb 이 설치된다.
=== 맥에서 인스톨 하기 2 ===
noweb 은 외부 프로그램을 불러서 추가 처리를 하는 기능이 있다. 외부 프로그램은 C 코드를 컴파일한 바이너리거나, awk 프로그램이거나 icon 프로그램이다. 그러므로 noweb 을 이용해서 다양한 기능을 이용하기 위해서는 반드시 awk 와 icon 이 깔려 있어야 한다.
* 일단 src 디렉토리로 이동한다.
* awk 를 nawk 로 인식시키기 {{{sudo ln -s /usr/bin/awk /usr/bin/nawk}}}
@@ -37,7 +43,6 @@
우분투에서는 꾸러미 관리자에 등록되어 있다. 다른 패키지와 동일하게 설치한다.
== knoweb ==
기존의 noweb 을 개선한 스타일 파일, http://www.k-online.com/~joer/noweb/knoweb.html 에서 다운로드 받을 수 있다.
이 버전이 문제가 없고 더 안정적이므로 가능하면 knoweb.sty 를 사용하도록 한다.

== 예제 만들기 ==
간단히 구구단을 해주는 예제를 만들어 보았다.



noweb이란

noweb 은 LaTeX 을 사용하는 cweb 이다. web/cweb 이 TeX 을 대상으로 하는 것처럼 noweb 은 LaTeX 을 대상으로 한다. 즉, 기존의 모든 LaTeX 의 패키지를 cweb 에서 제공하는 literate programming 과 함께 사용할 수 있다.

다운로드/인스톨

http://www.eecs.harvard.edu/nr/noweb/ 에서 소스를 다운로드 하여 컴파일 해주면 된다.

PC 에서 인스톨 하기

맥에서 인스톨 하기1

가장 쉽게 인스톨 하는 것은 port (http://www.macports.org/) 를 사용하는 것이다.
sudo port install noweb
/opt/local/bin 에 noweb 이 설치된다.

맥에서 인스톨 하기2

noweb 은 외부 프로그램을 불러서 추가 처리를 하는 기능이 있다. 외부 프로그램은 C 코드를 컴파일한 바이너리거나, awk 프로그램이거나 icon 프로그램이다. 그러므로 noweb 을 이용해서 다양한 기능을 이용하기 위해서는 반드시 awk 와 icon 이 깔려 있어야 한다.
  • 일단 src 디렉토리로 이동한다.
  • awk 를 nawk 로 인식시키기 sudo ln -s /usr/bin/awk /usr/bin/nawk
  • icon 은 다음의 위치에 있다. http://www.cs.arizona.edu/icon/
    • 맥의 경우 바이너리가 있으므로 이를 인스톨 하여 사용하도록 한다. 인텔 맥의 경우에도 잘 동작한다.
    • icon 바이너리는 PATH상에 위치시켜준다.
  • src 디렉토리에서 Makefile 을 다음과 같이 변경한다. 여기에서 보면 라이브러리 소스가 awk 일 경우와 icon 일 경우, 두가지가 있으므로 해당되는 LIBSRC를 지정해주고 메이크 해주어야 한다. 즉, 전체적으로 보면 make install 을 두번해주어야 한다.
    #LIBSRC=./icon 
    LIBSRC=awk
    # If you have no Icon compiler, but do have icont, make ICONC=icont
    ICONC=icont
    ICONT=icont
      
  • 텍설정 디렉토리도 변경해 주어야 한다. 이 경우 (당연히) 필요한 경우 디렉토리를 만들어 주어야 한다.
    TEXINPUTS=/Users/smcho/Library/texmf/tex/latex/
      
  • 이후 make; sudo make install; 해주면 자동으로 깔린다.
    • 반드시 모든 아이콘 소스코드가 깔리는 것을 확인해 주어야 한다!!!!

리눅스에서 인스톨

맥의 경우를 참고해서 인스톨 하면 될것으로 생각됩니다. -- smcho

우분투에서는 꾸러미 관리자에 등록되어 있다. 다른 패키지와 동일하게 설치한다.

knoweb

기존의 noweb 을 개선한 스타일 파일, http://www.k-online.com/~joer/noweb/knoweb.html 에서 다운로드 받을 수 있다.

예제 만들기

간단히 구구단을 해주는 예제를 만들어 보았다.

\documentclass{article}
\usepackage{noweb}
\usepackage{dhucs}
\begin{document}

\section{구구단 만들기}
구구단을 해주는 프로그램을 작성해 보자. 

@ 
가장 높은 레벨에서는 다음과 같이 처리할 수 있다. 
<<nine.c>>=
<<headers>>
<<engine>>
<<main>>
<<print>>
<<test>>
@

상태는 [[status]]로 표시가 가능하다. 
<<headers>>=
/* 헤더파일 */
#include <stdio.h>
#include <assert.h>
@

<<engine>>=
/*
   DoxyGen string
*/
int engine(int x, int y)
{
  assert(x >= 0 && y >= 0);
  return (x * y);
}
@

<<print>>=
/*
  Write down the result.
*/
int print(int x, int y, int z)
{
  printf("(%d) X (%d) = (%d)\n",x,y,z);
}
@

<<main>>=
/*
  Main Routine
*/
int main()
{
  int i, j;
  for (i = 1; i < 3; i++) {
    for (j = 1; j < 3; j++) {
      int z = engine(i,j);
      print(i,j,z);
    }
  }
}
@

<<test>>=
/*
  Test routine
*/
int test()
{
  printf("testme\n");
}
@
\end{document}

사용법

텍파일 얻기
noweave -delay nine.nw > nine.tex

소스코드 얻기
notangle nine.nw -Rnine.c > nine.c

결과

텍소스를 컴파일 하면 pdf 를 얻을 수 있다.

소스코드를 컴파일 하면 프로그램을 얻을 수 있다.
 $ gcc nine.c -o nine
$ ./nine 
(1) X (1) = (1)
(1) X (2) = (2)
(2) X (1) = (2)
(2) X (2) = (4)

코드 청크

noweb 은 <<>> 로 상징되는 코드 청크들을 하나로 모아주는 기능을 제공한다. \nowebchunks 명령을 이용한다.

인덱스

noweb 은 어떠한 정의가 어디에서 사용되었는지를 알려주는 index 를 만들 수 있다.

인덱스 정의

[[main]] 과 같이 사용하면 main 이 인덱스로 기록된다.

인덱스 지정

@ %def main 을 코드청크 다음에 기록하면 인덱스와 코드청크가 연결이 된다. main 은 인덱스로 사용할, 미리 정의된 값이다.

인덱스 생성

\nowebindex 를 사용하여 생성한다.
  • noweb 명령에서 -index 를 추가한다.

책갈피

보통의 hyperref 를 사용하는 것 만으로도 코드 청크 끼리의 연결이 자동으로 생성된다.
\usepackage[pdftex,colorlinks,backref,bookmarks
  ,pdftitle={knoweb.sty}
  ,pdfauthor={smcho}
  ,pdfpagemode={UseOutline}
  ,bookmarksopen={true}
  ]{hyperref}

큰 프로그램 만들기

웹은 하나의 nw 파일에서 여러개의 소스파일을 만들어 낼 수가 있다. -R 옵션을 사용하면 된다.

또한 웹은 여러개의 nw 파일을 만들고, 각각을 tex 으로 변환한 다음에 \input 을 이용해서 하나의 '큰' 텍 파일을 만들어 낼 수 있다.

이 두가지를 종합하면 아주큰 프로젝트를 웹으로 만들어 낼 수가 있다. 그러나 이 경우 make 파일도 동시에 만들어야 한다.

다음에 Makefile 의 예를 들었다. make tex 을 이용해서 현재 디렉토리에 있는 모든 nw 파일에서 텍 소스와 매트랩(.m) 을 자동으로 생성해 내고, 이후에 make명령을 이용해서 pdf 를 만드는 구조로 되어 있다.

기존의 Makefile 에 비해서 셸의 for 기능을 이용해야 한다. 이것은 오브젝트 파일을 모아서 하나의 실행파일을 만드는 보통의 C 프로그래밍 과는 다르게, 하나의 tex 파일에 다수의 .tex 파일을 include 하는 구조를 이용해야 하기 때문이다.

만일, Make 고유의 기능을 이용해서 변경된 파일만을 처리하기 바란다면 일일이 abc.m : abc.nw 처럼 소스파일의 의존성을 기록해 주면 된다. 예에서는 자동으로 처리되는 방법을 사용했다.

SHELL=/bin/sh
NOWEAVE=noweave
NOTANGLE=notangle
NODEFS=nodefs
PDFLATEX=pdflatex

TARGET=codeanalysis
NWS = $(wildcard *.nw)
NAMES = $(NWS:.nw=)
TEXS = $(NWS:.nw=.tex)

.SUFFIXES: .nw .tex .dvi .html .pdf .m
.SECONDARY: $(TEXS) # Don't delete the tex file
.PHONY: tex

all: $(TARGET).pdf

test:
	@echo $(TEXS)
	
pdf:
	$(PDFLATEX) $(TARGET).tex

tex: 
	@for t in $(NAMES); do \
	echo "processing $$t.nw"; \
	$(NODEFS) -autodefs c $$t.nw > $$t.defs; \
	$(NOWEAVE) -delay -filter btdefn -autodefs c -indexfrom $$t.defs $$t.nw > $$t.tex; \
	$(NOTANGLE) -R$$t $$t.nw > $$t.m; \
	done

$(TARGET).pdf : $(TARGET).tex
	$(PDFLATEX) $< -o $@
	
.nw.tex:
	$(NODEFS) -autodefs c $*.nw > $*.defs
	$(NOWEAVE) -delay -filter btdefn -autodefs c -indexfrom $*.defs $*.nw > $@
	

sclean:
	rm -f *~  *.dvi *.log *.html *.pdf *.m *.out *.defs

clean:
	rm -f *~  *.dvi *.log *.html *.pdf *.m *.out *.defs *.tex *.aux
	

기타

  • notangle 이 만들어 주는 소스코드는 조금 답답한 느낌을 준다. 이경우 bcpp 등을 이용하여 소스를 예쁘게 변환할 수 있다.
  • memoir 를 사용할 경우 \tt 등과 같은 폰트 명령이 memoir 에 없다고 에러가 난다. 이건 memoir의 "문제"가 아니고 \tt 같은 non-compatible한 command를 쓰고 있는 스타일이 문제이기 때문에 발생한다. 이경우 [oldfontcommands] 옵션을 사용해야 한다.

예제

유명한 wc 를 noweb 을 이용해서 만들어 본다.

다운로드

@wc.zip (12.41 KB)

컴파일

nodefs -autodefs c wc.nw > wc.defs
noweave -delay -filter btdefn -autodefs c -indexfrom wc.defs wc.nw > wc.tex
pdflatex wc.tex
으로 pdf 를 생성할 수 있다.

notangle wc.nw > wc.c
로 C 소스코드를 생성할 수 있다.

결과

@wc.pdf (204.25 KB) 예제에서, 인덱스 및 코드 정크가 pdf 상에서 완벽하게 연결되어 지는 것을 볼 수 있다. 한글도 dhucs 를 사용하는 경우에는 문제없이 잘 된다.



^
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-12-17 02:11:18
Processing time 0.0723 sec