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} | ... | ... |