Commit 0115b8d880aac568b9b3d53e3a429e709017a03e
1 parent
84ce26e8
Exists in
master
and in
1 other branch
Adding CBSoft industry track proposal
Showing
12 changed files
with
2235 additions
and
0 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,15 @@ |
| 1 | +TARGET=spb | |
| 2 | + | |
| 3 | +all: $(TARGET).tex | |
| 4 | + pdflatex $(TARGET).tex | |
| 5 | + bibtex $(TARGET) | |
| 6 | + pdflatex $(TARGET).tex | |
| 7 | + pdflatex $(TARGET).tex | |
| 8 | + evince $(TARGET).pdf & | |
| 9 | + | |
| 10 | +edit: | |
| 11 | + gedit Makefile *.bib *.tex & | |
| 12 | + | |
| 13 | +clean: | |
| 14 | + rm -f $(TARGET).pdf *.out *.aux *.log *.blg *.bbl *.dvi *.ps *.toc *.lot *.lof *.idx *~ | |
| 15 | + | ... | ... |
| ... | ... | @@ -0,0 +1,406 @@ |
| 1 | +%% | |
| 2 | +%% This is file `caption2.sty', | |
| 3 | +%% generated with the docstrip utility. | |
| 4 | +%% | |
| 5 | +%% The original source files were: | |
| 6 | +%% | |
| 7 | +%% caption2.dtx (with options: `package') | |
| 8 | +%% | |
| 9 | +%% Copyright (C) 1994-2002 Axel Sommerfeldt (caption@sommerfeldt.net) | |
| 10 | +%% | |
| 11 | +%% -------------------------------------------------------------------------- | |
| 12 | +%% | |
| 13 | +%% It may be distributed and/or modified under the | |
| 14 | +%% conditions of the LaTeX Project Public License, either version 1.2 | |
| 15 | +%% of this license or (at your option) any later version. | |
| 16 | +%% The latest version of this license is in | |
| 17 | +%% http://www.latex-project.org/lppl.txt | |
| 18 | +%% and version 1.2 or later is part of all distributions of LaTeX | |
| 19 | +%% version 1999/12/01 or later. | |
| 20 | +%% | |
| 21 | +\NeedsTeXFormat{LaTeX2e}[1994/12/01] | |
| 22 | +\ProvidesPackage{caption2} | |
| 23 | + [2002/08/03 v2.1 Customising captions (AS)] | |
| 24 | +\newcommand*\captionfont{} | |
| 25 | +\newcommand*\captionlabelfont{} | |
| 26 | +\newcommand*\captionlabeldelim{} | |
| 27 | +\newcommand*\captionlabelsep{} | |
| 28 | +\newcommand*\captionsize{} | |
| 29 | +\newdimen\captionmargin | |
| 30 | +\newdimen\captionwidth | |
| 31 | +\newif\ifcaptionwidth | |
| 32 | +\newdimen\captionindent | |
| 33 | +\newif\ifcaptionlabel\captionlabeltrue | |
| 34 | +\newif\ifonelinecaptions | |
| 35 | +\newif\ifignoreLTcapwidth | |
| 36 | +\newcommand*\setcaptionmargin{% | |
| 37 | + \captionwidthfalse | |
| 38 | + \setlength\captionmargin} | |
| 39 | +\newcommand*\setcaptionwidth{% | |
| 40 | + \captionwidthtrue | |
| 41 | + \setlength\captionwidth} | |
| 42 | +\newcommand*\normalcaptionparams{% | |
| 43 | + \let\captionsize\@empty | |
| 44 | + \renewcommand*\captionfont{\captionsize}% | |
| 45 | + \let\captionlabelfont\@empty% | |
| 46 | + \renewcommand*\captionlabeldelim{:}% | |
| 47 | + \renewcommand*\captionlabelsep{\space}% | |
| 48 | + \setcaptionmargin\z@\setlength\captionindent\z@ | |
| 49 | + \onelinecaptionstrue} | |
| 50 | +\newcommand*\caption@eh{% | |
| 51 | + If you do not understand this error, please take a closer look\MessageBreak | |
| 52 | + at the documentation of the `caption2' package.\MessageBreak | |
| 53 | + \@ehc} | |
| 54 | +\newcommand*\defcaptionstyle[1]{% | |
| 55 | + \@namedef{caption@@#1}} | |
| 56 | +\newcommand*\newcaptionstyle[1]{% | |
| 57 | + \expandafter\ifx\csname caption@@#1\endcsname\relax | |
| 58 | + \expandafter\defcaptionstyle | |
| 59 | + \else | |
| 60 | + \PackageError{caption2}{Caption style `#1' already defined}{\caption@eh}% | |
| 61 | + \expandafter\@gobbletwo | |
| 62 | + \fi | |
| 63 | + {#1}} | |
| 64 | +\newcommand*\renewcaptionstyle[1]{% | |
| 65 | + \expandafter\ifx\csname caption@@#1\endcsname\relax | |
| 66 | + \PackageError{caption2}{Caption style `#1' undefined}{\caption@eh}% | |
| 67 | + \expandafter\@gobbletwo | |
| 68 | + \else | |
| 69 | + \expandafter\defcaptionstyle | |
| 70 | + \fi | |
| 71 | + {#1}} | |
| 72 | +\newcommand*\dummycaptionstyle[2]{% | |
| 73 | + \defcaptionstyle{#1}{% | |
| 74 | + \expandafter\ifx\csname caption@@\caption@style\expandafter\endcsname% | |
| 75 | + \csname caption@@#1\endcsname | |
| 76 | + \PackageError{caption2}{You can't use the caption style `#1' directy}{% | |
| 77 | + The caption style `#1' is only a dummy and does not really exists.% | |
| 78 | + \MessageBreak You have to redefine it (with \protect\renewcaptionstyle) | |
| 79 | + before you can select\MessageBreak it with \protect\captionstyle. | |
| 80 | + \space\caption@eh}% | |
| 81 | + \else | |
| 82 | + #2\usecaptionstyle{\caption@style}% | |
| 83 | + \fi}} | |
| 84 | +\newcaptionstyle{normal}{\caption@makecaption{normal}} | |
| 85 | +\newcaptionstyle{center}{\caption@makecaption{center}} | |
| 86 | +\newcaptionstyle{centerlast}{\caption@makecaption{centerlast}} | |
| 87 | +\newcaptionstyle{flushleft}{\caption@makecaption{flushleft}} | |
| 88 | +\newcaptionstyle{flushright}{\caption@makecaption{flushright}} | |
| 89 | +\newcaptionstyle{hang}{\caption@makecaption{hang}} | |
| 90 | +\newcaptionstyle{hang+center}{\caption@makecaption{hang@center}} | |
| 91 | +\newcaptionstyle{hang+centerlast}{\caption@makecaption{hang@centerlast}} | |
| 92 | +\newcaptionstyle{hang+flushleft}{\caption@makecaption{hang@flushleft}} | |
| 93 | +\newcaptionstyle{indent}{\caption@makecaption{indent}} | |
| 94 | +\newcommand*\captionstyle[1]{% | |
| 95 | + \expandafter\ifx\csname caption@@#1\endcsname\relax | |
| 96 | + \PackageError{caption2}{Undefined caption style `#1'}{\caption@eh}% | |
| 97 | + \else | |
| 98 | + \def\caption@style{#1}% | |
| 99 | + \fi} | |
| 100 | +\DeclareOption{normal}{\captionstyle{normal}} | |
| 101 | +\DeclareOption{center}{\captionstyle{center}} | |
| 102 | +\DeclareOption{centerlast}{\captionstyle{centerlast}} | |
| 103 | +\DeclareOption{flushleft}{\captionstyle{flushleft}} | |
| 104 | +\DeclareOption{flushright}{\captionstyle{flushright}} | |
| 105 | +\DeclareOption{anne}{\ExecuteOptions{centerlast}} | |
| 106 | +\DeclareOption{hang}{\captionstyle{hang}} | |
| 107 | +\DeclareOption{hang+center}{\captionstyle{hang+center}} | |
| 108 | +\DeclareOption{hang+centerlast}{\captionstyle{hang+centerlast}} | |
| 109 | +\DeclareOption{hang+flushleft}{\captionstyle{hang+flushleft}} | |
| 110 | +\DeclareOption{isu}{\ExecuteOptions{hang}} | |
| 111 | +\DeclareOption{indent}{\captionstyle{indent}} | |
| 112 | +\DeclareOption{scriptsize}{\g@addto@macro\captionsize\scriptsize} | |
| 113 | +\DeclareOption{footnotesize}{\g@addto@macro\captionsize\footnotesize} | |
| 114 | +\DeclareOption{small}{\g@addto@macro\captionsize\small} | |
| 115 | +\DeclareOption{normalsize}{\g@addto@macro\captionsize\normalsize} | |
| 116 | +\DeclareOption{large}{\g@addto@macro\captionsize\large} | |
| 117 | +\DeclareOption{Large}{\g@addto@macro\captionsize\Large} | |
| 118 | +\DeclareOption{up}{\g@addto@macro\captionlabelfont\upshape} | |
| 119 | +\DeclareOption{it}{\g@addto@macro\captionlabelfont\itshape} | |
| 120 | +\DeclareOption{sl}{\g@addto@macro\captionlabelfont\slshape} | |
| 121 | +\DeclareOption{sc}{\g@addto@macro\captionlabelfont\scshape} | |
| 122 | +\DeclareOption{md}{\g@addto@macro\captionlabelfont\mdseries} | |
| 123 | +\DeclareOption{bf}{\g@addto@macro\captionlabelfont\bfseries} | |
| 124 | +\DeclareOption{rm}{\g@addto@macro\captionlabelfont\rmfamily} | |
| 125 | +\DeclareOption{sf}{\g@addto@macro\captionlabelfont\sffamily} | |
| 126 | +\DeclareOption{tt}{\g@addto@macro\captionlabelfont\ttfamily} | |
| 127 | +\DeclareOption{oneline}{\onelinecaptionstrue} | |
| 128 | +\DeclareOption{nooneline}{\onelinecaptionsfalse} | |
| 129 | +\newcommand*\caption@package[1]{\@namedef{caption@pkt@#1}} | |
| 130 | +\DeclareOption{float}{\caption@twozerofalse\caption@package{float}{1}} | |
| 131 | +\DeclareOption{longtable}{\caption@twozerofalse\caption@package{longtable}{1}} | |
| 132 | +\DeclareOption{subfigure}{\caption@twozerofalse\caption@package{subfigure}{1}} | |
| 133 | +\DeclareOption{none}{\caption@twozerofalse | |
| 134 | + \caption@package{float}{0}\caption@package{longtable}{0}% | |
| 135 | + \caption@package{subfigure}{0}} | |
| 136 | +\DeclareOption{all}{\ExecuteOptions{float,longtable,subfigure}} | |
| 137 | +\DeclareOption{ruled}{} | |
| 138 | +\DeclareOption{ignoreLTcapwidth}{\ignoreLTcapwidthtrue} | |
| 139 | +\DeclareOption{debug}{\caption@debugtrue} | |
| 140 | +\newif\ifcaption@debug | |
| 141 | +\newif\ifcaption@twozero | |
| 142 | +\normalcaptionparams | |
| 143 | +\ExecuteOptions{none,normal} | |
| 144 | +\caption@twozerotrue | |
| 145 | +\ProcessOptions* | |
| 146 | +\ifcaption@twozero | |
| 147 | + \PackageInfo{caption2}{Running in caption2 v2.0 compatibility mode} | |
| 148 | +\fi | |
| 149 | +\def\captionof{\@ifstar{\caption@of{\caption*}}{\caption@of\caption}} | |
| 150 | +\newcommand*\caption@of[2]{\def\@captype{#2}#1} | |
| 151 | +\@ifundefined{abovecaptionskip}{% | |
| 152 | + \newlength\abovecaptionskip\setlength\abovecaptionskip{10\p@}}{} | |
| 153 | +\@ifundefined{belowcaptionskip}{% | |
| 154 | + \newlength\belowcaptionskip\setlength\belowcaptionskip{0\p@}}{} | |
| 155 | +\newdimen\captionlinewidth | |
| 156 | +\renewcommand\@makecaption[2]{% | |
| 157 | + \vskip\abovecaptionskip | |
| 158 | + \captionlinewidth\hsize | |
| 159 | + \def\captionlabel{#1}% | |
| 160 | + \def\captiontext{#2}% | |
| 161 | + \usecaptionstyle{\caption@style}% | |
| 162 | + \vskip\belowcaptionskip} | |
| 163 | +\newcommand*\usecaptionstyle[1]{% | |
| 164 | + \ifx\captiontext\relax | |
| 165 | + \PackageError{caption2}{You can't use \protect#1 | |
| 166 | + in normal text}{The usage of \protect#1 is only | |
| 167 | + allowed inside code declared with\MessageBreak \protect\defcaptionstyle, | |
| 168 | + \protect\newcaptionstyle \space or \protect\renewcaptionstyle. | |
| 169 | + \space\caption@eh} | |
| 170 | + \else | |
| 171 | + \@ifundefined{caption@@#1}% | |
| 172 | + {\PackageError{caption2}{Caption style `#1' undefined}{\caption@eh}}% | |
| 173 | + {\@nameuse{caption@@#1}} | |
| 174 | + \fi} | |
| 175 | +\newcommand*\caption@makecaption[1]{% | |
| 176 | + \ifcaptionlabel | |
| 177 | + \def\caption@label{{\captionlabelfont\captionlabel\captionlabeldelim}\captionlabelsep}% | |
| 178 | + \else | |
| 179 | + \let\caption@label\@empty | |
| 180 | + \fi | |
| 181 | + \usecaptionmargin\captionfont | |
| 182 | + \onelinecaption{\caption@label\captiontext}% | |
| 183 | + {\@nameuse{caption@@@#1}}} | |
| 184 | +\newcommand*\caption@@@normal{% | |
| 185 | + \caption@label\captiontext\par} | |
| 186 | +\newcommand*\caption@@@center{% | |
| 187 | + \centering\caption@label\captiontext\par}% | |
| 188 | +\newcommand*\caption@centerlast{% | |
| 189 | + \advance\leftskip by 0pt plus 1fil% | |
| 190 | + \advance\rightskip by 0pt plus -1fil% | |
| 191 | + \parfillskip0pt plus 2fil\relax} | |
| 192 | +\newcommand*\caption@@@centerlast{% | |
| 193 | + \caption@centerlast\caption@label\captiontext\par} | |
| 194 | +\newcommand*\caption@@@flushleft{% | |
| 195 | + \raggedright\caption@label\captiontext\par}% | |
| 196 | +\newcommand*\caption@@@flushright{% | |
| 197 | + \raggedleft\caption@label\captiontext\par}% | |
| 198 | +\newcommand*\caption@@@hang{% | |
| 199 | + \sbox\@tempboxa{\caption@label}% | |
| 200 | + \hangindent\wd\@tempboxa\noindent | |
| 201 | + \usebox\@tempboxa\caption@hangplus\captiontext\par} | |
| 202 | +\newcommand*\caption@hangplus{} | |
| 203 | +\newcommand*\caption@@@hang@center{% | |
| 204 | + \let\caption@hangplus\centering\caption@@@hang} | |
| 205 | +\newcommand*\caption@@@hang@centerlast{% | |
| 206 | + \let\caption@hangplus\caption@centerlast\caption@@@hang} | |
| 207 | +\newcommand*\caption@@@hang@flushleft{% | |
| 208 | + \let\caption@hangplus\raggedright\caption@@@hang} | |
| 209 | +\newcommand*\caption@@@indent{% | |
| 210 | + \hangindent\captionindent\noindent | |
| 211 | + \caption@label\captiontext\par} | |
| 212 | +\newcommand\onelinecaption[1]{% | |
| 213 | + \let\next\@firstofone | |
| 214 | + \ifonelinecaptions | |
| 215 | + \sbox\@tempboxa{#1}% | |
| 216 | + \ifdim\wd\@tempboxa >\captionlinewidth | |
| 217 | + \else | |
| 218 | + \def\next{{\centering\usebox{\@tempboxa}\par}\@gobble}% | |
| 219 | + \fi | |
| 220 | + \fi\next} | |
| 221 | +\newcommand*\usecaptionmargin{% | |
| 222 | + \ifcaptionwidth | |
| 223 | + \leftskip\captionlinewidth | |
| 224 | + \advance\leftskip by -\captionwidth | |
| 225 | + \divide\leftskip by 2 | |
| 226 | + \rightskip\leftskip | |
| 227 | + \captionlinewidth\captionwidth | |
| 228 | + \else | |
| 229 | + \leftskip\captionmargin | |
| 230 | + \rightskip\captionmargin | |
| 231 | + \advance\captionlinewidth by -2\captionmargin | |
| 232 | + \fi} | |
| 233 | +\renewcommand*\caption@package[3]{% | |
| 234 | + \if1\@nameuse{caption@pkt@#1}% | |
| 235 | + \@ifundefined{#2}% | |
| 236 | + {\let\next\AtBeginDocument}% | |
| 237 | + {\let\next\@firstofone}% | |
| 238 | + \else | |
| 239 | + \ifcaption@twozero | |
| 240 | + \@ifundefined{#2}{#3\let\next\@gobble}{% | |
| 241 | + \PackageWarning{caption2}{% | |
| 242 | + The `#1' package will be supported without explicit option % | |
| 243 | + (v2.0 compatibility issue)}% | |
| 244 | + \let\next\@firstofone}% | |
| 245 | + \else | |
| 246 | + #3\let\next\@gobble | |
| 247 | + \fi | |
| 248 | + \fi | |
| 249 | + \expandafter\let\csname caption@pkt@#1\endcsname\undefined | |
| 250 | + \ifcaption@debug | |
| 251 | + \ifx\next\@gobble\PackageInfo{caption2}{#1 => gobble}% | |
| 252 | + \else\ifx\next\@firstofone\PackageInfo{caption2}{#1 => firstofone}% | |
| 253 | + \else\ifx\next\AtBeginDocument\PackageInfo{caption2}{#1 => AtBeginDocument}% | |
| 254 | + \else\PackageInfo{caption2}{#1 => ???}\fi\fi\fi | |
| 255 | + \fi | |
| 256 | + \next} | |
| 257 | +\caption@package{float}{floatc@plain}{}{% | |
| 258 | + \ifx\floatc@plain\relax | |
| 259 | + \PackageWarning{caption2}{% | |
| 260 | + Option `float' was set but there is no float package loaded} | |
| 261 | + \else | |
| 262 | + \PackageInfo{caption2}{float package v1.2 (or newer) detected} | |
| 263 | + \newcommand\caption@floatc[3]{% | |
| 264 | + \ifx\captionlabelfont\@empty | |
| 265 | + \let\captionlabelfont\@fs@cfont | |
| 266 | + \fi | |
| 267 | + \captionlinewidth\hsize | |
| 268 | + \def\captionlabel{#2}% | |
| 269 | + \def\captiontext{#3}% | |
| 270 | + \usecaptionstyle{#1}} | |
| 271 | + \renewcommand*\floatc@plain{\caption@floatc{\caption@style}} | |
| 272 | + \@ifpackagewith{caption2}{ruled}{% | |
| 273 | + \dummycaptionstyle{ruled}{\onelinecaptionsfalse\setcaptionmargin{\z@}}% | |
| 274 | + }{% | |
| 275 | + \newcaptionstyle{ruled}{% | |
| 276 | + \ifcaptionlabel | |
| 277 | + {\@fs@cfont\captionlabel}\space% | |
| 278 | + \fi\captiontext\par}% | |
| 279 | + } | |
| 280 | + \renewcommand*\floatc@ruled{\caption@floatc{ruled}} | |
| 281 | + \renewcommand*\caption@of[2]{\def\@captype{#2}% | |
| 282 | + \@ifundefined{fst@#2}{}{% | |
| 283 | + \@nameuse{fst@#2}% | |
| 284 | + \@ifundefined{@float@setevery}{}{\@float@setevery{#2}}% | |
| 285 | + \let\caption@fs@capt\@fs@capt | |
| 286 | + \let\@fs@capt\caption@of@float} | |
| 287 | + #1} | |
| 288 | + \newcommand\caption@of@float[2]{\egroup | |
| 289 | + \vskip\abovecaptionskip | |
| 290 | + \normalsize\caption@fs@capt{#1}{#2}% | |
| 291 | + \vskip\belowcaptionskip | |
| 292 | + \bgroup}% | |
| 293 | + \fi} | |
| 294 | +\caption@package{longtable}{LT@makecaption}{}{% | |
| 295 | + \ifx\LT@makecaption\relax | |
| 296 | + \PackageWarning{caption2}{% | |
| 297 | + Option `longtable' was set but there is no longtable package loaded} | |
| 298 | + \else | |
| 299 | + \PackageInfo{caption2}{longtable package v3.15 (or newer) detected} | |
| 300 | + \dummycaptionstyle{longtable}{} | |
| 301 | + \renewcommand\LT@makecaption[3]{% | |
| 302 | + \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\hsize{% | |
| 303 | + \ifignoreLTcapwidth | |
| 304 | + \else | |
| 305 | + \setcaptionwidth\LTcapwidth | |
| 306 | + \fi | |
| 307 | + \captionlinewidth\hsize | |
| 308 | + \captionlabelfalse#1\captionlabeltrue | |
| 309 | + \def\captionlabel{#2}% | |
| 310 | + \def\captiontext{#3}% | |
| 311 | + \usecaptionstyle{longtable}% | |
| 312 | + \endgraf\vskip\baselineskip}% | |
| 313 | + \hss}}} | |
| 314 | + \fi} | |
| 315 | +\newcommand*\setsubcapstyle{% | |
| 316 | + \@ifundefined{subcapraggedrightfalse}{% | |
| 317 | + \newif\ifsubcapraggedright}{}% | |
| 318 | + \ifsubcaphang | |
| 319 | + \ifsubcapcenter | |
| 320 | + \subcapstyle{hang+center}% | |
| 321 | + \else\ifsubcapcenterlast | |
| 322 | + \subcapstyle{hang+centerlast}% | |
| 323 | + \else\ifsubcapraggedright | |
| 324 | + \subcapstyle{hang+flushleft}% | |
| 325 | + \else | |
| 326 | + \subcapstyle{hang}% | |
| 327 | + \fi\fi\fi | |
| 328 | + \else\ifsubcapcenter | |
| 329 | + \subcapstyle{center}% | |
| 330 | + \else\ifsubcapcenterlast | |
| 331 | + \subcapstyle{centerlast}% | |
| 332 | + \else\ifsubcapraggedright | |
| 333 | + \subcapstyle{flushleft}% | |
| 334 | + \else | |
| 335 | + \subcapstyle{normal}% | |
| 336 | + \fi\fi\fi\fi} | |
| 337 | +\newcommand\caption@makesubcaption[2]{% | |
| 338 | + \renewcommand*\captionfont{\subcapsize\subcapfont}% | |
| 339 | + \renewcommand*\captionlabelfont{\normalfont\subcapsize\subcaplabelfont}% | |
| 340 | + \let\captionlabeldelim\subcaplabeldelim | |
| 341 | + \let\captionlabelsep\subcaplabelsep | |
| 342 | + \ifsubfigcapwidth\captionwidthtrue\else\captionwidthfalse\fi | |
| 343 | + \setlength\captionmargin\subfigcapmargin | |
| 344 | + \setlength\captionwidth\subfigcapwidth | |
| 345 | + \captionindent\subcapindent | |
| 346 | + \ifsubcapnooneline\onelinecaptionsfalse\else\onelinecaptionstrue\fi | |
| 347 | + \hbox to\@tempdima{% | |
| 348 | + \caption@subfig@hss\parbox[t]{\@tempdima}{% | |
| 349 | + \captionlinewidth\@tempdima | |
| 350 | + \captionlabeltrue | |
| 351 | + \def\captionlabel{#1}% | |
| 352 | + \def\captiontext{\ignorespaces #2}% | |
| 353 | + \usecaptionstyle{\caption@substyle}}% | |
| 354 | + \caption@subfig@hss}} | |
| 355 | +\caption@package{subfigure}{@makesubfigurecaption}{% | |
| 356 | + \let\setsubcapstyle\undefined | |
| 357 | + \let\caption@makesubcaption\undefined}{% | |
| 358 | + \ifx\@makesubfigurecaption\relax | |
| 359 | + \PackageWarning{caption2}{% | |
| 360 | + Option `subfigure' was set but there is no subfigure package loaded} | |
| 361 | + \let\setsubcapstyle\undefined | |
| 362 | + \let\caption@makesubcaption\undefined | |
| 363 | + \else | |
| 364 | + \ifx\subcapfont\undefined | |
| 365 | + \PackageInfo{caption2}{subfigure package v2.0 detected} | |
| 366 | + \let\subcapfont\@empty | |
| 367 | + \newcommand*\subfigcapwidth{\z@} | |
| 368 | + \newcommand*\setsubcapmargin{% | |
| 369 | + \subfigcapwidthfalse | |
| 370 | + \renewcommand*\subfigcapmargin} | |
| 371 | + \newcommand*\setsubcapwidth{% | |
| 372 | + \subfigcapwidthtrue | |
| 373 | + \renewcommand*\subfigcapwidth} | |
| 374 | + \newcommand*\subcaplabelsep{\space} | |
| 375 | + \let\caption@subfig@hss\hfil | |
| 376 | + \else | |
| 377 | + \PackageInfo{caption2}{subfigure package v2.1 (or newer) detected} | |
| 378 | + \newdimen\subfigcapwidth | |
| 379 | + \newcommand*\setsubcapmargin{% | |
| 380 | + \subfigcapwidthfalse | |
| 381 | + \setlength\subfigcapmargin} | |
| 382 | + \newcommand*\setsubcapwidth{% | |
| 383 | + \subfigcapwidthtrue | |
| 384 | + \setlength\subfigcapwidth} | |
| 385 | + \newcommand*\subcaplabelsep{\hskip\subfiglabelskip} | |
| 386 | + \let\caption@subfig@hss\hss | |
| 387 | + \fi | |
| 388 | + \newif\ifsubfigcapwidth | |
| 389 | + \newdimen\subcapindent | |
| 390 | + \newcommand*\subcaplabeldelim{} | |
| 391 | + \newcommand*\subcapstyle[1]{% | |
| 392 | + \expandafter\ifx\csname caption@@#1\endcsname\relax | |
| 393 | + \PackageError{caption2}{Undefined caption style `#1'}{\caption@eh}% | |
| 394 | + \else | |
| 395 | + \def\caption@substyle{#1}% | |
| 396 | + \fi} | |
| 397 | + \setsubcapstyle | |
| 398 | + \renewcommand*\@thesubfigure{\thesubfigure} | |
| 399 | + \renewcommand*\@thesubtable{\thesubtable} | |
| 400 | + \let\@makesubfigurecaption\caption@makesubcaption | |
| 401 | + \let\@makesubtablecaption\caption@makesubcaption | |
| 402 | + \fi} | |
| 403 | +\let\caption@package\undefined | |
| 404 | +\endinput | |
| 405 | +%% | |
| 406 | +%% End of file `caption2.sty'. | ... | ... |
| ... | ... | @@ -0,0 +1,59 @@ |
| 1 | +\section*{Introdução} | |
| 2 | +\label{sec:intro} | |
| 3 | + | |
| 4 | +O Software Público Brasileiro (SPB) é um programa do Governo Federal Brasileiro | |
| 5 | +para promover o compartilhamento e a colaboração em soluções de software | |
| 6 | +livre\footnote{Neste texto, usamos o termo software livre como referente à Free | |
| 7 | +and Open Source Software (FOSS).} para a administração pública. Um Software | |
| 8 | +Público Brasileiro é considerado um bem público e o governo federal assume | |
| 9 | +algumas responsabilidades relacionadas ao seu uso, mas tem os mesmos princípios | |
| 10 | +de desenvolvimento de software livre, tal qual a tendência à descentralização | |
| 11 | +na tomada de decisões, o compartilhamento de informações e do desenvolvimento | |
| 12 | +(código), e a interação contínua com seus usuários. Em 2007, o governo federal | |
| 13 | +lançou o portal SPB com o objetivo de compartilhar projetos de software livre | |
| 14 | +desenvolvidos pelo governo brasileiro. Adicionalmente, a Instrução Normativa | |
| 15 | +(IN 04/2012) determina que os agentes públicos devem priorizar as soluções | |
| 16 | +disponíveis no Portal SPB. Em suma, a aquisição de uma solução proprietária | |
| 17 | +deve ser explicitamente justificada ao demonstrar que não há alternativa | |
| 18 | +adequada no Portal SPB. | |
| 19 | + | |
| 20 | +Entretanto, desde 2009, o Portal SPB teve vários problemas técnicas. O código | |
| 21 | +original da plataforma não estava mais sendo desenvolvido, e havia uma grande | |
| 22 | +quantidade de dívidas técnicas para superar. Depois de alguns eventos e | |
| 23 | +encontros para coletar os requisitos via os agentes do governo federal e da | |
| 24 | +sociedade, foi desenvolvida, entre janeiro de 2014 e junho de 2016, uma nova | |
| 25 | +plataforma para o Portal SPB, pela Universidade de Brasília (UnB) e a | |
| 26 | +Universidade de São Paulo (USP) em parceria com o Ministério de Orçamento, | |
| 27 | +Planejamento e Gestão (MP). Este foi projetado como uma plataforma integrada | |
| 28 | +para desenvolvimento de software colaborativo, e inclui funcionalidades para | |
| 29 | +redes sociais, listas de discussão, sistema de controle de versão e | |
| 30 | +monitoramento de qualidade de código-fonte. Para coordenar e desenvolver esse | |
| 31 | +projeto durante 30 meses, a UnB recebeu do Governo Federal Brasileiro um total | |
| 32 | +de 2.619.965,00 reais. | |
| 33 | + | |
| 34 | +O projeto foi desenvolvido por uma equipe de 3 professores, 2 estudantes de | |
| 35 | +mestrado e cerca de 50 alunos de graduação (não todos ao mesmo tempo), | |
| 36 | +juntamente com 2 designers profissionais e 6 desenvolvedores sêniors da | |
| 37 | +comunidade software livre. Os professores e todos os estudantes de graduação | |
| 38 | +eram da UnB e os mestrandos eram da USP. Quanto aos designers e desenvolvedores | |
| 39 | +seniores, 7 dos 8 viviam fora de Brasília. Em outras palavras, nós tínhamos uma | |
| 40 | +equipe trabalhando em um ambiente virtual colaborativo e distribuído. | |
| 41 | + | |
| 42 | +Todo o desenvolvimento foi feito de forma aberta, e as mudanças que | |
| 43 | +precisávamos nas ferramentas foram devolvidas às suas respectivas comunidades. | |
| 44 | +Nosso processo foi baseado em práticas ágeis e nos mecanismos empíricos das | |
| 45 | +comunidades de software livre. Definimos ciclos de desenvolvimento e lançamos 5 | |
| 46 | +versões do novo SPB Portal. A primeira versão (beta) foi disponibilizada em | |
| 47 | +setembro de 2014, apenas 9 meses desde o início do projeto. O antigo portal foi | |
| 48 | +desligado em setembro de 2015. Por fim, a última versão foi entregue em junho | |
| 49 | +de 2016. | |
| 50 | + | |
| 51 | +Neste relato temos como agenda apresentarmos uma visão geral dessa nova geração | |
| 52 | +do Portal SPB, bem como, compartilharmos nossa metodologia e processo de | |
| 53 | +desenvolvimento desse projeto ao trabalharmos com o governo federal brasileiro | |
| 54 | +para cumprir suas exigências, ao mesmo tempo ser o mais fiel possível às | |
| 55 | +comunidades de software livre envolvidas. Além disso, discutiremos várias | |
| 56 | +lições aprendidas para fornecer um ambiente virtual colaborativo e distribuído, | |
| 57 | +envolvendo uma grande equipe de estudantes de graduação e desenvolvedores | |
| 58 | +sêniors remotos. | |
| 59 | + | ... | ... |
| ... | ... | @@ -0,0 +1,69 @@ |
| 1 | +\section{Visão geral do novo portal SPB} | |
| 2 | +\label{sec:architecture} | |
| 3 | + | |
| 4 | +Com base na extensa lista de requisitos funcionais definidos pelo Governo | |
| 5 | +Federal do Brasil, selecionamos alguns sistemas livres compor a solução | |
| 6 | +proposta para o novo SPB. Avaliamos os sistemas que juntos poderiam fornecer o | |
| 7 | +maior sub-conjunto possível dos requisitos. Nós também estávamos convencidos de | |
| 8 | +que seria impossível fornecer todas as funcionalidade com uma única ferramenta. | |
| 9 | + | |
| 10 | +Do ponto de vista da arquitetura, dois requisitos eram importantes para a nova | |
| 11 | +plataforma: | |
| 12 | + | |
| 13 | +\begin{enumerate} | |
| 14 | +\item \textit{Integrar sistemas livres existentes}, com diferenças mínimas de suas versões originais; | |
| 15 | +\item \textit{Fornecer uma interface de usuário unificada} entre os diferentes sistemas, bem como a autenticação centralizada. | |
| 16 | +\end{enumerate} | |
| 17 | + | |
| 18 | +A adoção de sistemas livres existentes e a minimização de mudanças feitas | |
| 19 | +localmente tiveram como objetivo ser capazes de atualizar para versões mais | |
| 20 | +recentes do software original, nos beneficiando pelas melhorias e manutenção feitas | |
| 21 | +pelas comunidades de projetos existentes. Proporcionar uma interface de usuário | |
| 22 | +consistente em cima dessas diferentes ferramentas era necessária para fazer a | |
| 23 | +transição entre os diferentes sistemas sem a percepção do ponto de vista dos | |
| 24 | +usuários, ou seja, sem confundí-lo através de interfaces completamente | |
| 25 | +diferentes ao interagir com o portal. | |
| 26 | + | |
| 27 | +Para o primeiro requisito, identificamos quatro sistemas principais que exigiam | |
| 28 | +equipes especializadas para o trabalho no processo de integração. As equipes | |
| 29 | +aprenderam a desenvolver para os sistemas designados e contribuíram para as | |
| 30 | +comunidades originais, de modo que a versão que usamos não era | |
| 31 | +significativamente diferente do original. | |
| 32 | + | |
| 33 | +Ao final do projeto, o portal SPB foi composto por mais de dez sistemas, como | |
| 34 | +Colab, Noosfero, Mezuro, Gitlab, Mailman, Postfix e Munin. A seguir | |
| 35 | +apresentamos os mais relevantes, bem como como eles foram integrados na | |
| 36 | +plataforma. | |
| 37 | + | |
| 38 | +\begin{itemize} | |
| 39 | + | |
| 40 | +\item \textbf{Colab\footnote{\url{https://github.com/colab}}:} é uma plataforma | |
| 41 | +de integração de sistemas para aplicações web. Um de seus objetivos é permitir | |
| 42 | +que diferentes aplicações sejam combinadas de tal forma que um usuário não note | |
| 43 | +a mudança entre as aplicações. Para isso, o Colab oferece autenticação | |
| 44 | +centralizada, consistência visual, retransmissão de eventos entre aplicações e | |
| 45 | +mecanismo de busca integrado. | |
| 46 | + | |
| 47 | +\item \textbf{Noosfero\footnote{\url{http://noosfero.org}}:} é um software para | |
| 48 | +redes sociais e de colaboração. Além dos recursos clássicos de redes sociais, | |
| 49 | +ele também fornece recursos de publicação de conteúdo, como blogs e CMS | |
| 50 | +(\textit{Content Management System}) de propósito geral. A maioria das | |
| 51 | +interações do usuário com o novo SPB são através do Noosfero: registro do usuário, | |
| 52 | +páginas do projeto e de documentação e formulários de contato. | |
| 53 | + | |
| 54 | +\item \textbf{Gitlab\footnote{\url{http://gitlab.com}}:} é um gerenciador web | |
| 55 | +de repositórios Git com páginas wiki e recursos de \textit{issue tracker}. O | |
| 56 | +Gitlab é uma plataforma livre e se concentra em oferecer uma solução para | |
| 57 | +desenvolvimento colaborativo em torno do repositório. | |
| 58 | + | |
| 59 | +\item \textbf{Mezuro\footnote{\url{http://mezuro.org/}}:} é uma plataforma para | |
| 60 | +coletar métricas de código-fonte com o objetivo de monitorar a qualidade | |
| 61 | +interna de projetos de software livre escrito em C, C ++, Java, Python, Ruby ou | |
| 62 | +PHP. | |
| 63 | + | |
| 64 | +\end{itemize} | |
| 65 | + | |
| 66 | +Do ponto de vista prático, a plataforma SPB foi implantada em 7 máquinas | |
| 67 | +virtuais com diferentes | |
| 68 | +funções\footnote{\url{https://softwarepublico.gov.br/doc/arquitetura.html}}. | |
| 69 | + | ... | ... |
| ... | ... | @@ -0,0 +1,175 @@ |
| 1 | +\section{Processo e organização do desenvolvimento} | |
| 2 | +\label{sec:process} | |
| 3 | + | |
| 4 | +A nossa equipe de desenvolvimento era composta por profissionais com diferentes | |
| 5 | +níveis e habilidades, sendo a maioria deles estudantes de graduação de | |
| 6 | +engenharia de software (a partir do 4º semestre de curso). Uma vez que os | |
| 7 | +alunos não podiam dedicar muitas horas por semana ao projeto, eles sempre | |
| 8 | +tiveram a flexibilidade para negociar seus horários de trabalho durante o | |
| 9 | +semestre, a fim de não prejudicar a sua formação. Sua rotina de trabalho diária | |
| 10 | +no projeto incluiu programação e tarefas de DevOps (contabilizando 16 | |
| 11 | +horas-semanais). | |
| 12 | + | |
| 13 | +O desenvolvimento do projeto SPB exigiu uma vasta experiência, que os alunos de | |
| 14 | +graduação geralmente ainda não têm. Por essa razão, alguns desenvolvedores | |
| 15 | +sênior se juntaram ao projeto para ajudar com as questões mais difíceis e | |
| 16 | +transferir conhecimento aos alunos. Sua principal tarefa era fornecer soluções | |
| 17 | +para problemas complexos. Como esses profissionais são muito hábeis e o projeto | |
| 18 | +não poderia financiar um trabalho de tempo integral, eles trabalharam | |
| 19 | +parcialmente no projeto (20 horas-semanais). Além disso, eles viviam em estados | |
| 20 | +diferentes espalhados pelo Brasil, ou até outros países, o que levou muita da | |
| 21 | +comunicação a ser on-line. | |
| 22 | + | |
| 23 | +Em resumo, nosso processo de trabalho foi baseado em práticas de | |
| 24 | +desenvolvimento de software livre e colaborativo. O processo de | |
| 25 | +desenvolvimento foi definido com base na adaptação de diferentes práticas ágeis e de software livre, destacando o alto grau de automação | |
| 26 | +resultante das práticas de DevOps. Assim, o processo de trabalho foi executado | |
| 27 | +de forma cadenciada e contínua. | |
| 28 | + | |
| 29 | +Finalmente, o último grupo de participantes desse projeto foi composto por | |
| 30 | +funcionários do Ministério | |
| 31 | +do Planejamento, Desenvolvimento e Gestão (MP). Todas as decisões do projeto, | |
| 32 | +validações e definições de escopo foram feitas com eles. Dessa forma, | |
| 33 | +desenvolvemos produtos de software de forma incremental, com lançamentos | |
| 34 | +alinhados aos objetivos estratégicos do negócio. Como se pode ver, o projeto | |
| 35 | +tinha muitos tipos diferentes de \textit{stakeholders} que tinham de ser | |
| 36 | +organizados e sincronizados. | |
| 37 | + | |
| 38 | +\subsection{Organização da equipe} | |
| 39 | + | |
| 40 | +Aproximadamente 70\% das equipes de desenvolvimento foram compostas por | |
| 41 | +estudantes de engenharia de software da UnB e que trabalharam fisicamente no mesmo | |
| 42 | +laboratório. Cada aluno tinha seu próprio horário baseado em suas aulas, o que | |
| 43 | +complicava a implementação da programação em pares. Os desenvolvedores sênior | |
| 44 | +tentavam sincronizar sua agenda com os alunos em sua sub-equipe. Para lidar com | |
| 45 | +esse ambiente, tivemos algumas regras básicas que guiaram a organização do | |
| 46 | +projeto: | |
| 47 | + | |
| 48 | +\begin{enumerate} | |
| 49 | +\item As aulas têm alta prioridade para estudantes de graduação; | |
| 50 | +\item Trabalhe em pares sempre que possível (local com os demais estudantes ou | |
| 51 | + remotamente com um sênior). | |
| 52 | +\item Deve haver uma manhã ou uma tarde por semana quando \emph{todos} deverem | |
| 53 | + estar juntos fisicamente no laboratório (exceto, é claro, os membros da | |
| 54 | + equipe remota, mas que estarão on-line). | |
| 55 | +\item A cada 2 ou 3 meses, os desenvolvedores sêniors (residentes no Brasil) | |
| 56 | + voaria e trabalharia ao lado dos alunos por uma semana. | |
| 57 | +\end{enumerate} | |
| 58 | + | |
| 59 | +Com as regras acima, dividimos todo o projeto em quatro equipes diferentes: | |
| 60 | +Colab, Noosfero, Design e DevOps. Cada equipe tinha um líder (\textit{coach}) | |
| 61 | +responsável por reduzir o problema de comunicação com as outras equipes e | |
| 62 | +ajudar os membros a se organizar da melhor maneira para todos (sempre | |
| 63 | +respeitando seu tempo de trabalho). O \textit{coach} sempre foi um dos alunos | |
| 64 | +que trabalhava como desenvolvedor na equipe com o dever extra de registar as | |
| 65 | +tarefas atuais desenvolvidas na iteração (\textit{sprint}) e com a | |
| 66 | +responsabilidade de conversar com outras equipes. Uma coisa importante a | |
| 67 | +observar é a mutabilidade da equipe e do \textit{coach}, pois durante o projeto | |
| 68 | +muitos alunos mudaram de equipes para tentar ter diferentes experiências em | |
| 69 | +diversas áreas. | |
| 70 | + | |
| 71 | +Uma característica das equipes foi a presença de (pelo menos) um sênior por | |
| 72 | +equipe. Isso era essencial, porque as decisões difíceis e os problemas | |
| 73 | +complexos, geralmente, foram resolvidos ao consultá-los. Essa dinâmica | |
| 74 | +incentivamos aos demais alunos a terem o mesmo compartamento do \textit{coach} | |
| 75 | +mesmo sem serem. Por fim, os desenvolvedores sêniors trabalharam diretamente | |
| 76 | +com os alunos, e isso foi importante para dar ao graduando a oportunidade de | |
| 77 | +interagir com profissionais experientes em sua área e manter o conhecimento | |
| 78 | +fluindo no projeto. | |
| 79 | + | |
| 80 | +Por fim, tivemos ainda dois últimos elementos da organização da equipe que | |
| 81 | +foram essenciais para a harmonia do projeto: o \textit{meta-coach} e | |
| 82 | +professores. O primeiro era um engenheiro de software recentemente graduado | |
| 83 | +(nossos ex-alunos) e que queria continuar trabalhando no projeto; estes últimos | |
| 84 | +eram professores que orquestraram todas as interações entre todos os membros do | |
| 85 | +projeto, inclusive do governo federal. O \textit{meta-coach} normalmente | |
| 86 | +trabalhava em uma equipe específica e tinha a tarefa extra de conhecer o estado | |
| 87 | +atual de todas as equipes. Os professores e \textit{meta-coach} trabalharam | |
| 88 | +juntos para reduzir o problema de comunicação entre todas as equipes (o que | |
| 89 | +tornava-se mais complexo conforme a evolução do volume de trabalho). Por | |
| 90 | +último, todas as tarefas burocráticas, como a elaboração de relatórios sobre o | |
| 91 | +progresso do projeto para o Ministério, foi tratada pelos professores, mas com | |
| 92 | +o envolvimento de toda a equipe. | |
| 93 | + | |
| 94 | +\subsection{Comunicação e gestão das tarefas} | |
| 95 | + | |
| 96 | +Nossa equipe tinha muitas pessoas trabalhando em conjunto, e a maioria dos | |
| 97 | +sêniors trabalhavam remotamente. Além disso, tentamos manter nosso trabalho | |
| 98 | +completamente transparente para o governo brasileiro e os cidadãos interessados | |
| 99 | +em seguir o projeto. Para lidar com esses casos, usamos um conjunto de | |
| 100 | +ferramentas de comunicação e outras para gerenciar o projeto. | |
| 101 | + | |
| 102 | +Quando um aluno tinha que trabalhar em par com um sênior, normalmente, eles | |
| 103 | +usavam o hangout do Google para a comunicação e eles compartilhavam uma sessão | |
| 104 | +de terminal GNU/Linux com o tmate, o que lhes permitia compartilhar o mesmo | |
| 105 | +editor, com ambos digitando e vendo a tela. Para perguntas e discussão rápida, | |
| 106 | +usamos o IRC. Para a notificação geral, usamos as listas de discussão. | |
| 107 | + | |
| 108 | +Para a gestão do projeto utilizávamos o próprio portal SPB; Primeiro para | |
| 109 | +validá-lo por nós mesmos, e também porque ele tem todas as ferramentas | |
| 110 | +necessárias para o nosso projeto. Basicamente, criamos uma página Wiki, no | |
| 111 | +Gitlab integrado ao SPB, com um mapeamento entre as visões estratégica, tática | |
| 112 | +e operacional. Do ponto de vista prático, um ``milestone'' no GitLab era uma | |
| 113 | +``História de Usuário" (funcionalidade) e um ou mais ``issues'' no GitLab era | |
| 114 | +as tarefas para o desenvolvimento da funcionalidade em questão. Com essa | |
| 115 | +abordagem, conseguimos dois objetivos importantes: manter toda a gestão o mais | |
| 116 | +próximo possível do código-fonte e acompanhar cada funcionalidade desenvolvida | |
| 117 | +durante o projeto (uma vez que nós mesmo nos tornamos usuários reais da | |
| 118 | +plataforma). | |
| 119 | + | |
| 120 | +\subsection{Acompanhamento e gerenciamento de projeto de alto nível} | |
| 121 | + | |
| 122 | +O governo brasileiro costuma trabalhar com o desenvolvimento de software de uma | |
| 123 | +forma mais tradicional, diferentemente de nós com métodos ágeis e software | |
| 124 | +livre. Essa dissonância nos causou um ruído de comunicação com o governo. Foi | |
| 125 | +especialmente difícil convencê-los a aceitar a ideia de escopo aberto e | |
| 126 | +desenvolvimento ágil. Entretanto, depois de meses de trabalho e mostrando | |
| 127 | +resultados, eles deixaram de resistir aos métodos empíricos. | |
| 128 | + | |
| 129 | +Definimos algum nível de granularidade de reunião para evitar gerar demasiada | |
| 130 | +sobrecarga para os desenvolvedores. Tínhamos reuniões estratégica mensal e | |
| 131 | +reuniões planejamento e revisão a cada 15 dias. Na reunião estratégica, | |
| 132 | +geralmente, definimos as prioridades e as funcionalidades importantes para o | |
| 133 | +governo. Normalmente, os professores, os \textit{coaches} de cada equipe, os | |
| 134 | +\textit{meta-coaches} e alguns analistas do Ministério do Planejamento | |
| 135 | +participavam dessa reunião. Em geral, discutíamos o que a equipe já produziu | |
| 136 | +desde nossa última reunião e definíamos as funcionalidades para a próxima | |
| 137 | +versão. Observe que apenas parte da equipe participava dessas reuniões | |
| 138 | +estratégicas, mas todos os estudantes interessados estavam convidados a | |
| 139 | +participar (pois muitos estudantes quiseram essa experiência durante o | |
| 140 | +projeto). | |
| 141 | + | |
| 142 | +Depois dos encontros estratégicos com os principais atores envolvidos do | |
| 143 | +governo, tínhamos um turno de planejamento com todas as equipes juntas. Nessa | |
| 144 | +parte, cada equipe trabalhava junto para converter os requisitos em partes | |
| 145 | +menores (histórias de usuário) que era representadas como ``Épicos'' da | |
| 146 | +``release'' em desenvolvimento. Cada \textit{coach} era responsável pela | |
| 147 | +condução do planejamento, e depois a equipe toda a registrava na página wiki do | |
| 148 | +projeto (wiki fornecido pelo Gitlab do SPB). Baseado nos ``épicos'', a cada 15 | |
| 149 | +dias a equipe gerava um o planejamento da iteração/ciclo de desenvolvimento | |
| 150 | +(com os pequenos passos dos problemas mapeados). Para manter o governo | |
| 151 | +brasileiro sempre atualizado, convidávamos-os a trabalhar conosco para validar | |
| 152 | +as funcionalidades em desenvolvimento. Para isso, tínhamos uma reunião a cada | |
| 153 | +15 dia. E para manter nosso fluxo de gestão de tarefas, usando a própria | |
| 154 | +plataforma do SPB, especialmente o Gitlab, tínhamos: | |
| 155 | + | |
| 156 | +\begin{enumerate} | |
| 157 | + | |
| 158 | +\item Temos uma organização com muitos repositórios para cada ferramenta | |
| 159 | +integrada e sub-sistema; | |
| 160 | + | |
| 161 | +\item Cada \textit{milestone} foi usado para registrar uma história de usuário; | |
| 162 | + | |
| 163 | +\item Cada \textit{release} tem uma página no wiki com a compilação da reunião | |
| 164 | +estratégica e o mapeamento sistemático das funcionalidades planejadas; | |
| 165 | + | |
| 166 | +\item Para cada \textit{milestone} (história de usuário) tem um conjunto de | |
| 167 | +\textit{issues} (tarefas) específicas, que também são mapeadas na wiki da | |
| 168 | +\textit{release}, indicando qual dupla de desenvolvedores está trabalhando na | |
| 169 | +\textit{issue} em questão. | |
| 170 | + | |
| 171 | +\end{enumerate} | |
| 172 | + | |
| 173 | +Em suma, esse fluxo de trabalho proporcionou a nós e aos participantes pelo | |
| 174 | +governo brasileiro uma rastreabilidade completa e uma visão de alto nível de | |
| 175 | +cada funcionalidade (requisito) até para o nível mais baixo (código). | ... | ... |
| ... | ... | @@ -0,0 +1,116 @@ |
| 1 | +\section{Lições Aprendidas} | |
| 2 | +\label{sec:lessons} | |
| 3 | + | |
| 4 | +\textbf{Envolver alunos de graduação em projetos do mundo real, interagindo com clientes reais.} | |
| 5 | +% | |
| 6 | +Nossa equipe foi composta principalmente de estudantes de graduação em | |
| 7 | +engenharia de software, que tiveram a oportunidade de interagir com | |
| 8 | +desenvolvedores sênior e designers dentro da equipe, bem como com a equipe de | |
| 9 | +técnicos e gerentes do governo brasileiro. | |
| 10 | +% | |
| 11 | +Eles interagiram com profissionais que possuíam diversos conhecimentos e foram | |
| 12 | +capazes de participar em todos os níveis do processo de desenvolvimento de | |
| 13 | +software. Isto contribuiu para uma grande oportunidade de aprendizado, e para | |
| 14 | +a maioria deles esta foi a sua primeira experiência profissional. | |
| 15 | + | |
| 16 | +\textbf{A participação de profissionais experientes é crucial para o sucesso do projeto.} | |
| 17 | +% | |
| 18 | +Um fator importante para os alunos foi a composição das equipes com a | |
| 19 | +participação de profissionais experientes. No lado técnico, os desenvolvedores | |
| 20 | +sênior e designers lidavam com as decisões técnicas mais difíceis, criando | |
| 21 | +um ambiente de trabalho onde os alunos poderiam desenvolver suas habilidades de | |
| 22 | +forma didática e sem pressão. No lado gerencial, a participação ativa dos | |
| 23 | +professores - que são, no final, os responsáveis pelo projeto - é | |
| 24 | +crucial para garantir que a participação dos alunos seja conduzida de forma | |
| 25 | +saudável e seja um exemplo de liderar pelo exemplo. | |
| 26 | + | |
| 27 | +\textbf{Uma relação equilibrada entre academia e indústria.} | |
| 28 | +% | |
| 29 | +A experiência do projeto SPB levou o LAPPIS/UnB a desenvolver um estilo de trabalho que | |
| 30 | +demonstrou ser apropriado para um ambiente educacional que reúne academia e | |
| 31 | +indústria. A maior prioridade do ponto de vista da universidade são os alunos. | |
| 32 | +Diante disso, as atividades do projeto nunca foram priorizadas em detrimento | |
| 33 | +das aulas e outras atividades pedagógicas. Em resumo, tínhamos alunos | |
| 34 | +trabalhando em horários diferentes, a tempo parcial, localmente, | |
| 35 | +sempre respeitando suas condições individuais, mas fazendo o trabalho de | |
| 36 | +maneira coletiva, colaborativa e aberta. E mesmo sob um ambiente potencialmente | |
| 37 | +adverso, o projeto entregou a solução desejada com sucesso. | |
| 38 | +% | |
| 39 | +Ao final do projeto, notamos que as habilidades desenvolvidas pelos alunos | |
| 40 | +estavam no estado da arte da prática de engenharia de software. Depois que o | |
| 41 | +projeto terminou, tivemos membros da equipe que abraçaram com sucesso | |
| 42 | +oportunidades em organizações públicas, privadas, nacionais e internacionais, | |
| 43 | +além dos estudantes que entraram no empreendedorismo e abriram suas próprias | |
| 44 | +empresas. No início do projeto, as partes interessadas do governo brasileiro | |
| 45 | +tinham certas expectativas sobre o desenvolvimento de projetos que, digamos, | |
| 46 | +não correspondiam exatamente ao nosso trabalho baseado em práticas ágeis e de | |
| 47 | +software livre. Tivemos que desenvolver estratégias que apoiassem diferentes | |
| 48 | +culturas organizacionais. Conforme relatado na seção\ref{sec:process}, o Ministério do Planejamento é | |
| 49 | +organizado em uma estrutura organizacional hierárquica, tipicamente, | |
| 50 | +um paradigma de desenvolvimento tradicional. Portanto, tivemos que criar um | |
| 51 | +processo de ``tradução'' entre nossa equipe e os analistas do MP que gerenciaram o | |
| 52 | +projeto do lado deles. | |
| 53 | + | |
| 54 | +\textbf{Gerenciar separadamente os objetivos de nível estratégico e de nível operacional.} | |
| 55 | +% | |
| 56 | +Durante a fase inicial do projeto, a equipe de MP costumava trazer discussões | |
| 57 | +estratégicas para reuniões técnicas/operacionais, onde deveríamos discutir | |
| 58 | +decisões práticas e técnicas. | |
| 59 | +% | |
| 60 | +Isso resultou em um ambiente de comunicação e gerenciamento altamente complexo, | |
| 61 | +sobrecarregando os professores, uma vez eles eram responsáveis por | |
| 62 | +manter o alinhamento estratégico do MP sincronizado com os planejamentos de | |
| 63 | +implementação da equipe de desenvolvimento, especialmente à luz do | |
| 64 | +desmembramento cultural acima mencionado. A mistura de ambas as preocupações | |
| 65 | +nas mesmas discussões causava confusão em ambos os lados. Para o meio e fim do | |
| 66 | +projeto, conseguimos manter essas preocupações separadas, o que facilitou o | |
| 67 | +trabalho de todos os envolvidos. | |
| 68 | + | |
| 69 | +\textbf{Não aceitar más decisões técnicas por questões políticas.} | |
| 70 | +% | |
| 71 | +Nas fases iniciais do projeto, por motivação política e pessoal, os principais | |
| 72 | +atores do governo brasileiro, envolvidos na época, impuseram o uso da Colab | |
| 73 | +para orientar o desenvolvimento da nova plataforma SPB. Nossa equipe estava | |
| 74 | +totalmente contra a essa ideia, porque já sabíamos que o Colab era um projeto | |
| 75 | +muito experimental e sua adoção poderia aumentar dramaticamente a complexidade | |
| 76 | +do projeto. Mesmo nós fornecendo as razões técnicas para não utilizar Colab, MP | |
| 77 | +foi inflexível e tivemos de gerir este problema. Fizemos mudanças maciças e, ao | |
| 78 | +final do projeto, reescrevemos completamente o Colab e o tornamos estável (o | |
| 79 | +transformando em um Sistema de Sistema em camada de aplicação). É importante | |
| 80 | +notar que o MP nos obrigou a aceitar uma questão técnica baseada apenas em | |
| 81 | +interesses políticos, sem considerar todos os recursos que seriam gastos devido | |
| 82 | +a essa decisão. Ao final do projeto, verificamos que a Colab de fato consumiu a | |
| 83 | +maior quantidade do orçamento e aumentou a complexidade do projeto. | |
| 84 | + | |
| 85 | +\textbf{Considerar a sustentabilidade desde o início.} | |
| 86 | +% | |
| 87 | +No processo de implantação da plataforma SPB na estrutura do MP, tivemos que | |
| 88 | +interagir com os técnicos do MP. Fizemos vários workshops, treinamento e uma | |
| 89 | +documentação meticulosa descrevendo todos os procedimentos necessários para | |
| 90 | +atualizar a plataforma, no entanto, percebemos que os técnicos do MP | |
| 91 | +constantemente evitavam essa responsabilidade. Depois de notar essa situação, | |
| 92 | +nós organizamos uma equipe de DevOps específica que automatizou completamente | |
| 93 | +todo o procedimento de implantação. Nós simplificamos toda a implantação da | |
| 94 | +plataforma para algumas etapas: (1) configurações iniciais (apenas configuração | |
| 95 | +SSH) e (2) a execução de comandos simples para atualizar completamente a | |
| 96 | +plataforma. Ao final do projeto, observamos que os técnicos do MP sempre dependiam | |
| 97 | +do nosso apoio para atualizar a plataforma, mesmo com toda a automação | |
| 98 | +fornecida por nós. Ficamos tristemente com um sentimento de incerteza sobre o | |
| 99 | +futuro da plataforma após o término do projeto. Em retrospectiva, percebemos | |
| 100 | +que o MP dedicou analistas de sistemas e gerentes para o projeto, mas não | |
| 101 | +técnicos de operações e desenvolvedores, que deveria ter sido envolvido com o | |
| 102 | +processo para que pudessem, pelo menos, de forma confortável, fazer a manutenção | |
| 103 | +da infra-estrutura plataforma. | |
| 104 | + | |
| 105 | +Por fim, o novo portal do Software Público Brasileiro está disponível em | |
| 106 | +\url{https://softwarepublico.gov.br}. Toda a documentação, incluindo a | |
| 107 | +arquitetura detalhada e os manuais de operação, também estão disponíveis em | |
| 108 | +\url{https://softwarepublico.gov.br/doc}. Todas as ferramentas integradas são | |
| 109 | +software livre e nossas contribuições foram publicadas em repositórios abertos, | |
| 110 | +disponíveis no próprio portal SPB. Também contribuímos com funcionalidades e | |
| 111 | +melhorias para as respectivas comunidades dos projetos integrados: que | |
| 112 | +beneficiam essas comunidades, assim como nós, pois podemos compartilhar o | |
| 113 | +desenvolvimento futuro e o esforço de manutenção com outras organizações que | |
| 114 | +participam de seus projetos. | |
| 115 | + | |
| 116 | + | ... | ... |
| ... | ... | @@ -0,0 +1,37 @@ |
| 1 | +\section*{Audiência} | |
| 2 | + | |
| 3 | +Entendemos que lançamos uma plataforma sem precedentes para o governo | |
| 4 | +brasileiro, aplicando métodos colaborativos de desenvolvimento de software. | |
| 5 | +Este caso pode ajudar outros projetos a superar desafios similares de | |
| 6 | +engenharia de software no futuro, bem como demonstra como as universidades | |
| 7 | +podem melhorar a experiência de mundo real de seus alunos por meio desse tipo | |
| 8 | +de projeto. É um relato que atende uma ampla audiência, de estudantes à | |
| 9 | +professores, bem como, de desenvolvedores à gerentes de projetos. | |
| 10 | + | |
| 11 | +\section*{Biografia} | |
| 12 | + | |
| 13 | +{\bf Paulo Meirelles} é professor do Bacharelado em Engenharia de Software da | |
| 14 | +Universidade de Brasília. É pesquisador-colaborador do Centro de Competência em | |
| 15 | +Software Livre da Universidade de São Paulo (USP). Atualmente, está realizando | |
| 16 | +seu pós-doutorado no Departamento de Ciência da Computação no Instituto de | |
| 17 | +Matemática e Estatística da USP (IME-USP). Em 2013, concluiu seu doutorado em | |
| 18 | +Ciência da Computação no IME-USP, na área de Sistemas de Software. Foi | |
| 19 | +pesquisador visitante na Southern Illinois University Carbondale, Estados | |
| 20 | +Unidos, em 2011. Tem um amplo histórico de colaboração com a comunidade | |
| 21 | +software livre brasileira, entre outras, ministrando dezenas de palestras e | |
| 22 | +parcipando de vários paineis em eventos nacionais e internacionais nas últimas | |
| 23 | +duas décadas. Mais recentemente, coordenou a Evolução do Portal do Software | |
| 24 | +Público Brasileiro e foi consultor do projeto Participa.Br, da Secretaria-Geral | |
| 25 | +da Presidência da República, para o desenvolvimento de uma plataforma de | |
| 26 | +participação social com software livre. | |
| 27 | +\\ | |
| 28 | +\\ | |
| 29 | +{\bf Hilmer Neri} é professor do Bacharelado em Engenharia de Software da | |
| 30 | +Universidade de Brasília. Atualmente, está realizando | |
| 31 | +seu doutorado na COOPE-UFRJ... | |
| 32 | + | |
| 33 | +... | |
| 34 | + | |
| 35 | +... | |
| 36 | + | |
| 37 | +... | ... | ... |
| ... | ... | @@ -0,0 +1,164 @@ |
| 1 | +% LaTeX definitions for SBC 2001 style | |
| 2 | +% | |
| 3 | +% Created by Jomi Hubner & Rafael Bordini, june 2001 | |
| 4 | +% updated march 2005 | |
| 5 | + | |
| 6 | +\NeedsTeXFormat{LaTeX2e} | |
| 7 | +\ProvidesPackage{sbc-template}[2001/06/09] | |
| 8 | + | |
| 9 | +% margem sup 3.5 cm: há 1,5 cm para header, + 2 cm para top | |
| 10 | +% margem inf 2.5 cm: há 1,5 cm para foot, + 1 cm para bottom | |
| 11 | +% margem esq/dir 3 cm | |
| 12 | +\RequirePackage[a4paper,top=3.5cm,left=3cm,right=3cm,bottom=2.5cm]{geometry} | |
| 13 | + | |
| 14 | +\parindent 1.27cm | |
| 15 | +\parskip 6pt | |
| 16 | + | |
| 17 | +\flushbottom | |
| 18 | + | |
| 19 | +% captions | |
| 20 | +\RequirePackage[bf,sf,footnotesize,indent]{caption2} | |
| 21 | +\setlength{\captionmargin}{0.8cm} | |
| 22 | +\renewcommand{\captionfont}{\sffamily\footnotesize\bfseries} | |
| 23 | +\renewcommand{\captionlabeldelim}{.} | |
| 24 | + | |
| 25 | +% font | |
| 26 | +\RequirePackage{times} | |
| 27 | + | |
| 28 | +\renewcommand{\normalsize}{\@setfontsize\normalsize\@xiipt\@xivpt} | |
| 29 | +\newcommand{\XIIIPT}{\@setfontsize\xiiipt{13}{17}} | |
| 30 | +\newcommand{\XVIPT}{\@setfontsize\xvipt{16}{20}} | |
| 31 | + | |
| 32 | +% new commands | |
| 33 | +\newcounter{instn} | |
| 34 | +\setcounter{instn}{1} | |
| 35 | +\newcommand{\instnum}{\arabic{instn}} | |
| 36 | +\newcommand{\inst}[1]{\ensuremath{^{#1}}} | |
| 37 | +\newcommand{\nextinstitute}{\\\mbox{}\\[-6pt] \addtocounter{instn}{1}\inst{\instnum}} | |
| 38 | +\newcommand{\email}[1]{\\\mbox{}\\[-6pt]\footnotesize\texttt{#1}} | |
| 39 | +\renewcommand{\and}{, } | |
| 40 | + | |
| 41 | +% to avoid [...] in the bibliography | |
| 42 | +% \item[] instead of \item[\@biblabel{#1}\hfill] | |
| 43 | +\def\@lbibitem[#1]#2{\item[]\if@filesw | |
| 44 | + {\let\protect\noexpand | |
| 45 | + \immediate | |
| 46 | + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} | |
| 47 | +\renewenvironment{thebibliography}[1] | |
| 48 | + {\section*{\refname | |
| 49 | + \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}}% | |
| 50 | + \list{\@biblabel{\@arabic\c@enumiv}}% | |
| 51 | + {\settowidth\labelwidth{\@biblabel{#1}}% | |
| 52 | + \leftmargin\labelwidth | |
| 53 | + \advance\leftmargin\labelsep | |
| 54 | + %% changed! | |
| 55 | + \itemindent -\leftmargin | |
| 56 | + \itemsep 6pt | |
| 57 | + %%%%%%%%%%% | |
| 58 | + \@openbib@code | |
| 59 | + \usecounter{enumiv}% | |
| 60 | + \let\p@enumiv\@empty | |
| 61 | + \renewcommand\theenumiv{\@arabic\c@enumiv}}% | |
| 62 | + \sloppy | |
| 63 | + \clubpenalty4000 | |
| 64 | + \@clubpenalty \clubpenalty | |
| 65 | + \widowpenalty4000% | |
| 66 | + \sfcode`\.\@m} | |
| 67 | + {\def\@noitemerr | |
| 68 | + {\@latex@warning{Empty `thebibliography' environment}}% | |
| 69 | + \endlist} | |
| 70 | + | |
| 71 | + | |
| 72 | +% itens | |
| 73 | +\setlength\leftmargini {1.27cm} | |
| 74 | +\setlength\leftmargin {\leftmargini} | |
| 75 | +\setlength\leftmarginii {\leftmargini} | |
| 76 | +\setlength\leftmarginiii {\leftmargini} | |
| 77 | +\setlength\leftmarginiv {\leftmargini} | |
| 78 | +\setlength \labelsep {.5em} | |
| 79 | +\setlength \labelwidth {\leftmargini} | |
| 80 | +\addtolength\labelwidth {-\labelsep} | |
| 81 | +\def\@listI{\leftmargin\leftmargini | |
| 82 | + \parsep 0\p@ \@plus1\p@ \@minus\p@ | |
| 83 | + \topsep 0\p@ \@plus2\p@ \@minus4\p@ | |
| 84 | + \itemsep0\p@} | |
| 85 | +\let\@listi\@listI | |
| 86 | +\@listi | |
| 87 | +\def\@listii {\leftmargin\leftmarginii | |
| 88 | + \labelwidth\leftmarginii | |
| 89 | + \advance\labelwidth-\labelsep | |
| 90 | + \topsep 0\p@ \@plus2\p@ \@minus\p@} | |
| 91 | +\def\@listiii{\leftmargin\leftmarginiii | |
| 92 | + \labelwidth\leftmarginiii | |
| 93 | + \advance\labelwidth-\labelsep | |
| 94 | + \topsep 0\p@ \@plus\p@\@minus\p@ | |
| 95 | + \parsep \z@ | |
| 96 | + \partopsep \p@ \@plus\z@ \@minus\p@} | |
| 97 | + | |
| 98 | + | |
| 99 | +% sections | |
| 100 | +\renewcommand\section{\@startsection{section}{1}{\z@}% | |
| 101 | + {-6\p@ \@plus -4\p@ \@minus -4\p@}% | |
| 102 | + {0\p@ \@plus 4\p@ \@minus 4\p@}% | |
| 103 | + {\normalfont\XIIIPT\bfseries\boldmath | |
| 104 | + \rightskip=\z@ \@plus 8em\pretolerance=10000 }} | |
| 105 | + | |
| 106 | +\renewcommand\subsection{\@startsection{subsection}{2}{\z@}% | |
| 107 | + {-6\p@ \@plus -4\p@ \@minus -4\p@}% | |
| 108 | + {0\p@ \@plus 4\p@ \@minus 4\p@}% | |
| 109 | + {\normalfont\normalsize\bfseries\boldmath | |
| 110 | + \rightskip=\z@ \@plus 8em\pretolerance=10000 }} | |
| 111 | + | |
| 112 | +%\renewcommand{\thesection}{\arabic{section}.} | |
| 113 | +%\renewcommand{\thesubsection}{\thesection\arabic{subsection}.} | |
| 114 | +%\renewcommand{\thesubsubsection}{\thesubsection\arabic{subsubsection}.} | |
| 115 | + | |
| 116 | +\RequirePackage{titlesec} | |
| 117 | +\titlelabel{\thetitle.\hspace{1ex}} | |
| 118 | + | |
| 119 | +% first page | |
| 120 | + | |
| 121 | +\pagestyle{empty} | |
| 122 | + | |
| 123 | +\newcommand{\authortag}[1]{$^{#1}$} | |
| 124 | + | |
| 125 | +\def\address#1{\gdef\@address{#1}} | |
| 126 | + | |
| 127 | +\def\@maketitle{\newpage | |
| 128 | + %\null % isso dava um espaco extra antes do title | |
| 129 | + \begin{center} | |
| 130 | + %\vglue -6pt | |
| 131 | +% \vspace*{12pt} | |
| 132 | +\vspace*{-.7cm} | |
| 133 | + {\XVIPT\bf\@title\par} | |
| 134 | + \vglue 6pt plus 3pt minus 3pt | |
| 135 | + {\normalsize | |
| 136 | + \textbf{\begin{tabular}[t]{c}\@author\end{tabular}}\par} | |
| 137 | + \vglue 6pt plus 3pt minus 3pt | |
| 138 | + {\normalsize | |
| 139 | + \begin{tabular}[t]{c}\inst{\instnum}\@address\end{tabular}\par} | |
| 140 | + \vglue 6pt plus 3pt minus 3pt | |
| 141 | + \end{center}\par | |
| 142 | +} | |
| 143 | +\let\maketitleOLD\maketitle | |
| 144 | +\renewcommand{\maketitle}{\maketitleOLD\thispagestyle{empty}} | |
| 145 | + | |
| 146 | +\renewenvironment{abstract}{% | |
| 147 | + \list{}{\advance\topsep by6pt\relax%\small | |
| 148 | + \leftmargin=0.8cm | |
| 149 | + \labelwidth=\z@ | |
| 150 | + \listparindent=\z@ | |
| 151 | + \itemindent\listparindent | |
| 152 | + \rightmargin\leftmargin}\item[\hskip\labelsep | |
| 153 | + \bfseries\itshape Abstract.]\itshape}% | |
| 154 | + {\endlist} | |
| 155 | + | |
| 156 | +\newenvironment{resumo}{% | |
| 157 | + \list{}{\advance\topsep by6pt\relax%\small | |
| 158 | + \leftmargin=0.8cm | |
| 159 | + \labelwidth=\z@ | |
| 160 | + \listparindent=\z@ | |
| 161 | + \itemindent\listparindent | |
| 162 | + \rightmargin\leftmargin}\item[\hskip\labelsep | |
| 163 | + \bfseries\itshape Resumo.]\itshape}% | |
| 164 | + {\endlist} | ... | ... |
| ... | ... | @@ -0,0 +1,1103 @@ |
| 1 | +%% copy of "apalike" for SBC (no comma before year in citation label) | |
| 2 | + | |
| 3 | +% BibTeX `apalike' bibliography style (24-Jan-88 version) | |
| 4 | +% Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a. | |
| 5 | +% Copyright (C) 1988, all rights reserved. | |
| 6 | +% Copying of this file is allowed, provided that if you make any changes at all | |
| 7 | +% you name it something other than `apalike.bst'. | |
| 8 | +% This restriction helps ensure that all copies are identical. | |
| 9 | +% Differences between this style and `alpha' are generally heralded by a `%'. | |
| 10 | +% The file btxbst.doc has the documentation for alpha.bst. | |
| 11 | +% | |
| 12 | +% This style should be used with the `apalike' LaTeX style (apalike.sty). | |
| 13 | +% \cite's come out like "(Jones, 1986)" in the text but there are no labels | |
| 14 | +% in the bibliography, and something like "(1986)" comes out immediately | |
| 15 | +% after the author. Author (and editor) names appear as last name, comma, | |
| 16 | +% initials. A `year' field is required for every entry, and so is either | |
| 17 | +% an author (or in some cases, an editor) field or a key field. | |
| 18 | +% | |
| 19 | +% Editorial note: | |
| 20 | +% Many journals require a style like `apalike', but I strongly, strongly, | |
| 21 | +% strongly recommend that you not use it if you have a choice---use something | |
| 22 | +% like `plain' instead. Mary-Claire van Leunen (A Handbook for Scholars, | |
| 23 | +% Knopf, 1979) argues convincingly that a style like `plain' encourages better | |
| 24 | +% writing than one like `apalike'. Furthermore the strongest arguments for | |
| 25 | +% using an author-date style like `apalike'---that it's "the most practical" | |
| 26 | +% (The Chicago Manual of Style, University of Chicago Press, thirteenth | |
| 27 | +% edition, 1982, pages 400--401)---fall flat on their face with the new | |
| 28 | +% computer-typesetting technology. For instance page 401 anachronistically | |
| 29 | +% states "The chief disadvantage of [a style like `plain'] is that additions | |
| 30 | +% or deletions cannot be made after the manuscript is typed without changing | |
| 31 | +% numbers in both text references and list." LaTeX sidesteps the disadvantage. | |
| 32 | +% | |
| 33 | +% History: | |
| 34 | +% 15-sep-86 (SK,OP) Original version, by Susan King and Oren Patashnik. | |
| 35 | +% 10-nov-86 (OP) Truncated the sort.key$ string to the correct length | |
| 36 | +% in bib.sort.order to eliminate error message. | |
| 37 | +% 24-jan-88 (OP) Updated for BibTeX version 0.99a, from alpha.bst 0.99a; | |
| 38 | +% apalike now sorts by author, then year, then title; | |
| 39 | +% THIS `apalike' VERSION DOES NOT WORK WITH BIBTEX 0.98i. | |
| 40 | + | |
| 41 | +ENTRY | |
| 42 | + { address | |
| 43 | + author | |
| 44 | + booktitle | |
| 45 | + chapter | |
| 46 | + edition | |
| 47 | + editor | |
| 48 | + howpublished | |
| 49 | + institution | |
| 50 | + journal | |
| 51 | + key | |
| 52 | +% month not used in apalike | |
| 53 | + note | |
| 54 | + number | |
| 55 | + organization | |
| 56 | + pages | |
| 57 | + publisher | |
| 58 | + school | |
| 59 | + series | |
| 60 | + title | |
| 61 | + type | |
| 62 | + volume | |
| 63 | + year | |
| 64 | + } | |
| 65 | + {} | |
| 66 | + { label extra.label sort.label } | |
| 67 | + | |
| 68 | +INTEGERS { output.state before.all mid.sentence after.sentence after.block } | |
| 69 | + | |
| 70 | +FUNCTION {init.state.consts} | |
| 71 | +{ #0 'before.all := | |
| 72 | + #1 'mid.sentence := | |
| 73 | + #2 'after.sentence := | |
| 74 | + #3 'after.block := | |
| 75 | +} | |
| 76 | + | |
| 77 | +STRINGS { s t } | |
| 78 | + | |
| 79 | +FUNCTION {output.nonnull} | |
| 80 | +{ 's := | |
| 81 | + output.state mid.sentence = | |
| 82 | + { ", " * write$ } | |
| 83 | + { output.state after.block = | |
| 84 | + { add.period$ write$ | |
| 85 | + newline$ | |
| 86 | + "\newblock " write$ | |
| 87 | + } | |
| 88 | + { output.state before.all = | |
| 89 | + 'write$ | |
| 90 | + { add.period$ " " * write$ } | |
| 91 | + if$ | |
| 92 | + } | |
| 93 | + if$ | |
| 94 | + mid.sentence 'output.state := | |
| 95 | + } | |
| 96 | + if$ | |
| 97 | + s | |
| 98 | +} | |
| 99 | + | |
| 100 | +FUNCTION {output} | |
| 101 | +{ duplicate$ empty$ | |
| 102 | + 'pop$ | |
| 103 | + 'output.nonnull | |
| 104 | + if$ | |
| 105 | +} | |
| 106 | + | |
| 107 | +FUNCTION {output.check} | |
| 108 | +{ 't := | |
| 109 | + duplicate$ empty$ | |
| 110 | + { pop$ "empty " t * " in " * cite$ * warning$ } | |
| 111 | + 'output.nonnull | |
| 112 | + if$ | |
| 113 | +} | |
| 114 | + | |
| 115 | +% apalike needs this function because | |
| 116 | +% the year has special punctuation; | |
| 117 | +% apalike ignores the month | |
| 118 | +FUNCTION {output.year.check} | |
| 119 | +{ year empty$ | |
| 120 | + { "empty year in " cite$ * warning$ } | |
| 121 | + { write$ | |
| 122 | + " (" year * extra.label * ")" * | |
| 123 | + mid.sentence 'output.state := | |
| 124 | + } | |
| 125 | + if$ | |
| 126 | +} | |
| 127 | + | |
| 128 | +FUNCTION {output.bibitem} | |
| 129 | +{ newline$ | |
| 130 | + "\bibitem[" write$ | |
| 131 | + label write$ | |
| 132 | + "]{" write$ | |
| 133 | + cite$ write$ | |
| 134 | + "}" write$ | |
| 135 | + newline$ | |
| 136 | + "" | |
| 137 | + before.all 'output.state := | |
| 138 | +} | |
| 139 | + | |
| 140 | +FUNCTION {fin.entry} | |
| 141 | +{ add.period$ | |
| 142 | + write$ | |
| 143 | + newline$ | |
| 144 | +} | |
| 145 | + | |
| 146 | +FUNCTION {new.block} | |
| 147 | +{ output.state before.all = | |
| 148 | + 'skip$ | |
| 149 | + { after.block 'output.state := } | |
| 150 | + if$ | |
| 151 | +} | |
| 152 | + | |
| 153 | +FUNCTION {new.sentence} | |
| 154 | +{ output.state after.block = | |
| 155 | + 'skip$ | |
| 156 | + { output.state before.all = | |
| 157 | + 'skip$ | |
| 158 | + { after.sentence 'output.state := } | |
| 159 | + if$ | |
| 160 | + } | |
| 161 | + if$ | |
| 162 | +} | |
| 163 | + | |
| 164 | +FUNCTION {not} | |
| 165 | +{ { #0 } | |
| 166 | + { #1 } | |
| 167 | + if$ | |
| 168 | +} | |
| 169 | + | |
| 170 | +FUNCTION {and} | |
| 171 | +{ 'skip$ | |
| 172 | + { pop$ #0 } | |
| 173 | + if$ | |
| 174 | +} | |
| 175 | + | |
| 176 | +FUNCTION {or} | |
| 177 | +{ { pop$ #1 } | |
| 178 | + 'skip$ | |
| 179 | + if$ | |
| 180 | +} | |
| 181 | + | |
| 182 | +FUNCTION {new.block.checkb} | |
| 183 | +{ empty$ | |
| 184 | + swap$ empty$ | |
| 185 | + and | |
| 186 | + 'skip$ | |
| 187 | + 'new.block | |
| 188 | + if$ | |
| 189 | +} | |
| 190 | + | |
| 191 | +FUNCTION {field.or.null} | |
| 192 | +{ duplicate$ empty$ | |
| 193 | + { pop$ "" } | |
| 194 | + 'skip$ | |
| 195 | + if$ | |
| 196 | +} | |
| 197 | + | |
| 198 | +FUNCTION {emphasize} | |
| 199 | +{ duplicate$ empty$ | |
| 200 | + { pop$ "" } | |
| 201 | + { "{\em " swap$ * "}" * } | |
| 202 | + if$ | |
| 203 | +} | |
| 204 | + | |
| 205 | +INTEGERS { nameptr namesleft numnames } | |
| 206 | + | |
| 207 | +FUNCTION {format.names} | |
| 208 | +{ 's := | |
| 209 | + #1 'nameptr := | |
| 210 | + s num.names$ 'numnames := | |
| 211 | + numnames 'namesleft := | |
| 212 | + { namesleft #0 > } | |
| 213 | + { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first | |
| 214 | + nameptr #1 > | |
| 215 | + { namesleft #1 > | |
| 216 | + { ", " * t * } | |
| 217 | + { numnames #2 > | |
| 218 | + { "," * } | |
| 219 | + 'skip$ | |
| 220 | + if$ | |
| 221 | + t "others" = | |
| 222 | + { " et~al." * } | |
| 223 | + { " and " * t * } | |
| 224 | + if$ | |
| 225 | + } | |
| 226 | + if$ | |
| 227 | + } | |
| 228 | + 't | |
| 229 | + if$ | |
| 230 | + nameptr #1 + 'nameptr := | |
| 231 | + namesleft #1 - 'namesleft := | |
| 232 | + } | |
| 233 | + while$ | |
| 234 | +} | |
| 235 | + | |
| 236 | +FUNCTION {format.authors} | |
| 237 | +{ author empty$ | |
| 238 | + { "" } | |
| 239 | + { author format.names } | |
| 240 | + if$ | |
| 241 | +} | |
| 242 | + | |
| 243 | +FUNCTION {format.key} % this function is just for apalike | |
| 244 | +{ empty$ | |
| 245 | + { key field.or.null } | |
| 246 | + { "" } | |
| 247 | + if$ | |
| 248 | +} | |
| 249 | + | |
| 250 | +FUNCTION {format.editors} | |
| 251 | +{ editor empty$ | |
| 252 | + { "" } | |
| 253 | + { editor format.names | |
| 254 | + editor num.names$ #1 > | |
| 255 | + { ", editors" * } | |
| 256 | + { ", editor" * } | |
| 257 | + if$ | |
| 258 | + } | |
| 259 | + if$ | |
| 260 | +} | |
| 261 | + | |
| 262 | +FUNCTION {format.title} | |
| 263 | +{ title empty$ | |
| 264 | + { "" } | |
| 265 | + { title "t" change.case$ } | |
| 266 | + if$ | |
| 267 | +} | |
| 268 | + | |
| 269 | +FUNCTION {n.dashify} | |
| 270 | +{ 't := | |
| 271 | + "" | |
| 272 | + { t empty$ not } | |
| 273 | + { t #1 #1 substring$ "-" = | |
| 274 | + { t #1 #2 substring$ "--" = not | |
| 275 | + { "--" * | |
| 276 | + t #2 global.max$ substring$ 't := | |
| 277 | + } | |
| 278 | + { { t #1 #1 substring$ "-" = } | |
| 279 | + { "-" * | |
| 280 | + t #2 global.max$ substring$ 't := | |
| 281 | + } | |
| 282 | + while$ | |
| 283 | + } | |
| 284 | + if$ | |
| 285 | + } | |
| 286 | + { t #1 #1 substring$ * | |
| 287 | + t #2 global.max$ substring$ 't := | |
| 288 | + } | |
| 289 | + if$ | |
| 290 | + } | |
| 291 | + while$ | |
| 292 | +} | |
| 293 | + | |
| 294 | +FUNCTION {format.btitle} | |
| 295 | +{ title emphasize | |
| 296 | +} | |
| 297 | + | |
| 298 | +FUNCTION {tie.or.space.connect} | |
| 299 | +{ duplicate$ text.length$ #3 < | |
| 300 | + { "~" } | |
| 301 | + { " " } | |
| 302 | + if$ | |
| 303 | + swap$ * * | |
| 304 | +} | |
| 305 | + | |
| 306 | +FUNCTION {either.or.check} | |
| 307 | +{ empty$ | |
| 308 | + 'pop$ | |
| 309 | + { "can't use both " swap$ * " fields in " * cite$ * warning$ } | |
| 310 | + if$ | |
| 311 | +} | |
| 312 | + | |
| 313 | +FUNCTION {format.bvolume} | |
| 314 | +{ volume empty$ | |
| 315 | + { "" } | |
| 316 | + { "volume" volume tie.or.space.connect | |
| 317 | + series empty$ | |
| 318 | + 'skip$ | |
| 319 | + { " of " * series emphasize * } | |
| 320 | + if$ | |
| 321 | + "volume and number" number either.or.check | |
| 322 | + } | |
| 323 | + if$ | |
| 324 | +} | |
| 325 | + | |
| 326 | +FUNCTION {format.number.series} | |
| 327 | +{ volume empty$ | |
| 328 | + { number empty$ | |
| 329 | + { series field.or.null } | |
| 330 | + { output.state mid.sentence = | |
| 331 | + { "number" } | |
| 332 | + { "Number" } | |
| 333 | + if$ | |
| 334 | + number tie.or.space.connect | |
| 335 | + series empty$ | |
| 336 | + { "there's a number but no series in " cite$ * warning$ } | |
| 337 | + { " in " * series * } | |
| 338 | + if$ | |
| 339 | + } | |
| 340 | + if$ | |
| 341 | + } | |
| 342 | + { "" } | |
| 343 | + if$ | |
| 344 | +} | |
| 345 | + | |
| 346 | +FUNCTION {format.edition} | |
| 347 | +{ edition empty$ | |
| 348 | + { "" } | |
| 349 | + { output.state mid.sentence = | |
| 350 | + { edition "l" change.case$ " edition" * } | |
| 351 | + { edition "t" change.case$ " edition" * } | |
| 352 | + if$ | |
| 353 | + } | |
| 354 | + if$ | |
| 355 | +} | |
| 356 | + | |
| 357 | +INTEGERS { multiresult } | |
| 358 | + | |
| 359 | +FUNCTION {multi.page.check} | |
| 360 | +{ 't := | |
| 361 | + #0 'multiresult := | |
| 362 | + { multiresult not | |
| 363 | + t empty$ not | |
| 364 | + and | |
| 365 | + } | |
| 366 | + { t #1 #1 substring$ | |
| 367 | + duplicate$ "-" = | |
| 368 | + swap$ duplicate$ "," = | |
| 369 | + swap$ "+" = | |
| 370 | + or or | |
| 371 | + { #1 'multiresult := } | |
| 372 | + { t #2 global.max$ substring$ 't := } | |
| 373 | + if$ | |
| 374 | + } | |
| 375 | + while$ | |
| 376 | + multiresult | |
| 377 | +} | |
| 378 | + | |
| 379 | +FUNCTION {format.pages} | |
| 380 | +{ pages empty$ | |
| 381 | + { "" } | |
| 382 | + { pages multi.page.check | |
| 383 | + { "pages" pages n.dashify tie.or.space.connect } | |
| 384 | + { "page" pages tie.or.space.connect } | |
| 385 | + if$ | |
| 386 | + } | |
| 387 | + if$ | |
| 388 | +} | |
| 389 | + | |
| 390 | +FUNCTION {format.vol.num.pages} | |
| 391 | +{ volume field.or.null | |
| 392 | + number empty$ | |
| 393 | + 'skip$ | |
| 394 | + { "(" number * ")" * * | |
| 395 | + volume empty$ | |
| 396 | + { "there's a number but no volume in " cite$ * warning$ } | |
| 397 | + 'skip$ | |
| 398 | + if$ | |
| 399 | + } | |
| 400 | + if$ | |
| 401 | + pages empty$ | |
| 402 | + 'skip$ | |
| 403 | + { duplicate$ empty$ | |
| 404 | + { pop$ format.pages } | |
| 405 | + { ":" * pages n.dashify * } | |
| 406 | + if$ | |
| 407 | + } | |
| 408 | + if$ | |
| 409 | +} | |
| 410 | + | |
| 411 | +FUNCTION {format.chapter.pages} | |
| 412 | +{ chapter empty$ | |
| 413 | + 'format.pages | |
| 414 | + { type empty$ | |
| 415 | + { "chapter" } | |
| 416 | + { type "l" change.case$ } | |
| 417 | + if$ | |
| 418 | + chapter tie.or.space.connect | |
| 419 | + pages empty$ | |
| 420 | + 'skip$ | |
| 421 | + { ", " * format.pages * } | |
| 422 | + if$ | |
| 423 | + } | |
| 424 | + if$ | |
| 425 | +} | |
| 426 | + | |
| 427 | +FUNCTION {format.in.ed.booktitle} | |
| 428 | +{ booktitle empty$ | |
| 429 | + { "" } | |
| 430 | + { editor empty$ | |
| 431 | + { "In " booktitle emphasize * } | |
| 432 | + { "In " format.editors * ", " * booktitle emphasize * } | |
| 433 | + if$ | |
| 434 | + } | |
| 435 | + if$ | |
| 436 | +} | |
| 437 | + | |
| 438 | +FUNCTION {format.thesis.type} | |
| 439 | +{ type empty$ | |
| 440 | + 'skip$ | |
| 441 | + { pop$ | |
| 442 | + type "t" change.case$ | |
| 443 | + } | |
| 444 | + if$ | |
| 445 | +} | |
| 446 | + | |
| 447 | +FUNCTION {format.tr.number} | |
| 448 | +{ type empty$ | |
| 449 | + { "Technical Report" } | |
| 450 | + 'type | |
| 451 | + if$ | |
| 452 | + number empty$ | |
| 453 | + { "t" change.case$ } | |
| 454 | + { number tie.or.space.connect } | |
| 455 | + if$ | |
| 456 | +} | |
| 457 | + | |
| 458 | +FUNCTION {format.article.crossref} | |
| 459 | +{ "In" % this is for apalike | |
| 460 | + " \cite{" * crossref * "}" * | |
| 461 | +} | |
| 462 | + | |
| 463 | +FUNCTION {format.book.crossref} | |
| 464 | +{ volume empty$ | |
| 465 | + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ | |
| 466 | + "In " | |
| 467 | + } | |
| 468 | + { "Volume" volume tie.or.space.connect | |
| 469 | + " of " * | |
| 470 | + } | |
| 471 | + if$ | |
| 472 | + "\cite{" * crossref * "}" * % this is for apalike | |
| 473 | +} | |
| 474 | + | |
| 475 | +FUNCTION {format.incoll.inproc.crossref} | |
| 476 | +{ "In" % this is for apalike | |
| 477 | + " \cite{" * crossref * "}" * | |
| 478 | +} | |
| 479 | + | |
| 480 | +FUNCTION {article} | |
| 481 | +{ output.bibitem | |
| 482 | + format.authors "author" output.check | |
| 483 | + author format.key output % special for | |
| 484 | + output.year.check % apalike | |
| 485 | + new.block | |
| 486 | + format.title "title" output.check | |
| 487 | + new.block | |
| 488 | + crossref missing$ | |
| 489 | + { journal emphasize "journal" output.check | |
| 490 | + format.vol.num.pages output | |
| 491 | + } | |
| 492 | + { format.article.crossref output.nonnull | |
| 493 | + format.pages output | |
| 494 | + } | |
| 495 | + if$ | |
| 496 | + new.block | |
| 497 | + note output | |
| 498 | + fin.entry | |
| 499 | +} | |
| 500 | + | |
| 501 | +FUNCTION {book} | |
| 502 | +{ output.bibitem | |
| 503 | + author empty$ | |
| 504 | + { format.editors "author and editor" output.check | |
| 505 | + editor format.key output | |
| 506 | + } | |
| 507 | + { format.authors output.nonnull | |
| 508 | + crossref missing$ | |
| 509 | + { "author and editor" editor either.or.check } | |
| 510 | + 'skip$ | |
| 511 | + if$ | |
| 512 | + } | |
| 513 | + if$ | |
| 514 | + output.year.check % special for apalike | |
| 515 | + new.block | |
| 516 | + format.btitle "title" output.check | |
| 517 | + crossref missing$ | |
| 518 | + { format.bvolume output | |
| 519 | + new.block | |
| 520 | + format.number.series output | |
| 521 | + new.sentence | |
| 522 | + publisher "publisher" output.check | |
| 523 | + address output | |
| 524 | + } | |
| 525 | + { new.block | |
| 526 | + format.book.crossref output.nonnull | |
| 527 | + } | |
| 528 | + if$ | |
| 529 | + format.edition output | |
| 530 | + new.block | |
| 531 | + note output | |
| 532 | + fin.entry | |
| 533 | +} | |
| 534 | + | |
| 535 | +FUNCTION {booklet} | |
| 536 | +{ output.bibitem | |
| 537 | + format.authors output | |
| 538 | + author format.key output % special for | |
| 539 | + output.year.check % apalike | |
| 540 | + new.block | |
| 541 | + format.title "title" output.check | |
| 542 | + new.block | |
| 543 | + howpublished output | |
| 544 | + address output | |
| 545 | + new.block | |
| 546 | + note output | |
| 547 | + fin.entry | |
| 548 | +} | |
| 549 | + | |
| 550 | +FUNCTION {inbook} | |
| 551 | +{ output.bibitem | |
| 552 | + author empty$ | |
| 553 | + { format.editors "author and editor" output.check | |
| 554 | + editor format.key output | |
| 555 | + } | |
| 556 | + { format.authors output.nonnull | |
| 557 | + crossref missing$ | |
| 558 | + { "author and editor" editor either.or.check } | |
| 559 | + 'skip$ | |
| 560 | + if$ | |
| 561 | + } | |
| 562 | + if$ | |
| 563 | + output.year.check % special for apalike | |
| 564 | + new.block | |
| 565 | + format.btitle "title" output.check | |
| 566 | + crossref missing$ | |
| 567 | + { format.bvolume output | |
| 568 | + format.chapter.pages "chapter and pages" output.check | |
| 569 | + new.block | |
| 570 | + format.number.series output | |
| 571 | + new.sentence | |
| 572 | + publisher "publisher" output.check | |
| 573 | + address output | |
| 574 | + } | |
| 575 | + { format.chapter.pages "chapter and pages" output.check | |
| 576 | + new.block | |
| 577 | + format.book.crossref output.nonnull | |
| 578 | + } | |
| 579 | + if$ | |
| 580 | + format.edition output | |
| 581 | + new.block | |
| 582 | + note output | |
| 583 | + fin.entry | |
| 584 | +} | |
| 585 | + | |
| 586 | +FUNCTION {incollection} | |
| 587 | +{ output.bibitem | |
| 588 | + format.authors "author" output.check | |
| 589 | + author format.key output % special for | |
| 590 | + output.year.check % apalike | |
| 591 | + new.block | |
| 592 | + format.title "title" output.check | |
| 593 | + new.block | |
| 594 | + crossref missing$ | |
| 595 | + { format.in.ed.booktitle "booktitle" output.check | |
| 596 | + format.bvolume output | |
| 597 | + format.number.series output | |
| 598 | + format.chapter.pages output | |
| 599 | + new.sentence | |
| 600 | + publisher "publisher" output.check | |
| 601 | + address output | |
| 602 | + format.edition output | |
| 603 | + } | |
| 604 | + { format.incoll.inproc.crossref output.nonnull | |
| 605 | + format.chapter.pages output | |
| 606 | + } | |
| 607 | + if$ | |
| 608 | + new.block | |
| 609 | + note output | |
| 610 | + fin.entry | |
| 611 | +} | |
| 612 | + | |
| 613 | +FUNCTION {inproceedings} | |
| 614 | +{ output.bibitem | |
| 615 | + format.authors "author" output.check | |
| 616 | + author format.key output % special for | |
| 617 | + output.year.check % apalike | |
| 618 | + new.block | |
| 619 | + format.title "title" output.check | |
| 620 | + new.block | |
| 621 | + crossref missing$ | |
| 622 | + { format.in.ed.booktitle "booktitle" output.check | |
| 623 | + format.bvolume output | |
| 624 | + format.number.series output | |
| 625 | + format.pages output | |
| 626 | + address output % for apalike | |
| 627 | + new.sentence % there's no year | |
| 628 | + organization output % here so things | |
| 629 | + publisher output % are simpler | |
| 630 | + } | |
| 631 | + { format.incoll.inproc.crossref output.nonnull | |
| 632 | + format.pages output | |
| 633 | + } | |
| 634 | + if$ | |
| 635 | + new.block | |
| 636 | + note output | |
| 637 | + fin.entry | |
| 638 | +} | |
| 639 | + | |
| 640 | +FUNCTION {conference} { inproceedings } | |
| 641 | + | |
| 642 | +FUNCTION {manual} | |
| 643 | +{ output.bibitem | |
| 644 | + format.authors output | |
| 645 | + author format.key output % special for | |
| 646 | + output.year.check % apalike | |
| 647 | + new.block | |
| 648 | + format.btitle "title" output.check | |
| 649 | + organization address new.block.checkb | |
| 650 | + organization output | |
| 651 | + address output | |
| 652 | + format.edition output | |
| 653 | + new.block | |
| 654 | + note output | |
| 655 | + fin.entry | |
| 656 | +} | |
| 657 | + | |
| 658 | +FUNCTION {mastersthesis} | |
| 659 | +{ output.bibitem | |
| 660 | + format.authors "author" output.check | |
| 661 | + author format.key output % special for | |
| 662 | + output.year.check % apalike | |
| 663 | + new.block | |
| 664 | + format.title "title" output.check | |
| 665 | + new.block | |
| 666 | + "Master's thesis" format.thesis.type output.nonnull | |
| 667 | + school "school" output.check | |
| 668 | + address output | |
| 669 | + new.block | |
| 670 | + note output | |
| 671 | + fin.entry | |
| 672 | +} | |
| 673 | + | |
| 674 | +FUNCTION {misc} | |
| 675 | +{ output.bibitem | |
| 676 | + format.authors output | |
| 677 | + author format.key output % special for | |
| 678 | + output.year.check % apalike | |
| 679 | + new.block | |
| 680 | + format.title output | |
| 681 | + new.block | |
| 682 | + howpublished output | |
| 683 | + new.block | |
| 684 | + note output | |
| 685 | + fin.entry | |
| 686 | +} | |
| 687 | + | |
| 688 | +FUNCTION {phdthesis} | |
| 689 | +{ output.bibitem | |
| 690 | + format.authors "author" output.check | |
| 691 | + author format.key output % special for | |
| 692 | + output.year.check % apalike | |
| 693 | + new.block | |
| 694 | + format.btitle "title" output.check | |
| 695 | + new.block | |
| 696 | + "PhD thesis" format.thesis.type output.nonnull | |
| 697 | + school "school" output.check | |
| 698 | + address output | |
| 699 | + new.block | |
| 700 | + note output | |
| 701 | + fin.entry | |
| 702 | +} | |
| 703 | + | |
| 704 | +FUNCTION {proceedings} | |
| 705 | +{ output.bibitem | |
| 706 | + format.editors output | |
| 707 | + editor format.key output % special for | |
| 708 | + output.year.check % apalike | |
| 709 | + new.block | |
| 710 | + format.btitle "title" output.check | |
| 711 | + format.bvolume output | |
| 712 | + format.number.series output | |
| 713 | + address output % for apalike | |
| 714 | + new.sentence % we always output | |
| 715 | + organization output % a nonempty organization | |
| 716 | + publisher output % here | |
| 717 | + new.block | |
| 718 | + note output | |
| 719 | + fin.entry | |
| 720 | +} | |
| 721 | + | |
| 722 | +FUNCTION {techreport} | |
| 723 | +{ output.bibitem | |
| 724 | + format.authors "author" output.check | |
| 725 | + author format.key output % special for | |
| 726 | + output.year.check % apalike | |
| 727 | + new.block | |
| 728 | + format.title "title" output.check | |
| 729 | + new.block | |
| 730 | + format.tr.number output.nonnull | |
| 731 | + institution "institution" output.check | |
| 732 | + address output | |
| 733 | + new.block | |
| 734 | + note output | |
| 735 | + fin.entry | |
| 736 | +} | |
| 737 | + | |
| 738 | +FUNCTION {unpublished} | |
| 739 | +{ output.bibitem | |
| 740 | + format.authors "author" output.check | |
| 741 | + author format.key output % special for | |
| 742 | + output.year.check % apalike | |
| 743 | + new.block | |
| 744 | + format.title "title" output.check | |
| 745 | + new.block | |
| 746 | + note "note" output.check | |
| 747 | + fin.entry | |
| 748 | +} | |
| 749 | + | |
| 750 | +FUNCTION {default.type} { misc } | |
| 751 | + | |
| 752 | +MACRO {jan} {"January"} | |
| 753 | + | |
| 754 | +MACRO {feb} {"February"} | |
| 755 | + | |
| 756 | +MACRO {mar} {"March"} | |
| 757 | + | |
| 758 | +MACRO {apr} {"April"} | |
| 759 | + | |
| 760 | +MACRO {may} {"May"} | |
| 761 | + | |
| 762 | +MACRO {jun} {"June"} | |
| 763 | + | |
| 764 | +MACRO {jul} {"July"} | |
| 765 | + | |
| 766 | +MACRO {aug} {"August"} | |
| 767 | + | |
| 768 | +MACRO {sep} {"September"} | |
| 769 | + | |
| 770 | +MACRO {oct} {"October"} | |
| 771 | + | |
| 772 | +MACRO {nov} {"November"} | |
| 773 | + | |
| 774 | +MACRO {dec} {"December"} | |
| 775 | + | |
| 776 | +MACRO {acmcs} {"ACM Computing Surveys"} | |
| 777 | + | |
| 778 | +MACRO {acta} {"Acta Informatica"} | |
| 779 | + | |
| 780 | +MACRO {cacm} {"Communications of the ACM"} | |
| 781 | + | |
| 782 | +MACRO {ibmjrd} {"IBM Journal of Research and Development"} | |
| 783 | + | |
| 784 | +MACRO {ibmsj} {"IBM Systems Journal"} | |
| 785 | + | |
| 786 | +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} | |
| 787 | + | |
| 788 | +MACRO {ieeetc} {"IEEE Transactions on Computers"} | |
| 789 | + | |
| 790 | +MACRO {ieeetcad} | |
| 791 | + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} | |
| 792 | + | |
| 793 | +MACRO {ipl} {"Information Processing Letters"} | |
| 794 | + | |
| 795 | +MACRO {jacm} {"Journal of the ACM"} | |
| 796 | + | |
| 797 | +MACRO {jcss} {"Journal of Computer and System Sciences"} | |
| 798 | + | |
| 799 | +MACRO {scp} {"Science of Computer Programming"} | |
| 800 | + | |
| 801 | +MACRO {sicomp} {"SIAM Journal on Computing"} | |
| 802 | + | |
| 803 | +MACRO {tocs} {"ACM Transactions on Computer Systems"} | |
| 804 | + | |
| 805 | +MACRO {tods} {"ACM Transactions on Database Systems"} | |
| 806 | + | |
| 807 | +MACRO {tog} {"ACM Transactions on Graphics"} | |
| 808 | + | |
| 809 | +MACRO {toms} {"ACM Transactions on Mathematical Software"} | |
| 810 | + | |
| 811 | +MACRO {toois} {"ACM Transactions on Office Information Systems"} | |
| 812 | + | |
| 813 | +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} | |
| 814 | + | |
| 815 | +MACRO {tcs} {"Theoretical Computer Science"} | |
| 816 | + | |
| 817 | +READ | |
| 818 | + | |
| 819 | +FUNCTION {sortify} | |
| 820 | +{ purify$ | |
| 821 | + "l" change.case$ | |
| 822 | +} | |
| 823 | + | |
| 824 | +INTEGERS { len } | |
| 825 | + | |
| 826 | +FUNCTION {chop.word} | |
| 827 | +{ 's := | |
| 828 | + 'len := | |
| 829 | + s #1 len substring$ = | |
| 830 | + { s len #1 + global.max$ substring$ } | |
| 831 | + 's | |
| 832 | + if$ | |
| 833 | +} | |
| 834 | + | |
| 835 | +% There are three apalike cases: one person (Jones), | |
| 836 | +% two (Jones and de~Bruijn), and more (Jones et~al.). | |
| 837 | +% This function is much like format.crossref.editors. | |
| 838 | +% | |
| 839 | +FUNCTION {format.lab.names} | |
| 840 | +{ 's := | |
| 841 | + s #1 "{vv~}{ll}" format.name$ | |
| 842 | + s num.names$ duplicate$ | |
| 843 | + #2 > | |
| 844 | + { pop$ " et~al." * } | |
| 845 | + { #2 < | |
| 846 | + 'skip$ | |
| 847 | + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = | |
| 848 | + { " et~al." * } | |
| 849 | + { " and " * s #2 "{vv~}{ll}" format.name$ * } | |
| 850 | + if$ | |
| 851 | + } | |
| 852 | + if$ | |
| 853 | + } | |
| 854 | + if$ | |
| 855 | +} | |
| 856 | + | |
| 857 | +FUNCTION {author.key.label} | |
| 858 | +{ author empty$ | |
| 859 | + { key empty$ | |
| 860 | + { cite$ #1 #3 substring$ } | |
| 861 | + 'key % apalike uses the whole key | |
| 862 | + if$ | |
| 863 | + } | |
| 864 | + { author format.lab.names } | |
| 865 | + if$ | |
| 866 | +} | |
| 867 | + | |
| 868 | +FUNCTION {author.editor.key.label} | |
| 869 | +{ author empty$ | |
| 870 | + { editor empty$ | |
| 871 | + { key empty$ | |
| 872 | + { cite$ #1 #3 substring$ } | |
| 873 | + 'key % apalike uses the whole key | |
| 874 | + if$ | |
| 875 | + } | |
| 876 | + { editor format.lab.names } | |
| 877 | + if$ | |
| 878 | + } | |
| 879 | + { author format.lab.names } | |
| 880 | + if$ | |
| 881 | +} | |
| 882 | + | |
| 883 | +FUNCTION {editor.key.label} | |
| 884 | +{ editor empty$ | |
| 885 | + { key empty$ | |
| 886 | + { cite$ #1 #3 substring$ } | |
| 887 | + 'key % apalike uses the whole key, no organization | |
| 888 | + if$ | |
| 889 | + } | |
| 890 | + { editor format.lab.names } | |
| 891 | + if$ | |
| 892 | +} | |
| 893 | + | |
| 894 | +FUNCTION {calc.label} | |
| 895 | +{ type$ "book" = | |
| 896 | + type$ "inbook" = | |
| 897 | + or | |
| 898 | + 'author.editor.key.label | |
| 899 | + { type$ "proceedings" = | |
| 900 | + 'editor.key.label % apalike ignores organization | |
| 901 | + 'author.key.label % for labeling and sorting | |
| 902 | + if$ | |
| 903 | + } | |
| 904 | + if$ | |
| 905 | + " " % these three lines are | |
| 906 | + * % for apalike, which | |
| 907 | + year field.or.null purify$ #-1 #4 substring$ % uses all four digits | |
| 908 | + * | |
| 909 | + 'label := | |
| 910 | +} | |
| 911 | + | |
| 912 | +FUNCTION {sort.format.names} | |
| 913 | +{ 's := | |
| 914 | + #1 'nameptr := | |
| 915 | + "" | |
| 916 | + s num.names$ 'numnames := | |
| 917 | + numnames 'namesleft := | |
| 918 | + { namesleft #0 > } | |
| 919 | + { nameptr #1 > | |
| 920 | + { " " * } | |
| 921 | + 'skip$ | |
| 922 | + if$ % apalike uses initials | |
| 923 | + s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here | |
| 924 | + nameptr numnames = t "others" = and | |
| 925 | + { "et al" * } | |
| 926 | + { t sortify * } | |
| 927 | + if$ | |
| 928 | + nameptr #1 + 'nameptr := | |
| 929 | + namesleft #1 - 'namesleft := | |
| 930 | + } | |
| 931 | + while$ | |
| 932 | +} | |
| 933 | + | |
| 934 | +FUNCTION {sort.format.title} | |
| 935 | +{ 't := | |
| 936 | + "A " #2 | |
| 937 | + "An " #3 | |
| 938 | + "The " #4 t chop.word | |
| 939 | + chop.word | |
| 940 | + chop.word | |
| 941 | + sortify | |
| 942 | + #1 global.max$ substring$ | |
| 943 | +} | |
| 944 | + | |
| 945 | +FUNCTION {author.sort} | |
| 946 | +{ author empty$ | |
| 947 | + { key empty$ | |
| 948 | + { "to sort, need author or key in " cite$ * warning$ | |
| 949 | + "" | |
| 950 | + } | |
| 951 | + { key sortify } | |
| 952 | + if$ | |
| 953 | + } | |
| 954 | + { author sort.format.names } | |
| 955 | + if$ | |
| 956 | +} | |
| 957 | + | |
| 958 | +FUNCTION {author.editor.sort} | |
| 959 | +{ author empty$ | |
| 960 | + { editor empty$ | |
| 961 | + { key empty$ | |
| 962 | + { "to sort, need author, editor, or key in " cite$ * warning$ | |
| 963 | + "" | |
| 964 | + } | |
| 965 | + { key sortify } | |
| 966 | + if$ | |
| 967 | + } | |
| 968 | + { editor sort.format.names } | |
| 969 | + if$ | |
| 970 | + } | |
| 971 | + { author sort.format.names } | |
| 972 | + if$ | |
| 973 | +} | |
| 974 | + | |
| 975 | +FUNCTION {editor.sort} | |
| 976 | +{ editor empty$ | |
| 977 | + { key empty$ | |
| 978 | + { "to sort, need editor or key in " cite$ * warning$ | |
| 979 | + "" | |
| 980 | + } | |
| 981 | + { key sortify } | |
| 982 | + if$ | |
| 983 | + } | |
| 984 | + { editor sort.format.names } | |
| 985 | + if$ | |
| 986 | +} | |
| 987 | + | |
| 988 | +% apalike uses two sorting passes; the first one sets the | |
| 989 | +% labels so that the `a's, `b's, etc. can be computed; | |
| 990 | +% the second pass puts the references in "correct" order. | |
| 991 | +% The presort function is for the first pass. It computes | |
| 992 | +% label, sort.label, and title, and then concatenates. | |
| 993 | +FUNCTION {presort} | |
| 994 | +{ calc.label | |
| 995 | + label sortify | |
| 996 | + " " | |
| 997 | + * | |
| 998 | + type$ "book" = | |
| 999 | + type$ "inbook" = | |
| 1000 | + or | |
| 1001 | + 'author.editor.sort | |
| 1002 | + { type$ "proceedings" = | |
| 1003 | + 'editor.sort | |
| 1004 | + 'author.sort | |
| 1005 | + if$ | |
| 1006 | + } | |
| 1007 | + if$ | |
| 1008 | + #1 entry.max$ substring$ % for | |
| 1009 | + 'sort.label := % apalike | |
| 1010 | + sort.label % style | |
| 1011 | + * | |
| 1012 | + " " | |
| 1013 | + * | |
| 1014 | + title field.or.null | |
| 1015 | + sort.format.title | |
| 1016 | + * | |
| 1017 | + #1 entry.max$ substring$ | |
| 1018 | + 'sort.key$ := | |
| 1019 | +} | |
| 1020 | + | |
| 1021 | +ITERATE {presort} | |
| 1022 | + | |
| 1023 | +SORT % by label, sort.label, title---for final label calculation | |
| 1024 | + | |
| 1025 | +STRINGS { last.label next.extra } % apalike labels are only for the text; | |
| 1026 | + | |
| 1027 | +INTEGERS { last.extra.num } % there are none in the bibliography | |
| 1028 | + | |
| 1029 | +FUNCTION {initialize.extra.label.stuff} % and hence there is no `longest.label' | |
| 1030 | +{ #0 int.to.chr$ 'last.label := | |
| 1031 | + "" 'next.extra := | |
| 1032 | + #0 'last.extra.num := | |
| 1033 | +} | |
| 1034 | + | |
| 1035 | +FUNCTION {forward.pass} | |
| 1036 | +{ last.label label = | |
| 1037 | + { last.extra.num #1 + 'last.extra.num := | |
| 1038 | + last.extra.num int.to.chr$ 'extra.label := | |
| 1039 | + } | |
| 1040 | + { "a" chr.to.int$ 'last.extra.num := | |
| 1041 | + "" 'extra.label := | |
| 1042 | + label 'last.label := | |
| 1043 | + } | |
| 1044 | + if$ | |
| 1045 | +} | |
| 1046 | + | |
| 1047 | +FUNCTION {reverse.pass} | |
| 1048 | +{ next.extra "b" = | |
| 1049 | + { "a" 'extra.label := } | |
| 1050 | + 'skip$ | |
| 1051 | + if$ | |
| 1052 | + label extra.label * 'label := | |
| 1053 | + extra.label 'next.extra := | |
| 1054 | +} | |
| 1055 | + | |
| 1056 | +EXECUTE {initialize.extra.label.stuff} | |
| 1057 | + | |
| 1058 | +ITERATE {forward.pass} | |
| 1059 | + | |
| 1060 | +REVERSE {reverse.pass} | |
| 1061 | + | |
| 1062 | +% Now that the label is right we sort for real, | |
| 1063 | +% on sort.label then year then title. This is | |
| 1064 | +% for the second sorting pass. | |
| 1065 | +FUNCTION {bib.sort.order} | |
| 1066 | +{ sort.label | |
| 1067 | + " " | |
| 1068 | + * | |
| 1069 | + year field.or.null sortify | |
| 1070 | + * | |
| 1071 | + " " | |
| 1072 | + * | |
| 1073 | + title field.or.null | |
| 1074 | + sort.format.title | |
| 1075 | + * | |
| 1076 | + #1 entry.max$ substring$ | |
| 1077 | + 'sort.key$ := | |
| 1078 | +} | |
| 1079 | + | |
| 1080 | +ITERATE {bib.sort.order} | |
| 1081 | + | |
| 1082 | +SORT % by sort.label, year, title---giving final bibliography order | |
| 1083 | + | |
| 1084 | +FUNCTION {begin.bib} | |
| 1085 | +{ preamble$ empty$ % no \etalchar in apalike | |
| 1086 | + 'skip$ | |
| 1087 | + { preamble$ write$ newline$ } | |
| 1088 | + if$ | |
| 1089 | + "\begin{thebibliography}{}" write$ newline$ % no labels in apalike | |
| 1090 | +} | |
| 1091 | + | |
| 1092 | +EXECUTE {begin.bib} | |
| 1093 | + | |
| 1094 | +EXECUTE {init.state.consts} | |
| 1095 | + | |
| 1096 | +ITERATE {call.type$} | |
| 1097 | + | |
| 1098 | +FUNCTION {end.bib} | |
| 1099 | +{ newline$ | |
| 1100 | + "\end{thebibliography}" write$ newline$ | |
| 1101 | +} | |
| 1102 | + | |
| 1103 | +EXECUTE {end.bib} | ... | ... |
| ... | ... | @@ -0,0 +1,48 @@ |
| 1 | +@book{kon2012, | |
| 2 | + title={Software Livre e Propriedade Intelectual: Aspectos Jur{\'\i}dicos, Licen{\c{c}}as e Modelos de Neg{\'o}cios}, | |
| 3 | + author={Kon, Fabio and Lago, Nelson and Meirelles, Paulo and Sabino, Vanessa}, | |
| 4 | + journal={http://ccsl. ime. usp. br/files/slpi. pdf>. Acesso em}, | |
| 5 | + volume={2}, | |
| 6 | + pages={12}, | |
| 7 | + year={2012} | |
| 8 | +} | |
| 9 | + | |
| 10 | +@article{hippel2003, | |
| 11 | + author = {Hippel, Eric von and Krogh, Georg von}, | |
| 12 | + title = {Open Source Software and the "Private-Collective" Innovation Model: Issues for Organization Science}, | |
| 13 | + journal = {Organization Science}, | |
| 14 | + issue_date = {March 2003}, | |
| 15 | + volume = {14}, | |
| 16 | + number = {2}, | |
| 17 | + month = mar, | |
| 18 | + year = {2003}, | |
| 19 | + issn = {1526-5455}, | |
| 20 | + pages = {209--223}, | |
| 21 | + numpages = {15}, | |
| 22 | + url = {http://dx.doi.org/10.1287/orsc.14.2.209.14992}, | |
| 23 | + doi = {10.1287/orsc.14.2.209.14992}, | |
| 24 | + acmid = {970585}, | |
| 25 | + publisher = {INFORMS}, | |
| 26 | + address = {Institute for Operations Research and the Management Sciences (INFORMS), Linthicum, Maryland, USA}, | |
| 27 | + keywords = {Incentives, Innovation, Open source software, User innovation, users, collective action}, | |
| 28 | +} | |
| 29 | + | |
| 30 | +@phdthesis{meirelles2013, | |
| 31 | + title={Monitoring Source Code Metrics in Free Software Projects}, | |
| 32 | + author={Meirelles, Paulo Roberto Miranda}, | |
| 33 | + year={2013}, | |
| 34 | + school={Department of Computer Science -- Institute of Mathematics and Statistics of University of S{\~a}o Paulo}, | |
| 35 | + note = {[in portuguese]}, | |
| 36 | + url={http://www.teses.usp.br/teses/disponiveis/45/45134/tde-27082013-090242/en.php} | |
| 37 | +} | |
| 38 | + | |
| 39 | +@mastersthesis{sabino2009, | |
| 40 | + title={A systematic study on Free Software License}, | |
| 41 | + author={Vanessa Sabino}, | |
| 42 | + year={2009}, | |
| 43 | + school={Department of Computer Science -- Institute of Mathematics and Statistics of University of S{\~a}o Paulo}, | |
| 44 | + note = {[in portuguese]}, | |
| 45 | + url={http://www.teses.usp.br/teses/disponiveis/45/45134/tde-14032012-003454/en.php} | |
| 46 | + | |
| 47 | +} | |
| 48 | + | ... | ... |
| ... | ... | @@ -0,0 +1,33 @@ |
| 1 | +\documentclass[12pt]{article} | |
| 2 | + | |
| 3 | +\usepackage{sbc-template} | |
| 4 | +\usepackage{graphicx,url} | |
| 5 | +\usepackage[brazil]{babel} | |
| 6 | +\usepackage[utf8]{inputenc} | |
| 7 | +\usepackage{float} | |
| 8 | +\usepackage{setspace} | |
| 9 | + | |
| 10 | +\usepackage{tabularx} | |
| 11 | +\usepackage{cite} | |
| 12 | + | |
| 13 | +\begin{document} | |
| 14 | +\sloppy | |
| 15 | +\title{Lições aprendidas no desenvolvimento do novo portal do Software Público Brasileiro} | |
| 16 | + | |
| 17 | +\author{Paulo Meirelles\inst{1}, Hilmer Neri\inst{1}} | |
| 18 | + | |
| 19 | +\address{Laboratório de Produção, Pesquisa e Inovação em Sofware(LAPPIS)\\ | |
| 20 | + Faculdade UnB Gama (FGA) -- Universidade de Brasília (UnB) | |
| 21 | +% Área Especial de Indústria Projeção A, Setor Leste -- Gama - DF -- Brasil | |
| 22 | + \email{\{paulormm,hilmer\}@unb.br} | |
| 23 | +} | |
| 24 | + | |
| 25 | +\maketitle | |
| 26 | + | |
| 27 | +\input{content/01-introduction} | |
| 28 | +\input{content/04-architecture} | |
| 29 | +\input{content/07-process} | |
| 30 | +\input{content/09-lessons} | |
| 31 | +\input{content/10-finals} | |
| 32 | + | |
| 33 | +\end{document} | ... | ... |