ˇ ´ VYSOKE ´ UCEN ˇ ´I TECHNICKE ´ V PRAZE CESK E ´ FAKULTA STAVEBNI ´ OBOR GEODEZIE A KARTOGRAFIE ´ ´I A KARTOGRAFIE KATEDRA MAPOVAN
LATEX – sazba zdrojov´ eho k´ odu semestr´aln´ı pr´ace
Anna Kratochv´ılov´a
V Praze dne 26. 4. 2011
Kartografick´a polygrafie a reprografie
´ Uvod Sazba zdrojov´eho k´ odu je vˇec potˇrebn´a a nen´ı u ´plnˇe jednoduch´e vys´azet jej tak, aby to odpov´ıdalo konvenc´ım dan´eho programovac´ıho jazyka a aby byl k´od srozumiteln´ y. Nav´ıc ˇcasto je potˇreba jej prezentovat a zde hraje roli i estetick´e p˚ usoben´ı. Co vlastnˇe znamen´ a sazba zdrojov´eho k´odu? Pˇredevˇs´ım zachov´av´a speci´aln´ı znaky a odsazen´ı. Typicky se pro zdrojov´ y k´od pouˇz´ıv´a jin´e p´ısmo neˇz pro zbytek textu, a to pˇredevˇs´ım p´ısmo bezproporˇcn´ı (strojopis). V literatuˇre se lze setkat i s pouˇzit´ım kurz´ıvy. Dalˇs´ımi poˇzadavky m˚ uˇze b´ yt zv´ yraznˇen´ı kl´ıˇcov´ ych slov, ˇc´ıslov´an´ı ˇr´adk˚ u ˇci jejich zalomen´ı. Z´aleˇz´ı na konkr´etn´ıch potˇreb´ ach a vkusu, nicm´enˇe syst´em LATEX umoˇzn ˇuje splnit i n´aroˇcn´e poˇzadavky na sazbu zdrojov´eho k´odu.
1
Sazba zdrojov´ eho k´ odu v dokumentu
N´asleduj´ıc´ı text shrnuje nejpouˇz´ıvanˇejˇs´ı zp˚ usoby sazby, nicm´enˇe je tˇreba zd˚ uraznit, ˇze v t´eto oblasti neust´ ale doch´ az´ı k v´ yvoji a nov´e moˇznosti st´ale pˇrib´ yvaj´ı.
1.1
Pˇ r´ıkaz ∖verb a prostˇ red´ı verbatim
Jednou z nejjednoduˇsˇs´ıch moˇznost´ı, jak vys´azet zdrojov´ y k´od bezrozmˇern´ ym fontem vˇcetnˇe speci´ aln´ıch znak˚ u, je pouˇz´ıt pˇr´ıkaz \verb ˇci prostˇred´ı verbatim. Prvn´ı moˇznost je vhodn´ a pro kratˇs´ı u ´ryvky na ˇr´ adku, druh´a varianta slouˇz´ı pro bloky zdrojov´eho k´odu. Po pˇr´ıkazu \verb n´ asleduje oddˇelovaˇc, kter´ ym m˚ uˇze b´ yt jak´ ykoli speci´aln´ı znak (kromˇe mezery a *). Pˇr´ıkaz plat´ı pro n´asleduj´ıc´ı text, dokud nenaraz´ı na zvolen´ y oddˇelovaˇc. Napˇr´ıklad \verb|mezer, kolik chcete| vytiskne toto: mezer, kolik chcete. Prostˇred´ı verbatim funguje stejnˇe jako jin´a prostˇred´ı. N´asleduje pˇr´ıkaz a jeho v´ ysledek: \ begin { verbatim } zde se \ textit { prikazy } neinterpretuji \ end { verbatim }
zde se \textit{prikazy} neinterpretuji Alternativou k prostˇred´ı verbatim je prostˇred´ı alltt, pro jeho pouˇzit´ı je nutn´ y stejnojmenn´ y bal´ıˇcek. V´ yhodou je to, ˇze se uvnitˇr tohoto prostˇred´ı interpretuj´ı pˇr´ıkazy LATEXu. Pˇredchoz´ı pˇr´ıklad by tak mˇel n´ asleduj´ıc´ı v´ ystup: zde se prikazy neinterpretuji Je tˇreba dodat, ˇze ve zmiˇ novan´ ych pˇr´ıkazech a prostˇred´ıch nejsou s ˇceˇstinou ˇz´adn´e komplikace. Pokud v uk´ azkov´ ych textech chyb´ı diakritika, m´a to sv˚ uj d˚ uvod, je zde totiˇz pouˇzit bal´ıˇcek Listings, u kter´eho je pouˇzit´ı diakritiky problematick´e. Na druhou stranu, ps´at zdrojov´ y k´ od v ˇceˇstinˇe se stejnˇe nedoporuˇcuje.
1
1.2
Bal´ıˇ cek Listings
Listings je jedn´ım z nejpouˇz´ıvanˇejˇs´ıch bal´ıˇck˚ u pro s´azen´ı zdrojov´eho k´odu. Mezi jeho nejvˇetˇs´ı v´ yhody patˇr´ı to, ˇze vzhled v´ ypis˚ u k´odu si lze jednoduˇse pˇrizp˚ usobit vlastn´ım potˇreb´ am. Podporuje pˇres 70 programovac´ıch jazyk˚ u a u nˇekter´ ych i v´ıce dialekt˚ u. To umoˇzn ˇuje uˇzivateli nastavit odliˇsn´ y vzhled pro kl´ıˇcov´a slova, koment´aˇre a ˇretˇezce. D´ ale si lze vybrat, jakou formou k´ od vkl´adat. Lze vloˇzit u ´trˇzky k´odu pˇr´ımo do textu ˇci na samostatn´ y ˇr´ adek, naˇc´ıst k´ od ze souboru a pˇr´ıpadnˇe pouˇz´ıt plovouc´ı prostˇred´ı s popiskem a ˇc´ıslov´ an´ım. Vzhled v´ ypisu k´ odu je moˇzn´e zv´ yraznit r´ameˇckem a odliˇsnou barvou pozad´ı. Samozˇrejmost´ı je ˇc´ıslov´ an´ı ˇr´ adk˚ u s moˇznost´ı se na nˇe v textu odk´azat. Moˇznosti nastaven´ı jsou pops´ any d´ ale v textu. Pro pouˇzit´ı bal´ıˇcku je tˇreba jej uv´est v preambuli (tj. mezi \documentclass a \begin {document}): \ usepackage { listings }
1.2.1
Vkl´ ad´ an´ı k´ odu
Vloˇzit zdrojov´ y k´ od do textu lze nˇekolika zp˚ usoby. Pro kr´atk´ y u ´trˇzek k´odu je ˇcasto vhodn´e jej um´ıstit pˇr´ımo do textu. K tomu slouˇz´ı pˇr´ıkaz \lstinline, za kter´ ym n´asleduje k´od v oddˇelovaˇc´ıch, kter´e lze libovolnˇe zvolit tak, aby se vybran´e znaky nevyskytovaly v k´odu. Takˇze funguje \lstinline|int i; i++|, ale tˇreba i \lstinline*int i; i++*, coˇz oboj´ı produkuje: int i; i++. Dalˇs´ı moˇznost´ı je vkl´ adat k´ od mimo text, coˇz zajiˇst’uje prostˇred´ı lstlisting: \ begin { lstlisting } int i = 100; i ++; std :: cout << i << std :: endl ; \ end { lstlisting }
Pokud chcete vloˇzit vˇetˇs´ı ˇc´ ast k´odu, lze jej naˇc´ıst pˇr´ımo ze souboru. To m´a mimo jin´e v´ yhodu, ˇze pˇri zmˇenˇe v programu staˇc´ı pouze pˇreloˇzit soubor v LATEXu a nen´ı tak tˇreba zmˇenu pˇrepisovat na v´ıce m´ıstech. Pˇr´ıkaz \ lstinputlisting [ firstline =24 , lastline =33]{ semestr . sty }
vyp´ıˇse n´ asleduj´ıc´ı ˇc´ ast k´ odu (k´ od v LATEXu): \ def \ @makechapterhead #1{ % \ vspace *{50\ p@ } % {\ parindent \ z@ \ raggedright \ normalfont \ ifnum \ c@secnumdepth >\ m@ne \ Large \ bfseries \ thechapter . \ space \ fi \ interlinepenalty \ @M \ Large \ bfseries #1\ par \ nobreak \ vskip 40\ p@
Za povˇsimnut´ı stoj´ı parametry firstline a lastline, kter´ ymi lze omezit rozsah vypisovan´eho k´ odu.
2
Pro v´ ypisy k´ odu m˚ uˇze b´ yt v´ yhodn´e je um´ıstit do ˇc´ıslovan´eho plovouc´ıho prostˇred´ı se znaˇckou (label) a popiskem, coˇz se zaˇr´ıd´ı pˇrid´an´ım n´asleduj´ıc´ıch nepovinn´ ych parametr˚ u k pˇredch´ azej´ıc´ım pˇr´ıkaz˚ um. Na uk´azku k´odu se pak m˚ uˇzete odvol´avat standardnˇe pˇres \ref{klic} a \pageref{klic}, tedy napˇr. jako na uvedenou uk´azku ˇc. 1. \ begin { lstlisting }[ float =h , caption = Float prostredi , label = klic ] void nicNedelam () ; \ end { lstlisting }
Uk´ azka k´odu 1: Float prostˇred´ı void nicNedelam () ;
Na doplnˇen´ı informac´ı je vhodn´e uv´est, ˇze pˇr´ıkazy caption a label lze uv´est i bez plovouc´ıho prostˇred´ı. Pro dokumenty v ˇceˇstinˇe se hod´ı pˇredefinovat anglick´e oznaˇcen´ı Listing pomoc´ı \renewcommand{\lstlistingname}{Uk´ azka k´ odu}. 1.2.2
Moˇ znosti nastaven´ı a jejich v´ yznam
K nastaven´ı parametr˚ u slouˇz´ı pˇr´ıkaz \lstset{parametr=hodnota parametru}. Do pˇr´ıkazu lze napsat libovoln´ y poˇcet parametr˚ u oddˇelen´ ymi ˇc´arkou. Pokud takto cokoliv nastav´ıme, m´ a pak toto nastaven´ı platnost pro cel´ y dokument. Nastav´ıme-li je vˇsak pˇr´ımo pˇri vkl´ ad´ an´ı k´ odu (jako nepovinn´e parametry v hranat´ ych z´avork´ach), plat´ı nastaven´ı pouze pro tu konkr´etn´ı uk´ azku k´odu. Jestliˇze potˇrebujeme v dokumentu stˇr´ıdat r˚ uzn´ a nastaven´ı, je v´ yhodn´e nastavit styly pomoc´ı \lstdefinestyle, kter´e pak pouˇzijeme pˇri vkl´ad´an´ı k´ odu. N´ asleduj´ıc´ı v´ yˇcet v tabulce ˇc. 1 na stranˇe 4 nepokr´ yv´a zdaleka vˇsechny moˇznosti nastaven´ı, vyb´ır´ a jen ty z´akladn´ı. 1.2.3
Vzhled a zv´ yraznˇ en´ı uk´ azek k´ odu
Kdyˇz chceme zv´ yraznit k´ od, pom˚ uˇze n´am nastaven´ı frame a backgroundcolor. Pˇri pouˇzit´ı barev nezapomeˇ nte vloˇzit bal´ıˇcek color pomoc´ı \usepackage{color} s moˇznost´ı nepovinn´ ych parametr˚ u usenames, dvipsnames v hranat´ ych z´avork´ach. V´ ysledky r˚ uzn´ ych nastaven´ı zm´ınˇen´ ych parametr˚ u jsou na obr´azku ˇc. 1 na stranˇe 4:
3
Parametr
Pˇ r´ıklad hodnoty
language
C++, Python, . . .
basicstyle commentstyle keywordstyle morekeywords style showspaces numbers numberstyle stepnumber numbersep caption captionpos title breaklines breakatwhitespace breakindent breakautoindent gobble escapeinside
Popis
nastavuje podporu pro urˇcit´ y programovac´ı jazyk \small\ttfamily z´akladn´ı vzhled p´ısma \itshape vzhled koment´aˇr˚ u \color{red} vzhled kl´ıˇcov´ ych slov {some, key, words} pˇrid´an´ı kl´ıˇcov´ ych slov myStyle pouˇzit´ı uˇzivatelem pˇreddefinovan´eho stylu true, false vkl´ad´a viditeln´e mezery none, left, right ˇc´ıslov´an´ı ˇr´adk˚ u \tiny vzhled ˇc´ısel ˇr´adk˚ u {1, 2, ...} ˇc´ıslovan´ y je kaˇzd´ y n-t´ y ˇr´adek 10pt, 2mm vzd´alenost ˇc´ıslov´an´ı od k´odu popisek popisek uk´azky k´odu t, b um´ıstˇen´ı popisku \lstname neˇc´ıslovan´ y popisek, napˇr´ıklad n´azev vkl´adan´eho souboru true, false zalomen´ı ˇr´adk˚ u true, false zalomen´ı ˇr´adku v b´ıl´ ych znac´ıch 20em, 40mm odsazen´ı ˇr´adku po zalomen´ı true, false automatick´e odsazen´ı zalomen´eho ˇr´adku 1, 2, 3, . . . ignoruje dan´ y poˇcet znak˚ u od zaˇc´atku ˇr´adku {\%*}{*} text mezi zvolen´ ymi znaky nen´ı ve v´ ypisu, moˇzn´e vloˇzit \label pro odkazov´an´ı se na konkr´etn´ı ˇr´adku Tab. 1: Moˇznosti nastaven´ı
\ begin { lstlisting }[ frame = shadowbox , rulesepcolor =\ color { Gray }] ... \ end { lstlisting } \ definecolor { lightGrey }{ RGB }{250 ,250 ,250} \ begin { lstlisting }[ frame = LBtr , backgroundcolor =\ color { lightGrey } , frameround = tttt ] ... \ end { lstlisting }
\ begin { lstlisting }[ frame = lines , framerule =2 pt , rulecolor =\ color { BurntOrange } , backgroundcolor =\ color { Goldenrod }] ... \ end { lstlisting }
Obr. 1: Uk´azka r´ameˇck˚ u
4
1.2.4
Uk´ azka pouˇ zit´ı
Pro lepˇs´ı pˇredstavu je zde uk´az´ano jedno z vhodn´ ych nastaven´ı bal´ıˇcku (uk´azka ˇc. 2) a odpov´ıdaj´ıc´ı v´ ysledek (uk´ azka ˇc. 3 na stranˇe 6). Uk´ azka k´ odu 2: Uk´azka nastaven´ı pro k´od v C++ \ lstinputlisting [ float = ht , caption = Ukazka kodu v C ++ , language = C ++ , basicstyle =\ ttfamily \ small \ color { black } , commentstyle =\ itshape , keywordstyle =\ color { Blue } , showstringspaces = false , frame = lines , backgroundcolor =\ color { lightGrey } , numbers = left , numberstyle =\ small , stepnumber =5 , framexleftmargin =10 mm , xleftmargin =10 mm , breakindent =20 em , brea katwhi tespac e = true , breaklines = true ] { polygon . h }
2
Zdrojov´ e k´ ody v prezentaci LATEX Beamer
V prezentac´ıch tˇr´ıdy Beamer lze pro sazbu zdrojov´ ych k´odu v´ıcem´enˇe pouˇz´ıvat stejn´e A prostˇredky jako v norm´ aln´ım dokumentu L TEXu. Nav´ıc vˇsak lze prezentov´an´ı k´odu ozvl´ aˇstnit r˚ uzn´ ym skr´ yv´ an´ım a zv´ yrazˇ nov´an´ım urˇcit´e ˇc´asti k´odu.
2.1
Vloˇ zen´ı zdrojov´ eho k´ odu
K´od lze v prezentaci zobrazit nˇekolika zp˚ usoby, nˇekter´e z nich jiˇz byly pops´any v pˇredchoz´ıch ˇc´ astech. V kaˇzd´em pˇr´ıpadˇe je nutn´e pˇridat podm´ınku [fragile] ve tvaru \begin {frame}[fragile], bez kter´e se ˇz´adn´ y z n´asleduj´ıc´ıch zp˚ usob˚ u neobejde. K´od lze vloˇzit: ∙ pˇr´ımo do ˇr´ adku: \verb|zdrojovy kod| ∙ samostatnˇe na v´ıce ˇr´ adk˚ u: \ begin { verbatim } ... \ end { verbatim }
∙ samostatnˇe na v´ıce ˇr´ adk˚ u, znaky \, {, } jsou vyhodnoceny, coˇz umoˇzn ˇuje pouˇz´ıvat pˇr´ıkazy pro skr´ yv´ an´ı a zv´ yraznˇen´ı pˇr´ımo ve zdrojov´em k´odu: \ begin { semiverbatim } \ alert { zvyrazneny kod } \ end { semiverbatim }
∙ pouˇzit´ım bal´ıˇcku Listings.
2.2
Skr´ yv´ an´ı a zv´ yraznˇ en´ı k´ odu
Pokud chceme m´ıt prezentaci zdrojov´eho k´odu zaj´ımavˇejˇs´ı, lze toho dos´ahnout postupn´ ym odkr´ yv´ an´ım a zakr´ yv´ an´ım urˇcit´ ych ˇc´ast´ı k´odu s jejich pˇr´ıpadn´ ym barevn´ ym zv´ yraznˇen´ım. Pro u ´ˇcely odkr´ yv´ an´ı a zakr´ yv´an´ı lze pouˇz´ıt pˇr´ıkaz \uncover se specifikac´ı, kdy se m´ a dan´ y ˇr´ adek k´ odu zviditelnit. Specifikace <1-3,5-> napˇr´ıklad znamen´a, ˇze k´ od 5
Uk´ azka k´ odu 3: Uk´azka v´ ysledku nastaven´ı
5
10
15
20
25
class Polygon { protected : std :: vector < Point > points ; public : Polygon () {} void add ( const Point & p ) { points . push_back ( p ) ; } const Point & getPoint ( unsigned int index ) const { return points [ index ]; } const Point & operator []( int index ) const { return points [ index ]; } unsigned int size () const { return points . size () ; } /* * Returns number of points in polygon with the last point * which is the same as the first point . */ unsigned int getSize () const { return size () ; } void clear () { points . clear () ; } bool isValid () { unsigned int size = points . size () ; if ( size > 0) { for ( unsigned int i = 0; i < size ; i ++) { if (! points . at ( i ) . isValid () ) return false ; } if ( points [0] == points [ size -1]) return true ; } else return false ; }
bude viditeln´ y na prvn´ım aˇz tˇret´ım slidu, pak zmiz´ı a objev´ı se aˇz na p´at´em a uˇz tak z˚ ustane. Podobnˇe se chov´ a pˇr´ıkaz \alert, kter´ y k´od zv´ yrazn´ı ˇcervenou barvou (lze nastavit i jinou). Postup je uveden v n´asleduj´ıc´ım pˇr´ıkladˇe ˇc. 4 na stranˇe 4, nicm´enˇe u ´ˇcinek nastaven´ı je patrn´ y aˇz v prezentaci.
6
Uk´ azka k´ odu 4: Postupn´e zobrazen´ı k´odu v prezentaci \ begin { frame }[ fragile ] \ frametitle { Postupne zobrazeni kodu \ ldots } \ begin { semiverbatim } \ uncover <3 - >{\ alert <3 >{ SELECT gid , ST _ BuildArea ( ST _ Collect ( way ) ) AS way }} \ uncover <3 - >{ \ alert <3 >{ FROM }} \ uncover <3 - >{ \ alert <3 >{(}}\ uncover <2 - >{\ alert <2 >{ SELECT }} \ uncover <2 - >{ \ alert <2 >{ gid ,}} \ uncover <2 - >{ \ alert <2 >{ ST _ BuildArea ( ST _ Union ( ring . way , ST _ StartPoint ( ring . way ) ) ) }} \ uncover <2 - >{ \ alert <2 >{ AS way }} \ uncover <2 - >{ \ alert <2 >{ FROM }} \ uncover <2 - >{ \ alert <2 >{(}}\ uncover <1 - >{\ alert <1 >{ SELECT DISTINCT }} \ uncover <1 - >{ \ alert <1 >{ gid ,}} \ uncover <1 - >{ \ alert <1 >{ ST _ ExteriorRing (( ST _ DumpRings ( way ) ) . geom ) AS way }} \ uncover <1 - >{ \ alert <1 >{ FROM f 10. lesni _ porosty }} \ uncover <1 - >{ \ alert <1 >{ WHERE NOT ST _ IsValid ( way ) }}\ uncover <2 - >{\ alert <2 >{) }} \ uncover <2 - >{ \ alert <2 >{ AS ring }}\ uncover <3 - >{) } \ uncover <3 - >{ \ alert <3 >{ AS after _ union }} \ uncover <3 - >{\ alert <3 >{ GROUP BY gid ;}} \ end { semiverbatim } \ end { frame }
7
Z´ avˇ er Kromˇe v´ yˇse zmiˇ novan´ ych moˇznost´ı sazby zdrojov´eho k´odu existuj´ı i dalˇs´ı, se kter´ ymi ale nem´ am osobn´ı zkuˇsenost, nicm´enˇe na internetu lze v t´eto oblasti dohledat mnoho n´avod˚ u a rad. Pokud autor programu potˇrebuje pˇredv´est v´ ysledky sv´e pr´ace v dokumentu nebo v prezentaci, mˇel by se rozhodnˇe sezn´amit s uveden´ ymi moˇznostmi a zvolit si tu ˇ tomu vˇenovan´ vhodnou. Cas y se mu urˇcitˇe vyplat´ı.
Literatura [1] LaTeX. Wikibooks, open books for an open world [online]. 19 January 2005, last modified on 6 April 2011 [cit. 2011-04-06]. URL: http://en.wikibooks.org/wiki/LaTeX/ [2] Heinz, Carsten; Moses, Brooks. The Listings Package [online], [cit. 2011-04-06], URL: http://mirrors.ctan.org/macros/latex/contrib/listings/listings.pdf [3] Tantau, Till; Wright, Joseph; Mileti´c, Vedran. The beamer class: User Guide for version 3.10., [online], [cit. 2011-04-06], URL: http://ftp.cstug.cz/pub/tex/CTAN/macros/ latex/contrib/beamer/doc/beameruserguide.pdf
8