KTUGFaq

KTUG FAQ

로그인:
비밀번호:
가입
Domestic happiness and faithful friends.
FrontPage › DVI/Format
DVI(device-independent) 파일 포맷은 1979년 David R. Fuchs가 만들었으며, 조판 및 출력 등을 위한 매우 간단한 명령들로 이루어져 있습니다. 특히 TeX이 결과물로 이 DVI 포맷을 사용하면서 많은 사람들에게 친숙하게 되었습니다.

DVI 파일은 바이트(byte; 8-bit)들의 스트림으로 이루어지며 이러한 데이터들을 통해 DVI 명령들이 기술됩니다. 각 DVI 명령들은 한 바이트의 동작코드(operation code)와 그에 따른 인수들(parameters)로 구성되는데 각 인수들이 사용하는 바이트의 수는 고정되어있지 않습니다. (인수를 가지지 않는 동작코드도 물론 있습니다.) 파일 내에서의 위치(파일의 시작점을 0으로 했을 때)를 나타내는 포인터일 경우 4개의 바이트가 사용되고 숫자를 기술할 때는 1-4 개의 바이트들로 표현됩니다. 음수는 two's complement 방식으로 표현하는데, 예를 들어 2 개의 바이트를 사용하는 숫자의 범위는 $-2^{15}$ 에서 $2^{15}-1$ 까지 입니다. (이러한 이유로 DVI 파일은 매우 컴팩트한 (낭비하는 바이트가 많지 않은) 포맷이라고 알려져 있습니다.)

DVI 파일의 구성


DVI 파일은 크게 세 부분으로 나눌 수 있는데 첫 부분을 preamble, 마지막 부분을 postamble 이라고 부르며 여기에는 기본적인 정보들이 수록되어 있습니다. DVI 파일의 거의 대부분은 preamble 과 postamble 사이의 중간 부분이 차지하고 있는데 여기에는 각 페이지들의 정보가 차례로 들어가게 됩니다.

<preamble> <1st page> <2nd page> ... <last page> <postamble>

Preamble


preambleDVI 파일의 첫 부분에 위치하며 preamble 의 시작을 알리는 pre 동작코드(247)와 dimension 정보를 주는 6 개의 인수들로 구성됩니다. 각 인수 다음에 [k] 와 같이 숫자가 나오는 것은 각 인수가 얼마나 많은 바이트들을 필요로 하는가를 의미합니다.

pre i[1] num[4] den[4] mag[4] k[1] x[k]

먼저 iDVI 파일의 identification 번호로 TeX 은 2 를 사용하고 일본어 pTeX 과 같이 세로쓰기가 가능한 extended TeX 들은 3 을 사용합니다.

각각 4개의 바이트들로 이루어진 numden 는 양수의 값으로 DVI 파일에서 사용하는 기본 유닛(DVI unit)의 실제 길이를 의미합니다. 따라서 DVI 파일에 기술된 숫자에 $\frac{num}{den}$ 값을 곱하게 되면 $10^{-7}m$ 단위의 실제 길이가 나오게 됩니다.

$\frac{num}{den} (10^{-7}m) = 1 (\mbox{DVI unit})$

예를 들어 TeX 은 기본 유닛으로 sp 를 사용하는데 $1in = 2.54cm = 72.27pt = 72.27\cdot 2^{16}sp$ 이므로 다음 식에 의해 $num=25400000$ 이 되고 $den=7227\cdot 2^{16}=473628672$ 가 됩니다.

$10^{-7}m = \frac{10^{-7}}{0.0254}in = \frac{72.27\cdot 10^{-7}}{0.0254}pt = \frac{7227\cdot 2^{16}}{25400000}sp \approx 18.65 sp$

mag 는 배율을 1000 으로 곱한 값을 의미하는데 TeX 에서 \mag 명령으로 배율을 주는 것과 동일하다고 생각하면 됩니다. k 는 주석(comment)의 길이를 의미하는데 한 바이트를 사용하므로 주석은 최대 255 영문자를 넣을 수 있습니다. 마지막으로 x 는 주석의 내용을 의미합니다.

Postamble


postambleDVI 파일의 마지막 부분에 위치하며 postamble 의 시작을 알리는 post 동작코드(248)와 8 개의 인수들로 구성됩니다. 그 뒤에는 DVI 파일에서 사용한 글꼴들의 정의가 나오고 마지막으로 postpost 동작코드(249)와 2 개의 인수들이 나옵니다. DVI 파일의 끝은 223 값을 갖는 4-7 개의 바이트들로 채워지는데 이것은 DVI 파일의 크기가 4의 배수가 되도록 하기 위해서 사용됩니다.

post p[4] num[4] den[4] mag[4] l[4] u[4] s[2] t[2]

<font definitions>

postpost q[4] i[1] 223's[>=4]

post 의 인수들 중 num, den, mag 는 이미 preamble 에서 나왔던 것을 다시 한번 기록한 것입니다. p 인수는 DVI 파일에서 마지막 페이지의 시작 포인터를 (DVI 파일의 시작 점을 0 으로 했을 때) 의미하고 l 인수는 페이지들 중 길이가 가장 긴 페이지의 길이(height + depth)를 의미하고 u 인수는 페이지들 중 폭이 가장 큰 페이지의 폭(width)를 의미합니다. s 인수는 DVI 파일에서 사용한 스택의 최대 깊이를 그리고 t 인수는 DVI 파일에 들어 있는 페이지들의 수를 의미합니다.

postpost 의 인수들 중 ipreamble 에서 나왔던 것이고 q 인수는 post 동작코드의 위치를 가리키는 포인터입니다.

<font definitions> 는 다음과 같은 네가지의 동작코드(fnt_def1(243)-fnt_def4(246))로 구성되는데 각 동작코드들의 기능과 인수는 동일하며 글꼴 번호를 나타내는데 몇 개의 바이트를 사용하는가에 따라 달라집니다.

fnt_def1 k[1] c[4] s[4] d[4] a[1] l[1] n[a+l]

fnt_def2 k[2] c[4] s[4] d[4] a[1] l[1] n[a+l]

fnt_def3 k[3] c[4] s[4] d[4] a[1] l[1] n[a+l]

fnt_def4 k[4] c[4] s[4] d[4] a[1] l[1] n[a+l]

여기에서 k 의 범위는 각각 $0\leq k<256$, $0\leq k<65536$, $0\leq k<2^{24}$, $-2^{31}\leq k<2^{31}$ 입니다. 네개의 바이트를 차지하는 c 인수에는 DVI 파일을 만든 원래의 프로그램(보통 TeX)이 사용한 TFM 파일의 체크섬(checksum)이 기록됩니다. s 인수는 fixed-point scale factor, 그리고 d 인수는 design size 를 의미하는데 자세한 것은 TFM 파일 포맷을 보시기 바랍니다. n 인수에는 글꼴의 이름이 들어가는데 길이는 al 인수를 합한 값이 됩니다.

각 페이지 구성


DVI 파일의 각 페이지들은 bop 동작코드(139)로 시작해서 eop 동작코드(140)으로 끝나는데 각 동작코드에 필요한 인수는 다음과 같습니다.

bop c0[4] c1[4] ... c9[4] p[4]

<DVI commands>

eop

p 인수에는 이전 페이지의 시작 포인터(bop 위치)가 들어가는데 첫번째 페이지의 경우에는 -1 이 들어갑니다. c0...c9 인수에는 TeX 의 경우 \shipout 명령으로 각 페이지가 만들어질 때의 \count0...\count9 레지스터의 값이 들어가는데, 보통 \count0 레지스터에는 TeX 에서 사용한 페이지 번호가 들어있습니다.

DVI 파일의 특징


1. DVI 파일의 각 페이지에는 페이지 번호라는 개념이 없습니다. 대신 TeX 으로 만든 DVI 파일의 경우 페이지 번호에 관한 정보가 bopc0 인수에 들어 있을 뿐입니다.

2. DVI 파일에는 각 페이지의 바운딩 박스(bounding box; 폭과 길이에 관한 정보)가 들어있지 않습니다. 대신 postamble 에 최대 크기만 들어있습니다. 따라서 페이지의 바운딩 박스를 계산하려면 페이지 내의 DVI 명령들을 모두 분석해야만 합니다.

3. DVI 파일의 좌표는 PS 파일이나 PDF 파일에서 사용하는 직교좌표는 중고교 등의 수학 교과서에서 흔히 사용하는 직교좌표(Cartesian coordinates)의 체계(가로 좌표($x$-좌표는 왼쪽에서 오른쪽으로 증가하고 세로 좌표($y$-좌표)는 아래에서 위로 증가하는 체계)가 아닙니다. 종이의 왼쪽 맨위가 좌표의 원점 $(0,0)$이고 세로 좌표($y$-좌표)가 위에서 아래로 증가합니다.

DVI 변수들


1. 현재 지정된 글꼴 $f$

fnt 또는 fnt_num 동작코드로 변경할 수 있습니다.

2. 현재 위치 $(h,v)$

페이지 내의 현재 위치는 항상 $(h,v)$ 에 의해 결정되며

3. 현재 거리 변수 $w,x,y,z$

$w,x$$h$ 를 변경하는데, 그리고 $y,z$$v$ 를 변경하는데 주로 쓰입니다. 또는 길이 값을 잠시 보관하는 변수의 기능도 합니다.

DVI 명령어들


글자 또는 rule 출력 명령


1. set_char_0, set_char_1, ..., set_char_127 동작코드(0-127)

현재 지정된 글꼴의 해당 글자(0-127)를 현재 위치에 출력하고 그 글자의 폭만큼 오른쪽으로 이동합니다. (만약 TFM 파일에 글자의 폭이 음수로 기록되어 있으면 왼쪽으로 이동합니다.)

2. set1 c[1] 동작코드(128), set2 c[2] 동작코드(129), set3 c[3] 동작코드(130), set4 c[4] 동작코드(131)

위의 set_char_x 명령과 동일한 기능을 하는데 글자의 코드가 127 보다 큰 경우 c 인수에 코드를 넣습니다. c 인수는 기본적으로 양수이지만 c[4] 일 경우 음수도 될 수 있습니다.

3. put1 c[1] 동작코드(133), put2 c[2] 동작코드(134), put3 c[3] 동작코드(135), put4 c[4] 동작코드(136)

글자를 출력한 후 글자의 폭만큼 이동하는 것만 제외하고 위의 setx 명령과 동일한 기능을 합니다.

4. set_rule a[4] b[4] 동작코드(132), put_rule a[4] b[4] 동작코드(137)

(세로)길이 a, (가로)폭 b 인 (속이 꽉 찬) 네모 박스를 현재 위치에 출력합니다. set_rule 의 경우에는 출력 후 (가로)폭 b 만큼 오른쪽으로 이동합니다. (만약 b 가 음수인 경우 왼쪽으로 이동합니다.) 주의할 점은 a 또는 b 가 음수 또는 0인 경우에는 네모 박스를 출력하지 않는다는 것입니다.

가로 이동 명령


1. right1 b[1] 동작코드(143), right2 b[2] 동작코드(144), right3 b[3] 동작코드(145), right4 b[4] 동작코드(146)

2. w0 동작코드(147), w1 b[1] 동작코드(148), w2 b[2] 동작코드(149), w3 b[3] 동작코드(150), w4 b[4] 동작코드(151)

3. x0 동작코드(152), x1 b[1] 동작코드(153), x2 b[2] 동작코드(154), x3 b[3] 동작코드(155), x4 b[4] 동작코드(156)

세로 이동 명령


1. down1 b[1] 동작코드(157), down2 b[2] 동작코드(158), down3 b[3] 동작코드(159), down4 b[4] 동작코드(160)

2. y0 동작코드(161), y1 b[1] 동작코드(162), y2 b[2] 동작코드(163), y3 b[3] 동작코드(164), y4 b[4] 동작코드(165)

3. z0 동작코드(166), z1 b[1] 동작코드(167), z2 b[2] 동작코드(168), z3 b[3] 동작코드(169), z4 b[4] 동작코드(170)


see DVI

^
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-02-20 03:40:31
Processing time 0.0757 sec