← All templates

UFFS Computer Science undergraduate thesis (uffstex)

The uffstex class of UFFS's Computer Science course for undergraduate final papers (TCC), abnTeX2-based, in Portuguese.

Create an account to use this
Category
Thesis
Document class
uffstex (uffstex.cls) — ships with TeX Live
Workflow
Thesis / dissertation — submissions and revision rounds
Author
Federal University of Fronteira Sul, Computer Science course (uffstex)
Source
Federal University of Fronteira Sul, Computer Science course (uffstex)
Licence
uffstex.cls: LaTeX Project Public License. The sample text is Federal University of Fronteira Sul, Computer Science course (uffstex)'s, provided for authors preparing a submission.

These are the publisher’s own files. This project starts from Federal University of Fronteira Sul, Computer Science course (uffstex)’s package for this publication — their manuscript, their uffstex.cls, their bibliography style — so what compiles here is what they would have given you.

Federal University of Fronteira Sul, Computer Science course (uffstex) serves this exact file to Federal University of Fronteira Sul. Check Federal University of Fronteira Sul, Computer Science course (uffstex)’s author pages for the current instructions.

What you get

  • LICENSE · 19 KB
  • exemplos/refs.bib · 582 B
  • logo.png · 68 KB
  • sbc.bst · 21 KB
  • tcc.tex — the file that is compiled · 11 KB
  • uffstex.cls · 21 KB

These become your files. Editing them afterwards changes your project and nothing else — a project owns its files from the moment it is made.

Source

LICENSE — binary, 19 KB

exemplos/refs.bib · 582 B
@book{halim3rd,
	author={Steven Halim and Felix Halim},
	title={Competitive Programming},
	subtitle={The New Lower Bound of Programming Contests},
	edition={3},
	pagetotal={447},
	year={2013},
	publisher={Lulu},
	url={https://cpbook.net}
}

@book{exupery15,
  author={Antoine de Saint-Exupéry},
  title={O Pequeno Príncipe},
  origtitle={Le Petit Prince},
  language={brazilian},
  origlanguage={french},
  translator={Ivone C. Benedetti},
  publisher={L\&PM},
  edition={1},
  location={Porto Alegre},
  date={2015-01-15},
	year={2013},
  pagetotal={96},
  isbn={9788525432193}
}

logo.png — binary, 68 KB

sbc.bst · 21 KB
%% copy of "apalike" for SBC (no comma before year in citation label)

% BibTeX `apalike' bibliography style (24-Jan-88 version)
% Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a.
% Copyright (C) 1988, all rights reserved.
% Copying of this file is allowed, provided that if you make any changes at all
% you name it something other than `apalike.bst'.
% This restriction helps ensure that all copies are identical.
% Differences between this style and `alpha' are generally heralded by a `%'.
% The file btxbst.doc has the documentation for alpha.bst.
%
% This style should be used with the `apalike' LaTeX style (apalike.sty).
% \cite's come out like "(Jones, 1986)" in the text but there are no labels
% in the bibliography, and something like "(1986)" comes out immediately
% after the author.  Author (and editor) names appear as last name, comma,
% initials.  A `year' field is required for every entry, and so is either
% an author (or in some cases, an editor) field or a key field.
%
% Editorial note:
% Many journals require a style like `apalike', but I strongly, strongly,
% strongly recommend that you not use it if you have a choice---use something
% like `plain' instead.  Mary-Claire van Leunen (A Handbook for Scholars,
% Knopf, 1979) argues convincingly that a style like `plain' encourages better
% writing than one like `apalike'.  Furthermore the strongest arguments for
% using an author-date style like `apalike'---that it's "the most practical"
% (The Chicago Manual of Style, University of Chicago Press, thirteenth
% edition, 1982, pages 400--401)---fall flat on their face with the new
% computer-typesetting technology.  For instance page 401 anachronistically
% states "The chief disadvantage of [a style like `plain'] is that additions
% or deletions cannot be made after the manuscript is typed without changing
% numbers in both text references and list."  LaTeX sidesteps the disadvantage.
%
% History:
%   15-sep-86	(SK,OP)	Original version, by Susan King and Oren Patashnik.
%   10-nov-86	(OP)	Truncated the sort.key$ string to the correct length
%			in bib.sort.order to eliminate error message.
%   24-jan-88	(OP)	Updated for BibTeX version 0.99a, from alpha.bst 0.99a;
%			apalike now sorts by author, then year, then title;
%			THIS `apalike' VERSION DOES NOT WORK WITH BIBTEX 0.98i.

ENTRY
  { address
    author
    booktitle
    chapter
    edition
    editor
    howpublished
    institution
    journal
    key
%    month		not used in apalike
    note
    number
    organization
    pages
    publisher
    school
    series
    title
    type
    volume
    year
  }
  {}
  { label extra.label sort.label }

INTEGERS { output.state before.all mid.sentence after.sentence after.block }

FUNCTION {init.state.consts}
{ #0 'before.all :=
  #1 'mid.sentence :=
  #2 'after.sentence :=
  #3 'after.block :=
}

STRINGS { s t }

FUNCTION {output.nonnull}
{ 's :=
  output.state mid.sentence =
    { ", " * write$ }
    { output.state after.block =
	{ add.period$ write$
	  newline$
	  "\newblock " write$
	}
	{ output.state before.all =
	    'write$
	    { add.period$ " " * write$ }
	  if$
	}
      if$
      mid.sentence 'output.state :=
    }
  if$
  s
}

FUNCTION {output}
{ duplicate$ empty$
    'pop$
    'output.nonnull
  if$
}

FUNCTION {output.check}
{ 't :=
  duplicate$ empty$
    { pop$ "empty " t * " in " * cite$ * warning$ }
    'output.nonnull
  if$
}

%					apalike needs this function because
%					the year has special punctuation;
%					apalike ignores the month
FUNCTION {output.year.check}
{ year empty$
    { "empty year in " cite$ * warning$ }
    { write$
      " (" year * extra.label * ")" *
      mid.sentence 'output.state :=
    }
  if$
}

FUNCTION {output.bibitem}
{ newline$
  "\bibitem[" write$
  label write$
  "]{" write$
  cite$ write$
  "}" write$
  newline$
  ""
  before.all 'output.state :=
}

FUNCTION {fin.entry}
{ add.period$
  write$
  newline$
}

FUNCTION {new.block}
{ output.state before.all =
    'skip$
    { after.block 'output.state := }
  if$
}

FUNCTION {new.sentence}
{ output.state after.block =
    'skip$
    { output.state before.all =
	'skip$
	{ after.sentence 'output.state := }
      if$
    }
  if$
}

FUNCTION {not}
{   { #0 }
    { #1 }
  if$
}

FUNCTION {and}
{   'skip$
    { pop$ #0 }
  if$
}

FUNCTION {or}
{   { pop$ #1 }
    'skip$
  if$
}

FUNCTION {new.block.checkb}
{ empty$
  swap$ empty$
  and
    'skip$
    'new.block
  if$
}

FUNCTION {field.or.null}
{ duplicate$ empty$
    { pop$ "" }
    'skip$
  if$
}

FUNCTION {emphasize}
{ duplicate$ empty$
    { pop$ "" }
    { "{\em " swap$ * "}" * }
  if$
}

INTEGERS { nameptr namesleft numnames }

FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't :=   % last name first
      nameptr #1 >
	{ namesleft #1 >
	    { ", " * t * }
	    { numnames #2 >
		{ "," * }
		'skip$
	      if$
	      t "others" =
		{ " et~al." * }
		{ " and " * t * }
	      if$
	    }
	  if$
	}
	't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

FUNCTION {format.authors}
{ author empty$
    { "" }
    { author format.names }
  if$
}

FUNCTION {format.key}			% this function is just for apalike
{ empty$
    { key field.or.null }
    { "" }
  if$
}

FUNCTION {format.editors}
{ editor empty$
    { "" }
    { editor format.names
      editor num.names$ #1 >
	{ ", editors" * }
	{ ", editor" * }
      if$
    }
  if$
}

FUNCTION {format.title}
{ title empty$
    { "" }
    { title "t" change.case$ }
  if$
}

FUNCTION {n.dashify}
{ 't :=
  ""
    { t empty$ not }
    { t #1 #1 substring$ "-" =
	{ t #1 #2 substring$ "--" = not
	    { "--" *
	      t #2 global.max$ substring$ 't :=
	    }
	    {   { t #1 #1 substring$ "-" = }
		{ "-" *
		  t #2 global.max$ substring$ 't :=
		}
	      while$
	    }
	  if$
	}
	{ t #1 #1 substring$ *
	  t #2 global.max$ substring$ 't :=
	}
      if$
    }
  while$
}

FUNCTION {format.btitle}
{ title emphasize
}

FUNCTION {tie.or.space.connect}
{ duplicate$ text.length$ #3 <
    { "~" }
    { " " }
  if$
  swap$ * *
}

FUNCTION {either.or.check}
{ empty$
    'pop$
    { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  if$
}

FUNCTION {format.bvolume}
{ volume empty$
    { "" }
    { "volume" volume tie.or.space.connect
      series empty$
	'skip$
	{ " of " * series emphasize * }
      if$
      "volume and number" number either.or.check
    }
  if$
}

FUNCTION {format.number.series}
{ volume empty$
    { number empty$
	{ series field.or.null }
	{ output.state mid.sentence =
	    { "number" }
	    { "Number" }
	  if$
	  number tie.or.space.connect
	  series empty$
	    { "there's a number but no series in " cite$ * warning$ }
	    { " in " * series * }
	  if$
	}
      if$
    }
    { "" }
  if$
}

FUNCTION {format.edition}
{ edition empty$
    { "" }
    { output.state mid.sentence =
	{ edition "l" change.case$ " edition" * }
	{ edition "t" change.case$ " edition" * }
      if$
    }
  if$
}

INTEGERS { multiresult }

FUNCTION {multi.page.check}
{ 't :=
  #0 'multiresult :=
    { multiresult not
      t empty$ not
      and
    }
    { t #1 #1 substring$
      duplicate$ "-" =
      swap$ duplicate$ "," =
      swap$ "+" =
      or or
	{ #1 'multiresult := }
	{ t #2 global.max$ substring$ 't := }
      if$
    }
  while$
  multiresult
}

FUNCTION {format.pages}
{ pages empty$
    { "" }
    { pages multi.page.check
	{ "pages" pages n.dashify tie.or.space.connect }
	{ "page" pages tie.or.space.connect }
      if$
    }
  if$
}

FUNCTION {format.vol.num.pages}
{ volume field.or.null
  number empty$
    'skip$
    { "(" number * ")" * *
      volume empty$
	{ "there's a number but no volume in " cite$ * warning$ }
	'skip$
      if$
    }
  if$
  pages empty$
    'skip$
    { duplicate$ empty$
	{ pop$ format.pages }
	{ ":" * pages n.dashify * }
      if$
    }
  if$
}

FUNCTION {format.chapter.pages}
{ chapter empty$
    'format.pages
    { type empty$
	{ "chapter" }
	{ type "l" change.case$ }
      if$
      chapter tie.or.space.connect
      pages empty$
	'skip$
	{ ", " * format.pages * }
      if$
    }
  if$
}

FUNCTION {format.in.ed.booktitle}
{ booktitle empty$
    { "" }
    { editor empty$
	{ "In " booktitle emphasize * }
	{ "In " format.editors * ", " * booktitle emphasize * }
      if$
    }
  if$
}

FUNCTION {format.thesis.type}
{ type empty$
    'skip$
    { pop$
      type "t" change.case$
    }
  if$
}

FUNCTION {format.tr.number}
{ type empty$
    { "Technical Report" }
    'type
  if$
  number empty$
    { "t" change.case$ }
    { number tie.or.space.connect }
  if$
}

FUNCTION {format.article.crossref}
{ "In"							% this is for apalike
  " \cite{" * crossref * "}" *
}

FUNCTION {format.book.crossref}
{ volume empty$
    { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
      "In "
    }
    { "Volume" volume tie.or.space.connect
      " of " *
    }
  if$
  "\cite{" * crossref * "}" *				% this is for apalike
}

FUNCTION {format.incoll.inproc.crossref}
{ "In"							% this is for apalike
  " \cite{" * crossref * "}" *
}

FUNCTION {article}
{ output.bibitem
  format.authors "author" output.check
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.title "title" output.check
  new.block
  crossref missing$
    { journal emphasize "journal" output.check
      format.vol.num.pages output
    }
    { format.article.crossref output.nonnull
      format.pages output
    }
  if$
  new.block
  note output
  fin.entry
}

FUNCTION {book}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check
      editor format.key output
    }
    { format.authors output.nonnull
      crossref missing$
	{ "author and editor" editor either.or.check }
	'skip$
      if$
    }
  if$
  output.year.check				% special for apalike
  new.block
  format.btitle "title" output.check
  crossref missing$
    { format.bvolume output
      new.block
      format.number.series output
      new.sentence
      publisher "publisher" output.check
      address output
    }
    { new.block
      format.book.crossref output.nonnull
    }
  if$
  format.edition output
  new.block
  note output
  fin.entry
}

FUNCTION {booklet}
{ output.bibitem
  format.authors output
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.title "title" output.check
  new.block
  howpublished output
  address output
  new.block
  note output
  fin.entry
}

FUNCTION {inbook}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check
      editor format.key output
    }
    { format.authors output.nonnull
      crossref missing$
	{ "author and editor" editor either.or.check }
	'skip$
      if$
    }
  if$
  output.year.check				% special for apalike
  new.block
  format.btitle "title" output.check
  crossref missing$
    { format.bvolume output
      format.chapter.pages "chapter and pages" output.check
      new.block
      format.number.series output
      new.sentence
      publisher "publisher" output.check
      address output
    }
    { format.chapter.pages "chapter and pages" output.check
      new.block
      format.book.crossref output.nonnull
    }
  if$
  format.edition output
  new.block
  note output
  fin.entry
}

FUNCTION {incollection}
{ output.bibitem
  format.authors "author" output.check
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.title "title" output.check
  new.block
  crossref missing$
    { format.in.ed.booktitle "booktitle" output.check
      format.bvolume output
      format.number.series output
      format.chapter.pages output
      new.sentence
      publisher "publisher" output.check
      address output
      format.edition output
    }
    { format.incoll.inproc.crossref output.nonnull
      format.chapter.pages output
    }
  if$
  new.block
  note output
  fin.entry
}

FUNCTION {inproceedings}
{ output.bibitem
  format.authors "author" output.check
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.title "title" output.check
  new.block
  crossref missing$
    { format.in.ed.booktitle "booktitle" output.check
      format.bvolume output
      format.number.series output
      format.pages output
      address output					% for apalike
      new.sentence					% there's no year
      organization output				% here so things
      publisher output					% are simpler
    }
    { format.incoll.inproc.crossref output.nonnull
      format.pages output
    }
  if$
  new.block
  note output
  fin.entry
}

FUNCTION {conference} { inproceedings }

FUNCTION {manual}
{ output.bibitem
  format.authors output
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.btitle "title" output.check
  organization address new.block.checkb
  organization output
  address output
  format.edition output
  new.block
  note output
  fin.entry
}

FUNCTION {mastersthesis}
{ output.bibitem
  format.authors "author" output.check
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.title "title" output.check
  new.block
  "Master's thesis" format.thesis.type output.nonnull
  school "school" output.check
  address output
  new.block
  note output
  fin.entry
}

FUNCTION {misc}
{ output.bibitem
  format.authors output
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.title output
  new.block
  howpublished output
  new.block
  note output
  fin.entry
}

FUNCTION {phdthesis}
{ output.bibitem
  format.authors "author" output.check
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.btitle "title" output.check
  new.block
  "PhD thesis" format.thesis.type output.nonnull
  school "school" output.check
  address output
  new.block
  note output
  fin.entry
}

FUNCTION {proceedings}
{ output.bibitem
  format.editors output
  editor format.key output				% special for
  output.year.check					% apalike
  new.block
  format.btitle "title" output.check
  format.bvolume output
  format.number.series output
  address output				% for apalike
  new.sentence					% we always output
  organization output				% a nonempty organization
  publisher output				% here
  new.block
  note output
  fin.entry
}

FUNCTION {techreport}
{ output.bibitem
  format.authors "author" output.check
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.title "title" output.check
  new.block
  format.tr.number output.nonnull
  institution "institution" output.check
  address output
  new.block
  note output
  fin.entry
}

FUNCTION {unpublished}
{ output.bibitem
  format.authors "author" output.check
  author format.key output				% special for
  output.year.check					% apalike
  new.block
  format.title "title" output.check
  new.block
  note "note" output.check
  fin.entry
}

FUNCTION {default.type} { misc }

MACRO {jan} {"January"}

MACRO {feb} {"February"}

MACRO {mar} {"March"}

MACRO {apr} {"April"}

MACRO {may} {"May"}

MACRO {jun} {"June"}

MACRO {jul} {"July"}

MACRO {aug} {"August"}

MACRO {sep} {"September"}

MACRO {oct} {"October"}

MACRO {nov} {"November"}

MACRO {dec} {"December"}

MACRO {acmcs} {"ACM Computing Surveys"}

MACRO {acta} {"Acta Informatica"}

MACRO {cacm} {"Communications of the ACM"}

MACRO {ibmjrd} {"IBM Journal of Research and Development"}

MACRO {ibmsj} {"IBM Systems Journal"}

MACRO {ieeese} {"IEEE Transactions on Software Engineering"}

MACRO {ieeetc} {"IEEE Transactions on Computers"}

MACRO {ieeetcad}
 {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}

MACRO {ipl} {"Information Processing Letters"}

MACRO {jacm} {"Journal of the ACM"}

MACRO {jcss} {"Journal of Computer and System Sciences"}

MACRO {scp} {"Science of Computer Programming"}

MACRO {sicomp} {"SIAM Journal on Computing"}

MACRO {tocs} {"ACM Transactions on Computer Systems"}

MACRO {tods} {"ACM Transactions on Database Systems"}

MACRO {tog} {"ACM Transactions on Graphics"}

MACRO {toms} {"ACM Transactions on Mathematical Software"}

MACRO {toois} {"ACM Transactions on Office Information Systems"}

MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}

MACRO {tcs} {"Theoretical Computer Science"}

READ

FUNCTION {sortify}
{ purify$
  "l" change.case$
}

INTEGERS { len }

FUNCTION {chop.word}
{ 's :=
  'len :=
  s #1 len substring$ =
    { s len #1 + global.max$ substring$ }
    's
  if$
}

%			There are three apalike cases: one person (Jones),
%			two (Jones and de~Bruijn), and more (Jones et~al.).
%			This function is much like format.crossref.editors.
%
FUNCTION {format.lab.names}
{ 's :=
  s #1 "{vv~}{ll}" format.name$
  s num.names$ duplicate$
  #2 >
    { pop$ " et~al." * }
    { #2 <
	'skip$
	{ s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
	    { " et~al." * }
	    { " and " * s #2 "{vv~}{ll}" format.name$ * }
	  if$
	}
      if$
    }
  if$
}

FUNCTION {author.key.label}
{ author empty$
    { key empty$
	{ cite$ #1 #3 substring$ }
	'key					% apalike uses the whole key
      if$
    }
    { author format.lab.names }
  if$
}

FUNCTION {author.editor.key.label}
{ author empty$
    { editor empty$
	{ key empty$
	    { cite$ #1 #3 substring$ }
	    'key				% apalike uses the whole key
	  if$
	}
	{ editor format.lab.names }
      if$
    }
    { author format.lab.names }
  if$
}

FUNCTION {editor.key.label}
{ editor empty$
    { key empty$
	{ cite$ #1 #3 substring$ }
	'key			% apalike uses the whole key, no organization
      if$
    }
    { editor format.lab.names }
  if$
}

FUNCTION {calc.label}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.label
    { type$ "proceedings" =
	'editor.key.label			% apalike ignores organization
	'author.key.label			% for labeling and sorting
      if$
    }
  if$
  " "							% these three lines are
  *							% for apalike, which
  year field.or.null purify$ #-1 #4 substring$		% uses all four digits
  *
  'label :=
}

FUNCTION {sort.format.names}
{ 's :=
  #1 'nameptr :=
  ""
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { nameptr #1 >
	{ "   " * }
	'skip$
      if$						% apalike uses initials
      s nameptr "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}" format.name$ 't := % <= here
      nameptr numnames = t "others" = and
	{ "et al" * }
	{ t sortify * }
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

FUNCTION {sort.format.title}
{ 't :=
  "A " #2
    "An " #3
      "The " #4 t chop.word
    chop.word
  chop.word
  sortify
  #1 global.max$ substring$
}

FUNCTION {author.sort}
{ author empty$
    { key empty$
	{ "to sort, need author or key in " cite$ * warning$
	  ""
	}
	{ key sortify }
      if$
    }
    { author sort.format.names }
  if$
}

FUNCTION {author.editor.sort}
{ author empty$
    { editor empty$
	{ key empty$
	    { "to sort, need author, editor, or key in " cite$ * warning$
	      ""
	    }
	    { key sortify }
	  if$
	}
	{ editor sort.format.names }
      if$
    }
    { author sort.format.names }
  if$
}

FUNCTION {editor.sort}
{ editor empty$
    { key empty$
	{ "to sort, need editor or key in " cite$ * warning$
	  ""
	}
	{ key sortify }
      if$
    }
    { editor sort.format.names }
  if$
}

%			apalike uses two sorting passes; the first one sets the
%			labels so that the `a's, `b's, etc. can be computed;
%			the second pass puts the references in "correct" order.
%			The presort function is for the first pass. It computes
%			label, sort.label, and title, and then concatenates.
FUNCTION {presort}
{ calc.label
  label sortify
  "    "
  *
  type$ "book" =
  type$ "inbook" =
  or
    'author.editor.sort
    { type$ "proceedings" =
	'editor.sort
	'author.sort
      if$
    }
  if$
  #1 entry.max$ substring$	% for
  'sort.label :=		% apalike
  sort.label			% style
  *
  "    "
  *
  title field.or.null
  sort.format.title
  *
  #1 entry.max$ substring$
  'sort.key$ :=
}

ITERATE {presort}

SORT		% by label, sort.label, title---for final label calculation

STRINGS { last.label next.extra }	% apalike labels are only for the text;

INTEGERS { last.extra.num }		% there are none in the bibliography

FUNCTION {initialize.extra.label.stuff}	% and hence there is no `longest.label'
{ #0 int.to.chr$ 'last.label :=
  "" 'next.extra :=
  #0 'last.extra.num :=
}

FUNCTION {forward.pass}
{ last.label label =
    { last.extra.num #1 + 'last.extra.num :=
      last.extra.num int.to.chr$ 'extra.label :=
    }
    { "a" chr.to.int$ 'last.extra.num :=
      "" 'extra.label :=
      label 'last.label :=
    }
  if$
}

FUNCTION {reverse.pass}
{ next.extra "b" =
    { "a" 'extra.label := }
    'skip$
  if$
  label extra.label * 'label :=
  extra.label 'next.extra :=
}

EXECUTE {initialize.extra.label.stuff}

ITERATE {forward.pass}

REVERSE {reverse.pass}

%				Now that the label is right we sort for real,
%				on sort.label then year then title.  This is
%				for the second sorting pass.
FUNCTION {bib.sort.order}
{ sort.label
  "    "
  *
  year field.or.null sortify
  *
  "    "
  *
  title field.or.null
  sort.format.title
  *
  #1 entry.max$ substring$
  'sort.key$ :=
}

ITERATE {bib.sort.order}

SORT		% by sort.label, year, title---giving final bibliography order

FUNCTION {begin.bib}
{ preamble$ empty$				% no \etalchar in apalike
    'skip$
    { preamble$ write$ newline$ }
  if$
  "\begin{thebibliography}{}" write$ newline$		% no labels in apalike
}

EXECUTE {begin.bib}

EXECUTE {init.state.consts}

ITERATE {call.type$}

FUNCTION {end.bib}
{ newline$
  "\end{thebibliography}" write$ newline$
}

EXECUTE {end.bib}
tcc.tex — the file that is compiled · 11 KB
% Opção global de idioma "brazilian"
% (mesmo que uffstex ou abntex2 façam algo do tipo).
% Para escrever em inglês, colocar "english"
% (o último idioma é o padrão).
% Esta opção é informada aos pacotes importados
% com \usepackage (por exemplo, cleveref ao
% nomear os links das referências) e para as
% regras de hifenização.
% A opção "serif" estiliza os títulos com a versão
% serifada da fonte escolhida (abntex2 utiliza
% estilo sem serifa por padrão).
\documentclass[serif, english, brazilian]{uffstex}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
% \usepackage[
%   % Estilo numérico é preferível e é
%   % permitido pela ABNT e pela UFFS :)
%   style=abnt-numeric,
%   % Para o estilo autor-data:
%   % style=abnt
%   % Ordenação:
%   % sorting=nty % por nome, título e ano
%   % (a NBR 6023 não especifica desempate de ordenação...)
% ]{biblatex}

% adicionado suporte ao pacote datetime2 para a macro \imprimirdata,
% possibilitando a customização da formatação das datas
\usepackage[useregional=num]{datetime2}
\usepackage{xcolor}
\usepackage{booktabs}
\usepackage{csquotes}
% O abnTeX2 e o uffstex não obrigam
% a utilização de alguma fonte, então, se
% nenhuma for especificada, a padrão do
% LaTeX é utilizada (Computer Modern).
% As fontes do pacote newtx são recomendadas
% para quem deseja utilizar Times New Roman.
\usepackage{newtxtext}
\usepackage{newtxmath}
% cleveref deve ser carregado após hyperref
% (que é carregado automaticamente pelo abntex2)
% e amsmath (pacote newtxmath aparentemente
% carrega amsmath).
\usepackage{cleveref}
\usepackage[
  linesnumbered,
  lined,
  boxed,
  commentsnumbered
]{algorithm2e}

% verde padrão da UFFS segundo a identidade visual
\providecolor{uffsgreen}{RGB}{0, 105, 62}

% Adiciona arquivo de referências para o biblatex
% \addbibresource{refs.bib}

% Comandos de dados
\autor{CC UFFS}
\titulo{\uffstex}
\subtitulo{Classe de trabalhos acadêmicos da UFFS}
\curso{Ciência da Computação}
\cidade{Chapecó}
\uf{SC}
% datetime2 não funciona com \today porque ambos formatam a data
\data{\hoje}
\orientador{Fulano da Computação}
\coorientador{Beltrano da Computação}
\tipotrabalho{Trabalho de conclusão de curso (graduação)}
\palavrachave{Primeira palavra}
\palavrachave{Segunda palavra}
\palavrachave{Terceira palavra}
\palavrachave{Quarta palavra}
\palavrachave{Quinta palavra}

\begin{document}
% Ainda precisamos selecionar o idioma aqui
% para imprimir os rótulos no idioma correto,
% caso não seja português do Brasil.
% \selectlanguage{english}

% Início da parte pré-textual
% (opcional, abnTeX2 faz automaticamente).
\pretextual%

\imprimircapa%

% comando com '*' caso imprimir com twoside (opção padrão do uffstex)
% para a CIP ser impressa no verso.
\imprimirfolhaderosto*%

% ficha catalográfica (Cataloging in Publication (CIP))
% com copyright em "nota de rodapé"
\imprimircip[[email protected]]

\imprimirfolhadeaprovacao{\imprimircoorientador\ -- ABCD}
                         {Ciclano da Computação -- UFFS}
% \imprimirfolhadeaprovacao[<data de defesa, opcional>]
%    {<2o membro>}{<3o membro>}[<4o membro, opcional>][<5o membro, opcional>]

\begin{resumo}
  Escreva aqui seu resumo de 150 a 500 palavras.
  Infelizmente não encontrei, se é que existe, uma maneira de automatizar
  a criação de resumos para outras línguas que não a do documento.
  Então é preciso fazê-lo manualmente, especificando o título do resumo
  (\enquote{Resumo} na língua a ser escrita) e também escrever o texto dentro
  do ambiente \texttt{otherlanguage*}. Além disso, para escrever em uma língua
  diferente da do documento, também é preciso especificá-la para o Babel
  (feito globalmente neste exemplo).

  \vspace{\baselineskip}

  Palavras-chave: \imprimirpcs
\end{resumo}

\begin{resumo}[Abstract]
  \begin{otherlanguage*}{english}
    Your abstract in English.

    \vspace{\baselineskip}

    Keywords: Keyword 1. Keyword 2. Keyword 3. Keyword 4. Keyword 5.
  \end{otherlanguage*}
\end{resumo}

\pdfbookmark{\listfigurename}{lof}
\listoffigures*
\cleardoublepage%

\pdfbookmark{\listalgoritmoname}{\algoritmoext}
\listofalgoritmos*
\cleardoublepage%

\pdfbookmark{\listtablename}{lot}
\listoftables*
\cleardoublepage%

% Coloca o sumário no "sumário do PDF"
% (chamado de bookmark do PDF).
\pdfbookmark{\contentsname}{toc}
% Versão com * não coloca o próprio sumário no sumário
\tableofcontents*
\cleardoublepage%

% Início da parte textual
\textual%

\chapter{Seção primária}

Conteúdo da seção primária.

\section{Seção secundária}

Conteúdo da seção secundária.

\subsection{Seção terciária}

Conteúdo da seção terciária.

\subsubsection{Seção quaternária}

Conteúdo da seção quaternária.

\subsubsubsection{Seção quinária}

Conteúdo da seção quinária.

\section[Título curto]{Uma seção que possui um título longo
pode conter um título curto para o sumário}

É importante notar que não há nenhuma regra nas normas da ABNT ou da UFFS
sobre esta prática.

\chapter{Citações}

\section{Indiretas}

% Para citar com número de página, basta
% informá-la como parâmetro opcional.
Segundo \cite{halim3rd}, codar um array de sufixos é mais fácil que uma árvore de sufixos. Ou então: codar um array de sufixos é mais fácil que uma árvore de sufixos~\cite[253]{halim3rd}.

\section{Diretas}

Um dos trechos mais famosos do livro O Pequeno Príncipe é \enquote{O essencial é invisível aos olhos}~\cite[58]{exupery15}.

\subsection{Com mais de três linhas}

\begin{citacao}
\textit{A Léon Werth.}

Peço perdão às crianças por ter dedicado este livro a um adulto. Tenho uma boa desculpa: esse adulto é o meu melhor amigo no mundo. Tenho outra desculpa: esse adulto pode entender tudo, até livros para crianças. Tenho uma terceira desculpa: esse adulto mora na França, onde sente fome e frio. Também precisa ser consolado. Se todas essas desculpas não bastarem, então quero dedicar este livro à criança que esse adulto foi um dia. Todos os adultos primeiro foram crianças. (Mas poucos se lembram disso.) Portanto, corrijo minha dedicatória:

\textit{A Léon Werth quando era pequeno.}~\cite{exupery15}
\end{citacao}

\chapter{Alíneas}

A ABNT NBR 6024:2012 define que o texto que antecede as alíneas deve terminar com dois pontos; cada alínea deve iniciar com letra minúscula e terminar com ponto e vírgula, exceto a última, finalizada com ponto final, e a alínea que anteceder uma subalínea, finalizada com dois pontos:

\begin{alineas}
  \item item 1;
  \item item 2;
  \item item 3:
  \begin{alineas} % ou \begin{subalineas} ou \begin{incisos}
    \item item 3.1;
    \item item 3.2;
  \end{alineas}
  \item item 4.
\end{alineas}

Note que se a última alínea for uma subalínea, ela será finalizada com ponto final. Além disso, a ABNT define o ponto e vírgula para terminar uma subalínea, enquanto a normalização de trabalhos da UFFS determina o uso da vírgula neste caso. Como desconhecemos se a ABNT define alguma flexibilidade na customização desta regra, deixamos exemplificado o uso da regra original.

\chapter{Tabelas}

Exemplos de tabelas\footnote{Todas as seções devem conter algum texto entre elas, segundo o manual de normalização de trabalhos da UFFS.}.

\section{Tabelas comuns}

% Tabelas comuns do LaTeX, com um pouco
% de beleza graças ao pacote booktabs.
\begin{table}[h]
  \centering
  % \caption é o rótulo (título, identificação), que deve estar
  % acima do elemento (tabelas, figuras, etc).
  \caption{Países, capitais e população total aproximada}%
  \label{tab:paises}
  % @{} remove o espaço nas laterais.
  \begin{tabular}{@{}llr@{}}
    \toprule % linha superior
    % Notas de rodapé não se dão bem com tabelas, então
    % precisa usar \footnotemark com \footnotetext ao
    % invés de apenas \footnote{<texto>}.
    País   & Capital  & População\footnotemark\\
    \midrule % linha do meio
    Brasil & Brasília & 208 milhões\\
    Itália & Roma     & 61 milhões\\
    Canadá & Ottawa   & 37 milhões\\
    China  & Pequim   & 1.4 bilhões\\
    \bottomrule % linha inferior
  \end{tabular}
  \fonte{elaborado pelos autores com dados do Google}
  \nota{Outras informações, se necessário.}
  % Etiqueta para referenciar o elemento no texto.
\end{table}

\section{Tabelas do padrão IBGE}

\begin{table}[htb]
  % \ibgetab{<rótulo e etiqueta>}{<conteúdo>}{<legenda(s)>}
  \ibgetab{%
    \caption{Um Exemplo de tabela conforme o padrão IBGE}%
    \label{tabela-ibge}
  }{
    \begin{tabular}{@{}llr@{}}
      \toprule
      País   & Capital  & População\\
      \midrule
      Brasil & Brasília & 208 milhões\\
      Itália & Roma     & 61 milhões\\
      Canadá & Ottawa   & 37 milhões\\
      China  & Pequim   & 1.4 bilhões\\
      \bottomrule
    \end{tabular}
  }{
    \fonte{elaborado pelos autores, com dados do Google e comandos retirados do manual do \abnTeX}
    \nota{Uma nota.}
    \nota[Anotações]{Outra nota, mas com prefixo diferente.}
  }
\end{table}

\footnotetext{População do país, não da capital!}

\chapter{Imagens}

Na \autoref{fig:logo_uffs} podemos ver a nova assinatura visual da \imprimirinstituicao.

\begin{figure}[h]
  \centering
  \caption{Nova assinatura visual da UFFS}%
  \label{fig:logo_uffs}
  \includegraphics[scale=0.5]{logo.png}
  \fonte{UFFS}
\end{figure}

Na \cref{fig:logo_uffs_ibge} podemos ver a nova assinatura visual da \imprimirinstituicao\ reaproveitando o ambiente das tabelas do IBGE:

\begin{figure}[h]
  \ibgetab{
    \caption{Nova assinatura visual da UFFS}%
    \label{fig:logo_uffs_ibge}
  }{
    \includegraphics[scale=0.5]{logo.png}
  }{
    \fonte{UFFS}
  }
\end{figure}

\chapter{Miscelânea}

\section{Cores}

\textcolor{uffsgreen}{Podemos utilizar a cor verde oficial da UFFS através
do pacote \texttt{xcolor} e do comando:}

\begin{verbatim}
\providecolor{uffsgreen}{RGB}{0, 105, 62}
\end{verbatim}

\section{Algoritmos  }

Por ora, o único pacote que funcionou com o ambiente \texttt{ibgetab} foi o
\texttt{algorithm2e}.

\postextual%

% Para imprimir as referências,
% se utilizar o pacote biblatex (recomendado),
% como neste exemplo:
\bibliographystyle{sbc}  % estilo bibliográfico da Sociedade Brasileira de Computação (SBC)

	%\renewcommand{\bibname}{REFERÊNCIAS BIBLIOGRÁFICAS} %Define o Caption da seção de bibliografia
	%\addcontentsline{toc}{chapter}{REFERÊNCIAS BIBLIOGRÁFICAS}
	
	%não pode ter espaço entre os nomes dos arquivos bib
\bibliography{exemplos/refs}
% E se utilizar o abntex2cite, consultar a documentação:
% https://www.abntex.net.br/#manuais-do-abntex2
% ou
% https://ctan.org/pkg/abntex2
% (item "Ci­ta­tion sup­port pack­age doc­u­men­ta­tion")

\apendices%

\chapter{Um apêndice}

Conteúdo do apêndice.

\anexos%

\chapter{Um anexo}\label[anexo]{umanexo}

Conteúdo do anexo.

Aparentemente o \LaTeX\ não diferencia apêndice de anexo, então é preciso
explicitar o tipo do rótulo do anexo como \texttt{anexo} caso for referenciá-lo:
\verb|\label[anexo]{<rótulo>}|.

Isso só funciona com o \texttt{cleveref}.
Compare:
\autoref{umanexo} (com \verb|\autoref|) e \cref{umanexo} (com \verb|\cref|).

\end{document}
uffstex.cls · 21 KB
%%
%% Customizações do abnTeX2 (https://www.abntex.net.br/)
%% para a Universidade Federal da Fronteira Sul (UFFS).
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
%%
%% The Current Maintainer of this work is the ccuffs team.
%%
%% This work consists of the file uffstex.cls.
%%
%% Further information about abnTeX2 is available on https://www.abntex.net.br/.
%% Further information about ccuffs is available on https://ccuffs.github.io/.
%%

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{uffstex}[2018/12/01 v0.10.5]

% ==============================================================================
% Carregando pacotes necessários
% ==============================================================================
\RequirePackage{xparse}
\RequirePackage{xpatch}
\RequirePackage{graphicx}
\RequirePackage{lastpage}
% pacote indentfirst certifica que sempre haverá
% identação de parágrafo na 1a linha de um novo parágrafo
\RequirePackage{indentfirst}

% ==============================================================================
% Opções padrão para o abntex2
% ==============================================================================
% para controlar onde um capítulo pode iniciar: openleft, openright, openany
% para indicar impressão apenas em anverso ou anverso e verso: oneside, twoside
\PassOptionsToClass{
    12pt,
    a4paper,
    openright,
    twoside,
    brazil,
    chapter=TITLE, % capitaliza títulos primários no texto
    section=TITLE % capitaliza títulos secundários no texto
}{abntex2}

% ==============================================================================
% Declaração das opções da classe
% ==============================================================================

% \AtEndOfClass é utilizado para adiar a execução
% do código até o final do processamento desta classe
% pois o comando \ABNTEXchapterfont é definido pelo
% abntex2, a qual não está carregada neste momento
%
% opção "serif" para redefinir o estilo dos variados
% títulos do abntex2 com família de fontes serifadas
\DeclareOption{serif}{
    \AtEndOfClass{\renewcommand{\ABNTEXchapterfont}{\rmfamily\bfseries}}
}

% \DeclareOption* lida com os comandos não explicitamente
% especificados nesta classe e então os repassa para a
% classe abntex2
\DeclareOption*{
    \PassOptionsToClass{\CurrentOption}{abntex2}
}

\ProcessOptions\relax

\LoadClass{abntex2}

% ==============================================================================
% "Constantes"
% ==============================================================================
\providecommand*{\algoritmoext}{loalg}

% ==============================================================================
% Patches
% ==============================================================================
% patch pra deixar seções em caixa alta no sumário
% (cortesia de Lars Andersen, da classe Memoir)
\xpatchcmd{\H@old@sectm@m}{\fi#7}{%
    \fi\ifnum#2=1\relax\texorpdfstring{\MakeTextUppercase{#7}}{#7}\else#7\fi%
}{%
    \ClassInfo{uffstex}{patch para seções secundárias em caixa alta no
    sumário aplicado com sucesso}%
}{%
    \ClassWarning{uffstex}{patch para seções secundárias em caixa alta no
    sumário falhou}%
}

% patch para deixar apenas o número da página no cabeçalho
\xpatchcmd{\textual}{\pagestyle{abntheadings}}{\pagestyle{simple}}{%
  \ClassInfo{uffstex}{patch para cabeçalho simples de página
  aplicado com sucesso}%
}{%
  \ClassWarning{uffstex}{patch para cabeçalho simples de página falhou}%
}

% ==============================================================================
% Configurações de tamanhos e comprimentos
% ==============================================================================
% tamanho da indentação de novo parágrafo
\setlength{\parindent}{1.25cm}

% espaçamento entre títulos e texto (até seção quinária)
\setlength{\afterchapskip}{\baselineskip}
\setlength{\aftersecskip}{\baselineskip}
\setlength{\aftersubsecskip}{\baselineskip}
\setlength{\aftersubsubsecskip}{\baselineskip}
% (abnTeX2 define \subsubsubsection como \paragraph)
\setlength{\afterparaskip}{\baselineskip}

% remove espaço vertical que antecede uma seção primária no sumário
\setlength{\cftbeforechapterskip}{0cm}

% ==============================================================================
% Localização
% ==============================================================================
% português do Brasil
% por mais que especifiquemos "brazilian" como opção global,
% o abntex2 passa a opção "brazil" pro babel...
\addto\captionsbrazil{
  \providecommand*{\campusname}{campus de}
  \providecommand*{\cursoname}{curso de}
  \renewcommand*{\orientadorname}{Orientador}
  \renewcommand*{\coorientadorname}{Coorientador}
  \providecommand*{\bacharelname}{Bacharel}
  \providecommand*{\licenciaturaname}{Licenciatura}
  \providecommand*{\bancaname}{banca avaliadora}
  \providecommand*{\declaracaoaprovacao}{Este trabalho de conclus\~ao de curso
    foi defendido e aprovado pela \bancaname\ em:}
  \providecommand*{\algoritmoname}{Algoritmo}
  \providecommand*{\listalgoritmoname}{Lista de \algoritmoname{}s}
  \providecommand*{\cipfolhas}{f}
  \providecommand*{\cipiii}{T\'itulo}
  \providecommand*{\notacopia}{Todos os direitos autorais reservados
  a \imprimirautor. A reprodu\c{c}\~ao de partes ou do todo deste trabalho s\'o
  poder\'a ser feita mediante a cita\c{c}\~ao da fonte.}
  % abntex2 já utiliza 'anexoname' e 'anexosname'...
  \providecommand*{\annexname}{Anexo}
  \providecommand*{\annexesname}{Anexos}
}
\addto\extrasbrazil{
  \instituicao{Universidade Federal da Fronteira Sul}
  % texto "natureza do trabalho"; está um pouco diferente
  % do modelo da normalização de trabalhos da universidade...
  % como fica o título de quem fez licenciatura?
  \preambulo{Trabalho de conclus\~ao de curso apresentado %
      como requisito para obten\c{c}\~ao do grau de \imprimirgrau\ em %
      \imprimircurso\ da \imprimirinstituicao.}
}

% inglês
\addto\captionsenglish{
  \renewcommand*{\campusname}{campus of}
  \renewcommand*{\cursoname}{course of}
  \renewcommand*{\orientadorname}{Advisor}
  \renewcommand*{\coorientadorname}{Co-advisor}
  \renewcommand*{\bacharelname}{Bachelor}
  % "Licenciate" foi o mais próximo que encontrei,
  % mas pode não significar a mesma coisa que no Brasil:
  % https://www.merriam-webster.com/dictionary/licentiate
  % https://en.oxforddictionaries.com/definition/licentiate
  % https://en.wikipedia.org/wiki/Licentiate_(degree)
  \renewcommand*{\licenciaturaname}{Licenciate}
  \renewcommand*{\folhadeaprovacaoname}{Approval sheet}
  \renewcommand*{\bancaname}{examination committee}
  \renewcommand*{\declaracaoaprovacao}{This final undergraduate work
    was defended and approved by the \bancaname\ on:}
  \renewcommand*{\algoritmoname}{Algorithm}
  \renewcommand*{\listalgoritmoname}{List of \algoritmoname{}s}
  \renewcommand*{\cipfolhas}{pp}
  \renewcommand*{\cipiii}{Title}
  \renewcommand*{\notacopia}{All rights reserved to \imprimirautor.
  This work or any portion thereof may not be reproduced
  without citing the source.}
  % abntex2 já utiliza 'anexoname' e 'anexosname'...
  \renewcommand*{\annexname}{Annex}
  \renewcommand*{\annexesname}{Annexes}
}
\addto\extrasenglish{
  \instituicao{Federal University of Fronteira Sul}
  \preambulo{Final undergraduate work submitted as %
      requirement to obtain a \imprimirgrau's degree in %
      \imprimircurso\ from the \imprimirinstituicao.}
}

% ==============================================================================
% Comandos de dados
% ==============================================================================
% Versões com * das definições de comandos são recomendadas
% quando os parâmetros não são parágrafos inteiros
\newcommand*{\uffstex}{UFFS\TeX}

\providecommand*{\hoje}{\the\year-\the\month-\the\day}

\newcommand*{\imprimircampusRotulo}{\campusname}

\providecommand*{\imprimirgrau}{\bacharelname}
\providecommand*{\licenciatura}{\renewcommand*{\imprimirgrau}{\licenciaturaname}}
\newcommand*{\grau}[1]{\renewcommand*{\imprimirgrau}{#1}}

\newcommand*{\imprimircursoRotulo}{\cursoname}
\providecommand*{\imprimircurso}{}
\newcommand*{\curso}[1]{\renewcommand*{\imprimircurso}{#1}}

\providecommand*{\imprimirsubtitulo}{}
\newcommand*{\subtitulo}[1]{\renewcommand*{\imprimirsubtitulo}{#1}}

\ExplSyntaxOn
\regex_const:Nn \g__dados_divnome_regex {(?:(.+)\ )?(.+)}
\cs_new_protected:Npn \dados_divnome:NNn #1#2#3
{
    \regex_extract_once:NnN \g__dados_divnome_regex {#3} \l_tmpa_rslt
    \seq_pop_right:NN \l_tmpa_rslt #2
    \seq_pop_right:NN \l_tmpa_rslt #1
    % se não há sobrenome na entrada, #1 está vazia e o nome foi parar em #2
    \ifthenelse{\equal{#1}{} \and \not\equal{#2}{}}
    {
        % então seta #1 = #2 e depois limpa #2
        \tl_gset_eq:NN #1 #2
        \tl_gclear:N #2
    }{}
}

\RenewDocumentCommand \autor { m }
{
    \author{#1}
    \dados_divnome:NNn\autorinicio\autorultnome{#1}
}

\RenewDocumentCommand \orientador { O{\orientadorname} m }
{
    \RenewDocumentCommand \imprimirorientadorRotulo{}{#1:}
    \RenewDocumentCommand \imprimirorientador{}{#2}
    \dados_divnome:NNn\orientadorinicio\orientadorultnome{#2}
}

\RenewDocumentCommand \coorientador { O{\coorientadorname} m }
{
    \RenewDocumentCommand \imprimircoorientadorRotulo{}{#1:}
    \RenewDocumentCommand \imprimircoorientador{}{#2}
    \dados_divnome:NNn\coorientadorinicio\coorientadorultnome{#2}
}
\ExplSyntaxOff

\providecommand*{\imprimircidade}{}
\ProvideDocumentCommand \cidade { m }
{
    \renewcommand*{\imprimircidade}{#1}
}

\providecommand*{\imprimiruf}{}
\ProvideDocumentCommand \uf { m }
{
    \renewcommand*{\imprimiruf}{#1}
}

% =======================================
% Palavras-chave (funcionalidade baseada na classe mdtuffs)
% =======================================
\ExplSyntaxOn
\tl_const:Nn \c_kw_csprefix_tl {palavrach}
\int_const:Nn \c_kw_max_int {5}
\int_zero_new:N \g_kw_count_int

\cs_new:Npn \kw_add:n #1
{
    \cs_new:cpn {\c_kw_csprefix_tl\int_to_alph:n{\g_kw_count_int}} {#1}
}

\NewDocumentCommand \palavrachave { m }
{
    \int_compare:nTF {\g_kw_count_int < \c_kw_max_int}
    {
        \int_incr:N \g_kw_count_int
        \kw_add:n {#1}
    }
    {
        \ClassWarning{uffstex}{Voc\^e~excedeu~o~limite~de~
        \int_to_arabic:n {\c_kw_max_int}~palavras-chave.~Apenas~
        \int_to_arabic:n {\c_kw_max_int}~ser\~ao~exibidas}
    }
}

\NewDocumentCommand \imprimirpc { m }
{
    \int_compare:nTF {1 <= #1 <= \c_kw_max_int}
    {
        \use:c {\c_kw_csprefix_tl\int_to_alph:n{#1}}
    }
    {
        \ClassError{uffstex}{Palavra-chave~#1~n\~ao~existe}
            {Verifique~o~n\'umero~que~voc\^e~passou~como~par\^ametro~
            para~o~comando~\imprimirpc~e~quantas~palavras-chave~voc\^e~definiu.}
    }
}

\NewDocumentCommand \imprimirpcs { s O{\@.} }
{
    \int_zero_new:N \l_kw_count_int
    \int_while_do:nn {\l_kw_count_int < \g_kw_count_int}
    {
        \int_incr:N \l_kw_count_int
        % se usar comando com *, enumera as palavras-chave
        \IfBooleanT{#1}{\int_to_arabic:n {\l_kw_count_int}.\nobreakspace}
        \imprimirpc{\l_kw_count_int}#2

        % se o contador ainda é menor que o valor máximo, coloca um espaço
        % (ou seja, coloca um espaço entre as palavras-chave)
        \int_compare:nTF {\l_kw_count_int < \c_kw_max_int}{~}{}
    }
}
\ExplSyntaxOff

% ==============================================================================
% Fontes padrões dos títulos até seção quinária (texto e sumário)
% ==============================================================================
% controle de caixa alta é feito aparte
% capítulo no texto (negrito e caixa alta)
\renewcommand{\ABNTEXchapterfont}{\sffamily\bfseries}
\renewcommand{\ABNTEXchapterfontsize}{\normalsize}
% capítulo no sumário
\renewcommand{\cftchapterfont}{\ABNTEXchapterfont}
\renewcommand{\cftchapterpagefont}{\cftchapterfont}

% seção no texto (normal e caixa alta)
\renewcommand{\ABNTEXsectionfont}{\ABNTEXchapterfont\mdseries}
\renewcommand{\ABNTEXsectionfontsize}{\normalsize}
% seção no sumário
\renewcommand{\cftsectionfont}{\ABNTEXsectionfont}
\renewcommand{\cftsectionpagefont}{\cftsectionfont}

% subseção no texto (negrito e caixa baixa; reutiliza fonte do capítulo)
\renewcommand{\ABNTEXsubsectionfont}{\ABNTEXchapterfont}
\renewcommand{\ABNTEXsubsectionfontsize}{\normalsize}
% subseção no sumário
\renewcommand{\cftsubsectionfont}{\ABNTEXsubsectionfont}
\renewcommand{\cftsubsectionpagefont}{\cftsubsectionfont}

% sub-subseção no texto (normal e caixa baixa; reutiliza fonte da seção)
\renewcommand{\ABNTEXsubsubsectionfont}{\ABNTEXsectionfont}
\renewcommand{\ABNTEXsubsubsectionfontsize}{\normalsize}
% sub-subseção no sumário
\renewcommand{\cftsubsubsectionfont}{\ABNTEXsubsubsectionfont}
\renewcommand{\cftsubsubsectionpagefont}{\cftsubsubsectionfont}

% sub-sub-subseção no texto (itálico e caixa baixa; reutiliza fonte da seção)
\renewcommand{\ABNTEXsubsubsubsectionfont}{\ABNTEXsectionfont\itshape}
\renewcommand{\ABNTEXsubsubsubsectionfontsize}{\normalsize}
% sub-sub-subseção no sumário
\renewcommand{\cftparagraphfont}{\ABNTEXsubsubsubsectionfont}
\renewcommand{\cftparagraphpagefont}{\cftparagraphfont}

% ==============================================================================
% Capa
% ==============================================================================
\renewcommand{\imprimircapa}{
    \begin{capa}
        \centering
        \ABNTEXchapterfont

        % a logo deveria ser 20mm x 20mm, mas
        % daí vai distorcer... colocando só
        % altura, o LaTeX escala a largura
        \includegraphics[height=20mm]{logo.png}

        \vspace{\baselineskip}

        \MakeTextUppercase{\imprimirinstituicao}\\
        \MakeTextUppercase{\imprimircampusRotulo\ \imprimircidade}\\
        \MakeTextUppercase{\imprimircursoRotulo\ \imprimircurso}

        \vspace{3cm}

        \MakeTextUppercase{\imprimirautor}

        \vspace{4.5cm}

        \MakeTextUppercase{\imprimirtitulo}
        \abntex@ifnotempty{\imprimirsubtitulo}{
            \\\textmd{\MakeTextUppercase{\imprimirsubtitulo}}
        }

        \vspace{\fill}

        \MakeTextUppercase{\imprimircidade}\\
        \the\year
    \end{capa}
}

% ==============================================================================
% Folha de rosto
% ==============================================================================
\renewcommand{\folhaderostocontent}{
    \centering
    \ABNTEXchapterfont

    \MakeTextUppercase{\imprimirautor}

    \vspace{7cm}

    \MakeTextUppercase{\imprimirtitulo}
    \abntex@ifnotempty{\imprimirsubtitulo}{
        \\\textmd{\MakeTextUppercase{\imprimirsubtitulo}}
    }

    \vspace{3cm}

    \abntex@ifnotempty{\imprimirpreambulo}{
        \hspace*{0.49\textwidth}
        \begin{minipage}{0.5\textwidth}
            \mdseries
            \footnotesize
            \SingleSpacing

            \imprimirpreambulo

            \imprimirorientadorRotulo\ \imprimirorientador
            \abntex@ifnotempty{\imprimircoorientador}{
                \\\imprimircoorientadorRotulo\ \imprimircoorientador
            }
        \end{minipage}
    }

    \vfill

    \textbf{\MakeTextUppercase{\imprimircidade}}\\
    \textbf{\the\year}
}

% ==============================================================================
% Ficha catalográfica (funcionalidade baseada na classe mdtuffs)
% ==============================================================================
\ProvideDocumentEnvironment{cip}{}
{\thispagestyle{empty}\begin{SingleSpace}}
{\end{SingleSpace}}

\ProvideDocumentCommand
\imprimircip{ o }{
    \imprimircipframe
    \IfValueT{#1}{
        \vspace{4ex}
        \nominata{#1}
    }
    \clearpage%
}

\ProvideDocumentCommand
\imprimircipframe{}{
\vspace*{\fill}
\begin{cip}
    \noindent
    \framebox[14cm]{
    \begin{minipage}[c]{12cm}
        \setlength{\parindent}{2em}
        \setlength{\parskip}{1.4ex}
        \vspace*{2ex}
        \noindent
        \abntex@ifnotempty{\autorultnome}{\autorultnome, }\autorinicio

        \imprimirtitulo\abntex@ifnotempty{\imprimirsubtitulo}
            {: \imprimirsubtitulo} / \imprimirautor. -- \the\year.\\
        \indent\pageref*{LastPage}~\cipfolhas.: il.

        \imprimirorientadorRotulo\ \imprimirorientador.\\
        \abntex@ifnotempty{\imprimircoorientador}{
            \indent\imprimircoorientadorRotulo\ \imprimircoorientador.\\
        }
        \indent\imprimirtipotrabalho\ -- \imprimirinstituicao,
        \imprimircursoRotulo\ \imprimircurso,
        \imprimircidade, \abntex@ifnotempty{\imprimiruf}{\imprimiruf,}{}
        \the\year.

        \imprimirpcs*
        I.~\abntex@ifnotempty{\orientadorultnome}
            {\orientadorultnome, }{}\orientadorinicio,
            \MakeTextLowercase{\orientadorname}.
        \ifthenelse{\equal{\imprimircoorientador}{}}
        {
            % se não há coorientador, pula pra instituição
            II.~\imprimirinstituicao.
            III.~\cipiii.
        }
        {
            II.~\abntex@ifnotempty{\coorientadorultnome}
                {\coorientadorultnome, }{}\coorientadorinicio,
                \MakeTextLowercase{\coorientadorname}.
            III.~\imprimirinstituicao.
            IV.~\cipiii.
        }
        \vspace{4ex}
    \end{minipage}
    }
\end{cip}
}

\ProvideDocumentCommand \nominata{ m }{
\begin{SingleSpace}
    \hrule
    \vspace{6pt}
    \noindent\copyright\ \the\year\\
    \noindent\notacopia\\
    \noindent E-mail: {#1}
\end{SingleSpace}
}

% ==============================================================================
% Folha de aprovação
% ==============================================================================
% o regulamento de TCC de CC exige pelo menos 3 membros pra banca
% (orientador e mais dois). Este comando, portanto, exige dois membros
% (o orientador é impresso automaticamente) e suporta mais dois opcionais,
% totalizando 5 membros. O coorientador não é impresso automaticamente pois
% o manual de elaboração de TCC quer a sigla da instituição após o nome
% abaixo da linha da assinatura e o coorientador não é obrigado a ser da UFFS.
% O primeiro parâmetro, opcional, é a data da defesa.
% O valor padrão para a data de defesa é a data configurada no documento com
% a macro \data.
\ProvideDocumentCommand
\imprimirfolhadeaprovacao{ O{\imprimirdata} m m o o }{
\begin{folhadeaprovacao}
    \OnehalfSpacing
    \begin{center}
        \ABNTEXchapterfont%
        \MakeTextUppercase{\imprimirautor}

        \vspace{\baselineskip}

        \MakeTextUppercase{\imprimirtitulo}
        \abntex@ifnotempty{\imprimirsubtitulo}{
            \\\textmd{\MakeTextUppercase{\imprimirsubtitulo}}
        }
    \end{center}

    \vspace{\baselineskip}

    \noindent\imprimirpreambulo%

    \vspace{\baselineskip}

    \noindent\imprimirorientadorRotulo\ \imprimirorientador
    \abntex@ifnotempty{\imprimircoorientador}{
        \\\imprimircoorientadorRotulo\ \imprimircoorientador
    }

    \vspace{2\baselineskip}

    \noindent\declaracaoaprovacao\ #1.

    \vspace{2\baselineskip}

    \noindent\MakeTextUppercase{\bancaname}

    \assinatura{\imprimirorientador\ -- UFFS}
    \assinatura{#2}
    \assinatura{#3}
    \IfValueT{#4}{
        \assinatura{#4}
    }
    \IfValueT{#5}{
        \assinatura{#5}
    }
\end{folhadeaprovacao}
}

% ==============================================================================
% Ambiente `algoritmo` e definição da lista de algoritmos
% ==============================================================================
\newfloat{algoritmo}{\algoritmoext}{\algoritmoname}

\newlistof{listofalgoritmos}{\algoritmoext}{\listalgoritmoname}
\newlistentry{algoritmo}{\algoritmoext}{0}
\renewcommand*{\cftalgoritmoname}{\algoritmoname\space}
\renewcommand*{\cftalgoritmoaftersnum}{\hfill\textendash\hfill}

\AtBeginDocument{
    \@ifpackageloaded{cleveref}{
        % \crefname é definido automaticamente com \MakeLowercase do \Crefname
        \Crefname{algoritmo}{\algoritmoname}{\algoritmoname{}s}
        \Crefname{anexo}{\annexname}{\annexesname}

        \if@cref@capitalise%
            \crefname{algoritmo}{\algoritmoname}{\algoritmoname{}s}%
        \fi%
    }{}
    \@ifpackageloaded{datetime2}{
        \renewcommand*{\imprimirdata}{\DTMdate{\thedate}}
    }{}
}

% ==============================================================================
% Correção do título da seção das referências
% ==============================================================================
\AtBeginDocument{
  \@ifpackageloaded{biblatex}{
    % definição do título baseada no abnTeX2
    % (https://github.com/abntex/abntex2/blob/master/tex/latex/abntex2/abntex2.cls#L537,
    % que por sua vez é baseada na definição
    % padrão do Memoir), mas utilizando o
    % comando \defbibheading como recomendado
    % pela documentação do BibLaTeX quando
    % ele for carregado
    \defbibheading{abnt}[\refname]{
      \chapter*{#1}
      \bibmark
      \ifmemoirbibintoc{ % front-end do BibLaTeX
        \phantomsection
        \addcontentsline{toc}{chapter}{\texorpdfstring{\MakeTextUppercase{#1}}{#1}}
      }{}
      \prebibhook
    }
  }{}
}

The first page, as this template compiles today. Click it to enlarge, and again to shrink. Open the file ↗