With support for the unified NTUA/ECE dissertation format.

Hardwired in many places, bad implementation.
Just before the diploma project of Kyriakos Ginis.
parent 6d5c71be
This source diff could not be displayed because it is too large. You can view the blob instead.
No preview for this file type
%!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}
%******************************************************************************
% CVS/RCS version:
% $Id: softlab-thesis.cls,v 1.2 2002-10-28 17:01:04 nickie Exp $
% $Id: softlab-thesis.cls,v 1.3 2003-07-21 12:43:42 nickie Exp $
%******************************************************************************
% LaTeX file : softlab-thesis.cls
% Written by : Nikolaos S. Papaspyrou
% Date : October 17, 2002
% Revised : October 22, 2002
% Revised : July 2, 2003
%
% Description : A uniform template for diploma projects and doctoral
% dissertations at the Software Engineering Laboratory,
% Department of Electrical and Computer Engineering,
% School of Electrical and Computer Engineering,
% National Technical University of Athens.
%
% Notes : This package is based on `thesis.cls', written by
% Wenzel Matiaske (mati1831@perform.ww.tu-berlin.de)
% Copyright (C) 1991, 1996. Version 1.0g (1996/25/01).
% Revised in July 2003, to adhere to NTUA's ECE library
% policy for diploma projects and doctoral dissertations.
% Package information
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\filename{softlab-thesis}
\def\fileversion{1.0a}
\def\filedate{2002/10/28}
\def\fileversion{1.1a}
\def\filedate{2003/07/02}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{softlab-thesis}[\filedate\space\fileversion\space%
LaTeX document class (nsp).]
......@@ -28,9 +31,6 @@
% Options and related stuff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand\@ptsize{}
\newif\if@restonecol
\newif\if@titlepage
\@titlepagetrue
\newif\if@openright
\newif\if@openbib
\@openbibfalse
......@@ -65,6 +65,10 @@
\newif\if@greek \@greekfalse
\DeclareOption{greek}{\@greektrue}
\DeclareOption{english}{\@greekfalse}
\newcount\c@type
\DeclareOption{diploma}{\c@type=1}
\DeclareOption{master}{\c@type=2}
\DeclareOption{dissertation}{\c@type=3}
\newcount\hours \newcount\minutes
\def\SetTime{\hours=\time
\global\divide\hours by 60
......@@ -76,8 +80,6 @@
\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}
......@@ -96,12 +98,9 @@
\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}
\newif\if@contpage \@contpagetrue
\DeclareOption{contpage} {\@contpagetrue}
\DeclareOption{nocontpage}{\@contpagefalse}
\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{}
......@@ -113,8 +112,11 @@
\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\schoolfont#1{\def\sc@font{#1}} \def\sc@font{}
\def\departmentfont#1{\def\dp@font{#1}} \def\dp@font{}
\def\thesistypefont#1{\def\ty@font{#1}} \def\ty@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{}
......@@ -140,7 +142,9 @@
\subtitlefont{\large}
\authorfont{}
\institutionfont{\slshape}
\translatorfont{}
\schoolfont{\slshape}
\departmentfont{\slshape}
\thesistypefont{}
\theoremheaderfont{\upshape}
\theorembodyfont{}
\itemfont{\slshape}
......@@ -164,8 +168,10 @@
\titlefont{\LARGE\bfseries}
\subtitlefont{\large}
\authorfont{}
\translatorfont{}
\thesistypefont{}
\institutionfont{\slshape}
\schoolfont{\slshape}
\departmentfont{\slshape}
\theoremheaderfont{\bfseries}
\theorembodyfont{\itshape}
\itemfont{\bfseries}
......@@ -189,8 +195,10 @@
\titlefont{\LARGE\sffamily\bfseries}
\subtitlefont{\large\sffamily}
\authorfont{\Large\sffamily\slshape}
\translatorfont{}
\thesistypefont{}
\institutionfont{\sffamily}
\schoolfont{\sffamily}
\departmentfont{\sffamily}
\theoremheaderfont{\sffamily}
\theorembodyfont{}
\itemfont{\sffamily}
......@@ -202,22 +210,25 @@
\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,greek}
\ExecuteOptions{a4paper,11pt,twoside,final,openright,%
bold,nocenter,noupper,greek,contpage}
\ProcessOptions*
\ifnum\c@type=0
\ClassError{softlab-thesis}{Undefined type of thesis}{%
Please, give one of the options: diploma, master, dissertation%
}
\fi
% Miscellaneous settings
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\input{bk1\@ptsize.clo}
......@@ -250,7 +261,6 @@
% Required packages
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{a4}
\RequirePackage{graphicx}
\RequirePackage{dates}
......@@ -258,81 +268,73 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\if@twoside
\def\ps@headings{
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\vbox{\hsize=\textwidth
\def\@oddfoot{\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
\hfill{\pn@font\thepage}\if@center\hfill\fi}}}
\def\@evenfoot{\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}}%
\if@center\hfill\fi{\pn@font\thepage}\hfill}}}
\let\@oddhead\relax
\let\@evenhead\relax
\let\@mkboth\markboth
\def\chaptermark##1{%
\markboth {%
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\@chapapp\
\if@headcount
\thechapter. \ %
\fi
\@chapapp\ \thechapter. \ %
\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
\def\@oddfoot{\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}}%
\hfill{\pn@font\thepage}\if@center\hfill\fi}}}
\let\@oddhead\relax
\let\@mkboth\markboth
\def\chaptermark##1{%
\markright {%
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\@chapapp\
\if@headcount
\thechapter. \ %
\fi
\@chapapp\ \thechapter. \ %
\fi
\fi
##1}}}
\fi
\def\ps@myheadings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@oddhead{\vbox{\hsize=\textwidth
\def\@oddfoot{\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
\hfill{\pn@font\thepage}\if@center\hfill\fi}}}
\def\@evenfoot{\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}}%
\if@center\hfill\fi{\pn@font\thepage}\hfill}}}
\let\@oddhead\relax
\let\@evenhead\relax
\let\@mkboth\@gobbletwo
\let\chaptermark\@gobble
\let\sectionmark\@gobble
}
\def\ps@draft{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@oddfoot{\vbox{\hsize=\textwidth
\hbox to \textwidth{%
\hfill{\pn@font\thepage}\if@center\hfill\fi}}}
\def\@evenfoot{\vbox{\hsize=\textwidth
\hbox to \textwidth{%
\if@center\hfill\fi{\pn@font\thepage}\hfill}}}
\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}}%
\hfill{\pn@font\today,\ \now\ ---
{\h@font \draftname: ``\jobname''}}\if@center\hfill\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}}%
\if@center\hfill\fi{\pn@font{\h@font \draftname: ``\jobname''} ---
\today,\ \now}\hfill}}}%
\let\@mkboth\@gobbletwo
\let\chaptermark\@gobble
\let\sectionmark\@gobble
......@@ -352,15 +354,23 @@
% Title page and front matter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\@supervisor{} \def\supervisor#1{\gdef\@supervisor{#1}}
\def\@committeemembers{} \def\committeemembers#1{\gdef\@committeemembers{#1}}
\def\@supervisor@pos{} \def\supervisorpos#1{\gdef\@supervisor@pos{#1}}
\def\@committee@one{} \def\committeeone#1{\gdef\@committee@one{#1}}
\def\@committee@one@pos{}\def\committeeonepos#1{\gdef\@committee@one@pos{#1}}
\def\@committee@two{} \def\committeetwo#1{\gdef\@committee@two{#1}}
\def\@committee@two@pos{}\def\committeetwopos#1{\gdef\@committee@two@pos{#1}}
\def\@committee@three{} \def\committeethree#1{\gdef\@committee@three{#1}}
\def\@committee@three@pos{}\def\committeethreepos#1{\gdef\@committee@three@pos{#1}}
\def\@subtitle{} \def\subtitle#1{\gdef\@subtitle{#1}}
\def\@translator{} \def\translator#1{\gdef\@translator{#1}}
\def\@thesistype{} \def\thesistype#1{\gdef\@thesistype{#1}}
\def\@institution{} \def\institution#1{\gdef\@institution{#1}}
\def\@school{} \def\school#1{\gdef\@school{#1}}
\def\@department{} \def\department#1{\gdef\@department{#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\@date@defense{} \def\datedefense#1{\gdef\@date@defense{#1}}
\def\url#1{\gdef\@url{\texttt{#1}}}
\def\TRnumber#1{\gdef\@TRnumber{#1}}
\def\@trurl{} \def\trurl#1{\gdef\@trurl{\texttt{#1}}}
......@@ -369,33 +379,39 @@
\def\new@tpage{\newpage\thispagestyle{empty}\null}
\def\@author@and{\end{tabular}\hskip 1em plus.17fil
\if@center
\begin{tabular}[t]{c}
\else
\begin{tabular}[t]{@{}l@{}}
\fi}
\begin{tabular}[t]{@{}l@{}}}
\def\@committeemembers@and{\\ &}
\let\and\relax
\def\maketitle{%
\begin{titlepage}
\cleardoublepage
\newpage
\thispagestyle{empty}%
\if@compatibility
\setcounter{page}{0}
\fi
%
\let\footnotesize\small
\let\footnoterule\relax
\def\thefootnote{\fnsymbol{footnote}}
\new@tpage
%
\begin{minipage}{2.5cm}
\includegraphics[width=2.5cm]{pyrforos}%
\noindent
\begin{minipage}{3.0cm}
\includegraphics[height=2.8cm]{pyrforos}%
\end{minipage}
\hspace{0.5cm}
\begin{minipage}{12cm}
\begin{minipage}{12.0cm}
\raggedright%
\renewcommand\baselinestretch{1.2}\normalsize%
\in@font\@institution
{\in@font\@institution} \\
{\sc@font\@school} \\[3pt]
{\dp@font\@department}
\end{minipage}
%
\vfill
%
\begin{center}
\renewcommand\baselinestretch{1.8}\normalsize%
{\t@font\@title}
\end{center}
\ifx\@subtitle\@empty\else
......@@ -408,41 +424,122 @@
\vspace{1cm}
%
\begin{center}
%
{\ty@font\uppercase\expandafter{\@thesistype}} \\
%
\vspace{1cm}
\let\old@and\and%
\let\and\@author@and%
{\a@font%
\if@center%
\begin{tabular}[t]{c}%
\else%
\begin{tabular}[t]{@{}l@{}}%
\fi%
\@author%
\uppercase\expandafter{\@author}%
\end{tabular}}%
\let\and\old@and%
\end{center}
%
\vfill
%
\begin{minipage}{4.5cm}
\includegraphics{softlab-logo}%
{\st@font%
\textbf{\supervisorname~:\ \ }
\begin{tabular}[t]{@{}l@{}}
\@supervisor \\[6pt]
\@supervisor@pos
\end{tabular}}
%
\vfill
%
\begin{center}
{\st@font ÁèÞíá, \@date}
\end{center}
%
\cleardoublepage
\newpage
\thispagestyle{empty}%
%
\let\footnotesize\small
\let\footnoterule\relax
\def\thefootnote{\fnsymbol{footnote}}
\new@tpage
%
\noindent%
\begin{minipage}{3.0cm}
\includegraphics[height=2.8cm]{pyrforos}%
\end{minipage}
\hspace{1cm}
\begin{minipage}{9.5cm}
\begin{minipage}{12.0cm}
\raggedright%
\renewcommand\baselinestretch{1.2}\normalsize%
\tr@font\@translator \\[0.5em]
\st@font%
{\in@font\@institution} \\
{\sc@font\@school} \\[3pt]
{\dp@font\@department}
\end{minipage}
%
\vfill
%
\begin{center}
\renewcommand\baselinestretch{1.8}\normalsize%
{\t@font\@title}
\end{center}
\ifx\@subtitle\@empty\else
\vspace{1cm}
\begin{center}
{\st@font\@subtitle}
\end{center}
\fi
%
\vspace{1cm}
%
\begin{center}
%
{\ty@font\uppercase\expandafter{\@thesistype}} \\
%
\vspace{1cm}
\let\old@and\and%
\let\and\@committeemembers@and%
\begin{tabular}{@{}ll@{}}
\multicolumn{2}{@{}l@{}}{\underline{\committeename}:} \\[0.25em]
\supervisorname: & \@supervisor \\
\committeemembersname: & \@committeemembers
\end{tabular}%
\let\and\@author@and%
{\a@font%
\begin{tabular}[t]{@{}l@{}}%
\uppercase\expandafter{\@author}%
\end{tabular}}%
\let\and\old@and%
\end{minipage}
\vspace{2cm}
\end{center}
%
\vfill
%
{\st@font%
\textbf{\supervisorname~:\ \ }
\begin{tabular}[t]{@{}l@{}}
\@supervisor \\[6pt]
\@supervisor@pos
\end{tabular}
%
\vspace{1.0cm}\par
%
\noindent
Åãêñßèçêå áðü ôçí ôñéìåëÞ åîåôáóôéêÞ åðéôñïðÞ ôçí \@date@defense.
}
%
\vspace{1.5cm}\par
%
\noindent{\small
\hfill
\begin{tabular}{@{}l@{}}
\signature{\@committee@one}{\@committee@one@pos}
\end{tabular}
\hfill
\begin{tabular}{@{}l@{}}
\signature{\@committee@two}{\@committee@two@pos}
\end{tabular}
\hfill
\begin{tabular}{@{}l@{}}
\signature{\@committee@three}{\@committee@three@pos}
\end{tabular}
\hfill
\hbox{}
}
%
\vfill
%
\begin{center}
\st@font \@date
{\st@font ÁèÞíá, \@date}
\end{center}
%
\if@twoside\new@tpage
......@@ -462,53 +559,30 @@
{\centering \Large \@dedication \par}
\if@twoside \new@tpage \fi
\fi
\end{titlepage}
%
\newpage
%
\def\thefootnote{\arabic{footnote}}
\setcounter{footnote}{0}
\if@thema\else\let\thanks\relax\fi
\gdef\@thanks{}\gdef\@author{}\gdef\@translator{}\gdef\@institution{}%
\gdef\@supervisor{}\gdef\@committeemembers{}%
\gdef\@date@defense{}\gdef\@school{}\gdef\@department{}%
\gdef\@supervisor{}\gdef\@supervisor@pos{}%
\gdef\@committee@one{}\gdef\@committee@one@pos{}%
\gdef\@committee@two{}\gdef\@committee@two@pos{}%
\gdef\@committee@three{}\gdef\@committee@three@pos{}%
\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
\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
}
\def\abstractgr{%
\addcontentsline{toc}{chapter}{\abstractnamegr}%
\chapter*{\abstractnamegr\@mkboth{\abstractnamegr}{\abstractnamegr}}%
\noindent}
\def\endabstractgr{\par\vfil\null}
\def\abstracten{%
\addcontentsline{toc}{chapter}{\abstractnameen}%
\chapter*{\abstractnameen\@mkboth{\abstractnameen}{\abstractnameen}}%
\noindent}
\def\endabstract-en{\par\vfil\null}
% Sectioning
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......@@ -529,20 +603,20 @@
\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}%
\newcommand{\frontmatter}{\cleardoublepage\@mainmatterfalse%
\if@contpage\else\pagenumbering{roman}\fi}
\newcommand{\mainmatter}{%
\ifodd\c@page
\clearpage\thispagestyle{empty}\hbox{}%
\fi%
\label{pg:last-front}%
\clearpage\@mainmattertrue%
\if@contpage\else\pagenumbering{arabic}\fi%
\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{%
......@@ -550,11 +624,7 @@
\addcontentsline{toc}{part}{\partname\ \thepart \hspace{1em}#1}%
\else
\addcontentsline{toc}{part}{#1}\fi \markboth{}{}%
{\if@center
\centering
\else
\raggedright
\fi
{\raggedright
\reset@font
\ifnum \c@secnumdepth >-2\relax
\p@font \partname{} \thepart \par
......@@ -568,11 +638,7 @@
\par}
\@endpart}
\def\@spart#1{%
{\if@center
\centering
\else
\raggedright
\fi
{\raggedright
\reset@font\p@font
\if@upper
\uppercase\expandafter{#1}
......@@ -584,36 +650,9 @@
\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}%
%\thispagestyle{empty}
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
......@@ -622,19 +661,8 @@
\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
......@@ -644,12 +672,8 @@
\chaptermark{#1}
\addtocontents{lof}{\protect\addvspace{10pt}}
\addtocontents{lot}{\protect\addvspace{10pt}}
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]
\else
\@makechapterhead{#2}
\@afterheading
\fi}
\@afterheading}
\newlength{\beforechaptervspace}
\setlength{\beforechaptervspace}{50pt}
\newlength{\afterchaptervspace}
......@@ -657,18 +681,7 @@
\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
\raggedright
\ifnum \c@secnumdepth >\m@ne
\setbox\@tempboxa\hbox{\c@font\thechapter.\ %
\c@font
......@@ -678,8 +691,8 @@
#1%
\fi}
\ifdim \wd\@tempboxa >\hsize
\@hangfrom{%
\c@font\thechapter.\ }{\c@font
\@hangfrom{\c@font\thechapter.\ }%
{\c@font
\if@upper
\uppercase{#1}
\else
......@@ -690,13 +703,8 @@
\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}
......@@ -711,31 +719,12 @@
\fi
\par \nobreak}
\fi
\vspace{\afterchaptervspace}
\if@thema
\ifx\@shortauthor\@empty
\else
\@mkboth{\@shortauthor}{#1}
\fi
\ifx\@chapterauthor\@empty
\else
\@makechapterauthor
\fi
\fi}
\vspace{\afterchaptervspace}}
}
\def\@schapter#1{%
\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]
\else
\@makeschapterhead{#1}\@afterheading
\fi}
\def\@schapter#1{\@makeschapterhead{#1}\@afterheading}
\def\@makeschapterhead#1{%
\vspace*{\beforechaptervspace}{%
\if@center
\centering
\else
\parindent\z@\raggedright
\fi
{\c@font
\if@upper
\uppercase\expandafter{#1}
......@@ -744,31 +733,19 @@
\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}}
{\raggedright\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}}
{\raggedright\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}}
{\raggedright\reset@font\sss@font}}
\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
{3.25ex \@plus1ex \@minus.2ex}%
{-1em}%
......@@ -791,21 +768,12 @@
% Space lengths
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\if@twocolumn
\setlength\leftmargini {2em}
\else
\setlength\leftmargini {2.5em}
\fi
\setlength\leftmargini {2.5em}
\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\leftmarginv {1em}
\setlength\leftmarginvi {1em}
\setlength\leftmargin {\leftmargini}
\setlength \labelsep {.5em}
\setlength \labelwidth{\leftmargini}
......@@ -998,17 +966,11 @@
% Table of contents, etc.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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
......@@ -1049,31 +1011,19 @@
\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
......@@ -1147,7 +1097,6 @@
\newcommand{\nindexbefore}{}
\newcommand{\nindexafter}{}
\newenvironment{theindex}{%
\if@twocolumn\@restonecolfalse\else\@restonecoltrue\fi%
\columnseprule \z@%
\columnsep 35\p@%
\twocolumn[\@makeschapterhead{\indexname}]%
......@@ -1158,7 +1107,7 @@
\let\item\@idxitem\index@size%
}{%
\nindexafter%
\if@restonecol\onecolumn\else\clearpage\fi%
\onecolumn%
}
\newcommand{\@idxitem} {\par\hangindent 40\p@}
\newcommand{\subitem} {\par\hangindent 40\p@ \hspace*{20\p@}}
......@@ -1199,9 +1148,12 @@
\def\appendixname{ÐáñÜñôçìá}
\def\partname{ÌÝñïò}
\def\abstractname{Ðåñßëçøç}
\def\draftname{ðñïó÷Ýäéï}
\def\abstractnamegr{Ðåñßëçøç}
\def\abstractnameen{Abstract}
\def\draftname{Ðñïó÷Ýäéï}
\def\prefacename{Ðñüëïãïò}
\def\keywordsname{ËÝîåéò êëåéäéÜ}
\def\keywordsnamegr{ËÝîåéò êëåéäéÜ}
\def\keywordsnameen{Key words}
\def\acknowledgementsname{Åõ÷áñéóôßåò}
\def\committeename{ÓõìâïõëåõôéêÞ åðéôñïðÞ}
\def\supervisorname{ÅðéâëÝðùí}
......@@ -1209,11 +1161,11 @@
\def\pagesname{Óåëßäåò}
\def\urlname{URL}
\def\ftpname{FTP}
\newcommand{\today}{\space\number\day \ifcase\month\or
\newcommand{\today}{\number\day\space \ifcase\month\or
Éáíïõáñßïõ\or Öåâñïõáñßïõ\or Ìáñôßïõ\or Áðñéëßïõ\or
ÌáÀïõ\or Éïõíßïõ\or Éïõëßïõ\or Áõãïýóôïõ\or
Óåðôåìâñßïõ\or Ïêôùâñßïõ\or Íïåìâñßïõ\or Äåêåìâñßïõ\fi
\number\year}
\space\number\year}
\else
\def\contentsname{Contents}
\def\listfigurename{List of Figures}
......@@ -1227,7 +1179,7 @@
\def\appendixname{Appendix}
\def\partname{Part}
\def\abstractname{Abstract}
\def\draftname{preliminary draft}
\def\draftname{Preliminary draft}
\def\prefacename{Preface}
\def\keywordsname{Keywords}
\def\acknowledgementsname{Acknowledgements}
......@@ -1247,6 +1199,31 @@
\def\figureshortname{\figurename} % I don't like short names
\def\tableshortname{\tablename}
\if@greek
\uccode`Ü=`Á%
\uccode`Ý=`Å%
\uccode`Þ=`Ç%
\uccode`ß=`É%
\uccode`ü=`Ï%
\uccode`ý=`Õ%
\uccode`þ=`Ù%
%
\uccode`¶=`Á%
\uccode`¸=`Å%
\uccode`¹=`Ç%
\uccode`º=`É%
\uccode`¼=`Ï%
\uccode`¾=`Õ%
\uccode`¿=`Ù%
%
\uccode`ú=`Ú%
\uccode`û=`Û%
\uccode`À=`Ú%
\uccode`à=`Û%
%
\uccode`ò=`Ó%
\fi
\setlength\columnsep{10\p@}
\setlength\columnseprule{0\p@}
\iffinal
......@@ -1259,13 +1236,7 @@
\else
\raggedbottom
\fi
\if@twocolumn
\twocolumn
\sloppy
\flushbottom
\else
\onecolumn
\fi
\onecolumn
% Page setup
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......@@ -1276,17 +1247,17 @@
% Paper width
% --------------------------------
\oddsidemargin -0.4 mm % Margins: inside = 25 mm (IM)
\oddsidemargin 4.6 mm % Margins: inside = 30 mm (IM)
\evensidemargin -0.4 mm % outside = 25 mm (OM)
\textwidth 160.0 mm % text body = 160 mm (TB)
\textwidth 155.0 mm % text body = 155 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)
\topmargin -0.4 mm % Margins: top = 25 mm (TM)
\textheight 247.0 mm % bottom = 25 mm (BM)
% text body = 247 mm (TH)
% ------------------------------
% total = 297 mm
......@@ -1295,7 +1266,8 @@
% More environments
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newenvironment{keywords}{\section*{\keywordsname}}{}
\newenvironment{keywordsgr}{\section*{\keywordsnamegr}}{}
\newenvironment{keywordsen}{\section*{\keywordsnameen}}{}
\newcommand{\footacknowledgement}[1]{%
\let\@tmp@makefntext\@makefntext%
\long\def\@makefntext##1{%
......@@ -1311,23 +1283,24 @@
% Font customization
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\t@font{\Huge\bfseries}
\institutionfont{\LARGE\scshape}
\schoolfont{\Large\scshape}
\departmentfont{\Large\scshape}
\titlefont{\LARGE\bfseries}
\authorfont{\Large\bfseries}
\thesistypefont{\Large}
\def\st@font{\large}
\def\a@font{\LARGE}
\def\tr@font{\Large}
\def\in@font{\large\slshape}
% Miscellaneous stuff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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}
\thispagestyle{empty}\hbox{}\newpage\fi\fi}
% This saves the underfull boxes resulting from equations that
% are typeset in just one page
\raggedbottom
%\raggedbottom
% This typesets footnotes always at the very bottom of the page
\renewcommand\footnoterule{\vfill\kern-3\p@%
......@@ -1338,42 +1311,47 @@
\def\aux@date@year{\dateread{\theyear}}
\newcommand\date@year[1][\date]{\expandafter\aux@date@year #1 {}\relax{}}
% Macros for signatures
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand\signature[3][0pt]{\makebox[40mm]{\tiny\dotfill}\\[6pt]#2\\[#1]#3}
% More names
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\@author@accusative{ôïí óõããñáöÝá}
\if@greek
\translator{ÄéðëùìáôéêÞ Åñãáóßá}
\institution{%
Åèíéêü Ìåôóüâéï Ðïëõôå÷íåßï\\
ÔìÞìá Çëåêôñïëüãùí Ìç÷áíéêþí êáé Ìç÷áíéêþí Õðïëïãéóôþí\\
ÔïìÝáò Ôå÷íïëïãßáò ÐëçñïöïñéêÞò êáé Õðïëïãéóôþí\\
ÅñãáóôÞñéï Ôå÷íïëïãßáò Ëïãéóìéêïý%
}
\thesistype{ÄéðëùìáôéêÞ Åñãáóßá}
\institution{Åèíéêü Ìåôóüâéï Ðïëõôå÷íåßï}
\school{Ó÷ïëÞ Çëåêôñïëüãùí Ìç÷áíéêþí \\ êáé Ìç÷áíéêþí Õðïëïãéóôþí}
\department{ÔïìÝáò Ôå÷íïëïãßáò ÐëçñïöïñéêÞò \\ êáé Õðïëïãéóôþí}
\else
\translator{Diploma Project}
\institution{%
National Technical University of Athens\\
Department of Electrical and Computer Engineering\\
Division of Computer Science\\
Software Engineering Laboratory%
}
\thesistype{Diploma Project}
\institution{National Technical University of Athens}
\school{School of Electrical and Computer Engineering}
\department{Department of Computer Science}
\fi
\trurl{http://www.softlab.ntua.gr/techrep/}
\trftp{ftp://ftp.softlab.ntua.gr/pub/techrep/}
\uppertitleback{%
\begin{minipage}{2cm}
\includegraphics[width=2cm]{pyrforos}%
\end{minipage}
\hspace{0.5cm}
\begin{minipage}{12cm}
\@institution
\end{minipage}
\vspace*{4cm}%
{\large%
\signature[6pt]{%
\textbf{\uppercase{\@author}}
}{%
Äéðëùìáôïý÷ïò Çëåêôñïëüãïò Ìç÷áíéêüò êáé Ìç÷áíéêüò Õðïëïãéóôþí Å.Ì.Ð.
}}
}
\middletitleback{%
Copyright \copyright\ \ \@author, \date@year.\\
\lowertitleback{%
{\large Copyright \copyright\ \ \@author, \date@year.\\
\if@greek
Ìå åðéöýëáîç ðáíôüò äéêáéþìáôïò. All rights reserved.\\[12pt]
\else
All rights reserved.\\[12pt]
\fi
}
\if@greek
Ìå åðéöýëáîç ðáíôüò äéêáéþìáôïò.\\[12pt]
Áðáãïñåýåôáé ç áíôéãñáöÞ, áðïèÞêåõóç êáé äéáíïìÞ ôçò ðáñïýóáò
åñãáóßáò, åî ïëïêëÞñïõ Þ ôìÞìáôïò áõôÞò, ãéá åìðïñéêü óêïðü.
ÅðéôñÝðåôáé ç áíáôýðùóç, áðïèÞêåõóç êáé äéáíïìÞ ãéá óêïðü ìç
......@@ -1381,50 +1359,27 @@
íá áíáöÝñåôáé ç ðçãÞ ðñïÝëåõóçò êáé íá äéáôçñåßôáé ôï ðáñüí ìÞíõìá.
ÅñùôÞìáôá ðïõ áöïñïýí ôç ÷ñÞóç ôçò åñãáóßáò ãéá êåñäïóêïðéêü óêïðü
ðñÝðåé íá áðåõèýíïíôáé ðñïò ôïí óõããñáöÝá.
\medskip\par
Ïé áðüøåéò êáé ôá óõìðåñÜóìáôá ðïõ ðåñéÝ÷ïíôáé óå áõôü ôï
Ýããñáöï åêöñÜæïõí \@author@accusative{} êáé äåí ðñÝðåé íá
åñìçíåõèåß üôé áíôéðñïóùðåýïõí ôéò åðßóçìåò èÝóåéò ôïõ
Åèíéêïý Ìåôóüâéïõ Ðïëõôå÷íåßïõ.
\else
All rights reserved.\\[12pt]
This work is copyright and may not be reproduced, stored nor
distributed in whole or in part for commercial purposes. Permission
is hereby granted to reproduce, store and distribute this work for
non-propfit, educational and research purposes, provided that the
source is acknowledged and the present copyright message is retained.
Enquiries regarding use for profit should be directed to the author.
\medskip\par
The views and conclusions contained in this document are those
of the author and should not be interpreted as representing the
official policies, either expressed or implied, of the National
Technical University of Athens.
\fi
\vspace*{2cm}
}
\def\cr@comma{, }
\lowertitleback{%
\let\cr@old\\%
\let\\\cr@comma%
\@author,
\emph{\@title},
\@translator,
\@institution,
\@date.%
\let\\\cr@old%
\\[6pt]
\begin{tabular}{@{}ll@{}}
\@ifundefined{@url}{}{%
\urlname: & \@url \\
}
\pagesname: & \pageref{pg:last-front} + \pageref{pg:last-document}
\end{tabular} \\[12pt]
\@ifundefined{@TRnumber}{}{%
\let\cr@old\\%
\let\\\cr@comma%
\if@greek%
ÄéáèÝóéìï åðßóçò ùò: Ôå÷íéêÞ ÁíáöïñÜ
\else%
Also available as: Technical Report
\fi%
\@TRnumber, \@institution, \@date.%
\let\\\cr@old%
\\[6pt]
\begin{tabular}{@{}ll@{}}
\urlname: & \@trurl \\
\ftpname: & \@trftp
\end{tabular}
}
}
\let\nickie@oldenddocument\enddocument
\def\enddocument{\label{pg:last-document}\nickie@oldenddocument}
......
This source diff could not be displayed because it is too large. You can view the blob instead.
\documentclass{softlab-thesis}
\documentclass[diploma]{softlab-thesis}
%%%
......@@ -11,136 +11,128 @@
\frontmatter
\title{%
Μεταγλωττιστής Calvin σε NFlint%
}
\author{%
Βασίλειος Μ.\ Κουταβάς%
}
\date{%
Οκτώβριος 2002%
}
\supervisor{%
Νικόλαος Παπασπύρου, Λέκτορας%
}
\committeemembers{%
Εμμανουήλ Σκορδαλάκης, Καθηγητής%
\and%
Ευστάθιος Ζάχος, Καθηγητής%
}
\url{http://www.softlab.ntua.gr/\textasciitilde vkoutav/}
\TRnumber{CSD-SW-TR-2-02}
\title{
}
\author{ . }
\date{ 1999}
\datedefense{31 1999}
\supervisor{ X. }
\supervisorpos{ ...}
\committeeone{ X. }
\committeeonepos{ ...}
\committeetwo{ X. }
\committeetwopos{ ...}
\committeethree{ X. }
\committeethreepos{ ...}
\department{
}
\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}
%%% Abstract, in Greek
\begin{abstractgr}%
,
.
DCS 1800
.
.
DCS 1800.
, DCS 1800,
, DCS 1800
-- (BF ,
) (LNA) HP
Network Analyzer. , PC
HP Spectrum Analyzer .
,
.
,
.
\begin{keywordsgr}
, , DCS 1800,
.
\end{keywordsgr}
\end{abstractgr}
%%% Abstract, in English
\begin{abstracten}%
The scope of this thesis was the development of a methodology in
order to detect, recognize and record signals in a certain
spectrum. This methodology was applied to the finding of
interferences into the spectrum of the cellular mobile
communications system DCS 1800 in the wider area of the Attika
basin. For that purpose, outdoor measurements were carried out at
selected sites. The processing of the measurements showed the
existence of interferences into the DCS 1800 spectrum.
Specifically, the DCS 1800 cellular system was studied and the
interference theory was presented. Furthermore, DCS 1800 signals
were generated at the laboratory with the use of a digital
generator and a laboratory test - extraction of the
characteristic curves - of passive (Bandpass Filter, co-axial
cables) and active elements (LNA) was carried out, using a HP
Network Analyzer. Moreover, the interferences were recorded on a
hard disk through a HP Spectrum Analyzer and proper software.
This methodology can be used as a guide for carrying out both
outdoor and indoor measurements in any spectrum, by making simple
changes at the function keys of the Spectrum Analyzer. The
usefulness of the methodology is the specification of the
procedure of the measurements in steps, from the protection of
the personnel and the equipment up to the analytical stages of
the measurements procedure.
\begin{keywordsen}
Electromagnetic spectrum, cellular mobile communications, DCS
1800, interference detection.
\end{keywordsen}
\end{abstracten}
%%% Acknowledgements
\begin{acknowledgements}
Θέλω κατ'~αρχήν να ευχαριστήσω τον επιβλέποντα καθηγητή αυτής της
διατριβής, κ.~Μανόλη Σκορδαλάκη, για τη συνεχή καθοδήγηση και
εμπιστοσύνη του. Καθ'~όλη τη διάρκεια των δέκα ετών της συνεργασίας
μας, ήταν πάντοτε διαθέσιμος όποτε τον χρειαζόμουν, εξυπηρετικός και
φιλικός. Ευχαριστώ επίσης τα μέλη της εξεταστικής επιτροπής,
κ.κ.~Γιώργο Παπακωνσταντίνου, Ανδρέα Σταφυλοπάτη, Στάθη Ζάχο, Παναγιώτη
Τσανάκα, Τίμο Σελλή και Πάνο Ροντογιάννη, για την πρόθυμη και πάντα
αποτελεσματική βοήθειά τους, τις πολύτιμες συμβουλές και τις χρήσιμες
συζητήσεις που είχαμε.
Οι σπουδές μου στο Πανεπιστήμιο Cornell επηρέασαν κατά πολύ τον τρόπο
σκέψης μου αλλά και την κατεύθυνση της έρευνάς μου. Θα ήθελα να
ευχαριστήσω τον επιβλέποντά μου εκεί, κ.~David Gries, καθώς και τα άλλα
μέλη του τμήματος Επιστήμης Υπολογιστών οι οποίοι με δίδαξαν το
συνδυασμό της θεωρίας με την πράξη, με κατεύθυναν προς την τυπική
μελέτη των γλωσσών προγραμματισμού και μου παρείχαν πρόσβαση σε άφθονη
βιβλιογραφία. Μου πήρε κάποιο χρόνο μέχρι να εκτιμήσω όλα αυτά στο
δέοντα βαθμό και αισθάνομαι ότι δεν είχα ακόμα την ευκαιρία να τους
ευχαριστήσω.
Τα μέλη του Εργαστηρίου Τεχνολογίας Λογισμικού ήταν πάντα καλοί φίλοι.
Ιδιαίτερα, θα ήθελα να ευχαριστήσω τους Βασίλη Βεσκούκη, Σίμο Ρετάλη,
Τάσο Κουτουμάνο, Κλειώ Σγουροπούλου και Κώστα Ταβερναράκη για την
εξαιρετική υποστήριξή τους, τις πολλές και όμορφες ώρες συζήτησης που
μοιραστήκαμε. Επίσης, ευχαριστώ τους πολυάριθμους διαχειριστές του
εργαστηρίου για την τεχνική υποστήριξη που ποτέ δε μου αρνήθηκαν όλα
αυτά τα χρόνια.
Πολλές ευχαριστίες οφείλω στο φίλο μου και συνάδελφο Dragan
Ma\'{c}o\v{s} που με εισήγαγε στις μονάδες και έκανε χρήσιμες
παρατηρήσεις σχετικά με αυτή τη διατριβή. Επίσης, ευχαριστώ τους Τάσο
Βίγλα, Βασίλη Παπαδήμο για τη βοήθειά τους στις πρώτες φάσεις
αποσφαλμάτωσης της σημασιολογίας, όπως και τους Άλκη Πολυζώτη, Γιάννη
Σισμάνη, Μάνο Ρενιέρη και Κατερίνα Ποτίκα, για τις προτάσεις τους όσον
αφορά στην υλοποίηση της σημασιολογίας.
Θα ήθελα ακόμα να ευχαριστήσω τους φίλους μου που πάντα μου προσέφεραν
αγάπη, ενθάρρυνση και υποστήριξη. Χάρη σε αυτούς, οι σπουδές μου ήταν
πολύ πιο ευχάριστες. Τέλος, ευχαριστώ από βάθους καρδιάς την οικογένειά
μου και τη σύντροφό μου Κατερίνα για την αστείρευτη υπομονή, αγάπη και
εμπιστοσύνη, και γιατί μου επέτρεψαν να απέχω κατά καιρούς από
δραστηριότητες που δε συμβάδιζαν με τις σπουδές μου.
,
.~ ,
. ,
..~
,
.
,
.
,
,
.
\begin{flushright}
Νικόλαος Σ.\ Παπασπύρου,\\[6pt]
Αθήνα, 27 Φεβρουαρίου 1998.
. ,\\[6pt]
, 13 1999.
\end{flushright}
\footacknowledgement{%
Αυτή η διατριβή τυπώθηκε με το σύστημα προετοιμασίας εγγράφων \LaTeXe,
χρησιμοποιώντας την κλάση \texttt{thesis} του Wenzel Matiaske. Τα πακέτα
\texttt{diagrams} και \texttt{QED} του Paul Taylor, για τη δημιουργία
μεταβατικών διαγραμμάτων και αποδείξεων, ήταν ιδιαίτερα χρήσιμα, όπως
επίσης και το πακέτο \texttt{semantic} του Peter M{\o}ller Neergaard, για
τη δημιουργία κανόνων συνεπαγωγής.
CSD-SW-TR-1-99, ,
,
,
, 1999.
\\[6pt]
\begin{tabular}{@{}ll@{}}
URL: & \texttt{http://www.softlab.ntua.gr/techrep/} \\
FTP: & \texttt{ftp://ftp.softlab.ntua.gr/pub/techrep/}
\end{tabular}
}
\end{acknowledgements}
......@@ -156,405 +148,170 @@ Ma\'{c}o\v{s}
\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}
Οι δυο πρώτες απαιτήσεις θεωρούνται οι σημαντικότερες στο πλαίσιο αυτής
της διδακτορικής διατριβής. Επομένως, η προτεινόμενη σημασιολογία
πρέπει να είναι όσο το δυνατόν ορθότερη και πληρέστερη, σε σχέση με το
πρότυπο. Η απλότητα θα πρέπει να επιδιώκεται, όσο αυτό δεν επηρεάζει
τις άλλες δυο απαιτήσεις.
\chapter{}
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , .
\section{ C}
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , .
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , .
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , .
\section{ }
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
\nocite{*} , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , .
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , .
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , .
\section{ }
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , .
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , .
, , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , , ,
, , , , ,
, , , , ,
, , , , .
%%% Bibliography
\bibliographystyle{softlab-thesis}
\bibliographystyle{ieeetr}
\bibliography{test}
......
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