This commit was generated by cvs2svn to compensate for changes in r89,

which included commits to RCS files with non-trunk default branches.
parents
%!PS-Adobe-2.0 EPSF-2.0
%%Title: /root/old-linux/home/nickie/Research/Thesis/doc/Figures/pyrforos.ps
%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley
%%BoundingBox: 178 301 418 541
%%Pages: 1
%%DocumentFonts:
%%EndComments
%%BeginPreview: 240 240 1 240
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000010000000000000000000000000000
% 000000000000000000000000000fffffffc0000000000000000000000000
% 00000000000000000000000003ffffffffff000000000000000000000000
% 0000000000000000000000003ffffffffffff00000000000000000000000
% 000000000000000000000003fffffffffffffe0000000000000000000000
% 00000000000000000000003fffe000007fffffe000000000000000000000
% 0000000000000000000000fffe000000003ffffc00000000000000000000
% 000000000000000000000fffc00000000007ffff00000000000000000000
% 000000000000000000007ff0000000000007ffffe0000000000000000000
% 00000000000000000001ff00000e00000007e3fff8000000000000000000
% 0000000000000000000ff80000ffe0000007f1fffe000000000000000000
% 0000000000000000007fe00001fffe000003f8ffff800000000000000000
% 000000000000000000ff00000fffff000001fc787fe00000000000000000
% 000000000000000003fc00001fffff800000fe380ff80000000000000000
% 00000000000000000ff000007ff03fc000003e3c03fc0000000000000000
% 00000000000000003fc000007f803fe000001f3c007e0000000000000000
% 00000000000000007f000000ff0437e000001f1e003f8000000000000000
% 0000000000000001fc0000007f0017e000000f1e001fe000000000000000
% 0000000000000007f80000007f8007e00000079f80c7f800000000000000
% 000000000000000fe00000037f0007e00000079ff8f1ff00000000000000
% 000000000000003fc0000003ff87ffe00000079ffcf9ffc0000000000000
% 00000000000000ff00000003ffffffe0000007cffe7fffe0000000000000
% 00000000000001fe007c0003ffffffc0000007effe3feff8000000000000
% 00000000000007f8007c0001ffffff80000007ffff1fe1fc000000000000
% 0000000000000ff0007e00003fffff00000003ffff8ff0fe000000000000
% 0000000000001fc003ff00007e39ff00000003ffff87f03f000000000000
% 0000000000007f0807ff0000fc38ff00000003ffff83f01fc00000000000
% 000000000000fe1c0fff80007cfcff00000001ffff80e007e00000000000
% 000000000001fc1e0fffb0007dfcff00000060fffd8000e3f00000000000
% 000000000003f81e07fff8003ffe7f000000e07ffe0471e0fc0000000000
% 000000000007f01e07fff0001ffe37000000703ffe0771e0fc0000000000
% 00000000000fcc3e03fff0000f7e36000000701fff07f3c1fe0000000000
% 00000000001f9c3e01fff000003e000000007c0fff03f3c3ff8000000000
% 00000000001f1c3e01fff000003f000000003fffff03f3e7ffc000000000
% 00000000003e387e00fff000007efbe000003fffef81f9e7ffc000000000
% 0000000000f838fe00fff00000ffffff80001ffff781f9f3fff000000000
% 0000000000f071fc00ffe00001ffffffc0000ffff3c0fff9fff800000000
% 0000000003e0f3f800ffe00000fffffff80001fffbe07ff8fffc00000000
% 0000000007c0f3f000ffe0000077fffffe000007f9f87ff8fffe00000000
% 000000000f80e7e000ffc0000074ff1ffe000000fcfe3ffcfffe00000000
% 000000000f00e7c1c0ffc0000030ff3fff0000007eff9ffcffdf00000000
% 000000003e00e787c0ff800000302e7fff0000003fffcffcffcf80000000
% 000000007c00778fc0ff800000303effff8000001ffffffdffdfc0000000
% 00000000783ef78f80ff800000007cffffc000000fffffffffffe0000000
% 00000001f87ff79f00ff80000000fbffffe0000007fff7fffffff0000000
% 00000001f07ff7be007fc0000003e3ffffe0000007fffffffffcf8000000
% 00000003e03ff7be007fc0000063c3fffff000000ffffffffff878000000
% 00000007c007efbc001fc00000ffc7fffff800000ffffbf7fff87c000000
% 0000000f8407cf78000fe00000ffc7fffff800000fb1f9f7fff83e000000
% 0000000f0f078f780007f00000ffcffffff8000007fffdf79ffffe000000
% 0000001e0f8f1e700007f8000fbf8ffffff8000007fffff79fffff000000
% 0000003e0f8f3cf00003fc000ffe1ffffff8000003fffcf30fffcf000000
% 0000007c0f8f71e00001fe01cff80ffffff80000007fe0730fffc7800000
% 0000007c0f8e63c00001ff07eff0070fcff800000007f0300fffc3800000
% 000000f80f0e0f800001ff87e7c3001fe7f800000001f010067ffdc00000
% 000000f00f0e1f000001ffc7e38ffffff3f80000000060000033fee00000
% 000000e00f061c000000ffc7e73ffffff1f80000000000000003fff00000
% 000001e00f8038700000ffe3e07fffffc0f8000000000030003fff700000
% 000003c007c070f000007ff9e07fffff00380000000000ffffff00300000
% 0000038003e07fe000007ff9c1ffffffff800000000000fffffe00380000
% 0000078fc1f87fe000003ffc07ffffffffc00000000000fffffe001c0000
% 0000079fe0f8ffc000003ffc1fffff7fffe00000000000fffffe01fc0000
% 00000f1fe03cff8000003ffc3fffe1fffff800003ff000ffffff03fe0000
% 00001f0fffdcfe0000001fff7fffc3fffffc00003ffc00ffffff07fe0000
% 00001e03ffe6f80000000fffffff07f3fffc00003ffe00ffffff07ff0000
% 00003c01fff6700000000ffffffcffc1fffc00000ffe007ffffe07ff8000
% 00003c007fe600000000073ffff1ff81fffc0000020c003dffbc077b8000
% 000078001c063c00000003bfffc7fb83fffc00000000003ffffe07f9c000
% 000078000000fe00000001ffff07f9ffffff00000000003ffffe03f1c000
% 0000f8000001fe00000001ffff67f061ffe780000000003ffb9e03f0e000
% 0000f0000001ff80000000fffff1e0e0ffcf800003800031f18f00606000
% 0001e0000000ffc000000070fff8ecfc7fdf800003c00031f1cf00006000
% 0001e00000007fe0000000307ff83efe7f3fc00003e00039f3cf00003000
% 0001c00000007fe0000000007ff83ffe3e7fc00003f8003bf3cf00383000
% 0003c08000007fe0000000001ffc3ffe38ffe00000ff0039f1cf007e3800
% 0003c3e000001ff0000000001f7e3f7c3e7fe000007f803cf1c7007e1c00
% 000383f000000ff8000000001e7e3f1c3f87f00000ff8038f3c700ff1c00
% 000783f000000ffc000000001e7e3f001fc7f00001ff0038e3c700ffde00
% 000701f000000ffc000000001f7e1e1f8fe7f00003e00038e3c700fffe00
% 0007006000000ffc000000001e7e1c1fcff3f8000780003fffcf00fffe00
% 000f0000000003fc000000001e7e07bfe7f9fc000700003fffff00ffe700
% 000e0000000001ff000000000c7e07fff1f9fc000000003fffff00000700
% 000e0780000000ff00000000007e0fdff9fcfe000000001ff03e00000700
% 000e0fc0000000ff8000000003fe07cff8fc7e0000608000000000018700
% 001e0fe0000000ffc00000007ffe07c7f8fc7f8006e1c00000070007e780
% 003e07c00000007fc0000007fffe0781e0fc7f800ef1c018cce7000ff380
% 003e00000000007fe000003ffffe020001fc0f800ff1c01dfcf7000ffb80
% 003c00000000003ff000007ffffe000071fc1fc00ffbc01dfef7001ef980
% 003c3c000000003ff80001fffffe0383f1fe7fc00fffc01dfcf7001e79c0
% 003c7f000000000ffc0007fffffe07c7f1ffffc00fffc01dfe77001ff9c0
% 00387f000000000ffe001ffffffe07c7f1ffffe007ff801dfef7001ff1c0
% 00783f0000000007fe01fffffffc07eff3ffffe003fe001dfeff000ff0c0
% 00780e0000000007fe03ffffff8003eff3fffff00000001dfe770003e0c0
% 0078000000000007ff0ffffffe0003cff3fffff00078001dce77000000c0
% 0070000000000007ffcfffffe00003cff1fffff800fe001dcef7000000c0
% 007000000000001fffe7ffff000003cff07ffff801fe001dce770001c0c0
% 00f1f8000000003fffe3fff000000707f0fffff801ff001deef70003e060
% 00f1fc000000003fffe3ffc000000707e07ffffc03ff801ceef78003f060
% 00f1fc000000001fff8efe000000070180fffffc03ff801cee778003f860
% 00f0fc0000f00007ff9f30000000078000fffffc03ff801dee778007f860
% 00f0380000f80001ffff000000003f0078fffffc03ff001dfe77800fff70
% 01f0000000f80001ffff00000001ff3ff8fffffc01ff001cee77801ffff0
% 01f0000000f90001fffe00000007fe3ffdfffffc00fe001cee77801ffff0
% 01e0000000fb80001ffe0000001ffe1ffdfffffc007c001cee7f801ffc70
% 01e1f80001f7800007fc0000003ffe0039ffcffc0000001cef7f8003f870
% 01e3f80001ffc00003fc000001ffff0e3bffeffc0000001ceff38001f838
% 01e3f80001fff00001fc000003ffff1f3bfffff80000001ceff38001f038
% 01e1f80001fffe00007e000007ffffbf03fffff803ffe01eef7f8001e038
% 01e0200000ffff00007f00001ffffffe07fffff803ffe01cef7f80000038
% 01e00000007fff00007f80003ffffff807fffff803ffc01eefff80000038
% 01e0000000007e00007f80007ffffff807fffff0003e001eef7f80008038
% 01e1e00000000000007f8001ffff1ff9c7ffffe0003c001eef7f8003c018
% 01e3f00000000000003f8003fffe7ff9cfffff80003e001eefff8007e018
% 01e3f80000000000003f8007fff3ff99cfffff0003ffc01eef7f800ff018
% 01e3f80000000000001f000fffe7ff91cfffff0003ffe01fff7f800f7018
% 01e1f000000000000000001fffffff81cffffe0003ffc01fffff800e7018
% 01e00000000070000000007fffffff001ffffe000000001fefff800ffc18
% 01e000000000f800000000fffffffc001ffffe000000001fe7ff800fff98
% 01c000000003f800000001fffffff8001ffffe000000001ee7ff800fffb8
% 01c1f000000ff000000003ffffffe0003ffffe00000f001ee7ffc00fffb8
% 01e3f800003fc00000001fffffffc0003ffffc00003f801effffc0000038
% 01e3f800007f000000003fffffff00003ffffc0000ff001feffbc0000038
% 01e3f00001fe000000003ffffffc00003ffffc0000fc001fe7fbc0000038
% 01e0000003fc000000007fffffe000003ffff80001f8001fe7fb80000038
% 01e0000003ff000000007f7fff8000003ffff80001fc001fe7fb80000038
% 01f0000003fff0000000fe3ffc0000003ffff00001fe000e631100038070
% 01f0100001fffe0000007f3ff00000003ffff00000ff000e00000003f070
% 01f0fc00003fff0000007fff000000003fffe000007f000000000803fe70
% 01f1fc000003ff0000003fff000000003fffe000007e00001ffffc01fe70
% 01f1fc0000003e0000003f7f000000007fffe00000fc0007fffffc007e70
% 01f1fc000000000000003f7f000000003fffc00003f8003ffffffc007e70
% 00f078000000000000001f7f000000007fffc00003fc007ffffff800f870
% 01f000000000000000000f7f800000007fff800003ff803fffffc001f060
% 00f000000000000000000f7fc00000007fff800001ff801fffffc003e060
% 00f83e0000000000000007ffe00000007fff0000001f800fffffc00380e0
% 00f87f00000001c0000007fff00000007fff00000000000fffffc00000e0
% 0078ff00000033e0000007fff00000007fff00000000000fffffc00000e0
% 0078ff000003ffe0000007fff80000007ffe0000001e000f0ffbc00000c0
% 0078fe000007ffc0000003fffc0000007ffe0000007f00073fffc00000c0
% 00783000000fffc0000001fffc0000007ffe0000007f80067fffe00001c0
% 007c0000001fffc00000007ffe0000007ffc0000007f8000ffffe0000180
% 003c0000001f8380000000fffe000000fffc0000007f8007ffffc003e180
% 003c0f00003f00c0000000ffff000000fefc000000ff800fffffc00ff180
% 003c3f80003f01f0000000ffff000000fefc000000ff800fffffc00ffb80
% 003e3f80003f03f8000000ffff800000fffc0000007f800ffffffc0ffb80
% 003e3f80003fcffc0000007fff8000007fff0000007f001ffffffe0fe380
% 001e3f80001ffffe0000003fff8000007fff0000001c003ffffffe0f0700
% 001f3f00001ffffe0000003fff8000000fff80000000001ffffffc0f0700
% 000f0000000ffff80000003fff8000000fffe0000000001ffffff80f8700
% 000f00000007ff000000003fffc000000ffff80000700000fffff00f8700
% 000f03e00001fc000000001fffc000000ffffc0000f80007fffff8038f00
% 000f87e0000000000000001fffc0000007ffff0000fc0007fffff8000e00
% 00078ff000000003c020001fffc0000000ffff8001fe0003ffffff000e00
% 0007cfe000000007c0f8001fffc0000000ffffe003fe0041ffffffe01e00
% 0007cfe00000000fc3f8000fffc0000000fffff003df03f8ffffffe01c00
% 0007e7800000003fc3f8000fffe0000000fffff003ffc7fcfffffff03800
% 0003e000000000ffc3f80007ffe00000007ffff803ffc7fefe07fff03800
% 0003e038000001ffc3e00007ffe00000003ffff803ffcfdef807fff07800
% 0001e0fc000003ffc0000007ffe00000001ffffc03fb8fbff003fff07000
% 0001f1fc00000fffe0000003ffc00000000ffffe00000fbff003fff0f000
% 0001f1fc00001ffff0000003ff8000000007fffe00000fbff001ffe0e000
% 0000f9f800003ffff8000003ff8000000007ffff00000fc7f001ffe1e000
% 0000f80000003ffff8000003ffc000000003ffff007e07cfe000ffe1c000
% 0000780380003ffff8000003ffc000000001ffff81ff07cfc0003fe1c000
% 00007c0f80000007e0000001ffc000000000ffffc1ff03ef80001fe38000
% 00007c1fc000000000000001ffc0000000007fffc3fc01e700001fe38000
% 00003e1fc000000000000001ffc0000000007fffc3c001ff00001fc70000
% 00003f3fc000000000000000ffc0000000003fffe38000ff00001fc70000
% 00001f1f8000000000000000ffc0000000001fffe3c0007f00001fce0000
% 00001f1c0000000000000000ffc0000000000fffe3ff807f00000ffc0000
% 00000f800000000000000000ffc00000000007fff1ff807f000007fc0000
% 000007c07c000000000000007fc00000000003fff1ff807e000003f80000
% 000007c0fc000000000000007fc00000000001fff8fc007c000001f80000
% 000003e1fe000000000000007fc00000000000fff80000fc000000f00000
% 000003e1fe000000000000007fc000000000007ff80001f8000000f00000
% 000001f1fc000000000000007fc3fdfc0000007ff80003f8000000e00000
% 000001f9f0000000000fc0007fe7fffc0000003ff80003c0000001e00000
% 000000fc01800000001ffffe7de7fffe0000001ff80000000003e1c00000
% 000000fc07c00000001ffffefce7fffe0000000ff800003ffffff3800000
% 0000007e0fe00000001ffffcfcf7fffe0000000ff8007fffffffff800000
% 0000007e0fe00000001ffff1fef7fffe00000007fc00ffffffffff000000
% 0000003f1fe00000001fffe3fffbfffe00000003fc01ffffffffff000000
% 0000001f9f800000001fffc7fff9fffe00000003fe01fffffffffe000000
% 0000000f8f1c0000001fff9ffffdfffe00000001fe01fffffffffc000000
% 0000000fc03e0000001fff3ffffffffe00000000ff01ffffffc7f8000000
% 00000007e07f0000001fff7ffffffffe00000000ff01ffff8000f0000000
% 00000003f0ff0000001ffffffffffffe000000007f81fe000000f0000000
% 00000001fcfe0000000ffffffffffffe000000003f81fe000031e0000000
% 00000000fe7c2000000ffffffff9fffe000000003f81fc01fffbc0000000
% 00000000fe10f0000007ffff00f3fffe000000003fc1fc3fffff80000000
% 000000007f03f8000007fffc0001fffc000000003fe1fc7fffff00000000
% 000000007f83f8000003fff80000fff8000000003fe1fc7ffffe00000000
% 000000003fc3f000000007f000000000000388001fe1fc7ffffe00000000
% 000000001fc3e38000000ff87ffffffffffffe003fe1fc7ffffc00000000
% 000000000fe1c7c01ffffffffffffffffffffe003f01fc7ffff000000000
% 0000000003f00fc01ffffffffffffffffffffe007f81fc7ffff000000000
% 0000000001f80fc03ffffffffffffffffffffe00ff80fc7fffc000000000
% 0000000001fc0f803ffffffffffffffffffffe00ff80fe3fff8000000000
% 0000000000fe0f803ffffffffffffffffffffe01ff80fe3fff0000000000
% 00000000007f06001ffffffffffffffffffffe01ff80fe3ffe0000000000
% 00000000003fc0001fffffffffffffffffffff03ff80fe3ffc0000000000
% 00000000000fe0001fffffffffffffffffffff03ff00fe3ff00000000000
% 000000000007f0001fffffffffffffffffffff07ff00fe3fe00000000000
% 000000000003fc001fffffffffffffffffffff07fe00fe1f800000000000
% 000000000001fe001fffffffffffffffffffff0ffc00fe1f000000000000
% 000000000000ff001fffffffffffffffffffff1ffc00fe1e000000000000
% 0000000000007f801ffffffffffffffffffffe7ffe00fe3c000000000000
% 0000000000001fe01ffffffffffffffffffffc7ffe01fef8000000000000
% 0000000000000ff01fffffffffff01ff80000067fc01f9e0000000000000
% 00000000000003fc1ffe400000000000000000000000ffc0000000000000
% 00000000000001fe02000000000000000013c0007ff87f00000000000000
% 000000000000007f87fff07c007ffffffffffffffffc7e00000000000000
% 000000000000003ffffffffffffffffffffffffffffdf800000000000000
% 000000000000000ffffffffffffffffffffffffffffff000000000000000
% 0000000000000007ffffffffffffffffffffffffffffc000000000000000
% 0000000000000001ffffffffffffffffffffffffffff0000000000000000
% 00000000000000007ffffffffffffffffffffffffff80000000000000000
% 00000000000000001fffffffffffffffffffffffffe00000000000000000
% 000000000000000007ffffffffffffffffffffffff800000000000000000
% 000000000000000003fffffffffffffffffffffffc000000000000000000
% 000000000000000000fffffffffffffffffffffff8000000000000000000
% 0000000000000000000fffffffffffffffffffffe0000000000000000000
% 00000000000000000001ffffffffffffffffffff00000000000000000000
% 000000000000000000003ffffffffffffffffff800000000000000000000
% 0000000000000000000003ffffffffffffffff8000000000000000000000
% 00000000000000000000003ffffffffffffffc0000000000000000000000
% 000000000000000000000000fffffffffffee00000000000000000000000
% 00000000000000000000000007fffffffff8000000000000000000000000
% 000000000000000000000000000ffff8f800000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
% 000000000000000000000000000000000000000000000000000000000000
%%EndPreview
%%EndProlog
%%Page: 1 1
% remember original state
/origstate save def
% build a temporary dictionary
20 dict begin
% define string to hold a scanline's worth of data
/pix 30 string def
% define space for color conversions
/grays 240 string def % space for gray scale line
/npixls 0 def
/rgbindx 0 def
% lower left corner
178 301 translate
% size of image (on paper, in 1/72inch coords)
239.97600 239.97600 scale
% dimensions of data
240 240 1
% mapping matrix
[240 0 0 -240 0 240]
{currentfile pix readhexstring pop}
image
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffeffffffffffffffffffffffffffff
fffffffffffffffffffffffffff00000003fffffffffffffffffffffffff
fffffffffffffffffffffffffc0000000000ffffffffffffffffffffffff
ffffffffffffffffffffffffc000000000000fffffffffffffffffffffff
fffffffffffffffffffffffc00000000000001ffffffffffffffffffffff
ffffffffffffffffffffffc0001fffff8000001fffffffffffffffffffff
ffffffffffffffffffffff0001ffffffffc00003ffffffffffffffffffff
fffffffffffffffffffff0003ffffffffff80000ffffffffffffffffffff
ffffffffffffffffffff800ffffffffffff800001fffffffffffffffffff
fffffffffffffffffffe00fffff1fffffff81c0007ffffffffffffffffff
fffffffffffffffffff007ffff001ffffff80e0001ffffffffffffffffff
ffffffffffffffffff801ffffe0001fffffc0700007fffffffffffffffff
ffffffffffffffffff00fffff00000fffffe0387801fffffffffffffffff
fffffffffffffffffc03ffffe000007fffff01c7f007ffffffffffffffff
fffffffffffffffff00fffff800fc03fffffc1c3fc03ffffffffffffffff
ffffffffffffffffc03fffff807fc01fffffe0c3ff81ffffffffffffffff
ffffffffffffffff80ffffff00fbc81fffffe0e1ffc07fffffffffffffff
fffffffffffffffe03ffffff80ffe81ffffff0e1ffe01fffffffffffffff
fffffffffffffff807ffffff807ff81ffffff8607f3807ffffffffffffff
fffffffffffffff01ffffffc80fff81ffffff860070e00ffffffffffffff
ffffffffffffffc03ffffffc0078001ffffff8600306003fffffffffffff
ffffffffffffff00fffffffc0000001ffffff8300180001fffffffffffff
fffffffffffffe01ff83fffc0000003ffffff81001c01007ffffffffffff
fffffffffffff807ff83fffe0000007ffffff80000e01e03ffffffffffff
fffffffffffff00fff81ffffc00000fffffffc0000700f01ffffffffffff
ffffffffffffe03ffc00ffff81c600fffffffc0000780fc0ffffffffffff
ffffffffffff80f7f800ffff03c700fffffffc00007c0fe03fffffffffff
ffffffffffff01e3f0007fff830300fffffffe00007f1ff81fffffffffff
fffffffffffe03e1f0004fff820300ffffff9f00027fff1c0fffffffffff
fffffffffffc07e1f80007ffc00180ffffff1f8001fb8e1f03ffffffffff
fffffffffff80fe1f8000fffe001c8ffffff8fc001f88e1f03ffffffffff
fffffffffff033c1fc000ffff081c9ffffff8fe000f80c3e01ffffffffff
ffffffffffe063c1fe000fffffc1ffffffff83f000fc0c3c007fffffffff
ffffffffffe0e3c1fe000fffffc0ffffffffc00000fc0c18003fffffffff
ffffffffffc1c781ff000fffff81041fffffc000107e0618003fffffffff
ffffffffff07c701ff000fffff0000007fffe000087e060c000fffffffff
ffffffffff0f8e03ff001ffffe0000003ffff0000c3f00060007ffffffff
fffffffffc1f0c07ff001fffff00000007fffe00041f80070003ffffffff
fffffffff83f0c0fff001fffff88000001fffff8060780070001ffffffff
fffffffff07f181fff003fffff8b00e001ffffff0301c0030001ffffffff
fffffffff0ff183e3f003fffffcf00c000ffffff810060030020ffffffff
ffffffffc1ff18783f007fffffcfd18000ffffffc000300300307fffffff
ffffffff83ff88703f007fffffcfc100007fffffe000000200203fffffff
ffffffff87c108707f007fffffff8300003ffffff000000000001fffffff
fffffffe07800860ff007fffffff0400001ffffff800080000000fffffff
fffffffe0f800841ff803ffffffc1c00001ffffff8000000000307ffffff
fffffffc1fc00841ff803fffff9c3c00000ffffff0000000000787ffffff
fffffff83ff81043ffe03fffff0038000007fffff0000408000783ffffff
fffffff07bf83087fff01fffff0038000007fffff04e06080007c1ffffff
fffffff0f0f87087fff80fffff0030000007fffff8000208600001ffffff
ffffffe1f070e18ffff807fff04070000007fffff8000008600000ffffff
ffffffc1f070c30ffffc03fff001e0000007fffffc00030cf00030ffffff
ffffff83f0708e1ffffe01fe3007f0000007ffffff801f8cf000387fffff
ffffff83f0719c3ffffe00f8100ff8f03007fffffff80fcff0003c7fffff
ffffff07f0f1f07ffffe0078183cffe01807fffffffe0feff980023fffff
ffffff0ff0f1e0fffffe00381c7000000c07ffffffff9fffffcc011fffff
ffffff1ff0f9e3ffffff003818c000000e07fffffffffffffffc000fffff
fffffe1ff07fc78fffff001c1f8000003f07ffffffffffcfffc0008fffff
fffffc3ff83f8f0fffff80061f800000ffc7ffffffffff000000ffcfffff
fffffc7ffc1f801fffff80063e000000007fffffffffff000001ffc7ffff
fffff8703e07801fffffc003f8000000003fffffffffff000001ffe3ffff
fffff8601f07003fffffc003e0000080001fffffffffff000001fe03ffff
fffff0e01fc3007fffffc003c0001e000007ffffc00fff000000fc01ffff
ffffe0f0002301ffffffe00080003c000003ffffc003ff000000f801ffff
ffffe1fc001907fffffff0000000f80c0003ffffc001ff000000f800ffff
ffffc3fe00098ffffffff0000003003e0003fffff001ff800001f8007fff
ffffc3ff8019fffffffff8c0000e007e0003fffffdf3ffc20043f8847fff
ffff87ffe3f9c3fffffffc400038047c0003ffffffffffc00001f8063fff
ffff87ffffff01fffffffe0000f806000000ffffffffffc00001fc0e3fff
ffff07fffffe01fffffffe0000980f9e00187fffffffffc00461fc0f1fff
ffff0ffffffe007fffffff00000e1f1f00307ffffc7fffce0e70ff9f9fff
fffe1fffffff003fffffff8f0007130380207ffffc3fffce0e30ffff9fff
fffe1fffffff801fffffffcf8007c10180c03ffffc1fffc60c30ffffcfff
fffe3fffffff801fffffffff8007c001c1803ffffc07ffc40c30ffc7cfff
fffc3f7fffff801fffffffffe003c001c7001fffff00ffc60e30ff81c7ff
fffc3c1fffffe00fffffffffe081c083c1801fffff807fc30e38ff81e3ff
fffc7c0ffffff007ffffffffe181c0e3c0780fffff007fc70c38ff00e3ff
fff87c0ffffff003ffffffffe181c0ffe0380ffffe00ffc71c38ff0021ff
fff8fe0ffffff003ffffffffe081e1e070180ffffc1fffc71c38ff0001ff
fff8ff9ffffff003ffffffffe181e3e0300c07fff87fffc00030ff0001ff
fff0fffffffffc03ffffffffe181f840180603fff8ffffc00000ff0018ff
fff1fffffffffe00fffffffff381f8000e0603ffffffffc00000fffff8ff
fff1f87fffffff00ffffffffff81f020060301ffffffffe00fc1fffff8ff
fff1f03fffffff007ffffffffc01f830070381ffff9f7ffffffffffe78ff
ffe1f01fffffff003fffffff8001f8380703807ff91e3ffffff8fff8187f
ffc1f83fffffff803ffffff80001f87e1f03807ff10e3fe73318fff00c7f
ffc1ffffffffff801fffffc00001fdfffe03f07ff00e3fe20308fff0047f
ffc3ffffffffffc00fffff800001ffff8e03e03ff0043fe20108ffe1067f
ffc3c3ffffffffc007fffe000001fc7c0e01803ff0003fe20308ffe1863f
ffc380fffffffff003fff8000001f8380e00003ff0003fe20188ffe0063f
ffc780fffffffff001ffe0000001f8380e00001ff8007fe20108ffe00e3f
ff87c0fffffffff801fe00000003f8100c00001ffc01ffe20100fff00f3f
ff87f1fffffffff801fc0000007ffc100c00000fffffffe20188fffc1f3f
ff87fffffffffff800f0000001fffc300c00000fff87ffe23188ffffff3f
ff8ffffffffffff8003000001ffffc300e000007ff01ffe23108ffffff3f
ff8fffffffffffe000180000fffffc300f800007fe01ffe23188fffe3f3f
ff0e07ffffffffc0001c000ffffff8f80f000007fe00ffe21108fffc1f9f
ff0e03ffffffffc0001c003ffffff8f81f800003fc007fe311087ffc0f9f
ff0e03ffffffffe0007101fffffff8fe7f000003fc007fe311887ffc079f
ff0f03ffff0ffff80060cffffffff87fff000003fc007fe211887ff8079f
ff0fc7ffff07fffe0000ffffffffc0ff87000003fc00ffe201887ff0008f
fe0fffffff07fffe0000fffffffe00c007000003fe00ffe311887fe0000f
fe0fffffff06fffe0001fffffff801c002000003ff01ffe311887fe0000f
fe1fffffff047fffe001ffffffe001e002000003ff83ffe311807fe0038f
fe1e07fffe087ffff803ffffffc001ffc6003003ffffffe310807ffc078f
fe1c07fffe003ffffc03fffffe0000f1c4001003ffffffe3100c7ffe07c7
fe1c07fffe000ffffe03fffffc0000e0c4000007ffffffe3100c7ffe0fc7
fe1e07fffe0001ffff81fffff8000040fc000007fc001fe110807ffe1fc7
fe1fdfffff0000ffff80ffffe0000001f8000007fc001fe310807fffffc7
fe1fffffff8000ffff807fffc0000007f8000007fc003fe110007fffffc7
fe1fffffffff81ffff807fff80000007f800000fffc1ffe110807fff7fc7
fe1e1fffffffffffff807ffe0000e0063800001fffc3ffe110807ffc3fe7
fe1c0fffffffffffffc07ffc000180063000007fffc1ffe110007ff81fe7
fe1c07ffffffffffffc07ff8000c0066300000fffc003fe110807ff00fe7
fe1c07ffffffffffffe0fff00018006e300000fffc001fe000807ff08fe7
fe1e0fffffffffffffffffe00000007e300001fffc003fe000007ff18fe7
fe1fffffffff8fffffffff80000000ffe00001ffffffffe010007ff003e7
fe1fffffffff07ffffffff00000003ffe00001ffffffffe018007ff00067
fe3ffffffffc07fffffffe00000007ffe00001ffffffffe118007ff00047
fe3e0ffffff00ffffffffc0000001fffc00001fffff0ffe118003ff00047
fe1c07ffffc03fffffffe00000003fffc00003ffffc07fe100003fffffc7
fe1c07ffff80ffffffffc0000000ffffc00003ffff00ffe010043fffffc7
fe1c0ffffe01ffffffffc0000003ffffc00003ffff03ffe018043fffffc7
fe1ffffffc03ffffffff8000001fffffc00007fffe07ffe018047fffffc7
fe1ffffffc00ffffffff8080007fffffc00007fffe03ffe018047fffffc7
fe0ffffffc000fffffff01c003ffffffc0000ffffe01fff19ceefffc7f8f
fe0feffffe0001ffffff80c00fffffffc0000fffff00fff1fffffffc0f8f
fe0f03ffffc000ffffff8000ffffffffc0001fffff80fffffffff7fc018f
fe0e03fffffc00ffffffc000ffffffffc0001fffff81ffffe00003fe018f
fe0e03ffffffc1ffffffc080ffffffff80001fffff03fff8000003ff818f
fe0e03ffffffffffffffc080ffffffffc0003ffffc07ffc0000003ff818f
ff0f87ffffffffffffffe080ffffffff80003ffffc03ff80000007ff078f
fe0ffffffffffffffffff0807fffffff80007ffffc007fc000003ffe0f9f
ff0ffffffffffffffffff0803fffffff80007ffffe007fe000003ffc1f9f
ff07c1fffffffffffffff8001fffffff8000ffffffe07ff000003ffc7f1f
ff0780fffffffe3ffffff8000fffffff8000fffffffffff000003fffff1f
ff8700ffffffcc1ffffff8000fffffff8000fffffffffff000003fffff1f
ff8700fffffc001ffffff80007ffffff8001ffffffe1fff0f0043fffff3f
ff8701fffff8003ffffffc0003ffffff8001ffffff80fff8c0003fffff3f
ff87cffffff0003ffffffe0003ffffff8001ffffff807ff980001ffffe3f
ff83ffffffe0003fffffff8001ffffff8003ffffff807fff00001ffffe7f
ffc3ffffffe07c7fffffff0001ffffff0003ffffff807ff800003ffc1e7f
ffc3f0ffffc0ff3fffffff0000ffffff0103ffffff007ff000003ff00e7f
ffc3c07fffc0fe0fffffff0000ffffff0103ffffff007ff000003ff0047f
ffc1c07fffc0fc07ffffff00007fffff0003ffffff807ff0000003f0047f
ffc1c07fffc03003ffffff80007fffff8000ffffff80ffe0000001f01c7f
ffe1c07fffe00001ffffffc0007fffff8000ffffffe3ffc0000001f0f8ff
ffe0c0ffffe00001ffffffc0007ffffff0007fffffffffe0000003f0f8ff
fff0fffffff00007ffffffc0007ffffff0001fffffffffe0000007f078ff
fff0fffffff800ffffffffc0003ffffff00007ffff8fffff00000ff078ff
fff0fc1ffffe03ffffffffe0003ffffff00003ffff07fff8000007fc70ff
fff0781fffffffffffffffe0003ffffff80000ffff03fff8000007fff1ff
fff8700ffffffffc3fdfffe0003fffffff00007ffe01fffc000000fff1ff
fff8301ffffffff83f07ffe0003fffffff00001ffc01ffbe0000001fe1ff
fff8301ffffffff03c07fff0003fffffff00000ffc20fc070000001fe3ff
fff8187fffffffc03c07fff0001fffffff00000ffc0038030000000fc7ff
fffc1fffffffff003c07fff8001fffffff800007fc00380101f8000fc7ff
fffc1fc7fffffe003c1ffff8001fffffffc00007fc00302107f8000f87ff
fffe1f03fffffc003ffffff8001fffffffe00003fc0470400ffc000f8fff
fffe0e03fffff0001ffffffc003ffffffff00001fffff0400ffc000f0fff
fffe0e03ffffe0000ffffffc007ffffffff80001fffff0400ffe001f1fff
ffff0607ffffc00007fffffc007ffffffff80000fffff0380ffe001e1fff
ffff07ffffffc00007fffffc003ffffffffc0000ff81f8301fff001e3fff
ffff87fc7fffc00007fffffc003ffffffffe00007e00f8303fffc01e3fff
ffff83f07ffffff81ffffffe003fffffffff00003e00fc107fffe01c7fff
ffff83e03ffffffffffffffe003fffffffff80003c03fe18ffffe01c7fff
ffffc1e03ffffffffffffffe003fffffffff80003c3ffe00ffffe038ffff
ffffc0c03fffffffffffffff003fffffffffc0001c7fff00ffffe038ffff
ffffe0e07fffffffffffffff003fffffffffe0001c3fff80ffffe031ffff
ffffe0e3ffffffffffffffff003ffffffffff0001c007f80fffff003ffff
fffff07fffffffffffffffff003ffffffffff8000e007f80fffff803ffff
fffff83f83ffffffffffffff803ffffffffffc000e007f81fffffc07ffff
fffff83f03ffffffffffffff803ffffffffffe000703ff83fffffe07ffff
fffffc1e01ffffffffffffff803fffffffffff0007ffff03ffffff0fffff
fffffc1e01ffffffffffffff803fffffffffff8007fffe07ffffff0fffff
fffffe0e03ffffffffffffff803c0203ffffff8007fffc07ffffff1fffff
fffffe060ffffffffff03fff80180003ffffffc007fffc3ffffffe1fffff
ffffff03fe7fffffffe0000182180001ffffffe007fffffffffc1e3fffff
ffffff03f83fffffffe0000103180001fffffff007ffffc000000c7fffff
ffffff81f01fffffffe0000303080001fffffff007ff80000000007fffff
ffffff81f01fffffffe0000e01080001fffffff803ff0000000000ffffff
ffffffc0e01fffffffe0001c00040001fffffffc03fe0000000000ffffff
ffffffe0607fffffffe0003800060001fffffffc01fe0000000001ffffff
fffffff070e3ffffffe0006000020001fffffffe01fe0000000003ffffff
fffffff03fc1ffffffe000c000000001ffffffff00fe0000003807ffffff
fffffff81f80ffffffe0008000000001ffffffff00fe00007fff0fffffff
fffffffc0f00ffffffe0000000000001ffffffff807e01ffffff0fffffff
fffffffe0301fffffff0000000000001ffffffffc07e01ffffce1fffffff
ffffffff0183dffffff0000000060001ffffffffc07e03fe00043fffffff
ffffffff01ef0ffffff80000ff0c0001ffffffffc03e03c000007fffffff
ffffffff80fc07fffff80003fffe0003ffffffffc01e03800000ffffffff
ffffffff807c07fffffc0007ffff0007ffffffffc01e03800001ffffffff
ffffffffc03c0ffffffff80ffffffffffffc77ffe01e03800001ffffffff
ffffffffe03c1c7ffffff00780000000000001ffc01e03800003ffffffff
fffffffff01e383fe000000000000000000001ffc0fe0380000fffffffff
fffffffffc0ff03fe000000000000000000001ff807e0380000fffffffff
fffffffffe07f03fc000000000000000000001ff007f0380003fffffffff
fffffffffe03f07fc000000000000000000001ff007f01c0007fffffffff
ffffffffff01f07fc000000000000000000001fe007f01c000ffffffffff
ffffffffff80f9ffe000000000000000000001fe007f01c001ffffffffff
ffffffffffc03fffe000000000000000000000fc007f01c003ffffffffff
fffffffffff01fffe000000000000000000000fc00ff01c00fffffffffff
fffffffffff80fffe000000000000000000000f800ff01c01fffffffffff
fffffffffffc03ffe000000000000000000000f801ff01e07fffffffffff
fffffffffffe01ffe000000000000000000000f003ff01e0ffffffffffff
ffffffffffff00ffe000000000000000000000e003ff01e1ffffffffffff
ffffffffffff807fe0000000000000000000018001ff01c3ffffffffffff
ffffffffffffe01fe0000000000000000000038001fe0107ffffffffffff
fffffffffffff00fe00000000000fe007fffff9803fe061fffffffffffff
fffffffffffffc03e001bfffffffffffffffffffffff003fffffffffffff
fffffffffffffe01fdffffffffffffffffec3fff800780ffffffffffffff
ffffffffffffff8078000f83ff80000000000000000381ffffffffffffff
ffffffffffffffc0000000000000000000000000000207ffffffffffffff
fffffffffffffff000000000000000000000000000000fffffffffffffff
fffffffffffffff800000000000000000000000000003fffffffffffffff
fffffffffffffffe0000000000000000000000000000ffffffffffffffff
ffffffffffffffff8000000000000000000000000007ffffffffffffffff
ffffffffffffffffe00000000000000000000000001fffffffffffffffff
fffffffffffffffff80000000000000000000000007fffffffffffffffff
fffffffffffffffffc000000000000000000000003ffffffffffffffffff
ffffffffffffffffff000000000000000000000007ffffffffffffffffff
fffffffffffffffffff0000000000000000000001fffffffffffffffffff
fffffffffffffffffffe00000000000000000000ffffffffffffffffffff
ffffffffffffffffffffc0000000000000000007ffffffffffffffffffff
fffffffffffffffffffffc00000000000000007fffffffffffffffffffff
ffffffffffffffffffffffc000000000000003ffffffffffffffffffffff
ffffffffffffffffffffffff0000000000011fffffffffffffffffffffff
fffffffffffffffffffffffff80000000007ffffffffffffffffffffffff
fffffffffffffffffffffffffff0000707ffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
showpage
% stop using temporary dictionary
end
% restore original state
origstate restore
%%Trailer
File added
%!PS-Adobe-3.0 EPSF-3.0
%%Title: Software Engineering Laboratory Logo
%%BoundingBox: 15 15 128 100
%%Creator: ADOBEPS4.DRV Version 4.51
%%CreationDate: 03/09/2002 20:36:44
%%For: nickie
%%Pages: 1
%%DocumentNeededResources: (atend)
%%DocumentSuppliedResources: (atend)
%%LanguageLevel: 2
%%EndComments
%%BeginDefaults
%%ViewingOrientation: 1 0 0 1
%%EndDefaults
%%BeginProlog
%%BeginResource: procset AdobePS_FatalError 4.2 0
userdict begin/FatalErrorIf{{initgraphics findfont 1 index 0 eq{exch pop}{dup
length dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding{
ISOLatin1Encoding}stopped{StandardEncoding}if def currentdict end
/ErrFont-Latin1 exch definefont}ifelse exch scalefont setfont counttomark 3
div cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def end
%%EndResource
%%BeginResource: procset AdobePS_Win_Driver_Incr_L2 4.2 0
userdict /AdobePS_Win_Driver_Incr_L2 250 dict dup begin put
[
(This job can print only on a PostScript(R) Level 2 or 3 ) 100 500
(printer. Please send this file to a Level 2 or 3 printer.) 100 485
( ) 100 470
12 /Times-Roman
/languagelevel where {pop languagelevel}{1} ifelse 2 lt FatalErrorIf
/VM? {vmstatus exch sub exch pop gt {PrtVMMsg}if} bind def
%%BeginResource: procset AdobePS_Win_Utils 4.2 0
/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^
/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/-
/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true ,
d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d
/C/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-C/rcurveto ,
d/-M/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin
, d/Lw/setlinewidth , d/S/show , d/LH/showpage , d/K/stroke , d/W/widthshow ,
d/R/rotate , d/XS/xshow , d/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, d}
bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/sgcs{/DeviceGray setcolorspace}bd
/bn/bind ld/L2? F/languagelevel where{! languagelevel 2 ge{! T}if}if d/L3? F
/languagelevel where{! languagelevel 3 ge{! T}if}if d/g{@ not{U/DefIf_save
save put}if U/DefIf_bool 2 ^ put}b/DefIf_El{if U/DefIf_bool get not @{U
/DefIf_save get restore}if}b/e{DefIf_El !}b/self & d/reinitialize{[/TextInit
/GraphInit/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat
cleartomark}b/initialize{`{/Pscript_Win_Data where{!}{U/Pscript_Win_Data & put
}?/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U/Pscript_Win_Data 230
dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d reinitialize}?}b/terminate{!{&
self eq{exit}{E}?}loop E}b/suspend/terminate , d/resume{` Pscript_Win_Data `}b
/snap{transform 0.25 sub round 0.25 add ~ 0.25 sub round 0.25 add ~ itransform
}b/dsnap{dtransform round ~ round ~ idtransform}b U<04>cvn{}put/setjn{{
statusdict/jobname known{statusdict/jobname 3 -1 $ put}if}stopped cleartomark}
b/solid{[]0 setdash}b/setdsh{0 setdash}b/colspRefresh{}b/rp{4 2 $ M 1 ^ 0 - 0
~ - neg 0 -}b/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/CTMsave{globaldict ` currentglobal
T setglobal/SavedCTM matrix currentmatrix d setglobal E}b/CTMrestore{
globaldict ` currentglobal T setglobal/SavedCTM where{! SavedCTM setmatrix}if
setglobal E}b/emuxs{! ! currentpoint( )@ 0 6 -1 $ put S ~ 3 ^ 3 ^ get add ~ M
1 add}b/XSE{version cvi 2015 ge{XS}{0/emuxs , 4 -1 $ cshow ! !}?}b/UDF{L2?{
undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b/freeVM{/Courier findfont
[40 0 0 -40 0 0]makefont Ji 2 vmreclaim}b/hfRedefFont{findfont @ length dict `
{1 ^/FID ne{d}{! !}?}forall & E @ ` ~{/CharStrings 1 dict `/.notdef 0 d & E d}
if/Encoding 256 array 0 1 255{1 ^ ~/.notdef put}for d E definefont !}bind d
/hfMkCIDFont{/CIDFont findresource @ length 2 add dict `{1 ^ @/FID eq ~ @/XUID
eq ~/UIDBase eq or or{! !}{d}?}forall/CDevProc ~ d/Metrics2 16 dict d
/CIDFontName 1 ^ d & E 1 ^ ~/CIDFont defineresource ![~]composefont !}bind d
%%EndResource %%BeginResource: procset AdobePS_Win_Utils_L2 4.2 0
/colspA/DeviceGray d/colspABC/DeviceRGB d/setAorABC{{colspA}{colspABC}?
setcolorspace}b/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5
}? 3 -1 $ @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $
idtransform}b/BZ{4 -2 $ snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/sg
{@ @ setcolor}b/sco{setcolor}b/colspRefresh{colspABC setcolorspace}b/sgco{{sg
}{sco}?}b/UtilsInit{currentglobal{F setglobal}if}b/resourcestatus where{!
/ColorRendering/ProcSet resourcestatus{! ! T}{F}?}{F}? not{/ColorRendering<<
/GetHalftoneName{currenthalftone @/HalftoneName known{/HalftoneName get}{!
/none}?}bn/GetPageDeviceName{currentpagedevice @/PageDeviceName known{
/PageDeviceName get @ null eq{!/none}if}{!/none}?}bn/GetSubstituteCRD{!
/DefaultColorRendering/ColorRendering resourcestatus{! !/DefaultColorRendering
}{(DefaultColorRendering*){cvn exit}127 string/ColorRendering resourceforall}?
}bn>>/defineresource where{!/ProcSet defineresource !}{! !}?}if/buildcrdname{
/ColorRendering/ProcSet findresource ` mark GetHalftoneName @ type @/nametype
ne ~/stringtype ne and{!/none}if(.)GetPageDeviceName @ type @/nametype ne ~
/stringtype ne and{!/none}if(.)5 ^ 0 5 -1 1{^ length add}for string 6 1 $ 5 ^
5{~ 1 ^ cvs length 1 ^ length 1 ^ sub getinterval}repeat ! cvn 3 1 $ ! ! E}b
/definecolorrendering{~ buildcrdname ~/ColorRendering defineresource !}b
/findcolorrendering where{!}{/findcolorrendering{buildcrdname @/ColorRendering
resourcestatus{! ! T}{/ColorRendering/ProcSet findresource ` GetSubstituteCRD
E F}?}b}?/selectcolorrendering{findcolorrendering !/ColorRendering
findresource setcolorrendering}b/ExecWMForm{execform}b/setpagedevice where{!
/realstpgdev/setpagedevice ld}if/SC_topddict 0 d/SC_spdict 0 d/dopgdev{
Pscript_Win_Data/setpagedevice undef SC_topddict @ length 0 gt{realstpgdev}if}
bd/stpgdev{SC_topddict @ 3 -1 ${SC_spdict 2 ^ known{SC_spdict 2 ^ get @ 3 -1 $
{put @}forall ! put @}{put @}?}forall ! !}bd/ststpgdev{Pscript_Win_Data
/setpagedevice/stpgdev , put/SC_topddict 0 dict store/SC_spdict 3 dict `
/InputAttributes 0 dict d/Policies 0 dict d/OutputAttributes 0 dict d & E
store}d/G2UBegin{findresource/FontInfo get/GlyphNames2Unicode get `}bind d
/G2CCBegin{findresource/FontInfo get/GlyphNames2HostCode get `}bind d/G2UEnd{E
}bind d/AddFontInfoBegin{/FontInfo 8 dict @ `}bind d/AddFontInfo{
/GlyphNames2Unicode 16 dict d/GlyphNames2HostCode 16 dict d}bind d
/AddFontInfoEnd{E d}bind d/notdefXPos 0 d/notdefYPos 0 d/SetNotDefCharString{@
findfont/Encoding get 0 get/.notdef eq{@ 1000 selectfont<00>stringwidth
/notdefYPos ~ d/notdefXPos ~ d}{/notdefXPos 0 d/notdefYPos 0 d}? findfont
/CharStrings get/.notdef{! notdefXPos notdefYPos setcharwidth}put}bind d
/T0AddCFFMtx2{/CIDFont findresource/Metrics2 get ` d E}bind d/
%%EndResource
%%BeginResource: procset AdobePS_Win_Compat 4.2 0
userdict/AdobePS_Win_Compat 13 dict dup begin/bd{bind def}bind def/ld{load def
}bd/CB{pop pop pop pop}bind def/B{pop pop pop pop}bind def/$x matrix def/SS{
/pagesave save def}bind def/RS{/pagesave where{pop pagesave restore}{$x matrix
invertmatrix concat}ifelse}bind def/ANSIVec[0/grave 1/acute 2/circumflex 3
/tilde 4/macron 5/breve 6/dotaccent 7/dieresis 8/ring 9/cedilla 10
/hungarumlaut 11/ogonek 12/caron 13/dotlessi 39/quotesingle 96/grave 124/bar
130/quotesinglbase 131/florin 132/quotedblbase 133/ellipsis 134/dagger 135
/daggerdbl 136/circumflex 137/perthousand 138/Scaron 139/guilsinglleft 140/OE
145/quoteleft 146/quoteright 147/quotedblleft 148/quotedblright 149/bullet 150
/endash 151/emdash 152/tilde 153/trademark 154/scaron 155/guilsinglright 156
/oe 159/Ydieresis 160/space 161/exclamdown 164/currency 165/yen 166/brokenbar
167/section 168/dieresis 169/copyright 170/ordfeminine 171/guillemotleft 172
/logicalnot 173/hyphen 174/registered 175/macron 176/degree 177/plusminus 178
/twosuperior 179/threesuperior 180/acute 181/mu 182/paragraph 183
/periodcentered 184/cedilla 185/onesuperior 186/ordmasculine 187
/guillemotright 188/onequarter 189/onehalf 190/threequarters 191/questiondown
192/Agrave 193/Aacute 194/Acircumflex 195/Atilde 196/Adieresis 197/Aring 198
/AE 199/Ccedilla 200/Egrave 201/Eacute 202/Ecircumflex 203/Edieresis 204
/Igrave 205/Iacute 206/Icircumflex 207/Idieresis 208/Eth 209/Ntilde 210/Ograve
211/Oacute 212/Ocircumflex 213/Otilde 214/Odieresis 215/multiply 216/Oslash
217/Ugrave 218/Uacute 219/Ucircumflex 220/Udieresis 221/Yacute 222/Thorn 223
/germandbls 224/agrave 225/aacute 226/acircumflex 227/atilde 228/adieresis 229
/aring 230/ae 231/ccedilla 232/egrave 233/eacute 234/ecircumflex 235/edieresis
236/igrave 237/iacute 238/icircumflex 239/idieresis 240/eth 241/ntilde 242
/ograve 243/oacute 244/ocircumflex 245/otilde 246/odieresis 247/divide 248
/oslash 249/ugrave 250/uacute 251/ucircumflex 252/udieresis 253/yacute 254
/thorn 255/ydieresis]def currentdict{dup type/operatortype eq{[exch]cvx def}{
pop pop}ifelse}forall/initialize{currentdict exch begin begin}bind def
/terminate{/@FL where not{pop end end}{pop}ifelse}bind def/suspend/terminate
load def/resume/initialize load def/M/moveto load def end put/Courier findfont
10 scalefont setfont
%%EndResource
end
%%EndResource
%%EndProlog
%%BeginSetup
/findresource where{pop mark{/CIDParams /ProcSet findresource /SetBuildCompatible get true exch exec}stopped cleartomark}if
[ 1 0 0 1 0 0 ] false AdobePS_Win_Driver_Incr_L2 dup /initialize get exec
/mysetup [ .12 0 0 -.12 15 1176 ] def
%%EndSetup
%%Page: 1 1
%%EndPageComments
%%BeginPageSetup
userdict begin /pagesave save def end
mysetup concat [ matrix currentmatrix
{dup dup round sub abs .0001 lt{round} if} forall] setmatrix colspRefresh
%%EndPageSetup
AdobePS_Win_Driver_Incr_L2 begin
%%BeginResource: procset AdobePS_Win_Graphics 4.2 0
/Saved_CTM null d/CTM_save{/Saved_CTM Saved_CTM currentmatrix d}b/CTM_restore{
Saved_CTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d
/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d
/Reps 5 d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType 1
d/PaintProc{` 1 Lw[]0 setdash PaintData , exec E}b/FGnd null d/BGnd null d
/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal{
biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep
gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}
b/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M
MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep
M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8
+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{GDIHPatternDict
/PaintData 3 -1 $ put CTM_save GDIHMatrix setmatrix GDIHPatternDict matrix mp
CTM_restore ~ U ~ 2 ^ put d}b/h0{/h0/HS_Horizontal makehatch}b/h1{/h1
/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal makehatch}b/h3{/h3/HS_BDiagonal
makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5/HS_DiagCross makehatch}b
/GDIBWPatternDict 17 dict @ `/PatternType 1 d/PaintType 2 d/RepsV 6 d/RepsH 5
d/BBox[0 0 RepsH 1]d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d
/Width 8 d/mx[Width 0 0 Height neg 0 Height]d/FGnd null d/BGnd null d
/PaintProc{` RepsH{Width Height F mx PaintData imagemask Width 0 +}repeat E}b
E d/GDIBWPatternMx null d/pfprep{/PatternOfTheDay ~ GDIBWPatternDict `
/PaintData ~ d E CTM_save GDIBWPatternMx setmatrix GDIBWPatternDict matrix mp
CTM_restore ~ ! d}b/GraphInit{GDIHMatrix null eq{/Saved_CTM matrix d :
initmatrix ADO_mxRot concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~
XStep mul ~ dsnap YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix
readonly d ; : 0.24 -0.24 +S GDIBWPatternDict ` Width Height E dsnap +S
/GDIBWPatternMx matrix currentmatrix readonly d ; ;}if}b/cirp{360 0 An C}b
/ellp{CTM_save + +S 0.5 0 M 0 0 0.5 360 0 An C CTM_restore}b/rrp{/rad ~ d/y2 ~
d/x2 ~ d/y1 ~ d/x1 ~ d x2 x1 add 2 V y1 M x1 y1 x1 y2 rad arct x1 y2 x2 y2 rad
arct x2 y2 x2 y1 rad arct x2 y1 x1 y1 rad arct C}b/RRp{CTM_save + +S/dyS ~ d
/dxS ~ d dxS 2 V 0 M 0 0 0 dyS 0.5 arct 0 dyS dxS dyS 0.5 arct dxS dyS dxS 0
0.5 arct dxS 0 0 0 0.5 arct C CTM_restore}b
%%EndResource
%%BeginResource: procset AdobePS_Win_Graphics_L1 4.2 0
/arct{arcto ! ! ! !}b/GDIpattfill{@ patterncalc : 6 ^/PaintType get 2 eq{fGray
{8 -1 $ sg}{currentcolorspace 0 get/DeviceCMYK eq{11 -4 $ sco}{10 -3 $ sco}?}?
}if fEOFill{eoclip}{clip}? N patternfill ; N}b/hf{T pfMain}b/hfW{F pfMain}b/hs
{currentpoint strokepath M hfW}b/pfMain{/fEOFill ~ d/fGray ~ d : GDIpattfill ;
N}b/pf{T pfMain}b/pfW{F pfMain}b/ps{currentpoint strokepath M pfW}b/mpstrlen
80 d/mpstr mpstrlen string d 0 0 1 mpstr length 1 sub{1 ^ mpstr 3 1 $ put}for
!/mpsubstr null d/mp{~ @ length 12 add dict copy `/PatternCTM matrix
currentmatrix d/PatternMatrix ~ d/PatWidth XStep d/PatHeight YStep d/FontType
3 d/Encoding StandardEncoding d/FontMatrix matrix d/FontBBox BBox d/BuildChar{
! @ ` XStep 0 FontBBox aload ! setcachedevice/PaintProc , E : exec ;}b & E ~ @
3 -1 $ definefont}b/patterncalc{` : PatternCTM setmatrix PatternMatrix concat
BBox aload ! ! ! + pathbbox ; PatHeight V ceiling 4 1 $ PatWidth V ceiling 4 1
$ PatHeight V floor 4 1 $ PatWidth V floor 4 1 $ 2 ^ sub cvi abs ~ 3 ^ sub cvi
abs ~ 4 2 $ PatHeight mul ~ PatWidth mul ~ E 3 ^ mpstrlen idiv 4 1 $ 4 ^
mpstrlen mod}b/patternfill{/mpsubstr mpstr 0 4 -1 $ getinterval d 6 -1 $ @ `
Ji PatternCTM setmatrix PatternMatrix concat 1 ^ 1 ^ M 2 ^{currentpoint 5 ^{
mpstr S}repeat mpsubstr length 0 ne{mpsubstr S}if YStep add M}repeat ! ! ! ! !
E}b
%%EndResource
end reinitialize
357 9626 N M 227 50 rr : 1 1 1 sco L ; 4 Lw 0 Lc 0 Lj solid 0 0 0 sco K
N 323 9507 418 9556 12.5 rrp C : 1 1 1 sco L ; 1 Lc 1 Lj K
N 313 9517 412 9563 12.5 rrp C : 1 1 1 sco L ; K
N 307 9523 403 9569 12.5 rrp C : 1 1 1 sco L ; K
N 236 9295 331 9344 12.5 rrp C : 1 1 1 sco L ; K
270 9401 N M 100 50 rr : 1 1 1 sco L ; 0 Lc 0 Lj K
329 9453 N M 17 52 - 1 Lc 1 Lj K
332 9497 N M 14 8 - K
347 9505 N M 5 -13 - K
296 9346 N M 18 52 - K
299 9390 N M 15 8 - K
315 9398 N M 5 -13 - K
373 9575 N M 18 52 - K
377 9619 N M 14 8 - K
392 9627 N M 5 -13 - K
N 167 9085 263 9131 12.5 rrp C : 1 1 1 sco L ; K
201 9192 N M 103 50 rr : 1 1 1 sco L ; 0 Lc 0 Lj K
261 9243 N M 18 52 - 1 Lc 1 Lj K
264 9286 N M 14 8 - K
279 9295 N M 5 -14 - K
229 9137 N M 17 52 - K
232 9181 N M 14 8 - K
247 9189 N M 5 -13 - K
139 8979 N M 100 50 rr : 1 1 1 sco L ; 0 Lc 0 Lj K
198 9033 N M 17 50 - 1 Lc 1 Lj K
200 9075 N M 15 8 - K
216 9083 N M 5 -13 - K
65 9008 N M 74 0 - K
5 8982 N M 56 47 rr : 1 1 1 sco L ; 0 Lc 0 Lj K
125 8996 N M 11 10 - 1 Lc 1 Lj K
127 9017 N M 10 -10 - K
N 615 9295 711 9341 12.5 rrp C : 1 1 1 sco L ; K
578 9398 N M 100 50 rr : 1 1 1 sco L ; 0 Lc 0 Lj K
597 9503 N M 18 -52 - 1 Lc 1 Lj K
600 9459 N M 15 -7 - K
616 9451 N M 5 14 - K
630 9396 N M 17 -52 - K
633 9353 N M 14 -8 - K
648 9344 N M 5 14 - K
553 9625 N M 17 -52 - K
556 9581 N M 14 -8 - K
571 9573 N M 5 13 - K
N 684 9082 780 9131 12.5 rrp C : 1 1 1 sco L ; K
644 9188 N M 102 51 rr : 1 1 1 sco L ; 0 Lc 0 Lj K
665 9293 N M 18 -52 - 1 Lc 1 Lj K
668 9249 N M 14 -8 - K
683 9241 N M 5 13 - K
697 9187 N M 18 -52 - K
700 9143 N M 14 -8 - K
716 9135 N M 5 13 - K
709 8979 N M 100 50 rr : 1 1 1 sco L ; 0 Lc 0 Lj K
885 9006 N M -74 0 - 1 Lc 1 Lj K
886 8979 N M 57 50 rr : 1 1 1 sco L ; 0 Lc 0 Lj K
825 8994 N M -11 10 - 1 Lc 1 Lj K
823 9015 N M -10 -10 - K
N 550 9504 646 9553 12.5 rrp C : 1 1 1 sco L ; K
N 541 9513 640 9559 12.5 rrp C : 1 1 1 sco L ; K
N 535 9520 630 9566 12.5 rrp C : 1 1 1 sco L ; K
736 9083 N M 18 -52 - K
739 9039 N M 14 -8 - K
754 9031 N M 5 13 - K
300 9108 N M 353 0 - 1 Lw [ 75 50 ] setdsh K
366 9318 N M 215 0 - K
446 9546 N M 60 -1 - K
LH
pagesave restore
%%PageTrailer
%%Trailer
%%DocumentNeededResources:
%%DocumentSuppliedResources:
%%+ procset AdobePS_FatalError 4.2 0
%%+ procset AdobePS_Win_Driver_Incr_L2 4.2 0
%%+ procset AdobePS_Win_Utils 4.2 0
%%+ procset AdobePS_Win_Utils_L2 4.2 0
%%+ procset AdobePS_Win_Compat 4.2 0
%%+ procset AdobePS_Win_Graphics 4.2 0
%%+ procset AdobePS_Win_Graphics_L1 4.2 0
AdobePS_Win_Driver_Incr_L2 dup /terminate get exec
%%TrailerLength: 792
%%EOF
% BibTeX bibliography style `nickie'
% Author: Nikolaos S. Papaspyrou (nickie@softlab.ntua.gr)
% Created: October 16, 1995
% Revised: June 24, 2002
% RCS version: $Id: softlab-thesis.bst,v 1.1.1.1 2002-10-17 01:50:53 nickie Exp $
ENTRY
{ address
author
booktitle
chapter
edition
editor
howpublished
institution
journal
key
month
note
number
organization
pages
publisher
school
series
title
type
volume
year
bibcheck
bibfiles
bibwhere
}
{}
{ label extra.label sort.label }
INTEGERS { output.state before.all after.block mid.block before.note }
FUNCTION {init.state.consts}
{ #0 'before.all :=
#1 'after.block :=
#2 'mid.block :=
#3 'before.note :=
}
% Functions not, or, and
% ----------------------
% Logical operators, not covered
FUNCTION {not}
{
{ #0 }
{ #1 }
if$
}
FUNCTION {and}
{
'skip$
{ pop$ #0 }
if$
}
FUNCTION {or}
{
{ pop$ #1 }
'skip$
if$
}
% Function output.nonnull
% -----------------------
% Parameter 1: item to be preserved
% Parameter 2: item to be printed
% Result: parameter 2
%
% If we're after a block
% output parameter 1 followed by a comma and a \newblock
% else if we're before all
% output parameter 1
% else
% output parameter 1 followed by a comma and a space
STRINGS { s t }
FUNCTION {output.nonnull}
{
's :=
output.state after.block =
{ "," * write$
newline$
"\newblock " write$
}
{ output.state before.all =
'write$
{ output.state before.note =
{ "." * write$
newline$
"\newblock " write$ }
{ ", " * write$ }
if$
}
if$
}
if$
mid.block 'output.state :=
s
}
% Function output
% ---------------
% Parameter 1: item to be printed
%
% Outputs parameter 1
FUNCTION {output}
{
duplicate$ empty$
'pop$
'output.nonnull
if$
}
% Function output.check
% ---------------------
% Parameter 1: type of field (just to be printed)
% Parameter 2: item to be printed
%
% Checks if parameter 2 is empty. If not, it outputs it,
% otherwise it prints a warning.
FUNCTION {output.check}
{
't :=
duplicate$ empty$
{ pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull
if$
}
% Function remove.blanks
% ----------------------
% Parameter 1: string to be parsed
% Result: parameter 1, where leading and trailing blanks have been
% removed
INTEGERS { len ptr }
STRINGS { ss }
FUNCTION {remove.blanks}
{
duplicate$ empty$
{ pop$ "" }
{ 'ss :=
#0 'len :=
{ ss #1 len substring$ empty$ }
{ len #1 + 'len := }
while$
ss len global.max$ substring$ 'ss :=
#0 'len :=
{ ss #-1 len substring$ empty$ }
{ len #1 + 'len := }
while$
ss #0 len - global.max$ substring$
}
if$
}
% Function parse.comma.delimited
% ------------------------------
% Parameter 1: string to be parsed
% Result: an empty string, followed by the list of parsed elements in
% the string in reverse order (first to be popped is first
% element)
FUNCTION {parse.comma.delimited}
{
duplicate$ empty$
{ pop$ "" }
{ 's :=
""
#0 'len :=
s text.length$ 'ptr :=
{ ptr #0 > }
{ s ptr #1 substring$ "," =
{ len #0 =
{ "Invalid element in comma delimited list" warning$ }
{ s ptr #1 + len substring$ remove.blanks
#0 'len :=
}
if$
}
{ len #1 + 'len := }
if$
ptr #1 - 'ptr :=
}
while$
len #0 =
{ duplicate$ empty$
{ "Invalid element in comma delimited list" warning$ }
'skip$
if$
}
{ s #1 len substring$ remove.blanks }
if$
}
if$
}
% Function output.bibcheck
% ------------------------
% Writes the contents of the `bibcheck' field.
FUNCTION {output.bibcheck}
{
bibcheck parse.comma.delimited
{ duplicate$ empty$ not }
{ "?" * write$
duplicate$ empty$
'skip$
{ " " write$ }
if$
}
while$
pop$
}
% Function output.bibwhere
% ------------------------
% Writes the contents of the `bibwhere' field.
FUNCTION {output.bibwhere}
{
bibwhere empty$
'skip$
{ bibwhere remove.blanks write$ }
if$
}
% Function output.bibfiles
% ------------------------
% Writes the contents of the `bibfiles' field.
% Assumes just one bibwrite !!!
FUNCTION {output.bibfiles}
{
bibfiles parse.comma.delimited
{ duplicate$ empty$ not }
{ duplicate$ bibwhere remove.blanks =
{ pop$ }
{ write$
duplicate$ empty$
'skip$
{ ", " write$ }
if$
}
if$
}
while$
pop$
}
% Function output.bibitem
% -----------------------
% Result: null string
%
% Starts an entry by writing the label and citation.
FUNCTION {output.bibitem}
{
newline$
"\nbibitem[" write$
label write$
"]{" write$
cite$ write$
"}{" write$
output.bibcheck
"}{" write$
output.bibwhere
"}{" write$
output.bibfiles
"}" write$
newline$
""
before.all 'output.state :=
}
% Function fin.entry
% ------------------
% Parameter 1: item to be printed
%
% Finishes an entry by writing whatever remains followed by a period.
FUNCTION {fin.entry}
{
add.period$
write$
newline$
}
% Function new.block
% ------------------
% If we are not before all, now we are after a block.
FUNCTION {new.block}
{
output.state before.all =
'skip$
{ after.block 'output.state := }
if$
}
% Function new.block.checka
% -------------------------
% Parameter 1: item to be printed
%
% If parameter 1 is not empty, new block
FUNCTION {new.block.checka}
{
empty$
'skip$
'new.block
if$
}
% Function new.block.checkb
% -------------------------
% Parameter 1: item to be printed
% Parameter 2: item to be printed
%
% if at least one of parameters is non empty, new block
FUNCTION {new.block.checkb}
{
empty$
swap$ empty$
and
'skip$
'new.block
if$
}
% Function new.block.note
% -----------------------
% If we are not before all, now we are before a note.
FUNCTION {new.block.note}
{
output.state before.all =
'skip$
{ before.note 'output.state := }
if$
}
% Function field.or.null
% ----------------------
% Parameter 1: item
% Result: parameter 1, if not empty or missing, null string otherwise
FUNCTION {field.or.null}
{
duplicate$ empty$
{ pop$ "" }
'skip$
if$
}
% Function emphasize
% ------------------
% Parameter 1: item to be printed
% Result: parameter 1, surrounded by `{\em ' and `}'
FUNCTION {emphasize}
{
duplicate$ empty$
{ pop$ "" }
{ "{\em " swap$ * "}" * }
if$
}
% Function format.names
% ---------------------
% Parameter 1: names to be printed
% Result: formatted names from parameter 1
INTEGERS { nameptr namesleft numnames }
FUNCTION {format.names}
{
's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
nameptr #1 >
{ namesleft #1 >
{ ", " * t * }
{
%
% Uncomment the following two lines if you want a comma to be
% printed before the `and' if there are more than two names.
%
% numnames #2 >
% { "," * }
% 'skip$
% if$
t "others" =
{ " et~al." * }
{ " and " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
% Function format.authors
% -----------------------
% Result: formatted names of authors
FUNCTION {format.authors}
{
author empty$
{ "" }
{ author format.names }
if$
}
% Function format.editors
% -----------------------
% Result: formatted names of editors
FUNCTION {format.editors}
{
editor empty$
{ "" }
{ editor format.names
editor num.names$ #1 >
{ ", editors" * }
{ ", editor" * }
if$
}
if$
}
% Function format.title.case
% --------------------------
% Parameter 1: item to be printed
% Result: parameter 1 in "title"-case
%
% The first letters of all normal words are transformed to upper case,
% except for some words (e.g. prepositions, etc.).
FUNCTION {format.title.case}
{
% nothing so far !!!
}
% Function format.quote
% ---------------------
% Parameter 1: item to be printed
% Result: parameter 1 surrounded by quotes and with all
% double quotes transformed to single (in braces)
FUNCTION {format.quote}
{
's :=
"" 't :=
{ s text.length$ #1 > }
{ s #1 #2 substring$ "``" =
{ t "{`}" * 't :=
s #3 global.max$ substring$ 's :=
}
{ s #1 #2 substring$ "''" =
{ t "{'}" * 't :=
s #3 global.max$ substring$ 's :=
}
{ t s #1 #1 substring$ * 't :=
s #2 global.max$ substring$ 's :=
}
if$
}
if$
}
while$
"``" t * s * "''" *
}
% Function format.title
% ---------------------
% Result: the formatted title
%
% Format the title, converting it to "title"-case.
FUNCTION {format.title}
{
title empty$
{ "" }
{ title format.title.case format.quote }
if$
}
% Function n.dashify
% ------------------
% Parameter 1: pages field
% Result: properly formatted pages field
%
% Fix number of dashes (always > 1, if any)
FUNCTION {n.dashify}
{
't :=
""
{ t empty$ not }
{ t #1 #1 substring$ "-" =
{ t #1 #2 substring$ "--" = not
{ "--" *
t #2 global.max$ substring$ 't :=
}
{ { t #1 #1 substring$ "-" = }
{ "-" *
t #2 global.max$ substring$ 't :=
}
while$
}
if$
}
{ t #1 #1 substring$ *
t #2 global.max$ substring$ 't :=
}
if$
}
while$
}
% Function format.date
% --------------------
% Result: formatted month and year
FUNCTION {format.date}
{
year empty$
{ month empty$
{ "" }
{ "there's a month but no year in " cite$ * warning$
month
}
if$
}
{ month empty$
'year
{ month " " * year * }
if$
}
if$
}
% Function format.btitle
% ----------------------
% Result: formatted book title (emphasized, without touching it)
FUNCTION {format.btitle}
{
title emphasize
}
% Function tie.or.space.connect
% -----------------------------
% Parameter 1: item to be printed
% Parameter 2: item to be printed
% Result: parameter 1 followed by space (hard or soft) and parameter 2
FUNCTION {tie.or.space.connect}
{
duplicate$ text.length$ #3 <
{ "~" }
{ " " }
if$
swap$ * *
}
% Function tie.or.sspace.connect
% ------------------------------
% Parameter 1: item to be printed
% Parameter 2: item to be printed
% Result: parameter 1 followed by space (hard or soft) and parameter 2
%
% The space will be short, in any case
FUNCTION {tie.or.sspace.connect}
{
duplicate$ text.length$ #3 <
{ "~" }
{ "\ " }
if$
swap$ * *
}
% Function either.or.check
% ------------------------
% Parameter 1: item to be printed
% Parameter 2: warning message
%
% Print a warning if parameter 1 is not empty
FUNCTION {either.or.check}
{
empty$
'pop$
{ "can't use both " swap$ * " fields in " * cite$ * warning$ }
if$
}
% Function format.bvolume
% -----------------------
% Result: formatted book volume and series
FUNCTION {format.bvolume}
{
volume empty$
{ "" }
{ "vol." volume tie.or.sspace.connect
series empty$
'skip$
{ " of " * series emphasize * }
if$
"volume and number" number either.or.check
}
if$
}
% Function format.number.series
% -----------------------------
% Result: formatted number and series (or nothing if volume is not empty).
FUNCTION {format.number.series}
{
volume empty$
{ number empty$
{ series field.or.null }
{ "no." number tie.or.sspace.connect
series empty$
{ "there's a number but no series in " cite$ * warning$ }
{ " in " * series * }
if$
}
if$
}
{ "" }
if$
}
% Function format.edition
% -----------------------
% Result: formatted edition
FUNCTION {format.edition}
{
edition empty$
{ "" }
{ edition "l" change.case$ " edition" * }
if$
}
% Function multi.page.check
% -------------------------
% Parameter 1: range of pages
% Result: 1 if there are more than one pages, 0 otherwise
%
% Checks by searching for `-', `,' or `+' characters.
INTEGERS { multiresult }
FUNCTION {multi.page.check}
{
't :=
#0 'multiresult :=
{ multiresult not
t empty$ not
and
}
{ t #1 #1 substring$
duplicate$ "-" =
swap$ duplicate$ "," =
swap$ "+" =
or or
{ #1 'multiresult := }
{ t #2 global.max$ substring$ 't := }
if$
}
while$
multiresult
}
% Function format.pages
% ---------------------
% Result: formatted pages (long format) `page(s) pages'
FUNCTION {format.pages}
{
pages empty$
{ "" }
{ pages multi.page.check
{ "pp." pages n.dashify tie.or.sspace.connect }
{ "p." pages tie.or.sspace.connect }
if$
}
if$
}
% Function format.vol.num.pages
% -----------------------------
% Result: formatted volume, number and pages
FUNCTION {format.vol.num.pages}
{
volume empty$
{ "" }
{ "vol." volume tie.or.sspace.connect }
if$
number empty$
'skip$
{ volume empty$
{ "there's a number but no volume in " cite$ * warning$ }
{ ", " * }
if$
"no." number tie.or.sspace.connect *
}
if$
pages empty$
'skip$
{ duplicate$ empty$
'skip$
{ ", " * }
if$
format.pages *
}
if$
}
% Function format.chapter.pages
% -----------------------------
% Result: formatted chapter and pages, long format
FUNCTION {format.chapter.pages}
{
chapter empty$
'format.pages
{ type empty$
{ "chapter" }
{ type "l" change.case$ }
if$
chapter tie.or.space.connect
pages empty$
'skip$
{ ", " * format.pages * }
if$
}
if$
}
% Function format.in.ed.booktitle
% -------------------------------
% Result: formatted editors for booktitle
FUNCTION {format.in.ed.booktitle}
{
booktitle empty$
{ "" }
{ editor empty$
{ "in " booktitle emphasize * }
{ "in " format.editors * ", " * booktitle emphasize * }
if$
}
if$
}
% Function empty.misc.check
% -------------------------
% Check if all fields in a misc entry are empty.
FUNCTION {empty.misc.check}
{
author empty$ title empty$ howpublished empty$
month empty$ year empty$ note empty$
and and and and and
key empty$ not and
{ "all relevant fields are empty in " cite$ * warning$ }
'skip$
if$
}
% Function format.thesis.type
% ---------------------------
% Parameter 1: default type
% Result: formatted type of thesis
FUNCTION {format.thesis.type}
{
type empty$
'skip$
{ pop$
type "t" change.case$
}
if$
}
% Function format.tr.number
% -------------------------
% Result: formatted number of technical report
FUNCTION {format.tr.number}
{
type empty$
{ "Technical Report" }
'type
if$
number empty$
{ "t" change.case$ }
{ number tie.or.space.connect }
if$
}
% Function format.article.crossref
% --------------------------------
% Result: formatted article cross reference
%
% If the key field is empty
% return `in {\em journal \/} citation'
% else
% return `in key citation'
FUNCTION {format.article.crossref}
{
key empty$
{ journal empty$
{ "need key or journal for " cite$ * " to crossref " * crossref *
warning$
""
}
{ "in {\em " journal * "\/}" * }
if$
}
{ "in " key * }
if$
" \cite{" * crossref * "}" *
}
% Function format.crossref.editor
% -------------------------------
% Result: editor name(s) formatted for a cross reference (abbreviated)
FUNCTION {format.crossref.editor}
{
editor #1 "{vv~}{ll}" format.name$
editor num.names$ duplicate$
#2 >
{ pop$ " et~al." * }
{ #2 <
'skip$
{ editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
{ " et~al." * }
{ " and " * editor #2 "{vv~}{ll}" format.name$ * }
if$
}
if$
}
if$
}
% Function format.book.crossref
% -----------------------------
% Result: formatted book cross reference as in `VEC'
%
% where:
% V: `Volume volume of'
% E: if there is an editor (different from the author)
% formatted-editor
% else if the key field is empty
% `{\em series\/}
% else
% key
% C: citation
FUNCTION {format.book.crossref}
{
volume empty$
{ "empty volume in " cite$ * "'s crossref of " * crossref * warning$
"in "
}
{ "vol." volume tie.or.sspace.connect
" of " *
}
if$
editor empty$
editor field.or.null author field.or.null =
or
{ key empty$
{ series empty$
{ "need editor, key, or series for " cite$ * " to crossref " *
crossref * warning$
"" *
}
{ "{\em " * series * "\/}" * }
if$
}
{ key * }
if$
}
{ format.crossref.editor * }
if$
" \cite{" * crossref * "}" *
}
% Function format.incoll.inproc.crossref
% --------------------------------------
% Result: formatted incoll/inproc cross reference as in `EC'
%
% where:
% E: if there is an editor (different from the author)
% formatted-editor
% else if the key field is empty
% `{\em booktitle\/}
% else
% key
% C: citation
FUNCTION {format.incoll.inproc.crossref}
{
editor empty$
editor field.or.null author field.or.null =
or
{ key empty$
{ booktitle empty$
{ "need editor, key, or booktitle for " cite$ * " to crossref " *
crossref * warning$
""
}
{ "in {\em " booktitle * "\/}" * }
if$
}
{ "in " key * }
if$
}
{ "in " format.crossref.editor * }
if$
" \cite{" * crossref * "}" *
}
% Function article
% ----------------
% Prints an article as:
% start...
% authors \newblock
% title \newblock
% journal, volume, number, pages, date \newblock
% note
% finish...
FUNCTION {article}
{
output.bibitem
format.authors "author" output.check
new.block
format.title "title" output.check
new.block
crossref missing$
{ journal emphasize "journal" output.check
format.vol.num.pages output
format.date "year" output.check
}
{ format.article.crossref output.nonnull
format.pages output
}
if$
new.block.note
note output
fin.entry
}
% Function book
% -------------
% Prints a book as:
% start...
% authors x-or editors \newblock
% title, volume \newblock
% number, series
% publisher, address, edition, date \newblock
% note
% finish...
FUNCTION {book}
{
output.bibitem
author empty$
{ format.editors "author and editor" output.check }
{ format.authors output.nonnull
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
new.block
format.btitle "title" output.check
crossref missing$
{ format.bvolume output
new.block
format.number.series output
publisher "publisher" output.check
address output
}
{ new.block
format.book.crossref output.nonnull
}
if$
format.edition output
format.date "year" output.check
new.block.note
note output
fin.entry
}
% Function booklet
% ----------------
% Prints a booklet as:
% start...
% authors \newblock
% title \newblock if next exists
% howpublished, address
% date \newblock
% note
% finish...
FUNCTION {booklet}
{
output.bibitem
format.authors output
new.block
format.title "title" output.check
howpublished address new.block.checkb
howpublished output
address output
format.date output
new.block.note
note output
fin.entry
}
% Function inbook
% ---------------
% Prints an inbook as:
% start...
% authors x-or editors \newblock
% title, volume \newblock
% chapter, pages \newblock
% number, series
% publisher, address, edition, date \newblock
% note
% finish...
FUNCTION {inbook}
{
output.bibitem
author empty$
{ format.editors "author and editor" output.check }
{ format.authors output.nonnull
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
new.block
format.btitle "title" output.check
crossref missing$
{ format.bvolume output
format.chapter.pages "chapter and pages" output.check
new.block
format.number.series output
publisher "publisher" output.check
address output
}
{ format.chapter.pages "chapter and pages" output.check
new.block
format.book.crossref output.nonnull
}
if$
format.edition output
format.date "year" output.check
new.block.note
note output
fin.entry
}
% Function incollection
% ---------------------
% Prints an incollection as:
% start...
% authors \newblock
% title \newblock
% booktitle, volume, number, series, chapter, pages
% publisher, address, edition, date \newblock
% note
% finish...
FUNCTION {incollection}
{
output.bibitem
format.authors "author" output.check
new.block
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
format.bvolume output
format.number.series output
format.chapter.pages output
publisher "publisher" output.check
address output
format.edition output
format.date "year" output.check
}
{ format.incoll.inproc.crossref output.nonnull
format.chapter.pages output
}
if$
new.block.note
note output
fin.entry
}
% Function inproceedings / conference
% -----------------------------------
% Prints an inproceedings/conference as:
% start...
% authors \newblock
% title \newblock
% booktitle, volume, number, pages
% organization, publisher, address { not exactly! }
% date \newblock
% note
% finish...
FUNCTION {inproceedings}
{
output.bibitem
format.authors "author" output.check
new.block
format.title "title" output.check
new.block
crossref missing$
{ format.in.ed.booktitle "booktitle" output.check
format.bvolume output
format.number.series output
format.pages output
address empty$
{ organization output
publisher output
format.date "year" output.check
}
{ address output.nonnull
format.date "year" output.check
organization output
publisher output
}
if$
}
{ format.incoll.inproc.crossref output.nonnull
format.pages output
}
if$
new.block.note
note output
fin.entry
}
FUNCTION {conference} { inproceedings }
% Function manual
% ---------------
% Prints a manual as:
% start...
% whatever...
% finish...
FUNCTION {manual}
{
output.bibitem
author empty$
{ organization empty$
'skip$
{ organization output.nonnull
address output
}
if$
}
{ format.authors output.nonnull }
if$
new.block
format.btitle "title" output.check
author empty$
{ organization empty$
{ address new.block.checka
address output
}
'skip$
if$
}
{ organization address new.block.checkb
organization output
address output
}
if$
format.edition output
format.date output
new.block.note
note output
fin.entry
}
% Function mastersthesis
% ----------------------
% Prints a Master's thesis as:
% start...
% whatever...
% finish...
FUNCTION {mastersthesis}
{
output.bibitem
format.authors "author" output.check
new.block
format.title "title" output.check
new.block
"Master's thesis" format.thesis.type output.nonnull
school "school" output.check
address output
format.date "year" output.check
new.block.note
note output
fin.entry
}
% Function misc
% -------------
% Prints a misc entry as:
% start...
% whatever...
% finish...
FUNCTION {misc}
{
output.bibitem
format.authors output
title howpublished new.block.checkb
format.title output
howpublished new.block.checka
howpublished output
format.date output
new.block.note
note output
fin.entry
empty.misc.check
}
% Function phdthesis
% ------------------
% Prints a Ph.D. thesis as:
% start...
% whatever...
% finish...
FUNCTION {phdthesis}
{
output.bibitem
format.authors "author" output.check
new.block
format.btitle "title" output.check
new.block
"Ph.D.\ thesis" format.thesis.type output.nonnull
school "school" output.check
address output
format.date "year" output.check
new.block.note
note output
fin.entry
}
% Function proceedings
% --------------------
% Prints a proceedings entry as:
% start...
% whatever...
% finish...
FUNCTION {proceedings}
{
output.bibitem
editor empty$
{ organization output }
{ format.editors output.nonnull }
if$
new.block
format.btitle "title" output.check
format.bvolume output
format.number.series output
address empty$
{ editor empty$
'skip$
{ organization output }
if$
publisher output
format.date "year" output.check
}
{ address output.nonnull
format.date "year" output.check
editor empty$
'skip$
{ organization output }
if$
publisher output
}
if$
new.block.note
note output
fin.entry
}
% Function techreport
% -------------------
% Prints a technical report as:
% start...
% whatever...
% finish...
FUNCTION {techreport}
{
output.bibitem
format.authors "author" output.check
new.block
format.title "title" output.check
new.block
format.tr.number output.nonnull
institution "institution" output.check
address output
format.date "year" output.check
new.block.note
note output
fin.entry
}
% Function unpublished
% --------------------
% Prints an unpublished entry as:
% start...
% whatever...
% finish...
FUNCTION {unpublished}
{
output.bibitem
format.authors "author" output.check
new.block
format.title "title" output.check
new.block.note
note "note" output.check
format.date output
fin.entry
}
% Auxiliary
FUNCTION {default.type} { misc }
% Months
MACRO {jan} {"January"}
MACRO {feb} {"February"}
MACRO {mar} {"March"}
MACRO {apr} {"April"}
MACRO {may} {"May"}
MACRO {jun} {"June"}
MACRO {jul} {"July"}
MACRO {aug} {"August"}
MACRO {sep} {"September"}
MACRO {oct} {"October"}
MACRO {nov} {"November"}
MACRO {dec} {"December"}
% Periodicals
MACRO {acmcs} {"ACM Computing Surveys"}
MACRO {acta} {"Acta Informatica"}
MACRO {cacm} {"Communications of the ACM"}
MACRO {ibmjrd} {"IBM Journal of Research and Development"}
MACRO {ibmsj} {"IBM Systems Journal"}
MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
MACRO {ieeetc} {"IEEE Transactions on Computers"}
MACRO {ieeetcad}
{"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
MACRO {ipl} {"Information Processing Letters"}
MACRO {jacm} {"Journal of the ACM"}
MACRO {jcss} {"Journal of Computer and System Sciences"}
MACRO {scp} {"Science of Computer Programming"}
MACRO {sicomp} {"SIAM Journal on Computing"}
MACRO {tocs} {"ACM Transactions on Computer Systems"}
MACRO {tods} {"ACM Transactions on Database Systems"}
MACRO {tog} {"ACM Transactions on Graphics"}
MACRO {toms} {"ACM Transactions on Mathematical Software"}
MACRO {toois} {"ACM Transactions on Office Information Systems"}
MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
MACRO {tcs} {"Theoretical Computer Science"}
% Do the reading!
READ
% Sorting
FUNCTION {sortify}
{ purify$
"l" change.case$
}
FUNCTION {chop.word}
{ 's :=
'len :=
s #1 len substring$ =
{ s len #1 + global.max$ substring$ }
's
if$
}
FUNCTION {format.lab.chop}
{
#4 text.prefix$
}
FUNCTION {format.lab.names}
{
#1 "{v{}}{ll{}}" format.name$
purify$
format.lab.chop
}
FUNCTION {author.key.label}
{ author empty$
{ key empty$
{ cite$ format.lab.chop }
{ key format.lab.chop }
if$
}
{ author format.lab.names }
if$
}
FUNCTION {author.editor.key.label}
{ author empty$
{ editor empty$
{ key empty$
{ cite$ format.lab.chop }
{ key format.lab.chop }
if$
}
{ editor format.lab.names }
if$
}
{ author format.lab.names }
if$
}
FUNCTION {author.key.organization.label}
{ author empty$
{ key empty$
{ organization empty$
{ cite$ format.lab.chop }
{ "The " #4 organization chop.word format.lab.chop }
if$
}
{ key format.lab.chop }
if$
}
{ author format.lab.names }
if$
}
FUNCTION {editor.key.organization.label}
{ editor empty$
{ key empty$
{ organization empty$
{ cite$ format.lab.chop }
{ "The " #4 organization chop.word format.lab.chop }
if$
}
{ key format.lab.chop }
if$
}
{ editor format.lab.names }
if$
}
FUNCTION {calc.label}
{ type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.organization.label
{ type$ "manual" =
'author.key.organization.label
'author.key.label
if$
}
if$
}
if$
duplicate$
year field.or.null purify$ #-1 #2 substring$
*
'label :=
year field.or.null purify$ #-1 #4 substring$
*
sortify 'sort.label :=
}
FUNCTION {sort.format.names}
{ 's :=
#1 'nameptr :=
""
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ nameptr #1 >
{ " " * }
'skip$
if$
s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't :=
nameptr numnames = t "others" = and
{ "et al" * }
{ t sortify * }
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {sort.format.title}
{ 't :=
"A " #2
"An " #3
"The " #4 t chop.word
chop.word
chop.word
sortify
#1 global.max$ substring$
}
FUNCTION {author.sort}
{ author empty$
{ key empty$
{ "to sort, need author or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {author.editor.sort}
{ author empty$
{ editor empty$
{ key empty$
{ "to sort, need author, editor, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ editor sort.format.names }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {author.organization.sort}
{ author empty$
{ organization empty$
{ key empty$
{ "to sort, need author, organization, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ "The " #4 organization chop.word sortify }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {editor.organization.sort}
{ editor empty$
{ organization empty$
{ key empty$
{ "to sort, need editor, organization, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ "The " #4 organization chop.word sortify }
if$
}
{ editor sort.format.names }
if$
}
FUNCTION {presort}
{ calc.label
sort.label
" "
*
type$ "book" =
type$ "inbook" =
or
'author.editor.sort
{ type$ "proceedings" =
'editor.organization.sort
{ type$ "manual" =
'author.organization.sort
'author.sort
if$
}
if$
}
if$
*
" "
*
year field.or.null sortify
*
" "
*
title field.or.null
sort.format.title
*
#1 entry.max$ substring$
'sort.key$ :=
}
% Sort
ITERATE {presort}
SORT
% Find longest label
STRINGS { longest.label last.sort.label next.extra }
INTEGERS { longest.label.width last.extra.num }
FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
#0 int.to.chr$ 'last.sort.label :=
"" 'next.extra :=
#0 'longest.label.width :=
#0 'last.extra.num :=
}
FUNCTION {forward.pass}
{ last.sort.label sort.label =
{ last.extra.num #1 + 'last.extra.num :=
last.extra.num int.to.chr$ 'extra.label :=
}
{ "a" chr.to.int$ 'last.extra.num :=
"" 'extra.label :=
sort.label 'last.sort.label :=
}
if$
}
FUNCTION {reverse.pass}
{ next.extra "b" =
{ "a" 'extra.label := }
'skip$
if$
label extra.label * 'label :=
label width$ longest.label.width >
{ label 'longest.label :=
label width$ 'longest.label.width :=
}
'skip$
if$
extra.label 'next.extra :=
}
EXECUTE {initialize.longest.label}
ITERATE {forward.pass}
REVERSE {reverse.pass}
FUNCTION {begin.bib}
{
"\providecommand\nbibitem[5][]{\bibitem[#1]{#2}}" write$ newline$
preamble$ empty$
'skip$
{ preamble$ write$ newline$ }
if$
"\begin{thebibliography}{" longest.label * "}" * write$ newline$
}
EXECUTE {begin.bib}
EXECUTE {init.state.consts}
ITERATE {call.type$}
FUNCTION {end.bib}
{ newline$
"\end{thebibliography}" write$ newline$
}
EXECUTE {end.bib}
%%
%% This is file `thesis.cls',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% thesis.dtx (with options: `thesis')
%%
%% Copyright (C) 1991, 1996 by Wenzel Matiaske, mati1831@perform.ww.tu-berlin.de
%%
%% You are not allowed to distribute this file without the
%% original source thesis.dtx. For distribution of the
%% sources see the copyright notice in the file thesis.dtx.
%%
\def\filename{softlab-thesis}
\def\fileversion{1.0g}
\def\filedate{1996/25/01}
\def\docdate{1995/25/01}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{softlab-thesis}[\filedate\space\fileversion\space%
LaTeX document class (wm).]
\newcommand\@ptsize{}
\newif\if@restonecol
\newif\if@titlepage
\@titlepagetrue
\newif\if@openright
\newif\if@openbib
\@openbibfalse
\newif\if@mainmatter \@mainmattertrue
\DeclareOption{a4paper}
{\setlength\paperheight {297mm}%
\setlength\paperwidth {210mm}}
\DeclareOption{a5paper}
{\setlength\paperheight {210mm}%
\setlength\paperwidth {148mm}}
\DeclareOption{b5paper}
{\setlength\paperheight {250mm}%
\setlength\paperwidth {176mm}}
\DeclareOption{letterpaper}
{\setlength\paperheight {11in}%
\setlength\paperwidth {8.5in}}
\DeclareOption{legalpaper}
{\setlength\paperheight {14in}%
\setlength\paperwidth {8.5in}}
\DeclareOption{executivepaper}
{\setlength\paperheight {10.5in}%
\setlength\paperwidth {7.25in}}
\DeclareOption{landscape}
{\setlength\@tempdima {\paperheight}%
\setlength\paperheight {\paperwidth}%
\setlength\paperwidth {\@tempdima}}
\DeclareOption{10pt}{\renewcommand\@ptsize{0}}
\DeclareOption{11pt}{\renewcommand\@ptsize{1}}
\DeclareOption{12pt}{\renewcommand\@ptsize{2}}
\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse}
\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue}
\newcount\hours \newcount\minutes
\def\SetTime{\hours=\time
\global\divide\hours by 60
\minutes=\hours
\multiply\minutes by 60
\advance\minutes by-\time
\global\multiply\minutes by-1 }
\def\now{\number\hours:\ifnum\minutes<10 0\fi\number\minutes}
\newif\iffinal \finaltrue
\DeclareOption{draft}{\setlength\overfullrule{5pt}\finalfalse \SetTime}
\DeclareOption{final}{\setlength\overfullrule{0pt}\finaltrue}
\newif\if@thema \@themafalse
\DeclareOption{thema}{\@thematrue}
\newif\if@crosshair \@crosshairfalse
\DeclareOption{crosshair}{\@crosshairtrue}
\DeclareOption{nocrosshair}{\@crosshairfalse}
\newif\if@itemization \@itemizationtrue
\DeclareOption{itemize} {\@itemationtrue}
\DeclareOption{noitemize}{\@itemizationfalse}
\newif\if@enumeration \@enumerationtrue
\DeclareOption{enumerate} {\@enumerationtrue}
\DeclareOption{noenumerate}{\@enumerationfalse}
\newif\if@noind \@noindfalse
\DeclareOption{indent} {\@noindfalse}
\DeclareOption{noindent}{\@noindtrue}
\newif\if@center \@centerfalse
\DeclareOption{center} {\@centertrue}
\DeclareOption{nocenter}{\@centerfalse}
\newif\if@upper \@upperfalse
\DeclareOption{upper} {\@uppertrue}
\DeclareOption{noupper}{\@upperfalse}
\newif\if@headline \@headlinetrue
\DeclareOption{headline} {\@headlinetrue}
\DeclareOption{noheadline}{\@headlinefalse}
\newif\if@headcount \@headcounttrue
\DeclareOption{headcount} {\@headcounttrue}
\DeclareOption{noheadcount}{\@headcountfalse}
\def\partfont#1{\def\p@font{#1}} \def\p@font{}
\def\chapterfont#1{\def\c@font{#1}} \def\c@font{}
\def\chapterauthorfont#1{\def\ca@font{#1}} \def\ca@font{}
\def\sectionfont#1{\def\s@font{#1}} \def\s@font{}
\def\subsectionfont#1{\def\ss@font{#1}} \def\ss@font{}
\def\subsubsectionfont#1{\def\sss@font{#1}} \def\sss@font{}
\def\paragraphfont#1{\def\pg@font{#1}} \def\pg@font{}
\def\subparagraphfont#1{\def\spg@font{#1}} \def\spg@font{}
\def\titlefont#1{\def\t@font{#1}} \def\t@font{}
\def\subtitlefont#1{\def\st@font{#1}} \def\st@font{}
\def\authorfont#1{\def\a@font{#1}} \def\a@font{}
\def\translatorfont#1{\def\a@font{#1}} \def\tr@font{}
\def\institutionfont#1{\def\in@font{#1}} \def\in@font{}
\def\theoremheaderfont#1{\def\thh@font{#1}} \def\thh@font{}
\def\theorembodyfont#1{\def\thb@font{#1}} \def\thb@font{}
\def\itemfont#1{\def\item@font{#1}} \def\item@font{}
\def\examplefont#1{\def\ex@font{#1}} \def\ex@font{}
\def\headingstextfont#1{\def\h@font{#1}} \def\h@font{}
\def\pagenumberfont#1{\def\pn@font{#1}} \def\pn@font{}
\def\captionheaderfont#1{\def\cph@font{#1}} \def\cph@font{}
\def\captionbodyfont#1{\def\cpb@font{#1}} \def\cpb@font{}
\def\figurefont#1{\def\fig@font{#1}} \def\fig@font{}
\def\tablefont#1{\def\tab@font{#1}} \def\tab@font{}
\def\indexsize#1{\def\index@size{#1}} \def\index@size{}
\def\bibsize#1{\def\bib@size{#1}} \def\bib@size{}
\DeclareOption{slanted}{
\partfont{\Large}
\chapterfont{\large}
\chapterauthorfont{\large}
\sectionfont{\large\slshape}
\subsectionfont{\slshape}
\subsubsectionfont{\slshape}
\paragraphfont{\slshape}
\subparagraphfont{\slshape}
\titlefont{\LARGE}
\subtitlefont{\large}
\authorfont{}
\institutionfont{\slshape}
\translatorfont{}
\theoremheaderfont{\upshape}
\theorembodyfont{}
\itemfont{\slshape}
\examplefont{}
\headingstextfont{\small\slshape}
\pagenumberfont{\small}
\captionheaderfont{\slshape\small}
\captionbodyfont{\small}
\figurefont{}
\tablefont{}
}
\DeclareOption{bold}{%
\partfont{\LARGE\bfseries}
\chapterfont{\LARGE\bfseries}
\chapterauthorfont{\large}
\sectionfont{\Large\bfseries}
\subsectionfont{\large\bfseries}
\subsubsectionfont{\bfseries}
\paragraphfont{\bfseries}
\subparagraphfont{\bfseries}
\titlefont{\LARGE\bfseries}
\subtitlefont{\large}
\authorfont{}
\translatorfont{}
\institutionfont{\slshape}
\theoremheaderfont{\bfseries}
\theorembodyfont{\itshape}
\itemfont{\bfseries}
\examplefont{}
\headingstextfont{\small\bfseries}
\pagenumberfont{\small}
\captionheaderfont{\bfseries}
\captionbodyfont{}
\figurefont{}
\tablefont{}
}
\DeclareOption{sfbold}{%
\partfont{\LARGE\sffamily\bfseries}
\chapterfont{\LARGE\sffamily\bfseries}
\chapterauthorfont{\Large\sffamily\bfseries}
\sectionfont{\large\sffamily\bfseries}
\subsectionfont{\large\sffamily\bfseries}
\subsubsectionfont{\sffamily\bfseries}
\paragraphfont{\sffamily\bfseries}
\subparagraphfont{\sffamily}
\titlefont{\LARGE\sffamily\bfseries}
\subtitlefont{\large\sffamily}
\authorfont{\Large\sffamily\slshape}
\translatorfont{}
\institutionfont{\sffamily}
\theoremheaderfont{\sffamily}
\theorembodyfont{}
\itemfont{\sffamily}
\examplefont{}
\headingstextfont{\small\sffamily}
\pagenumberfont{\small\rmfamily}
\captionheaderfont{\sffamily}
\captionbodyfont{}
\figurefont{}
\tablefont{}
}
\DeclareOption{titlepage}{\@titlepagetrue}
\DeclareOption{notitlepage}{\@titlepagefalse}
\DeclareOption{openright}{\@openrighttrue}
\DeclareOption{openany}{\@openrightfalse}
\DeclareOption{onecolumn}{\@twocolumnfalse}
\DeclareOption{twocolumn}{\@twocolumntrue}
\DeclareOption{leqno}{\input{leqno.clo}}
\DeclareOption{fleqn}{\input{fleqn.clo}}
\DeclareOption{openbib}{\@openbibtrue}
\newif\if@chapterbib \@chapterbibfalse
\DeclareOption{chapterbib}{\@chapterbibtrue}
\ExecuteOptions{a4paper,11pt,twoside,onecolumn,final,openright,%
bold,nocenter,noupper,headcount}
\ProcessOptions*
\input{bk1\@ptsize.clo}
\setlength\lineskip{1\p@}
\setlength\normallineskip{1\p@}
\renewcommand\baselinestretch{}
\if@noind
\setlength\parskip{0.5\baselineskip
\@plus.1\baselineskip \@minus.1\baselineskip}
\setlength\parindent{\z@}
\def\noparskip{\par\vspace{-\parskip}}
\else
\setlength\parskip{0\p@ \@plus 1\p@}
\let\noparskip\relax
\fi
\@lowpenalty 51
\@medpenalty 151
\@highpenalty 301
\setcounter{topnumber}{2}
\renewcommand\topfraction{.7}
\setcounter{bottomnumber}{1}
\renewcommand\bottomfraction{.3}
\setcounter{totalnumber}{3}
\renewcommand\textfraction{.2}
\renewcommand\floatpagefraction{.5}
\setcounter{dbltopnumber}{2}
\renewcommand\dbltopfraction{.7}
\renewcommand\dblfloatpagefraction{.5}
\def\e@skip{\h@font{\phantom{y}}}
\if@twoside
\def\ps@headings{
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\vbox{\hsize=\textwidth
\hbox to \textwidth{%
{\pn@font\thepage}\hfill{\h@font\leftmark}\e@skip\if@center\hfill\fi}
\if@headline \vskip 1.5pt \hrule \fi}}%
\def\@oddhead{\vbox{\hsize=\textwidth
\hbox to \textwidth{%
\if@center\hfill\fi{\h@font\rightmark}\e@skip\hfill{\pn@font\thepage}}
\if@headline \vskip 1.5pt \hrule \fi}}%
\let\@mkboth\markboth
\def\chaptermark##1{%
\markboth {%
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\@chapapp\
\if@headcount
\thechapter. \ %
\fi
\fi
\fi
##1}{}}%
\def\sectionmark##1{%
\markright {%
\ifnum \c@secnumdepth >\z@
\if@headcount
\thesection. \ %
\fi
\fi
##1}}}
\else
\def\ps@headings{%
\let\@oddfoot\@empty
\def\@oddhead{\vbox{\hsize=\textwidth
\hbox to \textwidth{%
\if@center\hfill\fi{\h@font\rightmark}\e@skip\hfill{\pn@font\thepage}}
\if@headline \vskip 1.5pt \hrule \fi}}%
\let\@mkboth\markboth
\def\chaptermark##1{%
\markright {%
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\@chapapp\
\if@headcount
\thechapter. \ %
\fi
\fi
\fi
##1}}}
\fi
\def\ps@myheadings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@oddhead{\vbox{\hsize=\textwidth
\hbox to \textwidth{%
\if@center\hfill\fi{\h@font\rightmark}\e@skip\hfill{\pn@font\thepage}}
\if@headline \vskip 1.5pt \hrule \fi}}%
\def\@evenhead{\vbox{\hsize=\textwidth
\hbox to \textwidth{%
{\pn@font\thepage}\hfill{\h@font\leftmark}\e@skip\if@center\hfill\fi}
\if@headline \vskip 1.5pt \hrule \fi}}%
\let\@mkboth\@gobbletwo
\let\chaptermark\@gobble
\let\sectionmark\@gobble
}
\def\ps@draft{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@oddhead{\vbox{\hsize=\textwidth
\hbox to \textwidth{%
{\pn@font\today\ \now\ --- {\h@font \draftname: ``\jobname''}
\hfil\e@skip \thepage}}
\if@headline \vskip 1.5pt \hrule \fi}}%
\def\@evenhead{\vbox{\hsize=\textwidth
\hbox to \textwidth{%
\pn@font\thepage\e@skip\hfil {\h@font \draftname: ``\jobname''} ---
\today\ \now\ }
\if@headline \vskip 1.5pt \hrule \fi}}%
\let\@mkboth\@gobbletwo
\let\chaptermark\@gobble
\let\sectionmark\@gobble
}
\@ifundefined{option@crosshair}{}{%
\def\clap#1{\hbox to 0pt{\hss#1\hss}} \newdimen\@crosshairrule
\@crosshairrule=.24pt \def\@crosshairs{\vbox to
0pt{\hsize=0pt\baselineskip=0pt\lineskip=0pt \vss \clap{\vrule
height .125in width \@crosshairrule depth 0pt} \clap{\vrule
width .25in height \@crosshairrule depth 0pt} \clap{\vrule
height .125in width \@crosshairrule depth 0pt} \vss}}
\def\ps@empty{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@oddhead{\hfill\raise\headheight\@crosshairs}
\let\@evenhead\@oddhead}}
\def\@subtitle{} \def\subtitle#1{\gdef\@subtitle{#1}}
\def\@translator{} \def\translator#1{\gdef\@translator{#1}}
\def\@institution{} \def\institution#1{\gdef\@institution{#1}}
\def\@dedication{} \def\dedication#1{\def\@dedication{#1}}
\def\@uppertitleback{} \long\def\uppertitleback#1{\def\@uppertitleback{#1}}
\def\@middletitleback{} \long\def\middletitleback#1{\def\@middletitleback{#1}}
\def\@lowertitleback{} \long\def\lowertitleback#1{\def\@lowertitleback{#1}}
\def\new@tpage{\newpage\thispagestyle{empty}\null}
\def\and{\end{tabular}\hskip 1em plus.17fil
\if@center
\begin{tabular}[t]{c}
\else
\begin{tabular}[t]{@{}l@{}}
\fi}
\def\maketitle{%
\begin{titlepage}
\let\footnotesize\small
\let\footnoterule\relax
\def\thefootnote{\fnsymbol{footnote}}
\if@twoside
\new@tpage
\begin{raggedright}
{\t@font \@title \par}\vskip 1em
{\st@font \@subtitle \par}\vspace{50pt}
{\a@font \lineskip 1.25em
\begin{tabular}[t]{@{}l@{}}
\@author
\end{tabular}\par}
\vfill
{\in@font\@institution\par}
\end{raggedright}
\new@tpage \new@tpage
{\ss@font\@title}\par
{\sss@font\@subtitle}
\new@tpage
\fi
\new@tpage
\begin{center}
{\t@font\@title \par}\vskip 1em
{\st@font\@subtitle \par}
\vspace{50pt}
{\a@font \lineskip 1.25em
\begin{tabular}[t]{c}
\@author
\end{tabular} \par }\vfil
{\tr@font \@translator \par}
\vfil
{\st@font \@date \par}
\vskip 2em
{\in@font\@institution \par}
\end{center}
\par \@thanks
\if@twoside \new@tpage
\noindent\begin{minipage}[t]{\textwidth}
\@uppertitleback
\end{minipage}\par
\vfill
\noindent\begin{minipage}[t]{\textwidth}
\@middletitleback
\end{minipage}\par
\vfill
\noindent\begin{minipage}[b]{\textwidth}
\@lowertitleback
\end{minipage}
\fi
\ifx\@dedication\@empty\else \new@tpage
{\centering \Large \@dedication \par}
\fi
\if@twoside \new@tpage \fi
\end{titlepage}
\def\thefootnote{\arabic{footnote}}
\setcounter{footnote}{0}
\if@thema\else\let\thanks\relax\fi
\gdef\@thanks{}\gdef\@author{}\gdef\@translator{}\gdef\@institution{}
\gdef\@uppertitleback{}\gdef\@lowertitleback{}\gdef\@dedication{}%
\gdef\@title{}\gdef\@subtitle{}\let\maketitle\relax}
\def\abstract{%\titlepage
\addcontentsline{toc}{chapter}{\abstractname}%
\chapter*{\abstractname\@mkboth{\abstractname}{\abstractname}}}
\def\endabstract{\par\vfil\null\endtitlepage}
\if@thema
\if@center
\def\chapterabstract{\if@twocolumn
\subsection*{\abstractname}%
\else \small
\begin{center}%
{\pg@font \abstractname\vspace{-.5em}\vspace{\z@}}%
\end{center}%
\quotation
\fi}
\def\endchapterabstract{\if@twocolumn\else\endquotation\fi}
\else
\def\chapterabstract{\if@twocolumn
\subsection*{\abstractname}%
\else \small
\subsection*{\abstractname}%
\fi}
\def\endchapterabstract{\par\bigskip}
\fi
\fi
\newcommand*{\chaptermark}[1]{}
\setcounter{secnumdepth}{2}
\newcounter {part}
\newcounter {chapter}
\newcounter {section}[chapter]
\newcounter {subsection}[section]
\newcounter {subsubsection}[subsection]
\newcounter {paragraph}[subsubsection]
\newcounter {subparagraph}[paragraph]
\renewcommand{\thepart} {\Roman{part}}
\renewcommand{\thechapter} {\arabic{chapter}}
\renewcommand{\thesection} {\thechapter.\arabic{section}}
\renewcommand{\thesubsection} {\thesection.\arabic{subsection}}
\renewcommand{\thesubsubsection}{\thesubsection .\arabic{subsubsection}}
\renewcommand{\theparagraph} {\thesubsubsection.\arabic{paragraph}}
\renewcommand{\thesubparagraph} {\theparagraph.\arabic{subparagraph}}
\def\chapapp#1{\def\@chapapp{#1}} \def\@chapapp{}
\newcommand{\frontmatter}{\cleardoublepage
\@mainmatterfalse\pagenumbering{roman}}
\newcommand{\mainmatter}{\label{pg:last-front}\cleardoublepage
\@mainmattertrue\pagenumbering{arabic}%
\addtocontents{toc}{\protect\addvspace{1em}}}
\newcommand{\backmatter}{\if@openright\cleardoublepage\else\clearpage\fi
\@mainmatterfalse}
\newcommand{\part}{\cleardoublepage
\thispagestyle{empty}%
\if@twocolumn
\onecolumn\@tempswatrue
\else
\@tempswafalse
\fi
\vspace*{\beforechaptervspace}%
\secdef\@part\@spart}
\def\@part[#1]#2{%
\ifnum \c@secnumdepth >-2\relax \refstepcounter{part}
\addcontentsline{toc}{part}{\partname\ \thepart \hspace{1em}#1}%
\else
\addcontentsline{toc}{part}{#1}\fi \markboth{}{}%
{\if@center
\centering
\else
\raggedright
\fi
\reset@font
\ifnum \c@secnumdepth >-2\relax
\p@font \partname{} \thepart \par
\vskip 20pt
\fi
\p@font
\if@upper
\uppercase{#2}
\else #2
\fi
\par}
\@endpart}
\def\@spart#1{%
{\if@center
\centering
\else
\raggedright
\fi
\reset@font\p@font
\if@upper
\uppercase\expandafter{#1}
\else #1%
\fi\par}
\@endpart}
\def\@endpart{\vfil\newpage
\if@twoside
\hbox{}%
\thispagestyle{empty}%
\newpage
\fi
\if@tempswa
\twocolumn
\fi}
\if@thema
\def\chapterauthor#1{\gdef\@chapterauthor{#1}} \def\@chapterauthor{}
\def\shortauthor#1{\gdef\@shortauthor{#1}} \def\@shortauthor{}
\def\@makechapterauthor{\par
\def\thefootnote{\fnsymbol{footnote}}%
\def\@makefnmark{\hbox
to\z@{$\m@th^{\@thefnmark}$\hss}}%
\if@center
\centering
\else\parindent\z@
\raggedright
\fi
{\ca@font \lineskip .5em
\if@center
\begin{tabular}[t]{c}
\else
\begin{tabular}[t]{@{}l@{}}
\fi
\@chapterauthor
\end{tabular} \par}\@thanks
\vskip30\p@
\gdef\@chapterauthor{}\gdef\@shortauthor{}
\gdef\@thanks{}\setcounter{footnote}{0}}
\fi
\newcommand{\chapter}{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{empty}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
\def\@chapter[#1]#2{%
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\refstepcounter{chapter}%
\typeout{\chaptername\space\thechapter.}
\if@thema
\ifx\@shortauthor\@empty
\addcontentsline{toc}{chapter}{%
\protect\numberline{\thechapter.}#1}%
\else
\addcontentsline{toc}{chapter}{%
\protect\numberline{\thechapter.}%
\@shortauthor\hfill\mbox{}\vskip\normallineskip #1}%
\fi
\else
\addcontentsline{toc}{chapter}{%
\protect\numberline{\thechapter.}#1}%
\fi
\else
\addcontentsline{toc}{chapter}{#1}
\fi
\else
\addcontentsline{toc}{chapter}{#1}
\fi
\chaptermark{#1}
\addtocontents{lof}{\protect\addvspace{10pt}}
\addtocontents{lot}{\protect\addvspace{10pt}}
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]
\else
\@makechapterhead{#2}
\@afterheading
\fi}
\newlength{\beforechaptervspace}
\setlength{\beforechaptervspace}{50pt}
\newlength{\afterchaptervspace}
\setlength{\afterchaptervspace}{30pt}
\def\@makechapterhead#1{%
\vspace*{\beforechaptervspace}{%
\ifx\@chapapp\@empty
\if@center\centering
\ifnum \c@secnumdepth >\m@ne
{\c@font\thechapter.\ }
\fi
{\c@font
\if@upper
\uppercase{#1}
\else
#1
\fi
\par \nobreak}
\else\raggedright
\ifnum \c@secnumdepth >\m@ne
\setbox\@tempboxa\hbox{\c@font\thechapter.\ %
\c@font
\if@upper
\uppercase{#1}
\else
#1%
\fi}
\ifdim \wd\@tempboxa >\hsize
\@hangfrom{%
\c@font\thechapter.\ }{\c@font
\if@upper
\uppercase{#1}
\else
#1%
\fi
\par\nobreak}
\else
\hbox to\hsize{\box\@tempboxa\hfil}
\fi
\fi
\fi
\else
\if@center
\centering
\else
\raggedright
\fi
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
{\s@font \@chapapp{} \thechapter}
\par \vskip 15\p@
\fi
\fi
{\c@font
\if@upper
\uppercase{#1}
\else
#1%
\fi
\par \nobreak}
\fi
\vspace{\afterchaptervspace}
\if@thema
\ifx\@shortauthor\@empty
\else
\@mkboth{\@shortauthor}{#1}
\fi
\ifx\@chapterauthor\@empty
\else
\@makechapterauthor
\fi
\fi}
}
\def\@schapter#1{%
\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]
\else
\@makeschapterhead{#1}\@afterheading
\fi}
\def\@makeschapterhead#1{%
\vspace*{\beforechaptervspace}{%
\if@center
\centering
\else
\parindent\z@\raggedright
\fi
{\c@font
\if@upper
\uppercase\expandafter{#1}
\else
#1%
\fi
\par\nobreak
\vskip 30\p@}
\if@thema
\ifx\@shortauthor\@empty
\else
\@mkboth{\@shortauthor}{#1}
\fi
\ifx\@chapterauthor\@empty
\else
\@makechapterauthor
\fi\fi
}}
\newcommand\section{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\if@center\centering\else\raggedright\fi
\reset@font\s@font}}
\newcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\if@center\centering\else\raggedright\fi
\reset@font\ss@font}}
\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\if@center\centering\else\raggedright\fi
\reset@font\sss@font}}
\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
{3.25ex \@plus1ex \@minus.2ex}%
{-1em}%
{\reset@font\pg@font}}
\newcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
{3.25ex \@plus1ex \@minus .2ex}%
{-1em}%
{\reset@font\spg@font}}
\if@twocolumn
\setlength\leftmargini {2em}
\else
\setlength\leftmargini {2.5em}
\fi
\setlength\leftmarginii {2.2em}
\setlength\leftmarginiii {1.87em}
\setlength\leftmarginiv {1.7em}
\if@twocolumn
\setlength\leftmarginv {.5em}
\setlength\leftmarginvi {.5em}
\else
\setlength\leftmarginv {1em}
\setlength\leftmarginvi {1em}
\fi
\setlength\leftmargin {\leftmargini}
\setlength \labelsep {.5em}
\setlength \labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}
\@beginparpenalty -\@lowpenalty
\@endparpenalty -\@lowpenalty
\@itempenalty -\@lowpenalty
\if@enumeration
\renewcommand\theenumi{\arabic{enumi}}
\renewcommand\theenumii{\alph{enumii}}
\renewcommand\theenumiii{\roman{enumiii}}
\renewcommand\theenumiv{\Alph{enumiv}}
\newcommand\labelenumi{\theenumi.}
\newcommand\labelenumii{(\theenumii)}
\newcommand\labelenumiii{\theenumiii.}
\newcommand\labelenumiv{\theenumiv.}
\renewcommand\p@enumii{\theenumi}
\renewcommand\p@enumiii{\theenumi(\theenumii)}
\renewcommand\p@enumiv{\p@enumiii\theenumiii}
\else
\renewcommand\theenumi{\arabic{enumi}}
\renewcommand\theenumii{\arabic{enumii}}
\renewcommand\theenumiii{\arabic{enumiii}}
\renewcommand\theenumiv{\arabic{enumiv}}
\newcommand\labelenumi{\theenumi.}
\newcommand\labelenumii{\theenumi.\theenumii.}
\newcommand\labelenumiii{\theenumi.\theenumii.\theenumiii.}
\newcommand\labelenumiv{\theenumi.\theenumii.\theenumiii.\theenumiv.}
\renewcommand\p@enumii{\theenumi}
\renewcommand\p@enumiii{\theenumi(\theenumii)}
\renewcommand\p@enumiv{\p@enumiii\theenumiii}
\fi
\if@itemization
\newcommand\labelitemi{$\m@th\bullet$}
\newcommand\labelitemii{\normalfont\bfseries --}
\newcommand\labelitemiii{$\m@th\ast$}
\newcommand\labelitemiv{$\m@th\cdot$}
\else
\newcommand\labelitemi{\bfseries --}
\newcommand\labelitemii{\bfseries --}
\newcommand\labelitemiii{\bfseries --}
\newcommand\labelitemiv{\bfseries --}
\fi
\newenvironment{description}
{\list{}{\labelwidth\z@ \itemindent-\leftmargin
\let\makelabel\descriptionlabel}}
{\endlist}
\newcommand\descriptionlabel[1]{\hspace\labelsep
\item@font #1}
\newenvironment{verse}
{\let\\=\@centercr
\list{}{\itemsep \z@
\itemindent -1.5em%
\listparindent\itemindent
\rightmargin \leftmargin
\advance\leftmargin 1.5em}%
\item[]}
{\endlist}
\newenvironment{quotation}
{\list{}{\listparindent 1.5em%
\itemindent \listparindent
\rightmargin \leftmargin
\parsep \z@ \@plus\p@}%
\item[]}
{\endlist}
\newenvironment{quote}
{\list{}{\rightmargin\leftmargin}%
\item[]}
{\endlist}
\def\@begintheorem#1#2{\reset@font\thb@font\trivlist
\item[\hskip \labelsep{\reset@font\thh@font #1\ #2:}]}
\def\@opargbegintheorem#1#2#3{\reset@font\thb@font\trivlist
\item[\hskip \labelsep{\reset@font\thh@font #1\ #2\ (#3):}]}
\def\@endtheorem{\endtrivlist}
\newlength{\exampleindent} \setlength{\exampleindent}{\parindent}
\newenvironment{example}%
{\begin{list}{}{%
\setlength{\leftmargin}{\exampleindent}}
\ex@font \item[]}
{\end{list}}
\newenvironment{describe}[1][\quad]%
{\begin{list}{}{%
\renewcommand{\makelabel}[1]{{\item@font ##1}\hfil}%
\settowidth{\labelwidth}{{\item@font #1}}%
\setlength{\leftmargin}{\labelwidth}%
\addtolength{\leftmargin}{\labelsep}}}%
{\end{list}}
\newenvironment{titlepage}
{%
\cleardoublepage
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse\newpage
\fi
\thispagestyle{empty}%
\if@compatibility
\setcounter{page}{0}
\fi}%
{\if@restonecol\twocolumn \else \newpage \fi
}
\newcommand\appendix{\par
\setcounter{chapter}{0}%
\setcounter{section}{0}%
\ifx\@chapapp\@empty
\def\@addappendixtocontents{\addcontentsline{toc}{part}{\appendixname}}
\part*{\appendixname\@mkboth{\appendixname}{\appendixname}%%
\@addappendixtocontents}
\else
\renewcommand{\@chapapp}{\appendixname}%
\fi
\renewcommand{\thechapter}{\Alph{chapter}}}
\setlength\arraycolsep{5\p@}
\setlength\tabcolsep{6\p@}
\setlength\arrayrulewidth{.4\p@}
\setlength\doublerulesep{2\p@}
\setlength\tabbingsep{\labelsep}
\skip\@mpfootins = \skip\footins
\setlength\fboxsep{3\p@}
\setlength\fboxrule{.4\p@}
\@addtoreset{equation}{chapter}
\renewcommand{\theequation}{\thechapter.\arabic{equation}}
\def\marginlabel#1{\marginpar%
{\if@twoside
\ifodd\c@page
\raggedright
\else
\raggedleft
\fi
\else
\raggedright
\fi #1}}
\def\attention{\mbox{}%
\marginpar[\raggedleft\large\bf! $\rightarrow$]%
{\raggedright\large\bf $\leftarrow$ !}}
\def\seealso#1{\mbox{}%
\marginpar[\raggedleft$\rightarrow$ \small #1]%
{\raggedright\small #1 $\leftarrow$}\ignorespaces}
\newcounter{figure}[chapter]
\renewcommand{\thefigure}{\thechapter.\@arabic\c@figure}
\def\fps@figure{tbp}
\def\ftype@figure{1}
\def\ext@figure{lof}
\def\fnum@figure{\figureshortname~\thefigure}
\newenvironment{figure}
{\fig@font\@float{figure}}
{\end@float}
\newenvironment{figure*}
{\fig@font\@dblfloat{figure}}
{\end@dblfloat}
\newcounter{table}[chapter]
\renewcommand{\thetable}{\thechapter.\@arabic\c@table}
\def\fps@table{tbp}
\def\ftype@table{2}
\def\ext@table{lot}
\def\fnum@table{\tableshortname~\thetable}
\newenvironment{table}
{\tab@font\@float{table}}
{\end@float}
\newenvironment{table*}
{\tab@font\@dblfloat{table}}
{\end@dblfloat}
\newlength\abovecaptionskip
\newlength\belowcaptionskip
\setlength\abovecaptionskip{10\p@}
\setlength\belowcaptionskip{0\p@}
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\setbox\@tempboxa\hbox{{\cph@font #1:} {\cpb@font #2}}%
\ifdim \wd\@tempboxa >\hsize
\@hangfrom{\cph@font #1: }{\cpb@font #2\par}%
\else
\hbox to\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
\def\rb#1{\raisebox{1.5ex}[-1.5ex]{#1}}
\def\tablerule{\noalign{\ifnum0=`}\fi
\hrule \@height \arrayrulewidth \vskip\doublerulesep
\futurelet \@tempa\@xhline}
\def\thicktablerule{\noalign{\ifnum0=`}\fi
\hrule \@height 2\arrayrulewidth \vskip\doublerulesep
\futurelet \@tempa\@xhline}
\def\doubletablerule{\noalign{\ifnum0=`}\fi
\hrule \@height \arrayrulewidth \vskip2\arrayrulewidth
\hrule \@height \arrayrulewidth \vskip\doublerulesep
\futurelet \@tempa\@xhline}
\def\thickhline{\noalign{\ifnum0=`}\fi
\hrule \@height 2\arrayrulewidth\futurelet \@tempa\@xhline}
\def\doublehline{\noalign{\ifnum0=`}\fi
\hrule \@height \arrayrulewidth\vskip2\arrayrulewidth
\hrule \@height \arrayrulewidth \futurelet \@tempa\@xhline}
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
\DeclareRobustCommand*{\cal}{\@fontswitch{\relax}{\mathcal}}
\DeclareRobustCommand*{\mit}{\@fontswitch{\relax}{\mathnormal}}
\newcommand{\@pnumwidth}{1.55em}
\newcommand{\@tocrmarg} {2.55em}
\newcommand{\@dotsep}{4.5}
\setcounter{tocdepth}{2}
\newcommand{\tableofcontents}{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\addcontentsline{toc}{chapter}{\contentsname}
\chapter*{\contentsname
\@mkboth{\contentsname}%
{\contentsname}}%
\@starttoc{toc}%
\if@restonecol\twocolumn\fi
}
\newcommand*{\l@part}[2]{%
\ifnum \c@tocdepth >-2\relax
\addpenalty{-\@highpenalty}%
\addvspace{2.25em \@plus\p@}%
\begingroup
\setlength\@tempdima{3em}%
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
{\leavevmode
{\sss@font #1}\hfil \hbox to\@pnumwidth{\hss #2}}\par
\nobreak
\global\@nobreaktrue
\everypar{\global\@nobreakfalse\everypar{}}
\endgroup
\fi}
\newcommand*{\l@chapter}[2]{%
\ifnum \c@tocdepth >\m@ne
\addpenalty{-\@highpenalty}%
\vskip 1.0em \@plus\p@
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode
\advance\leftskip\@tempdima
\hskip -\leftskip
{\sss@font #1}%
\nobreak\leaders\hbox{%
$\m@th \mkern \@dotsep mu.\mkern \@dotsep mu$}
\hfill\nobreak\hbox to\@pnumwidth{\hfil\textrm{#2}}\par
\penalty\@highpenalty
\endgroup
\fi}
\newcommand*{\l@section} {\@dottedtocline{1}{1.5em}{2.3em}}
\newcommand*{\l@subsection} {\@dottedtocline{2}{3.8em}{3.2em}}
\newcommand*{\l@subsubsection}{\@dottedtocline{3}{7.0em}{4.1em}}
\newcommand*{\l@paragraph} {\@dottedtocline{4}{10em}{5em}}
\newcommand*{\l@subparagraph} {\@dottedtocline{5}{12em}{6em}}
\newcommand{\listoffigures}{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\addcontentsline{toc}{chapter}{\listfigurename}
\chapter*{\listfigurename
\@mkboth{\listfigurename}%
{\listfigurename}}%
\@starttoc{lof}%
\if@restonecol\twocolumn\fi
}
\newcommand*{\l@figure}{\@dottedtocline{1}{1.5em}{2.3em}}
\newcommand{\listoftables}{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\addcontentsline{toc}{chapter}{\listtablename}
\chapter*{\listtablename
\@mkboth{\listtablename}%
{\listtablename}}%
\@starttoc{lot}%
\if@restonecol\twocolumn\fi
}
\let\l@table\l@figure
\newdimen\bibindent
\bibindent=1.5em
\newenvironment{thebibliography}[1]
{\if@chapterbib
\addcontentsline{toc}{section}{\refname}%
\section*{\refname\@mkboth{\refname}{\refname}}%
\else
\addtocontents{toc}{\protect\addvspace{1em}}%
\addcontentsline{toc}{chapter}{\bibname}%
\addtocontents{toc}{\protect\addvspace{1em}}%
\chapter*{\bibname\@mkboth{\bibname}{\bibname}}%
\fi
\list{\@biblabel{\arabic{enumiv}}}%
{\settowidth\labelwidth{\@biblabel{#1}}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\if@openbib
\advance\leftmargin\bibindent
\itemindent -\bibindent
\listparindent \itemindent
\parsep \z@
\fi
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{\arabic{enumiv}}}%
\if@openbib
\renewcommand\newblock{\par}
\else
\renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
\fi
\sloppy\clubpenalty4000\widowpenalty4000%
\sfcode`\.=\@m}
{\def\@noitemerr
{\@latex@warning{Empty `thebibliography' environment}}%
\endlist}
\newcommand\newblock{}
\if@chapterbib
\def\@mainbblfile{\jobname.bbl}
\let\@bblfile=\@mainbblfile
\def\bibliography#1{%
\if@filesw\immediate\write\@auxout{\string\bibdata{#1}}\fi
\@input{\@bblfile}}
\def\@include#1 {\clearpage
\if@filesw \immediate\write\@mainaux{\string\@input{#1.aux}}\fi
\@tempswatrue
\if@partsw \@tempswafalse\edef\@tempb{#1}
\@for\@tempa:=\@partlist\do{\ifx\@tempa\@tempb\@tempswatrue\fi}
\fi
\if@tempswa
\if@filesw \let\@auxout=\@partaux
\immediate\openout\@partaux #1.aux
\immediate\write\@partaux{\relax}
\fi
\def\@bblfile{#1.bbl}\@input{#1.tex}
\let\@bblfile\@mainbblfile\clearpage
\@writeckpt{#1}
\if@filesw
\immediate\closeout\@partaux
\fi
\let\@auxout=\@mainaux\else\@nameuse{cp@#1}
\fi}
\fi
\newenvironment{theindex}
{\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
\columnseprule \z@
\columnsep 35\p@
\twocolumn[\@makeschapterhead{\indexname}]%
\@mkboth{\indexname}%
{\indexname}%
\thispagestyle{plain}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\let\item\@idxitem\index@size}
{\if@restonecol\onecolumn\else\clearpage\fi}
\newcommand{\@idxitem} {\par\hangindent 40\p@}
\newcommand{\subitem} {\par\hangindent 40\p@ \hspace*{20\p@}}
\newcommand{\subsubitem}{\par\hangindent 40\p@ \hspace*{30\p@}}
\newcommand{\indexspace}{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax}
\renewcommand\footnoterule{%
\kern-3\p@
\hrule width .4\columnwidth
\kern 2.6\p@}
\@addtoreset{footnote}{chapter}
\if@noind
\long\def\@makefntext#1{%
\leftskip 2.0em%
\noindent
\hbox to 0em{\hss\@makefnmark\kern 0.25em}#1}
\else
\long\def\@makefntext#1{%
\parindent 1em%
\noindent
\hbox to 1.8em{\hss\@makefnmark\kern 0.25em}#1}
\fi
\def\contentsname{Contents}
\def\listfigurename{List of Figures}
\def\listtablename{List of Tables}
\def\bibname{Bibliography}
\def\refname{References}
\def\indexname{Index}
\def\figurename{Figure}
\def\tablename{Table}
\def\chaptername{Chapter}
\def\appendixname{Appendix}
\def\partname{Part}
\def\abstractname{Abstract}
\def\draftname{preliminary draft}
\def\figureshortname{Fig.} % <-- thesis
\def\tableshortname{Tab.} % <-- thesis
\def\prefacename{Preface} % <-- thesis
\newcommand{\today}{\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\day, \number\year}
\setlength\columnsep{10\p@}
\setlength\columnseprule{0\p@}
\iffinal
\pagestyle{headings}
\else
\pagestyle{draft}
\fi
\pagenumbering{arabic}
\if@twoside
\else
\raggedbottom
\fi
\if@twocolumn
\twocolumn
\sloppy
\flushbottom
\else
\onecolumn
\fi
%% Customization for SoftLab -- nickie
\usepackage{a4}
\usepackage{graphicx}
%%% Layout
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Page setup
% Formulae for calculating the layout parameters:
% odd side margin = IM - 1 in
% even side margin = OM - 1 in
% top margin = TM - 1 in
% Paper width
% --------------------------------
\oddsidemargin -0.4 mm % Margins: inside = 25 mm (IM)
\evensidemargin -0.4 mm % outside = 25 mm (OM)
\textwidth 160.0 mm % text body = 160 mm (TB)
% --------------------------------
% total = 210 mm
%
% Paper height
% --------------------------------
\topmargin 4.6 mm % Margins: top = 30 mm (TM)
\textheight 242.0 mm % bottom = 25 mm (BM)
% text body = 242 mm (TH)
% ------------------------------
% total = 297 mm
\advance \topmargin by -\headheight
\advance \topmargin by -\headsep
% Let us allow bigger floats
\renewcommand{\topfraction}{0.8}
\renewcommand{\bottomfraction}{0.8}
\renewcommand{\floatpagefraction}{0.8}
% Other parameters
\setlength{\parskip}{6pt}
%%% For the thesis class
\def\contentsname{} % Declare all greek titles again
\def\listfigurename{} % (thesis class has changed them)
\def\listtablename{}
\def\bibname{}
\def\figurename{}
\def\tablename{}
\def\chaptername{}
\def\appendixname{}
\def\partname{}
\def\abstractname{}
\chapapp{\chaptername} % Print ``Chapter''
\def\figureshortname{\figurename} % I don't like short names
\def\tableshortname{\tablename}
\newenvironment{keywords}{\section*{ }}{}
\newcommand{\footacknowledgement}[1]{%
\let\@tmp@makefntext\@makefntext%
\long\def\@makefntext##1{%
\parindent 1em%
\noindent##1}%
\footnotetext{#1}%
\let\@makefntext\@tmp@makefntext%
}
\def\maketitle{%
\begin{titlepage}
\let\footnotesize\small
\let\footnoterule\relax
\def\thefootnote{\fnsymbol{footnote}}
\new@tpage
%
\begin{minipage}{2.5cm}
\includegraphics[width=2.5cm]{pyrforos}%
\end{minipage}
\hspace{0.5cm}
\begin{minipage}{12cm}
\renewcommand\baselinestretch{1.2}\normalsize%
\in@font\@institution
\end{minipage}
%
\vfill
%
\begin{center}
{\t@font\@title}
\end{center}
\ifx\@subtitle\@empty\else
\vspace{1cm}
\begin{center}
{\st@font\@subtitle}
\end{center}
\fi
%
\vspace{1cm}
%
\begin{center}
{\a@font\@author}
\end{center}
%
\vfill
%
\begin{minipage}{4.5cm}
\includegraphics{softlab-logo}%
\end{minipage}
\hspace{1cm}
\begin{minipage}{9.5cm}
\renewcommand\baselinestretch{1.2}\normalsize%
\tr@font\@translator \\[0.5em]
\st@font%
\begin{tabular}{@{}ll@{}}
\multicolumn{2}{@{}l@{}}{\underline{ :}} \\[0.25em]
: & , \\
: & , \\
& ,
\end{tabular}
\end{minipage}
\vspace{2cm}
\begin{center}
\st@font \@date
\end{center}
%
\new@tpage
\noindent\begin{minipage}[t]{\textwidth}
\@uppertitleback
\end{minipage}\par
\vfill
\noindent\begin{minipage}[t]{\textwidth}
\@middletitleback
\end{minipage}\par
\vfill
\noindent\begin{minipage}[b]{\textwidth}
\@lowertitleback
\end{minipage}
\ifx\@dedication\@empty\else \new@tpage
{\centering \Large \@dedication \par}
\if@twoside \new@tpage \fi
\fi
\end{titlepage}
\def\thefootnote{\arabic{footnote}}
\setcounter{footnote}{0}
\if@thema\else\let\thanks\relax\fi
\gdef\@thanks{}\gdef\@author{}\gdef\@translator{}\gdef\@institution{}
\gdef\@uppertitleback{}\gdef\@lowertitleback{}\gdef\@dedication{}%
\gdef\@title{}\gdef\@subtitle{}\let\maketitle\relax%
}
\def\t@font{\Huge\bfseries}
\def\st@font{\large}
\def\a@font{\LARGE}
\def\tr@font{\Large}
\def\in@font{\large\slshape}
%\def\t@font{\LARGE\bfseries}
%\def\st@font{\large}
%\def\a@font{\Large}
%\def\tr@font{\large}
%\def\in@font{\large\slshape}
% Empty pages should be really empty (not have headings)
\def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
\thispagestyle{empty}\hbox{}\newpage%
\if@twocolumn\thispagestyle{empty}\hbox{}\newpage\fi\fi\fi}
% This saves the underfull boxes resulting from equations that
% are typeset in just one page
\raggedbottom
% This typesets footnotes always at the very bottom of the page
\renewcommand\footnoterule{\vfill\kern-3\p@%
\hrule width .4\columnwidth\kern 2.6\p@}
% This is a patch for the thesis package
% The first page of the index should be empty too
% [If the index package is used, it must be before it.]
% The macros \nindexbefore and \nindexafter are used for
% putting text before and after the index, on the same page.
\newcommand{\nindexbefore}{}
\newcommand{\nindexafter}{}
\renewenvironment{theindex}{%
\if@twocolumn\@restonecolfalse\else\@restonecoltrue\fi%
\columnseprule \z@%
\columnsep 35\p@%
\twocolumn[\@makeschapterhead{\indexname}]%
\nindexbefore%
\@mkboth{\indexname}{\indexname}%
\thispagestyle{empty}\parindent\z@%
\parskip\z@ \@plus .3\p@\relax%
\let\item\@idxitem\index@size%
}{%
\nindexafter%
\if@restonecol\onecolumn\else\clearpage\fi%
}
\translator{%
}
\institution{%
\\
\\
\\
}
\uppertitleback{%
\begin{minipage}{2cm}
\includegraphics[width=2cm]{pyrforos}%
\end{minipage}
\hspace{0.5cm}
\begin{minipage}{12cm}
\@institution
\end{minipage}
}
\middletitleback{%
Copyright \copyright\ \ \@author, 2002.\\ % !!!
.\\[12pt]
,
, , .
,
, ,
.
.
}
\lowertitleback{%
. .
. \\[24pt]
%
\@author,
\emph{\@title},
\@translator,
\@institution,
\@date. \\[6pt]
\begin{tabular}{@{}ll@{}}
URL: & \texttt{http://www.softlab.ntua.gr/~{}vkoutav/} \\ % !!!
Pages: & \pageref{pg:last-front} + \pageref{pg:last-document}
\end{tabular} \\[12pt]
:
CSD-SW-TR-2-02,
,
,
,
\@date. \\[6pt]
\begin{tabular}{@{}ll@{}}
URL: & \texttt{http://www.softlab.ntua.gr/techrep/} \\
FTP: & \texttt{ftp://ftp.softlab.ntua.gr/pub/techrep/}
\end{tabular}
}
\newenvironment{acknowledgements}{%
\addcontentsline{toc}{chapter}{}%
\chapter*{}%
}{}
\let\nickie@oldenddocument\enddocument
\def\enddocument{\label{pg:last-document}\nickie@oldenddocument}
\endinput
%%
%% End of file `thesis.cls'.
This source diff could not be displayed because it is too large. You can view the blob instead.
\documentclass{softlab-thesis}
%%%
%%% The document
%%%
\begin{document}
%%% Title page
\frontmatter
\title{%
Μεταγλωττιστής Calvin σε NFlint
}
\author{%
Βασίλειος Μ.\ Κουταβάς
}
\date{%
Οκτώβριος 2002
}
\maketitle
%%% Abstract
\begin{abstract}%
\noindent%
Η γλώσσα C καθώς και οι απόγονοί της αποτελούν ένα ισχυρό και
αδιαμφισβήτητο κατεστημένο στη σύγχρονη βιομηχανία λογισμικού.
Πρόκειται για μια πολύ δημοφιλή γλώσσα προγραμματισμού γενικού σκοπού,
που χαρακτηρίζεται από οικονομία στην έκφραση, ένα μεγάλο σύνολο από
τελεστές και τύπους δεδομένων και από την υψηλή μεταφερσιμότητα του
πηγαίου κώδικα. Το τρέχον επίσημο κείμενο αναφοράς για τη γλώσσα C
είναι το διεθνές πρότυπο ISO/IEC 9899:1990. Στο κείμενο αυτό, η
σημασιολογία της C ορίζεται με άτυπο τρόπο χρησιμοποιώντας φυσική
γλώσσα, κάτι που συχνά οδηγεί σε παρερμηνείες.
Σε αυτή τη διατριβή προτείνεται μια τυπική δηλωτική σημασιολογία για τη
γλώσσα προγραμματισμού ANSI~C, με έμφαση στην ακρίβεια και την
πληρότητα ως προς το πρότυπο. Διαφαίνεται ότι μια γλώσσα
προγραμματισμού τόσο χρήσιμη στην πράξη και τόσο εγγενώς πολύπλοκη όσο
η C είναι δυνατό να ορισθεί με τυπικό τρόπο. Η προτεινόμενη
σημασιολογία είναι δυνατό να χρησιμοποιηθεί ως ένα ακριβές, αφηρημένο
και ανεξάρτητο υλοποίησης πρότυπο για τη C. Επιπλέον, μπορεί να
αποτελέσει τη βάση για τη διατύπωση τυπικών συλλογισμών σχετικά με τη
συμπεριφορά των προγραμμάτων σε C, καθώς και ένα πολύτιμο θεωρητικό
εργαλείο στη διαδικασία ανάπτυξης λογισμικού.
Προκειμένου να βελτιωθεί η δόμηση και η κομψότητα της προτεινόμενης
σημασιολογίας, γίνεται χρήση των μονάδων και των μετασχηματιστών
μονάδων για την απεικόνιση διαφορετικών πλευρών της σημασιολογίας των
υπολογισμών. Ενδιαφέροντα ερευνητικά αποτελέσματα έχουν επιτευχθεί στην
προσπάθεια για την ακριβή μοντελοποίηση πολύπλοκων χαρακτηριστικών της
C, όπως η απροσδιόριστη σειρά αποτίμησης των εκφράσεων και τα σημεία
διαδοχής, με τη χρήση μονάδων. Τα αποτελέσματα αυτά είναι χρήσιμα στην
περιγραφή της σημασιολογίας γλωσσών προγραμματισμού που υποστηρίζουν μη
ντετερμινιστικά χαρακτηριστικά και παραλληλισμό.
Μια υλοποίηση ενός αφηρημένου διερμηνέα για προγράμματα C, βασισμένου
στην προτεινόμενη σημασιολογία, έχει επίσης αναπτυχθεί χρησιμοποιώντας
τη Haskell ως γλώσσα υλοποίησης. Η υλοποίηση αυτή χρησιμοποιείται για
την αξιολόγηση της ορθότητας και της πληρότητας της προτεινόμενης
σημασιολογίας. Παρότι η εργασία αυτή βρίσκεται ακόμα σε εξέλιξη, τα ως
τώρα αποτελέσματα είναι ιδιαίτερα ικανοποιητικά.
\begin{keywords}
Γλώσσα προγραμματισμού ANSI~C, πρότυπο ISO/IEC 9899:1990, τυπική
περιγραφή, δηλωτική σημασιολογία, μονάδες, μετασχηματιστές μονάδων.
\end{keywords}
\end{abstract}
%%% Acknowledgements
\begin{acknowledgements}
Θέλω κατ'~αρχήν να ευχαριστήσω τον επιβλέποντα καθηγητή αυτής της
διατριβής, κ.~Μανόλη Σκορδαλάκη, για τη συνεχή καθοδήγηση και
εμπιστοσύνη του. Καθ'~όλη τη διάρκεια των δέκα ετών της συνεργασίας
μας, ήταν πάντοτε διαθέσιμος όποτε τον χρειαζόμουν, εξυπηρετικός και
φιλικός. Ευχαριστώ επίσης τα μέλη της εξεταστικής επιτροπής,
κ.κ.~Γιώργο Παπακωνσταντίνου, Ανδρέα Σταφυλοπάτη, Στάθη Ζάχο, Παναγιώτη
Τσανάκα, Τίμο Σελλή και Πάνο Ροντογιάννη, για την πρόθυμη και πάντα
αποτελεσματική βοήθειά τους, τις πολύτιμες συμβουλές και τις χρήσιμες
συζητήσεις που είχαμε.
Οι σπουδές μου στο Πανεπιστήμιο Cornell επηρέασαν κατά πολύ τον τρόπο
σκέψης μου αλλά και την κατεύθυνση της έρευνάς μου. Θα ήθελα να
ευχαριστήσω τον επιβλέποντά μου εκεί, κ.~David Gries, καθώς και τα άλλα
μέλη του τμήματος Επιστήμης Υπολογιστών οι οποίοι με δίδαξαν το
συνδυασμό της θεωρίας με την πράξη, με κατεύθυναν προς την τυπική
μελέτη των γλωσσών προγραμματισμού και μου παρείχαν πρόσβαση σε άφθονη
βιβλιογραφία. Μου πήρε κάποιο χρόνο μέχρι να εκτιμήσω όλα αυτά στο
δέοντα βαθμό και αισθάνομαι ότι δεν είχα ακόμα την ευκαιρία να τους
ευχαριστήσω.
Τα μέλη του Εργαστηρίου Τεχνολογίας Λογισμικού ήταν πάντα καλοί φίλοι.
Ιδιαίτερα, θα ήθελα να ευχαριστήσω τους Βασίλη Βεσκούκη, Σίμο Ρετάλη,
Τάσο Κουτουμάνο, Κλειώ Σγουροπούλου και Κώστα Ταβερναράκη για την
εξαιρετική υποστήριξή τους, τις πολλές και όμορφες ώρες συζήτησης που
μοιραστήκαμε. Επίσης, ευχαριστώ τους πολυάριθμους διαχειριστές του
εργαστηρίου για την τεχνική υποστήριξη που ποτέ δε μου αρνήθηκαν όλα
αυτά τα χρόνια.
Πολλές ευχαριστίες οφείλω στο φίλο μου και συνάδελφο Dragan
Ma\'{c}o\v{s} που με εισήγαγε στις μονάδες και έκανε χρήσιμες
παρατηρήσεις σχετικά με αυτή τη διατριβή. Επίσης, ευχαριστώ τους Τάσο
Βίγλα, Βασίλη Παπαδήμο για τη βοήθειά τους στις πρώτες φάσεις
αποσφαλμάτωσης της σημασιολογίας, όπως και τους Άλκη Πολυζώτη, Γιάννη
Σισμάνη, Μάνο Ρενιέρη και Κατερίνα Ποτίκα, για τις προτάσεις τους όσον
αφορά στην υλοποίηση της σημασιολογίας.
Θα ήθελα ακόμα να ευχαριστήσω τους φίλους μου που πάντα μου προσέφεραν
αγάπη, ενθάρρυνση και υποστήριξη. Χάρη σε αυτούς, οι σπουδές μου ήταν
πολύ πιο ευχάριστες. Τέλος, ευχαριστώ από βάθους καρδιάς την οικογένειά
μου και τη σύντροφό μου Κατερίνα για την αστείρευτη υπομονή, αγάπη και
εμπιστοσύνη, και γιατί μου επέτρεψαν να απέχω κατά καιρούς από
δραστηριότητες που δε συμβάδιζαν με τις σπουδές μου.
\begin{flushright}
Νικόλαος Σ.\ Παπασπύρου,\\[6pt]
Αθήνα, 27 Φεβρουαρίου 1998.
\end{flushright}
\footacknowledgement{%
Αυτή η διατριβή τυπώθηκε με το σύστημα προετοιμασίας εγγράφων \LaTeXe,
χρησιμοποιώντας την κλάση \texttt{thesis} του Wenzel Matiaske. Τα πακέτα
\texttt{diagrams} και \texttt{QED} του Paul Taylor, για τη δημιουργία
μεταβατικών διαγραμμάτων και αποδείξεων, ήταν ιδιαίτερα χρήσιμα, όπως
επίσης και το πακέτο \texttt{semantic} του Peter M{\o}ller Neergaard, για
τη δημιουργία κανόνων συνεπαγωγής.
}
\end{acknowledgements}
%%% Various tables
\tableofcontents
\listoftables
\listoffigures
%%% Main part of the book
\mainmatter
\chapter{Εισαγωγή%
\label{ch:intro}}
Το κεφάλαιο αυτό είναι μια εισαγωγή στην παρούσα διατριβή. Στην
ενότητα~\ref{sec:intro:c} επιχειρείται μια σύντομη παρουσίαση της
γλώσσας προγραμματισμού C, με έμφαση στην ιστορία και τα χαρακτηριστικά
της. Η ενότητα~\ref{sec:intro:semantics} περιέχει μια περιγραφική
εισαγωγή στη σημασιολογία των γλωσσών προγραμματισμού, προκατειλημμένη
προς την κατεύθυνση της δηλωτικής σημασιολογίας. Η
ενότητα~\ref{sec:intro:overview} είναι μια επισκόπηση αυτής της
διατριβής. Κατ'~αρχήν συζητείται το αντικείμενο, τα κίνητρα και οι
δυνατές εφαρμογές και εν συνεχεία παρουσιάζεται μια επισκόπηση της
μεθοδολογίας που χρησιμοποιείται και μια περίληψη της συνεισφοράς αυτής
της διατριβής. Στην ενότητα~\ref{sec:intro:related} περιέχεται μια
επισκόπηση της συναφούς έρευνας και το κεφάλαιο ολοκληρώνεται με τη
δομή της διατριβής, στην ενότητα~\ref{sec:intro:structure}.
\section{Η γλώσσα προγραμματισμού C%
\label{sec:intro:c}}
Η C είναι μια ευρύτατα γνωστή και πολύ δημοφιλής γλώσσα προγραμματισμού
γενικού σκοπού. Αναπτύχθηκε κατά τη διάρκεια της περιόδου 1969-1973 στα
εργαστήρια AT\&T Bell Labs ως μια γλώσσα υλοποίησης για το λειτουργικό
σύστημα Unix. Πατέρας της C είναι ο Dennis Ritchie, ο οποίος επίσης
ανέπτυξε τον πρώτο μεταγλωττιστή στην περίοδο 1971-1973. Ένας
λεπτομερής απολογισμός της εξέλιξης της γλώσσας C, γραμμένος από τον
ίδιο τον Dennis Ritchie, βρίσκεται στο \cite{ritchie-1993-dcl}.
Ο άμεσος πρόγονος της C είναι μια γλώσσα που ονομάζεται
B \cite{johnson-1973-plb}, η οποία σχεδιάσθηκε από τον Ken Thompson την
περίοδο 1969-1970 ως μια γλώσσα υλοποίησης για τον υπολογιστή DEC
PDP-7. Η B μπορεί να θεωρηθεί ένα υποσύνολο της
BCPL \cite{richards-1979-blc}, μια γλώσσα που σχεδιάσθηκε από τον
Martin Richards στα μέσα της δεκαετίας του 1960 κυρίως ως ένα εργαλείο
για την ανάπτυξη μεταγλωττιστών. Η κύρια διαφορά ανάμεσα στη C και τους
προγόνους της είναι η παρουσία ενός μη τετριμμένου συστήματος τύπων. Οι
BCPL και B δε διαθέτουν άλλους τύπους πλήν του ``word'', ο οποίος
αναπαριστά συγχρόνως δεδομένα και ``δείκτες'' σε δεδομένα. Η εισαγωγή
νέων τύπων στη C ήταν απαραίτητη προκειμένου να παρέχεται γλωσσική
υποστήριξη των χαρακτήρων και των αριθμών κινητής υποδιαστολής που
είχαν ήδη κάνει την εμφάνισή τους στις αρχές της δεκαετίας του 1970. Το
1973, ο πυρήνας της C όπως την ξέρουμε σήμερα είχε συμπληρωθεί και ένας
μεταγλωττιστής για τον DEC PDP-11 είχε ήδη αναπτυχθεί από τον Dennis
Ritchie. Η γλώσσα υποστήριζε ακεραίους και χαρακτήρες ως βασικούς
τύπους, πλήρεις τύπους πινάκων και δεικτών, ειδικούς λογικούς τελεστές
και έναν ισχυρό προεπεξεργαστή.
Στα χρόνια που ακολούθησαν, αρκετές αλλαγές εισήχθησαν στη γλώσσα C
λόγω των αυξημένων απαιτήσεων για μεταφερσιμότητα και ασφάλεια. Αρκετοί
νέοι τύποι προστέθησαν στο σύστημα τύπων, καθώς και μετατροπές μεταξύ
τύπων. Η πρώτη ευρέως διαθέσιμη περιγραφή της γλώσσας, το βιβλίο ``The
C Programming Language'' επίσης γνωστό ως ``K\&R'', εμφανίσθηκε το
1978 \cite{kernighan-1978-cpl}.\footnote{Η δεύτερη έκδοση αυτού του
βιβλίου, που περιέχει μεταγενέστερες αλλαγές, εκδόθηκε δέκα χρόνια
αργότερα \cite{kernighan-1988-cpl}. Το βιβλίο ``K\&R'' χρησίμευσε ως
κείμενο αναφοράς για τη γλώσσα ως το 1989, όταν υιοθετήθηκε ένα επίσημο
πρότυπο.} Μέχρι τότε, ο πυρήνας του λειτουργικού συστήματος Unix είχε
γραφεί σε C και τόσο η ίδια η γλώσσα όσο και οι μεταγλωττιστές είχαν
κερδίσει σημαντικά σε εμπιστοσύνη. Κατά τη διάρκεια της δεκαετίας του
1980, η χρήση της γλώσσας C γνώρισε μεγάλη διάδοση και άρχισαν να
διατίθενται μεταγλωττιστές σχεδόν για κάθε τύπο υπολογιστή και
λειτουργικό σύστημα.
Η C, καθώς και οι δυο πρόγονοί της B και BCPL, ανήκει στην οικογένεια
των γλωσσών που εκφράζουν το παραδοσιακό διαδικασιακό μοντέλο
προγραμματισμού, χαρακτηριστικό παράδειγμα του οποίου είναι οι γλώσσες
Fortran και Algol~60. Είναι ιδιαίτερα προσανατολισμένη προς τον
προγραμματισμό συστημάτων και η μικρή και συνοπτική περιγραφή της
επιτρέπει την εύκολη ανάπτυξη απλών μεταγλωττιστών. Η C χαρακτηρίζεται
κυρίως από οικονομία έκφρασης, που υλοποιείται μέσω της λακωνικής
σύνταξης και του μεγάλου πλήθους τελεστών και τύπων δεδομένων, καθώς
επίσης και από το γεγονός ότι επιτρέπει πρόσβαση στα ενδότερα του
υπολογιστή.
Η C θεωρείται γλώσσα προγραμματισμού μεσαίου επιπέδου. Από τη μια
πλευρά πλησιάζει στη γλώσσα μηχανής. Οι αφαιρέσεις που εισάγει
βασίζονται σε συμπαγείς τύπους δεδομένων και σε λειτουργίες που
υποστηρίζονται άμεσα από όλους σχεδόν τους συμβατικούς υπολογιστές και,
για αυτό το λόγο, τα προγράμματα σε C είναι συνήθως ιδιαίτερα
αποδοτικά. Από την άλλη πλευρά, οι αφαιρέσεις αυτές είναι αρκετά υψηλού
επιπέδου ώστε να διευκολύνουν τον προγραμματισμό και να θέτουν τα
θεμέλια για τη μεταφερσιμότητα προγραμμάτων μεταξύ υπολογιστών. Η
μεταφερσιμότητα ενισχύεται επιπλέον από το γεγονός ότι τα προγράμματα C
βασίζονται σε συναρτήσεις βιβλιοθήκης για λειτουργίες εισόδου-εξόδου
και για την επικοινωνία τους με το λειτουργικό σύστημα.
Σύμφωνα με τον Dennis Ritchie, τα στοιχεία που χαρακτηρίζουν
περισσότερο τη C και τη διαφοροποιούν από τους προγόνους της και άλλες
σύγχρονές της γλώσσες είναι δυο: η στενή σχέση μεταξύ πινάκων και
δεικτών και η σύνταξη των δηλώσεων, που μιμείται αυτή των εκφράσεων.
Όμως, αυτά είναι επίσης ανάμεσα στα πλέον αμφιλεγόμενατα χαρακτηριστικά
της γλώσσας, καθώς και πηγές παρερμηνειών, όχι μόνο για τους αρχάριους
αλλά ακόμα και για έμπειρους προγραμματιστές.
Ως το 1982, οι αλλαγές που εισήχθησαν στη γλώσσα C ως αποτέλεσμα
προσαρμογής αυτής στην καθιερωμένη πρακτική ήταν πολλές. Κάθε
μεταγλωττιστής υλοποιούσε μια ελαφρώς διαφορετική έκδοση της C. Η πρώτη
έκδοση του ``K\&R'' δεν περιέγραφε πια τη γλώσσα όπως αυτή
χρησιμοποιείτο στην πράξη ή, ακόμα και όταν το έκανε, δεν ήταν αρκετά
σαφές σε πολλά σημεία. Σε μια προσπάθεια για την προτυποποίηση της C,
το Αμερικανικό Εθνικό Ινστιτούτο Προτύπων (American National Standards
Institute, ANSI) ίδρυσε την επιτροπή X3J11 το καλοκαίρι του 1983.
Σκοπός της ήταν ``να αναπτύξει ένα καθαρό, συνοπτικό και μη διφορούμενο
πρότυπο για τη γλώσσα προγραμματισμού C, που να κωδικοποιεί τον κοινό,
υπάρχοντα ορισμό της γλώσσας και να προάγει τη μεταφερσιμότητα των
προγραμμάτων μεταξύ περιβαλλόντων της γλώσσας C''. Η επιτροπή ήταν πολύ
προσεκτική και συντηρητική σχετικά με επεκτάσεις της γλώσσας. Η βασική
αλλαγή που υιοθετήθηκε ήταν η χρήση πρωτοτύπων συναρτήσεων, που
αποτελούσε ένα σημαντικό βήμα στην κατεύθυνση προς ένα ισχυρότερο
σύστημα τύπων για τη C. Όμως, η επιτροπή αποφάσισε να επιτρέψει τον
παλαιό τρόπο δήλωσης συναρτήσεων, ως ένα είδος συμβιβασμού με το μεγάλο
όγκο υπάρχοντος λογισμικού σε C.
Η διαδικασία αυτή ολοκληρώθηκε στο τέλος του 1989 και είχε ως
αποτέλεσμα το πρότυπο ANS~X3.159-1989 \cite{ansi-1989-ansisplc}, το
οποίο αργότερα υιοθετήθηκε από το Διεθνή Οργανισμό Προτυποποίησης
(International Organization for Standardization) με κωδικό αριθμό
ISO/IEC 9899:1990 \cite{ansi-1990-plc}. Το πρότυπο συμπληρώνεται από
μια σειρά άλλων εγγράφων που έχουν τη θέση
επεξηγήσεων \cite{ansi-1989-ransisplc} ή
διορθώσεων \cite{ansi-1994-plctc1}. Η έκδοση της γλώσσας C που
προδιαγράφεται στο πρότυπο ονομάζεται ISO C, ή συνήθως ANSI C. Από το
1990 έχει ξεκινήσει μια διαδικασία επανεξέτασης του προτύπου, που
αναμένεται να οδηγήσει σε ένα εντελώς αναμορφωμένο πρότυπο, με το
παρωνύμιο ``C9X'', ως το τέλος του 1999.
Από τα πρώτα χρόνια της ανάπτυξής της, η C έχει χρησιμοποιηθεί για τον
προγραμματισμό μιας ευρείας περιοχής εφαρμογών, συμπεριλαμβανομένου και
του μεγαλύτερου μέρους του λειτουργικού συστήματος Unix. Μεταγλωττιστές
για τη C είναι σήμερα διαθέσιμοι σχεδόν για κάθε σύστημα υπολογιστή
και, παρότι η γλώσσα επιτρέπει ακόμα την ανάπτυξη μη μεταφέρσιμων
εφαρμογών, τα προγράμματα σε C είναι γενικά μεταφέρσιμα, ενίοτε με
μικρές μετατροπές. Κατά τη διάρκεια των τελευταίων είκοσι ετών, η C
έχει χρησιμοποιηθεί ως βάση, ή τουλάχιστον έχει σημαντικά επηρεάσει την
ανάπτυξη αρκετών νέων γλωσσών προγραμματισμού. Μεταξύ αυτών, αξίζει να
αναφέρει κανείς τις Concurrent C \cite{gehani-1989-cc}, Objective
C \cite{cox-1991-oopea} και ιδιαίτερα τις
C++ \cite{stroustrup-1991-cpl, ellis-1990-acrm} και
Java \cite{gosling-1996-jls}. Στη σύγχρονη βιομηχανία λογισμικού μπορεί
να ισχυρισθεί κανείς ότι η C και οι απόγονοί της αποτελούν ένα ισχυρό
και αδιαμφισβήτητο κατεστημένο. Το πρότυπο της γλώσσας είναι σήμερα
αποδεκτό ως μια κοινή βάση για τη C και χρησιμοποιείται ως σημείο
αναφοράς από τους κατασκευαστές αλλά και τους χρήστες υλοποιήσεων και
άλλων εργαλείων.
\section{Σημασιολογία γλωσσών προγραμματισμού%
\label{sec:intro:semantics}}
Η μελέτη των γλωσσών προγραμματισμού απαρεγκλίτως διακρίνει δυο βασικά
στοιχεία: τη \emph{σύνταξη} (syntax) και τη \emph{σημασιολογία}
(semantics). Η σύνταξη αναφέρεται στην μορφή και τη δομή των καλώς
σχηματισμένων προτάσεων της γλώσσας, συμπεριλαμβανομένων και των
προγραμμάτων. Η σημασιολογία αναφέρεται στην απόδοση ερμηνείας σε αυτές
τις προτάσεις, την οποία πρέπει να σέβονται οι μεταγλωττιστές και οι
άλλες υλοποιήσεις της γλώσσας. Η διαχωριστική γραμμή μεταξύ σύνταξης
και σημασιολογίας δεν είναι πάντοτε καλά ορισμένη. Η ετυμολογία της
λέξης ``σημασιολογία'' (τόσο στα ελληνικά όσο και στα αγγλικά) οδηγεί
στο ρήμα της αρχαίας ελληνικής γλώσσας ``σημαίνω''. Η αρχική σημασία
της λέξης είναι η μελέτη της σύνδεσης μεταξύ των λέξεων και προτάσεων
μιας γλώσσας και της ερμηνείας τους.
Η σύνταξη των γλωσσών προγραμματισμού ορίζεται συνήθως με τυπικό τρόπο.
Αυτή η ερευνητική περιοχή έχει εκτεταμμένα μελετηθεί και υπάρχει σήμερα
πληθώρα αποδεκτών φορμαλισμών. Ο ευρύτερα γνωστός από αυτούς είναι οι
γραμματικές χωρίς συμφραζόμενα, που συνήθως εκφράζονται με τη μορφή
Backus Naur Form (BNF) και παραλλαγές αυτής. Οι γραμματικές επιτρέπουν,
ή και προτείνουν, μια άμεση σύνδεση μεταξύ της σύνταξης και της
υλοποίησης συντακτικών αναλυτών, και αυτή η ισχυρή σύνδεση είναι
πιθανώς ο κυριότερος λόγος που η περιοχή του τυπικού ορισμού της
σύνταξης έχει αναπτυχθεί τόσο πολύ.
Από την άλλη πλευρά, η σημασιολογία των γλωσσών προγραμματισμού
ορίζεται συνήθως με άτυπο τρόπο. Αυτό οφείλεται κυρίως στην
πολυπλοκότητα του εγχειρήματος, που γίνεται ακόμα μεγαλύτερη αν κανείς
αναλογισθεί ότι η απλότητα της μορφής BNF αποδίδεται μερικά στο γεγονός
ότι τα πολυπλοκότερα τμήματα της περιγραφής της σύνταξης έχουν
``μεταφερθεί στο επίπεδο της σημασιολογίας''. Σε αντίθεση με τη σύνταξη
δεν υπάρχουν καθιερωμένοι, σε αποδοχή και σε χρήση, φορμαλισμοί και
μεθοδολογίες για την περιγραφή της σημασιολογίας.
Καθένας που χρησιμοποιεί μια γλώσσα προγραμματισμού για την ανάπτυξη
λογισμικού πρέπει να έχει αντίληψη της σημασιολογίας της γλώσσας σε
κάποιο επίπεδο αφαίρεσης. Οι προγραμματιστές συνήθως αντιλαμβάνονται τη
σημασιολογία μέσω παραδειγμάτων, διαίσθησης και περιγραφών σε φυσική
γλώσσα. Τέτοιες περιγραφές της σημασιολογίας είναι άτυπες και
βασίζονται συνήθως σε ένα πλήθος υποθέσεων σχετικά με τις γνώσεις και
την ικανότητα αντίληψης των αναγνωστών τους. Οι άτυπες περιγραφές είναι
εγγενώς διφορούμενες, όπως συμβαίνει πάντα στην περίπτωση των φυσικών
γλωσσών. Στη καλύτερη περίπτωση, η διαίσθηση του προγραμματιστή
καλύπτει τα σημεία που λείπουν και οδηγεί στη σωστή κατανόηση της
σημασιολογίας. Στη χειρότερη περίπτωση, η περιγραφή είναι μοιραία
διφορούμενη, ή ακόμα και παραπλανητική, και ο προγραμματιστής είναι
εκτεθειμένος σε παρερμηνείες που συχνά οδηγούν σε προγραμματιστικά
σφάλματα.
Η έρευνα στην περιοχή της τυπικής σημασιολογίας των γλωσσών
προγραμματισμού άρχισε στη δεκαετία του 1960. Με τη ραγδαία αύξηση στην
πολυπλοκότητα των γλωσσών προγραμματισμού υψηλού επιπέδου, οι ερευνητές
άρχισαν να αναζητούν μια τυπική σημασιολογία βασισμένη σε συστήματα
μαθηματικής λογικής με ακριβείς κανόνες, ως ένα τρόπο να ξεπερασθούν τα
διφορούμενα σημεία και να επέλθει πειθαρχία σε αυτό το πεδίο. Έκτοτε,
το προϊόν περισσότερων από τριάντα ετών έρευνας είναι η διατύπωση και
εκτενής μελέτη πολυάριθμων μεθόδων και φορμαλισμών. Μια εξαιρετική
εισαγωγή στο πεδίο αυτό είναι η \cite{winskel-1993-fspl}, ενώ
η \cite{mitchell-1996-fpl} παρέχει μια εκτενέστερη παρουσίαση των
μεθόδων και της μαθηματικής θεμελίωσης.
Για ιστορικούς λόγους, οι τυπικές περιγραφές σημασιολογίας
κατατάσσονται σε τρεις κύριες κατηγορίες:
\begin{itemize}
%
\item \emph{Λειτουργική σημασιολογία} (operational semantics): Οι
ερμηνείες είναι ακολουθίες από υπολογιστικά βήματα που
πραγματοποιούνται κατά την εκτέλεση των προγραμμάτων. Μια
συστηματικότερη παραλλαγή είναι η δομική λειτουργική σημασιολογία
(structural operational semantics). Μια στοιχειώδης εισαγωγή μπορεί να
βρεθεί στο \cite{hennessy-1990-spleiusos}
%
\item \emph{Δηλωτική σημασιολογία} (denotational semantics): Οι
ερμηνείες είναι μαθηματικά αντικείμενα, συνήθως συναρτήσεις από
εισόδους σε εξόδους. Αυτή η κατηγορία σημασιολογίας κατασκευάζει ρητά
μαθηματικά μοντέλα των γλωσσών προγραμματισμού. Θα συζητηθεί
περισσότερο στη συνέχεια, καθώς είναι η προσέγγιση που ακολουθείται
στην παρούσα διατριβή.
%
\item \emph{Αξιωματική σημασιολογία} (axiomatic semantics): Οι
ερμηνείες εκφράζονται με έμμεσο τρόπο, μέσω λογικών προτάσεων που
περιγράφουν ιδιότητες των προγραμμάτων. Η προσέγγιση αυτή είναι χρήσιμη
γιατι αποσκοπεί άμεσα στην υποστήριξη της επαλήθευσης των προγραμμάτων.
Η θεμελιώδης εργασία στην περιοχή της αξιωματικής σημασιολογίας είναι
η \cite{hoare-1969-abcp}, ενώ ένα κλασσικό εισαγωγικό κείμενο είναι
το \cite{de-bakker-1980-mtpc}. Ακολουθώντας αυτή την προσέγγιση, έχει
επίσης προταθεί η ανάπτυξη αποδείξεων ορθότητας παράλληλα με την
ανάπτυξη των προγραμμάτων \cite{dijkstra-1976-dp, gries-1981-sp}.
\end{itemize}
Θα πρέπει να σημειωθεί ότι αυτές οι τρεις κατηγορίες δεν πρέπει να
αντιμετωπίζονται ως αλληλοσυγκρουόμενες. Στην πραγματικότητα είναι
συμπληρωματικές και αλληλοεξαρτώμενες. Κάθε μια έχει τις εφαρμογές της
και εξυπηρετεί καλύτερα μια συγκεκριμένη κατηγορία εφαρμογών. Η
λειτουργική και η δηλωτική σημασιολογία μπορούν να χρησιμοποιηθούν για
τον ορισμό διερμηνέων για μια μελετώμενη γλώσσα, και κατά συνέπεια
βοηθούν στον ορισμό ή την αναμόρφωση μιας γλώσσας. Η αξιωματική
σημασιολογία είναι χρήσιμη για την απόδειξη ιδιοτήτων των προγραμμάτων.
Πιθανώς η κυριότερη εφαρμογή της τυπικής σημασιολογίας είναι η ταχεία
πρωτοτυποποίηση (rapid prototyping), με τη χρήση εργαλείων που
μεταφράζουν προδιαγραφές γλωσσών προγραμματισμού σε σωστούς
μεταγλωττιστές ή διερμηνείς.
Υπάρχουν φορμαλισμοί που έχουν επηρεασθεί και συνδυάζουν στοιχεία
περισσότερων από τις προαναφερθείσες κατηγορίες. Οι μηχανές αφηρημένης
κατάστασης (abstract state machines), γνωστές και ως εξελισσόμενες
άλγεβρες (evolving algebras) είναι ένας τέτοιος φορμαλισμός, που
διατυπώθηκε από τον Gurevich ως μια προσπάθεια γεφύρωσης του χάσματος
ανάμεσα σε τυπικά μοντέλα υπολογισμού και στις πρακτικές μεθόδους
προδιαγραφής \cite{gurevich-1992-eaads, gurevich-1995-ealg}. Η δραστική
σημασιολογία (action semantics), που αναπτύχθηκε από τους Mosses και
Watt, είναι ένα πρακτικό υπόβαθρο για την τυπική περιγραφή γλωσσών που
συνδυάζει χαρακτηριστικά και των τριών παραδοσιακών
προσεγγίσεων \cite{mosses-1992-as}.
Η δηλωτική σημασιολογία, ή η μαθηματική προσέγγιση στη σημασιολογία
γλωσσών προγραμματισμού, είναι ένας φορμαλισμός που διατυπώθηκε από
τους Scott και Strachey στα τέλη της δεκαετίας του 1960. Έκτοτε έχει
ευρέως μελετηθεί από διακεκριμένους ερευνητές και έχει χρησιμοποιηθεί
ως μέθοδος για τη σημασιολογική ανάλυση, την περιγραφή, την αξιολόγηση
αλλά και την υλοποίηση διαφόρων γλωσσών προγραμματισμού. Η θεμελιώδης
εργασία στη δηλωτική σημασιολογία είναι η \cite{scott-1971-tmscl}.
Άλλές εισαγωγικές εργασίες που περιλαμβάνουν χρήσιμη βιβλιογραφία είναι
οι \cite{tennent-1976-dspl} και \cite{mosses-1990-ds}. Εισαγωγικά
βιβλία που παρουσιάζουν σε μεγαλύτερο βάθος την σχετική θεωρία και τις
τεχνικές που έχουν αναπτυχθεί είναι τα \cite{milne-1976-tpls},
\cite{stoy-1977-dsssaplt}, \cite{gordon-1979-ddpl},
\cite{allison-1986-pids} και \cite{schmidt-1986-dsmld}. Ένα βιβλίο
μεταπτυχιακού επιπέδου με μεγαλύτερο μαθηματικό βάθος είναι
το \cite{gunter-1992-splst}. Η παρούσα διατριβή έχει επηρεασθεί σε
μεγάλο βαθμό από το \cite{tennent-1991-spl}, ένα εξαιτερικό βιβλίο που
αποκαλύπτει τη σύνδεση μεταξύ σύνταξης και διαφόρων πλευρών της
σημασιολογίας. Το ίδιο πραγματοποιείται από το
\cite{mitchell-1996-fpl}, που εστιάζεται κυρίως στη μαθηματική
θεμελίωση των διαφόρων προσεγγίσεων. Τέλος, μια επισκόπηση του
ερευνητικού πεδίου δίνεται στο \cite{jung-1996-ddshaop}.
Σύμφωνα με τη δηλωτική προσέγγιση, η σημασιολογία των γλωσσών
προγραμματισμού περιγράφεται με την συσχέτιση μαθηματικών
\emph{ερμηνειών} (denotations) σε προγράμματα και τμήματα προγραμμάτων.
Οι ερμηνείες είναι συνήθως συναρτήσεις υψηλού βαθμού πάνω σε κατάλληλες
μαθηματικές οντότητες, όπως τα \emph{πεδία} (domains), η θεωρία των
οποίων συνοψίζεται στο κεφάλαιο~\ref{ch:mathematics}. Μια από τις βασικές
ιδιότητες της δηλωτικής σημασιολογίας είναι η \emph{συνθετικότητα}
(compositionality), δηλαδή το γεγονός ότι η ερμηνεία μιας πρότασης
μπορεί να υπολογισθεί με την κατάλληλη σύνθεση των ερμηνειών των
τμημάτων της πρότασης, όπως αυτά καθορίζονται από τη συντακτική δομή.
Παρότι οι ερευνητές δεν έχουν συμφωνήσει σε μια κοινά αποδεκτή
μεταγλώσσα για την παράσταση των ερμηνειών και ότι υπάρχει αρκετά
μεγάλη διαφοροποίηση στους συμβολισμούς που χρησιμοποιούνται από
διαφόρους συγγραφείς, φαίνεται ότι οι παραλλαγές του λογισμού-$\lambda$
($\lambda$-calculus) πάνω σε πεδία είναι πολύ δημοφιλείς. Αυτή η
προσέγγιση υιοθετείται στην παρούσα διατριβή.
Ένα από τα σημαντικότερα μειονεκτήματα της κλασσικής δηλωτικής
σημασιολογίας είναι η έλλειψη δόμησης (modularity). Μικρές αλλαγές ή
επεκτάσεις στον ορισμό μιας γλώσσας συνεπάγονται συχνά τεράστιες
αλλαγές στην τυπική της σημασιολογία. Κατά συνέπεια, παρότι η δηλωτική
σημασιολογία είναι ένας κατάλληλος και κομψός φορμαλισμός για γλώσσες
ως μεσαίου μεγέθους, δεν είναι εύκολη η χρήση της στην περίπτωση
πραγματικών γλωσσών προγραμματισμού.\footnote{Στην παρούσα διατριβή, ο
όρος ``πραγματικές γλώσσες προγραμματισμού'' σημαίνει γλώσσες
προγραμματισμού υψηλού επιπέδου που χρησιμοποιούνται ευρέως στην πράξη
για την ανάπτυξη λογισμικού, σε αντιδιαστολή με γλώσσες που
σχεδιάζονται και χρησιμοποιούνται σε ακαδημαϊκά εργαστήρια για
πειραματικούς σκοπούς. Φυσικά αυτό δε σημαίνει ότι οι πρώτες είναι
περισσότερο πραγματικές, ή καλύτερες από τις δεύτερες. Αρκετές φορές
συμβαίνει μάλλον το αντίθετο.} Επιπλέον, δεν είναι εύκολη η
επαναχρησιμοποίηση τμημάτων της περιγραφής δηλωτικής σημασιολογίας μιας
γλώσσας προγραμματισμού για την περιγραφή μιας άλλης γλώσσας. Η μελέτη
μεμονωμένων χαρακτηριστικών των γλωσσών προγραμματισμού είναι
ευκολότερη και κατά συνέπεια επιθυμητή. Όμως, αυτό προϋποθέτει ότι θα
είναι αργότερα δυνατό να ενωθούν τα κομμάτια και να δημιουργηθεί μια
πλήρης δηλωτική περιγραφή για ολόκληρη τη γλώσσα προγραμματισμού. Αυτό
το βήμα σύνθεσης είναι το σημείο αποτυχίας της κλασσικής δηλωτικής
σημασιολογίας.
Η χρήση της \emph{θεωρίας κατηγοριών} (category theory) και των
\emph{μονάδων} (monads) έχει προταθεί ως λύση στο πρόβλημα της έλλειψης
δόμησης και είναι αρκετά δημοφιλής στην κοινότητα των ερευνητών της
δηλωτικής σημασιολογίας. Όπως προτάθηκε από τον Moggi, η διαισθητική
αιτιολόγηση της χρήσης των μονάδων στη δηλωτική σημασιολογία είναι ότι
οι υπολογισμοί με αποτέλεσμα μια τιμή ενός πεδίου $V$ μπορούν να
αναπαρασταθούν ως στοιχεία ενός πεδίου $M(V)$, όπου $M$ είναι μια
κατάλληλη μονάδα \cite{moggi-1989-clcm}. Τα χαρακτηριστικά των γλωσσών
προγραμματισμού μπορούν να μελετηθούν ανεξάρτητα το ένα από το άλλο, με
την επιλογή σχετικά απλών μονάδων για την αναπαράστασή του, και
αργότερα να συνδυασθούν σε μια πλήρη σημασιολογική περιγραφή για τη
γλώσσα. Επίσης, οι μονάδες έχουν πρόσφατα προταθεί ως ένας κομψός
τρόπος για την εισαγωγή προστακτικών χαρακτηριστικών στο συναρτησιακό
μοντέλο προγραμματισμού, και πολλές συναρτησιακές γλώσσες τις
υποστηρίζουν άμεσα.
Στη διατριβή αυτή γίνεται χρήση της τεχνικής των μονάδων και ως
αποτέλεσμα αυτής καταδεικνύεται ότι η σημασιολογία βελτιώνεται
σημαντικά ως προς την δόμηση και την κομψότητα. Μια σύντομη εισαγωγή
στις μονάδες, ο ακριβής συμβολισμός που χρησιμοποιείται σε αυτή τη
διατριβή και αναφορές σε χρήσιμη βιβλιογραφία δίνονται στο
κεφάλαιο~\ref{ch:mathematics}. Για αναλυτικές εισαγωγές στις μονάδες
και τη χρήση τους στη δηλωτική σημασιολογία, ο αναγνώστης παραπέμπεται
στα \cite{moggi-1990-avpl} και \cite{wadler-1992-efp}.
\section{Επισκόπηση της διατριβής%
\label{sec:intro:overview}}
Το κύριο αντικείμενο αυτής της διατριβής είναι η ανάπτυξη και
αξιολόγηση μιας τυπικής περιγραφής της σημασιολογίας της γλώσσας
προγραμματισμού C. Η προτεινόμενη σημασιολογία πρέπει να πληρεί τις
παρακάτω απαιτήσεις:
\begin{itemize}
%
\item \emph{Ορθότητα}: η τυπική περιγραφή πρέπει να αποδίδει όσο το
δυνατόν πιο πιστά την άτυπη σημασιολογία της ANSI~C, όπως αυτή
περιγράφεται στο πρότυπο. Οι περισσότερες τυπικές περιγραφές της
σημασιολογίας πραγματικών γλωσσών προγραμματισμού που έχουν προταθεί
στη βιβλιογραφία είναι ανακριβείς, σε κάποιο βαθμό, είτε λόγω
ηθελημένων απλοποιήσεων είτε κατά λάθος. Λαμβάνοντας υπόψη την
πολυπλοκότητα των γλωσσών αυτών, πρέπει κανείς να παραδεχθεί ότι μια
ανακριβής σημασιολογία είναι εντούτοις χρήσιμη, υπό την προϋπόθεση οι
ανακρίβειες να είναι σαφώς καταγεγραμμένες.
%
\item \emph{Πληρότητα}: η γλώσσα που περιγράφεται πρέπει να είναι όσο
το δυνατό μεγαλύτερο υποσύνολο της ANSI~C. Στην περιγραφή της τυπικής
σημασιολογίας μιας πραγματικής γλώσσας προγραμματισμού, είναι συχνή η
παράλειψη πολύπλοκων χαρακτηριστικών της γλώσσας, που δεν μπορούν να
περιγραφούν με απλό και κομψό τρόπο. Είναι επίσης συχνή η αντιμετώπιση
ορισμένων χαρακτηριστικών ως συντακτικών κατασκευασμάτων που μπορούν να
ορισθούν βάσει άλλων χαρακτηριστικών (syntactic sugar). Η πρώτη τακτική
οδηγεί σε ανακριβείς τυπικές περιγραφές και πρέπει να αποφεύγεται, όσο
αυτό είναι δυνατό. Η δεύτερη τακτική, παρότι δεν επηρεάζει την ορθότητα
της σημασιολογίας, αποφεύγεται επίσης στην παρούσα διατριβή, καθώς
συχνά στερεί τη σημασιολογική περιγραφή από την άμεση σύνδεσή της με τη
σύνταξη της γλώσσας.
%
\item \emph{Απλότητα}: η τυπική περιγραφή πρέπει να διατηρείται όσο το
δυνατόν απλούτερη. Το σκεπτικό πίσω από αυτή την απαίτηση είναι ότι τα
απλά τυπικά συστήματα είναι ευκολότερα στην ανάπτυξη, κατανόηση,
γενικότερα διαχείριση, αλλά και (κυρίως) στη χρήση. Η απαίτηση αυτή
έρχεται σε άμεση αντιπαράθεση με τις προηγούμενες δυο.
\end{itemize}
Οι δυο πρώτες απαιτήσεις θεωρούνται οι σημαντικότερες στο πλαίσιο αυτής
της διδακτορικής διατριβής. Επομένως, η προτεινόμενη σημασιολογία
πρέπει να είναι όσο το δυνατόν ορθότερη και πληρέστερη, σε σχέση με το
πρότυπο. Η απλότητα θα πρέπει να επιδιώκεται, όσο αυτό δεν επηρεάζει
τις άλλες δυο απαιτήσεις.
%%% Bibliography
\bibliographystyle{softlab-thesis}
\bibliography{test}
%%% Appendices
\backmatter
\appendix
\chapter{Ευρετήριο συμβολισμών}
$A \rightarrow B$ : συνάρτηση από το πεδίο $A$ στο πεδίο $B$.
%%% End of document
\end{document}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment