From 7e648debcaaf2756c8f85856950bf81c7c92769d Mon Sep 17 00:00:00 2001 From: Gabriel Francisco Date: Sat, 27 Jun 2026 11:59:51 -0300 Subject: [PATCH 1/2] classic-ppgsi:0.1.0 --- packages/preview/classic-ppgsi/0.1.0/LICENSE | 21 + .../preview/classic-ppgsi/0.1.0/README.md | 86 +++ .../classic-ppgsi/0.1.0/assets/usp_logo.jpg | Bin 0 -> 66077 bytes .../preview/classic-ppgsi/0.1.0/biblio.typ | 432 ++++++++++++ packages/preview/classic-ppgsi/0.1.0/lib.typ | 652 ++++++++++++++++++ .../0.1.0/template/assets/ficha-1.png | Bin 0 -> 12237 bytes .../0.1.0/template/assets/figura-exemplo.png | Bin 0 -> 6254 bytes .../classic-ppgsi/0.1.0/template/main.typ | 624 +++++++++++++++++ .../0.1.0/template/referencias.bib | 45 ++ .../preview/classic-ppgsi/0.1.0/thumbnail.png | Bin 0 -> 120671 bytes .../preview/classic-ppgsi/0.1.0/typst.toml | 18 + 11 files changed, 1878 insertions(+) create mode 100644 packages/preview/classic-ppgsi/0.1.0/LICENSE create mode 100644 packages/preview/classic-ppgsi/0.1.0/README.md create mode 100644 packages/preview/classic-ppgsi/0.1.0/assets/usp_logo.jpg create mode 100644 packages/preview/classic-ppgsi/0.1.0/biblio.typ create mode 100644 packages/preview/classic-ppgsi/0.1.0/lib.typ create mode 100644 packages/preview/classic-ppgsi/0.1.0/template/assets/ficha-1.png create mode 100644 packages/preview/classic-ppgsi/0.1.0/template/assets/figura-exemplo.png create mode 100644 packages/preview/classic-ppgsi/0.1.0/template/main.typ create mode 100644 packages/preview/classic-ppgsi/0.1.0/template/referencias.bib create mode 100644 packages/preview/classic-ppgsi/0.1.0/thumbnail.png create mode 100644 packages/preview/classic-ppgsi/0.1.0/typst.toml diff --git a/packages/preview/classic-ppgsi/0.1.0/LICENSE b/packages/preview/classic-ppgsi/0.1.0/LICENSE new file mode 100644 index 0000000000..5c8c9ec641 --- /dev/null +++ b/packages/preview/classic-ppgsi/0.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Gabriel Francisco dos Santos Silva + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/preview/classic-ppgsi/0.1.0/README.md b/packages/preview/classic-ppgsi/0.1.0/README.md new file mode 100644 index 0000000000..49506267d7 --- /dev/null +++ b/packages/preview/classic-ppgsi/0.1.0/README.md @@ -0,0 +1,86 @@ +# classic-ppgsi + +A dissertation/thesis template for **PPgSI–EACH–USP** (Graduate Program in +Information Systems, University of São Paulo) in [Typst](https://typst.app) — +a 1:1 port of the `abntex2ppgsi` LaTeX class, compliant with ABNT NBR 14724 and +the program's specific adjustments. Document content is in Brazilian Portuguese. + +![Template cover page](thumbnail.png) + +## Usage + +```sh +typst init @preview/classic-ppgsi +``` + +This scaffolds a project from `template/main.typ`, including `referencias.bib` +and the example `assets/`. Then compile: + +```sh +typst compile main.typ +``` + +The entrypoint imports the package and configures the whole document via `thesis`: + +```typ +#import "@preview/classic-ppgsi:0.1.0" as ppgsi + +#show: ppgsi.thesis.with( + title: "Título do trabalho: subtítulo do trabalho", + title-en: "Work title: work subtitle", + // particles (de, da, dos) go in `given` so the inverted reference reads "TAL, Fulano de" + author: (given: "Fulano de", surname: "Tal"), + advisor: [Orientador: Prof. Dr. Fulano de Tal], + bibliography: read("referencias.bib"), + catalog-card: image("assets/ficha-1.png", width: 100%, height: 100%, fit: "contain"), + abstract: ( + pt-br: (body: [Resumo...], keywords: ("palavra1", "palavra2")), + en-us: (body: [Abstract...], keywords: ("keyword1", "keyword2")), + ), + // + siglas, símbolos, banca, dedicatória, epígrafe, etc. +) + += Introdução +... +``` + +## Features + +- Complete front matter: cover, title page, catalog card, errata, approval sheet, + dedication, acknowledgments, epigraph, abstract (pt/en), lists of + illustrations/tables, list of acronyms and symbols, table of contents. +- ABNT-style illustrations: `figure`, `table`, `frame` (quadro), `algorithm`, + `code`, with caption on top and a source line. The source defaults to the + thesis author and year (`source: auto`); pass content to cite another work, + or `none` to omit. +- Long direct quotations (`quote`) with the 4 cm ABNT indent. +- Author–date citations and references via a built-in engine (`cite`, `prose`, + `references`) — see `biblio.typ`. +- Appendices and annexes with independent letters (`appendix`, `annex`); their + internal sections (`section`, `subsection`) are numbered automatically. +- Bilingual abstract as a single object (`abstract: (pt-br: ..., en-us: ...)`), + reused (with `title`/`author`/`keywords`) in the PDF metadata. +- The work's own ABNT reference at the top of each abstract is generated + automatically from `author`, `title`/`title-en`, year, page count, `degree` + and institution (`citation: auto` by default; override with content or `none`). +- Validation of mandatory ABNT elements on compile (toggle with `validate: false`). +- Integrated ecosystem packages: acronyms (`@key`, via + [glossy](https://typst.app/universe/package/glossy)), code highlighting + ([codly](https://typst.app/universe/package/codly)), checklists + ([cheq](https://typst.app/universe/package/cheq)), data plots + ([lilaq](https://typst.app/universe/package/lilaq)) and diagrams + ([cetz](https://typst.app/universe/package/cetz)). + +The USP logo ships with the package (the `logo` parameter), so you don't need to +provide it. The catalog card (`catalog-card`) is specific to each work and must +come from your own project. + +## Development + +`build.sh` registers this repository in Typst's local package cache +(`@preview/classic-ppgsi`), compiles `template/main.typ`, and produces +`build/main.pdf`, per-page PNGs, and `thumbnail.png`. + +## License + +[MIT](LICENSE). diff --git a/packages/preview/classic-ppgsi/0.1.0/assets/usp_logo.jpg b/packages/preview/classic-ppgsi/0.1.0/assets/usp_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c1e0cff931bb84704e8ce9e2f45f6a198348a85 GIT binary patch literal 66077 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�>+|zECbxjK{F8ldccy)XZXC)XAoWvA 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 +#let _blue = rgb(41, 5, 195) // \definecolor{blue}{RGB}{41,5,195} do modelo + +// --------------------------------------------------------------------------- +// PARSER BibTeX (subconjunto: @tipo{chave, campo = {valor} | "valor" | token}) +// --------------------------------------------------------------------------- + +#let _strip-comments(s) = s.split("\n").filter(l => not l.trim().starts-with("%")).join("\n") + +#let _is-ws(c) = c == " " or c == "\t" or c == "\n" or c == "\r" + +#let _skip-ws(cp, i) = { + while i < cp.len() and _is-ws(cp.at(i)) { i += 1 } + i +} + +#let _read-braced(cp, i) = { + // pré: cp.at(i) == "{". Devolve (interior, índice-após-"}"). + let depth = 1 + let out = "" + i += 1 + while i < cp.len() and depth > 0 { + let c = cp.at(i) + if c == "{" { depth += 1; out += c } + else if c == "}" { depth -= 1; if depth > 0 { out += c } } + else { out += c } + i += 1 + } + (out, i) +} + +#let _read-quoted(cp, i) = { + // pré: cp.at(i) == "\"". Devolve (interior, índice-após-"\""). + let out = "" + let depth = 0 + i += 1 + while i < cp.len() { + let c = cp.at(i) + if c == "\"" and depth == 0 { i += 1; break } + if c == "{" { depth += 1 } + if c == "}" { depth -= 1 } + out += c + i += 1 + } + (out, i) +} + +#let _read-bare(cp, i) = { + let out = "" + while i < cp.len() and not (cp.at(i) in (",", "}")) { out += cp.at(i); i += 1 } + (out.trim(), i) +} + +#let _read-value(cp, i) = { + i = _skip-ws(cp, i) + let c = cp.at(i, default: "") + if c == "{" { _read-braced(cp, i) } + else if c == "\"" { _read-quoted(cp, i) } + else { _read-bare(cp, i) } +} + +#let _read-token(cp, i, stops) = { + let out = "" + while i < cp.len() and not (cp.at(i) in stops) { out += cp.at(i); i += 1 } + (out, i) +} + +#let _parse-bib(content) = { + let cp = _strip-comments(content).clusters() + let n = cp.len() + let i = 0 + let entries = (:) + while i < n { + // próximo "@" + while i < n and cp.at(i) != "@" { i += 1 } + if i >= n { break } + i += 1 // pula "@" + let parts = _read-token(cp, i, ("{", "(")) // tipo + let etype = lower(parts.at(0).trim()) + i = parts.at(1) + if i >= n { break } + i += 1 // pula "{" + i = _skip-ws(cp, i) + let kp = _read-token(cp, i, (",", "}")) // chave + let key = kp.at(0).trim() + i = kp.at(1) + if cp.at(i, default: "") == "," { i += 1 } + let fields = (:) + while i < n { + i = _skip-ws(cp, i) + if cp.at(i, default: "") == "}" { i += 1; break } + let np = _read-token(cp, i, ("=", ",", "}")) // nome do campo + let name = lower(np.at(0).trim()) + i = np.at(1) + if cp.at(i, default: "") != "=" { + // entrada malformada / sem "=" — aborta este campo + if cp.at(i, default: "") == "," { i += 1 } + continue + } + i += 1 // pula "=" + let vp = _read-value(cp, i) + i = vp.at(1) + if name != "" { fields.insert(name, vp.at(0).trim()) } + i = _skip-ws(cp, i) + if cp.at(i, default: "") == "," { i += 1 } + } + if key != "" { entries.insert(key, (type: etype, fields: fields)) } + } + entries +} + +// --------------------------------------------------------------------------- +// AUTORES +// --------------------------------------------------------------------------- + +#let _split-authors(field) = field.split(regex("\s+and\s+")).map(s => s.trim()).filter(s => s != "") + +#let _name-parts(raw) = { + // devolve (family, given) + let nm = raw.trim() + if "," in nm { + let p = nm.split(",") + (p.at(0).trim(), p.slice(1).join(",").trim()) + } else { + let toks = nm.split(regex("\s+")).filter(t => t != "") + if toks.len() == 0 { ("", "") } + else if toks.len() == 1 { (toks.at(0), "") } + else { (toks.last(), toks.slice(0, toks.len() - 1).join(" ")) } + } +} + +#let _initials(given) = given.split(regex("\s+")).filter(t => t != "").map(t => upper(t.clusters().at(0, default: "")) + ".").join(" ") + +// "SOBRENOME, I. N." (lista da bibliografia) +#let _format-name(raw) = { + let np = _name-parts(raw) + let fam = upper(np.at(0)) + let ini = _initials(np.at(1)) + if ini == "" { fam } else { fam + ", " + ini } +} + +#let _authors-bib(field) = _split-authors(field).map(_format-name).join("; ") + +#let _families(field) = _split-authors(field).map(raw => _name-parts(raw).at(0)) + +#let _titlecase(s) = { + let t = lower(s) + if t.len() == 0 { t } else { upper(t.clusters().at(0)) + t.clusters().slice(1).join() } +} + +// Autor de citação: >3 autores → "Primeiro et al." (et al. itálico). +// caixa = "upper" (parentético) | "title" (narrativo). +#let _cite-authors(field, caixa: "upper", narrativo: false) = { + let fams = _families(field) + let aplica = if caixa == "upper" { f => upper(f) } else { f => _titlecase(f) } + if fams.len() == 0 { + [] + } else if fams.len() > 3 { + [#aplica(fams.at(0)) #emph[et al.]] + } else if narrativo { + // narrativo: "A", "A e B", "A, B e C" + if fams.len() == 1 { aplica(fams.at(0)) } + else { + let ini = fams.slice(0, fams.len() - 1).map(aplica).join(", ") + [#ini e #aplica(fams.last())] + } + } else { + // parentético: "A; B; C" + fams.map(aplica).join("; ") + } +} + +// --------------------------------------------------------------------------- +// DESAMBIGUAÇÃO (sufixo a/b/c por ordem de PRIMEIRA citação) +// --------------------------------------------------------------------------- + +#let _year(entry) = entry.fields.at("year", default: "") + +#let _ay-key(entry) = { + let fams = _families(entry.fields.at("author", default: "")) + lower(fams.at(0, default: "")) + "|" + _year(entry) +} + +#let _cite-order(markers) = { + let order = () + for m in markers { if m.value not in order { order.push(m.value) } } + order +} + +#let _suffixes(order, entries) = { + let groups = (:) + for k in order { + if k in entries { + let ay = _ay-key(entries.at(k)) + groups.insert(ay, groups.at(ay, default: ()) + (k,)) + } + } + let smap = (:) + for (ay, ks) in groups { + if ks.len() > 1 { + for (idx, k) in ks.enumerate() { smap.insert(k, numbering("a", idx + 1)) } + } + } + smap +} + +// --------------------------------------------------------------------------- +// ESTADO + MARCADORES +// --------------------------------------------------------------------------- + +#let _bibsrc = state("ppgsi-bibsrc", "") +#let register-bib(content) = _bibsrc.update(content) +#let _entries() = _parse-bib(_bibsrc.get()) +#let _mark(k) = [#metadata(k)] + +// --------------------------------------------------------------------------- +// CITAÇÕES PÚBLICAS +// --------------------------------------------------------------------------- + +// Parentética, fim de frase: "(AMENTA et al., 2002b; AMENTA et al., 2002c)" +#let cite(..keys) = { + let ks = keys.pos() + ks.map(_mark).join() + context { + let entries = _entries() + let smap = _suffixes(_cite-order(query(_CM)), entries) + let parts = ks.map(k => { + let e = entries.at(k) + text(fill: _blue)[#_cite-authors(e.fields.author, caixa: "upper"), #(_year(e) + smap.at(k, default: ""))] + }) + [(#parts.join[; ])] + } +} + +// Narrativa, meio de frase: "Amenta et al. (2002a)" +#let prose(key) = { + _mark(key) + context { + let entries = _entries() + let smap = _suffixes(_cite-order(query(_CM)), entries) + let e = entries.at(key) + text(fill: _blue)[#_cite-authors(e.fields.author, caixa: "title", narrativo: true) (#(_year(e) + smap.at(key, default: "")))] + } +} + +// --------------------------------------------------------------------------- +// FORMATAÇÃO DE ENTRADAS (por tipo, conforme abntex2-alf.bst) +// --------------------------------------------------------------------------- + +#let _g(f, name) = f.at(name, default: "") +#let _endash(s) = s.replace("-", "–") +#let _sentence(s) = _titlecase(s) + +// add.period$: só acrescenta "." se ainda não terminar em pontuação de sentença. +#let _dot(s) = if s == "" or s.ends-with(".") or s.ends-with("?") or s.ends-with("!") { s } else { s + "." } + +// "Local: Editora" com fallbacks ABNT. +#let _pub-addr(f) = { + let addr = _g(f, "address") + let pub = _g(f, "publisher") + let l = if addr != "" { addr } else { "[S.l.]" } + let e = if pub != "" { pub } else { "[s.n.]" } + if addr == "" and pub == "" { "[S.l.: s.n.]" } else { l + ": " + e } +} + +#let _edition(f) = { + let ed = _g(f, "edition") + if ed == "" { none } + else if ed.match(regex("^[0-9]")) != none { ed + ". ed." } else { ed } +} + +#let _vnp(f) = { + // ", v. X, n. Y, p. A–B" (só os presentes) + let out = [] + if _g(f, "volume") != "" { out += [, v. #_g(f, "volume")] } + if _g(f, "number") != "" { out += [, n. #_g(f, "number")] } + if _g(f, "pages") != "" { out += [, p. #_endash(_g(f, "pages"))] } + out +} + +#let _thesis-type(f, etype) = { + let custom = _g(f, "type") + if custom != "" { custom } + else if etype == "phdthesis" { "Tese (Doutorado)" } + else { "Dissertação (Mestrado)" } +} + +#let _emdash = " \u{2014} " + +#let _render-entry(entry) = { + let f = entry.fields + let t = entry.type + let aut = _authors-bib(_g(f, "author")) + let yr = _year(entry) + + if t == "article" { + let out = [#_dot(aut) #_sentence(_g(f, "title")). #emph(_g(f, "journal"))] + if _g(f, "publisher") != "" { out += [, #_g(f, "publisher")] } + if _g(f, "address") != "" { out += [, #_g(f, "address")] } + out += _vnp(f) + if yr != "" { out += [, #yr] } + out += [.] + out + + } else if t == "book" or t == "manual" or t == "techreport" or t == "booklet" { + let out = [#_dot(aut) #emph(_g(f, "title"))] + let ed = _edition(f) + if ed != none { out += [. #ed] } + if t == "book" { + out += [. #_pub-addr(f)] + if yr != "" { out += [, #yr] } + } else { + let addr = _g(f, "address") + out += [. #(if addr != "" { addr } else { "[S.l.]" })] + if yr != "" { out += [, #yr] } + } + if _g(f, "pages") != "" { out += [. #_g(f, "pages") p.] } + out += [.] + out + + } else if t == "inbook" or t == "incollection" { + let out = [#_dot(aut) #_sentence(_g(f, "title")). In: ] + if t == "inbook" { out += [#"______". ] } + else if _g(f, "editor") != "" { out += [#_authors-bib(_g(f, "editor")) (Ed.). ] } + out += [#emph(_g(f, "booktitle"))] + let ed = _edition(f) + if ed != none { out += [. #ed] } + out += [. #_pub-addr(f)] + if yr != "" { out += [, #yr] } + if _g(f, "chapter") != "" { out += [. cap. #_g(f, "chapter")] } + if _g(f, "pages") != "" { out += [, p. #_endash(_g(f, "pages"))] } + out += [.] + out + + } else if t == "inproceedings" or t == "conference" { + let out = [#_dot(aut) #_sentence(_g(f, "title")). In: ] + if _g(f, "organization") != "" { out += [#upper(_g(f, "organization")). ] } + else if _g(f, "editor") != "" { out += [#_authors-bib(_g(f, "editor")) (Ed.). ] } + out += [#emph(_g(f, "booktitle")). #_pub-addr(f)] + if yr != "" { out += [, #yr] } + if _g(f, "pages") != "" { out += [. p. #_endash(_g(f, "pages"))] } + out += [.] + out + + } else if t == "phdthesis" or t == "mastersthesis" { + let out = [#_dot(aut) #emph(_g(f, "title")).] + if _g(f, "pages") != "" { out += [ #_g(f, "pages") f.] } + out += [ #_thesis-type(f, t)#_emdash#_g(f, "school")] + if _g(f, "address") != "" { out += [, #_g(f, "address")] } + if yr != "" { out += [, #yr] } + out += [.] + out + + } else if t == "proceedings" { + let head = if _g(f, "editor") != "" { [#_authors-bib(_g(f, "editor")) (Ed.)] } else { upper(_g(f, "organization")) } + let out = [#head. #emph(_g(f, "title")). #_pub-addr(f)] + if yr != "" { out += [, #yr] } + if _g(f, "pages") != "" { out += [. #_g(f, "pages") p.] } + out += [.] + out + + } else { + // misc / default + let out = [#_dot(aut) #emph(_g(f, "title"))] + if _g(f, "howpublished") != "" { out += [. #_g(f, "howpublished")] } + if yr != "" { out += [, #yr] } + out += [.] + if _g(f, "url") != "" { out += [ Disponível em: <#_g(f, "url")>.] } + out + } +} + +// --------------------------------------------------------------------------- +// BACKREF +// --------------------------------------------------------------------------- + +#let _backref(markers, key) = { + // páginas distintas (valor exibido do contador) + local da 1ª ocorrência (p/ link) + let seen = (:) + for m in markers.filter(m => m.value == key) { + let p = counter(page).at(m.location()).first() + if str(p) not in seen { seen.insert(str(p), m.location()) } + } + let pages = seen.pairs().map(((k, v)) => (p: int(k), loc: v)).sorted(key: x => x.p) + let n = pages.len() + let plink(x) = link(x.loc, text(fill: _blue, str(x.p))) + if n == 0 { [Nenhuma citação no texto.] } + else if n == 1 { [Citado na página #plink(pages.at(0)).] } + else { + let ini = pages.slice(0, n - 1).map(plink).join(", ") + [Citado #n vezes nas páginas #ini e #plink(pages.last()).] + } +} + +// --------------------------------------------------------------------------- +// LISTA DE REFERÊNCIAS +// --------------------------------------------------------------------------- + +#let _padnum(n) = { + let s = str(n) + ("0" * (6 - s.len())) + s +} + +#let references() = { + heading(level: 1, numbering: none, supplement: none)[Referências] + context { + let entries = _entries() + let markers = query(_CM) + let order = _cite-order(markers) + let idx = (:) + for (n, k) in order.enumerate() { idx.insert(k, n) } + let cited = order.filter(k => k in entries) + let sorted = cited.sorted(key: k => { + let e = entries.at(k) + let sa = upper(_authors-bib(_g(e.fields, "author"))) + sa + "\u{1}" + _year(e) + "\u{1}" + lower(_g(e.fields, "title")) + "\u{1}" + _padnum(idx.at(k)) + }) + set par(leading: 0.65em, spacing: 1.3em, first-line-indent: 0pt, justify: true) + for k in sorted { + block(_render-entry(entries.at(k)) + " " + _backref(markers, k)) + } + } +} diff --git a/packages/preview/classic-ppgsi/0.1.0/lib.typ b/packages/preview/classic-ppgsi/0.1.0/lib.typ new file mode 100644 index 0000000000..afeacfc2e7 --- /dev/null +++ b/packages/preview/classic-ppgsi/0.1.0/lib.typ @@ -0,0 +1,652 @@ +// ============================================================================ +// classic-ppgsi — porte 1:1 do modelo LaTeX abntex2ppgsi (PPgSI-EACH-USP) +// API pública em inglês; usar via namespace: #import "@preview/classic-ppgsi:0.1.0" as ppgsi +// ============================================================================ + +#import "biblio.typ": cite, prose, references, register-bib, _blue + +// Pacotes do ecossistema integrados ao template (re-exportados via namespace): +// ppgsi.lq → lilaq (gráficos de dados, dentro de ppgsi.figure) +// ppgsi.cetz → cetz (desenho/diagramas, dentro de ppgsi.figure) +// glossy/codly/cheq agem por show-rule no corpo (ver thesis()). +#import "@preview/glossy:0.9.1" as glossy +#import "@preview/codly:1.3.0" as codly +#import "@preview/cheq:0.4.0": checklist +#import "@preview/lilaq:0.6.0" as lq +#import "@preview/cetz:0.5.2" as cetz + +#let cm-dash = "\u{2002}\u{2013}\u{2002}" // " – " (espaco-en + travessao + espaco-en) + + +#let _heading-numbering = (..nums) => { + let n = nums.pos() + if n.len() <= 3 { numbering("1.1.1", ..n) } +} + +#let _chapter-mark(loc) = { + // capitulos numerados + back-matter (apendice/anexo/referencias, outlined); + // exclui pre-textuais (outlined:false), que nao tem cabecalho. + let chaps = query(heading.where(level: 1)).filter(h => ( + h.location().page() <= loc.page() and (h.numbering != none or h.outlined == true) + )) + if chaps.len() == 0 { return none } + let h = chaps.last() + if h.numbering != none { + let num = numbering("1", ..counter(heading).at(h.location())) + [Capítulo #num. #h.body] + } else { + h.body + } +} + +// Conteudo "single space" (resumo, fontes, ficha, citacoes, referencias). +#let _single(body) = { + set par(leading: 0.65em, spacing: 0.65em) + body +} + +// --------------------------------------------------------------------------- +// ILUSTRACOES: source, figure, table, frame, algorithm +// --------------------------------------------------------------------------- + +// Replica p{Xin}+\tabcolsep do LaTeX: largura dada = texto; soma 12pt (6pt/lado). +#let _addsep(columns) = if type(columns) == array { + columns.map(c => if type(c) == length { c + 12pt } else { c }) +} else { columns } + +// Linha "Fonte – ..." abaixo da ilustracao (tam. 10, centralizada, simples). +#let _src(body) = { + set text(size: 10pt) + set par(leading: 0.6em, first-line-indent: 0pt, justify: false) + v(3pt, weak: true) + align(center, [Fonte#cm-dash#body]) +} +#let source = _src + +// Fonte "elaborado pelo autor": reaproveita author/date definidos em thesis(). +// source: auto -> "Fonte – , " +// source: none -> sem linha de fonte +// source: -> "Fonte – " (ex.: citação a outro trabalho) +#let _self-source = state("ppgsi-self-source", none) +#let _render-source(src) = if src == none { +} else if src == auto { + context { let s = _self-source.get(); if s != none { _src(s) } } +} else { + _src(src) +} + +// "Nome do Autor, ano" — a mesma fonte que `source: auto` usa, exposta para uso +// inline (ex.: #ppgsi.myself, ou source: ppgsi.myself). +#let myself = context _self-source.get() + +#let figure(body, caption: none, source: auto, placement: none) = std.figure( + { + body + _render-source(source) + }, + caption: caption, + kind: image, + supplement: [Figura], + placement: placement, +) + +#let table( + caption: none, + source: auto, + columns: auto, + align: auto, + header: none, + ..rows, +) = std.figure( + { + std.table( + columns: _addsep(columns), + align: align, + stroke: none, + inset: (x: 6pt, y: 3pt), + std.table.hline(stroke: 0.6pt), + ..if header != none { + (std.table.header(..header), std.table.hline(stroke: 0.6pt)) + } else { () }, + ..rows.pos().flatten(), + std.table.hline(stroke: 0.6pt), + ) + _render-source(source) + }, + caption: caption, + kind: std.table, + supplement: [Tabela], + placement: none, +) + +#let frame( + caption: none, + source: auto, + columns: auto, + align: auto, + header: none, + ..rows, +) = std.figure( + { + std.table( + columns: _addsep(columns), + align: align, + stroke: 0.5pt, + inset: (x: 6pt, y: 3pt), + ..if header != none { (std.table.header(..header),) } else { () }, + ..rows.pos().flatten(), + ) + _render-source(source) + }, + caption: caption, + kind: "frame", + supplement: [Quadro], + placement: none, +) + +// Algorithm: caixa com regua acima/abaixo e linhas numeradas. +// (a norma permite leve diferenca para ilustracoes do tipo algoritmo/codigo) +#let algorithm(caption: none, source: auto, ..lines) = std.figure( + block(width: 100%, breakable: false, { + set text(size: 12pt) + set par(leading: 0.7em, first-line-indent: 0pt, justify: false) + line(length: 100%, stroke: 0.8pt) + v(3pt) + let ls = lines.pos() + grid( + columns: (auto, 1fr), + column-gutter: 0.8em, + row-gutter: 0.35em, + align: (right, left), + ..ls.enumerate().map(((i, l)) => (text(size: 10pt)[#(i + 1):], l)).flatten(), + ) + v(3pt) + line(length: 100%, stroke: 0.8pt) + _render-source(source) + }), + caption: caption, + kind: "algorithm", + supplement: [Algoritmo], + placement: none, +) + +// Código-fonte: listagem com legenda "Código N –"; o codly estiliza o raw block +// (números de linha etc.) — ver codly-init em thesis(). +#let code(body, caption: none, source: auto) = std.figure( + { + body + _render-source(source) + }, + caption: caption, + kind: "code", + supplement: [Código], + placement: none, +) + +// Citação direta longa (>3 linhas): recuo de 4cm, fonte 10, espaçamento simples, +// sem aspas, justificada; `citation` opcional ao final (ex.: prose/cite ou (AUTOR, ano, p. X)). +#let quote(body, citation: none) = block(width: 100%, inset: (left: 4cm), { + set text(size: 10pt) + set par(leading: 0.65em, spacing: 0.65em, first-line-indent: 0pt, justify: true) + body + if citation != none { [ #citation] } +}) + +// Theme do glossy que reproduz o grid 2-col da "Lista de abreviaturas e siglas". +// (entry.label precisa ser emitido para os @sigla do texto linkarem na lista) +#let _sigla-theme = ( + section: (title, body) => body, + group: (name, index, total, body) => body, + entry: (entry, index, total) => block(below: 1em, grid( + columns: (3.5em, 1fr), + column-gutter: 1cm, + [#entry.short#entry.label], entry.long, + )), +) + +// --------------------------------------------------------------------------- +// APENDICES E ANEXOS (letras A, B, C independentes; capitulo centralizado) +// --------------------------------------------------------------------------- + +#let _apx = counter("ppgsi-apendice") +#let _anx = counter("ppgsi-anexo") +#let _apx-sec = counter("ppgsi-apx-section") +#let _apx-subsec = counter("ppgsi-apx-subsection") + +// Congela a letra no local do heading (evita vazar valor final no sumario); +// zera a numeração interna de seções a cada novo apêndice/anexo. +#let _back-chapter(contador, rotulo, titulo) = { + contador.step() + _apx-sec.update(0) + _apx-subsec.update(0) + context { + let letra = numbering("A", ..contador.get()) + heading(level: 1, numbering: none, [#rotulo #letra#cm-dash#titulo]) + } +} + +#let appendix(title) = _back-chapter(_apx, [Apêndice], title) +#let annex(title) = _back-chapter(_anx, [Anexo], title) + +// cite / prose / references: ver biblio.typ (motor próprio ABNT). + +// Seções internas de apêndice/anexo: numeradas automaticamente (1, 1.1), fora do sumário. +#let section(body) = { + _apx-sec.step() + _apx-subsec.update(0) + context heading(level: 2, numbering: none, outlined: false, + [#numbering("1", _apx-sec.get().first()) #body]) +} +#let subsection(body) = { + _apx-subsec.step() + context heading(level: 3, numbering: none, outlined: false, + [#numbering("1.1", _apx-sec.get().first(), _apx-subsec.get().first()) #body]) +} + +// --------------------------------------------------------------------------- +// PRE-TEXTUAIS +// --------------------------------------------------------------------------- + +#let _capa(logo, instituicao, autor, titulo, local, data) = { + set align(center) + set par(leading: 1.1em, first-line-indent: 0pt, justify: false) + set text(size: 12pt) + if logo != none { image(logo, width: 2.7cm) } + v(0.3cm) + instituicao + v(4cm) + autor + v(5cm) + text(weight: "bold", titulo) + v(1fr) + local + parbreak() + data + v(1cm) +} + +#let _folha-de-rosto(autor, titulo, preambulo, orientador, coorientador, local, data) = { + set align(center) + set par(leading: 1.1em, first-line-indent: 0pt, justify: false) + set text(size: 12pt) + autor + v(1fr) + v(1fr) + text(weight: "bold", titulo) + v(1fr) + // preambulo: bloco de meia largura, alinhado a direita, justificado, simples + align(left, pad(left: 50%, _single({ + set par(justify: true, leading: 0.65em, spacing: 1.3em) + preambulo + v(2em) + [#orientador] + if coorientador != none { + v(0.5em) + [#coorientador] + } + }))) + v(1fr) + local + parbreak() + data + v(1cm) +} + +#let _ficha(ficha) = { + if ficha == none { return } + page(margin: 0cm, header: none, footer: none, { + if type(ficha) == str { + image(ficha, width: 100%, height: 100%, fit: "contain") + } else { ficha } + }) +} + +// --------------------------------------------------------------------------- +// TEMPLATE PRINCIPAL +// --------------------------------------------------------------------------- + +// Normaliza uma entrada de `abstract`: conteúdo -> (body: ); dicionário -> ele mesmo. +#let _abstract-part(v) = if v == none { none } else if type(v) == dictionary { v } else { (body: v) } + +// Divide "Título: subtítulo" em (título, subtítulo); sem ":", subtítulo é none. +#let _split-title(t) = if type(t) == str and ":" in t { + let i = t.position(":") + (t.slice(0, i).trim(), t.slice(i + 1).trim()) +} else { (t, none) } + +// Referência ABNT da própria obra (gerada para o resumo/abstract quando citation: auto). +#let _work-reference(name, title, year, unit, degree, institution, location, defense) = context { + let folhas = counter(page).final().first() + let (main, sub) = _split-title(title) + let titulo = if sub != none { [*#main*: #sub] } else { [*#main*] } + [#name. #titulo. #year. #folhas #unit #degree -- #institution, #location, #defense.] +} + +#let thesis( + title: "Título do trabalho: subtítulo do trabalho", + title-en: none, + author: (given: "Fulano de", surname: "Tal"), + institution: [ + UNIVERSIDADE DE SÃO PAULO + + ESCOLA DE ARTES, CIÊNCIAS E HUMANIDADES + + PROGRAMA DE PÓS-GRADUAÇÃO EM SISTEMAS DE INFORMAÇÃO + ], + location: "São Paulo", + date: "2015", + defense-year: none, + degree: [Dissertação (Mestrado em Ciências)], + degree-en: [Dissertation (Master of Science)], + institution-ref: [Escola de Artes, Ciências e Humanidades, Universidade de São Paulo], + institution-ref-en: [School of Arts, Sciences and Humanities, University of São Paulo], + self-source: auto, + logo: "assets/usp_logo.jpg", + preamble: none, + advisor: [Orientador: Prof. Dr. Fulano de Tal], + co-advisor: [Coorientador: Prof. Dr. Fulano de Tal], + catalog-card: none, + errata: none, + approval-text: none, + committee: (), + dedication: none, + acknowledgments: none, + epigraph: none, + abstract: none, + acronyms: none, + symbols: none, + list-figures: true, + list-algorithms: true, + list-code: true, + list-frames: true, + list-tables: true, + bibliography: none, + validate: true, + body, +) = { + // ---- Resumo/abstract: normaliza entradas por idioma --------------------- + let _abs-pt = _abstract-part(if abstract != none { abstract.at("pt-br", default: none) } else { none }) + let _abs-en = _abstract-part(if abstract != none { abstract.at("en-us", default: none) } else { none }) + + // ---- Autor: nome para exibição e forma invertida da referência ---------- + let _author-str = if type(author) == dictionary { author.given + " " + author.surname } else { author } + let _author-cite = if type(author) == dictionary { [#upper(author.surname), #author.given] } else { [#author] } + let _defense = if defense-year != none { defense-year } else { date } + + // ---- Referência da própria obra (citation: auto por padrão) ------------- + let _resolve-cit(part, lang) = { + if part == none { return none } + let c = part.at("citation", default: auto) + if c == none { return none } + if c != auto { return c } + if lang == "en" { + if title-en == none { return none } + _work-reference(_author-cite, title-en, date, "p.", degree-en, institution-ref-en, location, _defense) + } else { + _work-reference(_author-cite, title, date, "f.", degree, institution-ref, location, _defense) + } + } + let _cit-pt = _resolve-cit(_abs-pt, "pt") + let _cit-en = _resolve-cit(_abs-en, "en") + + // ---- Validação dos elementos obrigatórios (ABNT) ------------------------ + if validate { + let req(cond, nome) = assert(cond, message: "Elemento obrigatório ausente: " + nome + " (use validate: false para desativar).") + req(title not in (none, ""), "título") + req(_author-str not in (none, ""), "autor") + req(advisor != none, "orientador (advisor)") + req(_abs-pt != none and _abs-pt.at("body", default: none) != none, "resumo (abstract.ptBR)") + req(_abs-en != none and _abs-en.at("body", default: none) != none, "abstract (abstract.enUS)") + req(bibliography != none, "referências (bibliography)") + } + + // ---- Metadados do PDF: palavras-chave (arrays) e data (ano) ------------- + let _doc-keywords = () + for p in (_abs-pt, _abs-en) { + let kw = if p != none { p.at("keywords", default: none) } else { none } + if type(kw) == array { _doc-keywords += kw } + } + let _doc-date = if type(date) == str and date.match(regex("^\\d{4}$")) != none { + datetime(year: int(date), month: 1, day: 1) + } else { auto } + + // ---- Estilos globais ---------------------------------------------------- + set page( + paper: "a4", + margin: (left: 3cm, right: 2cm, top: 3cm, bottom: 2cm), + header-ascent: 1cm, + header: context { + let loc = here() + let pg = loc.page() + let mark = _chapter-mark(loc) + if mark == none { return } // pre-textual: sem cabecalho + set text(size: 10pt) + let chap-here = query(heading.where(level: 1)).filter(h => h.location().page() == pg) + if chap-here.len() > 0 { + align(right, counter(page).display()) + return + } + grid( + columns: (1fr, auto), + align: (left + bottom, right + bottom), + mark, counter(page).display(), + ) + v(-0.4em) + line(length: 100%, stroke: 0.4pt) + }, + ) + set text(font: "New Computer Modern", size: 12pt, lang: "pt", region: "br", hyphenate: true) + set document(title: title, author: _author-str, keywords: _doc-keywords, date: _doc-date) + set math.equation(numbering: "(1)") + set par( + leading: 1.1em, + spacing: 1.1em, + first-line-indent: (amount: 1.25cm, all: true), + justify: true, + ) + set heading(numbering: _heading-numbering) + + // ---- Ilustracoes: legenda acima, separador travessao -------------------- + set std.figure(gap: 0.6em) + set std.figure.caption(separator: cm-dash, position: top) + show std.figure.caption: it => { + set text(size: 12pt) + set par(leading: 0.6em, first-line-indent: 0pt, spacing: 0.6em) + layout(size => context { + let number = it.counter.display(it.numbering) + let is-alg = it.kind == "algorithm" + let label = if is-alg { strong[#it.supplement #number] } else { [#it.supplement #number#cm-dash] } + let gap = if is-alg { [ ] } else { [] } + let full = label + gap + it.body + if measure(full).width <= size.width { + align(center, full) + } else { + set par(hanging-indent: measure(label + gap).width, justify: true) + full + } + }) + } + + show heading.where(level: 1): it => { + pagebreak(weak: true) + set text(size: 12pt, weight: "bold") + set par(first-line-indent: 0pt, justify: false, leading: 0.93em) + block(above: 0pt, below: 22pt, width: 100%, { + if it.numbering == none { align(center, it.body) } else { it } + }) + } + show heading.where(level: 2): it => { + set text(size: 12pt, weight: "regular", style: "italic") + set par(first-line-indent: 0pt, justify: false, leading: 0.93em) + block(above: 32pt, below: 22pt, it) + } + show heading.where(level: 3): it => { + set text(size: 12pt, weight: "regular", style: "normal") + set par(first-line-indent: 0pt, justify: false, leading: 0.93em) + block(above: 32pt, below: 22pt, it) + } + + // ---- Pacotes integrados (show-rules de documento) ----------------------- + // glossy: habilita @sigla (expande na 1ª menção); codly: estiliza raw blocks; + // cheq: listas "- [ ]"/"- [x]" viram caixas. glossy só se houver siglas. + let _glossy-init = if acronyms != none { glossy.init-glossary.with(acronyms) } else { it => it } + show: _glossy-init + show: codly.codly-init.with() + show: checklist + + // título de elemento pré-textual (centralizado, negrito, sem numeração) + let pre-titulo(nome) = heading(level: 1, numbering: none, outlined: false, bookmarked: true, nome) + + // ---- Registra a fonte .bib para o motor de citações/referências --------- + if bibliography != none { register-bib(bibliography) } + + // Fonte padrão das ilustrações: ", " (ou self-source explícito). + _self-source.update(if self-source == auto { [#_author-str, #date] } else { self-source }) + + // ---- CAPA (nao contada) ------------------------------------------------- + // Nome do autor em caixa alta na capa e na folha de rosto (convenção ABNT). + _capa(logo, institution, upper(_author-str), title, location, date) + counter(page).update(0) + pagebreak() + + // ---- FOLHA DE ROSTO (= pagina 1) ---------------------------------------- + _folha-de-rosto(upper(_author-str), title, preamble, advisor, co-advisor, location, date) + pagebreak() + + // ---- FICHA CATALOGRAFICA (verso) ---------------------------------------- + _ficha(catalog-card) + + // ---- ERRATA ------------------------------------------------------------- + if errata != none { + pre-titulo[Errata] + errata + } + + // ---- FOLHA DE APROVACAO ------------------------------------------------- + if approval-text != none { + pre-titulo(hide[Folha de aprovação]) // marcador/bookmark sem titulo visivel + // (o conteudo da aprovacao nao tem titulo impresso) + } + if approval-text != none { + _single({ + set par(justify: true) + approval-text + v(3cm) + set align(center) + for member in committee { + v(1.2cm) + line(length: 10cm, stroke: 0.5pt) + member + parbreak() + } + }) + pagebreak() + } + + // ---- DEDICATORIA -------------------------------------------------------- + if dedication != none { + v(1fr) + align(center, emph(dedication)) + v(1fr) + pagebreak() + } + + // ---- AGRADECIMENTOS ----------------------------------------------------- + if acknowledgments != none { + pre-titulo[Agradecimentos] + acknowledgments + } + + // ---- EPIGRAFE ----------------------------------------------------------- + if epigraph != none { + v(1fr) + align(right, emph(epigraph)) + pagebreak() + } + + // ---- RESUMO ------------------------------------------------------------- + if _abs-pt != none { + pre-titulo[Resumo] + _single({ + set par(first-line-indent: 0pt, spacing: 18pt) + if _cit-pt != none { align(left, _cit-pt); parbreak() } + _abs-pt.at("body", default: none) + let kw = _abs-pt.at("keywords", default: none) + if kw != none { + parbreak() + if type(kw) == array { [Palavras-chave: #(kw.join(". ")).] } else { [Palavras-chave: #kw] } + } + }) + } + + // ---- ABSTRACT ----------------------------------------------------------- + if _abs-en != none { + pre-titulo[Abstract] + _single({ + set par(first-line-indent: 0pt, spacing: 18pt) + set text(lang: "en") + if _cit-en != none { align(left, _cit-en); parbreak() } + _abs-en.at("body", default: none) + let kw = _abs-en.at("keywords", default: none) + if kw != none { + parbreak() + if type(kw) == array { [Keywords: #(kw.join(". ")).] } else { [Keywords: #kw] } + } + }) + } + + // ---- LISTAS DE ILUSTRACOES ---------------------------------------------- + let lista(nome, target) = { + pre-titulo(nome) + // entrada inteira azul (prefixo + dash + título); pontilhado e página pretos + show outline.entry: it => { + let tail = if it.fill != none { box(width: 1fr, it.fill) } else { h(1fr) } + it.indented( + text(fill: _blue, { it.prefix(); cm-dash }), + text(fill: _blue, it.body()) + [ ] + tail + [ ] + it.page(), + ) + } + outline(title: none, target: target) + } + if list-figures { lista([Lista de figuras], std.figure.where(kind: image)) } + if list-algorithms { lista([Lista de algoritmos], std.figure.where(kind: "algorithm")) } + if list-code { lista([Lista de códigos], std.figure.where(kind: "code")) } + if list-frames { lista([Lista de quadros], std.figure.where(kind: "frame")) } + if list-tables { lista([Lista de tabelas], std.figure.where(kind: std.table)) } + + // ---- LISTA DE SIGLAS (renderizada pelo glossy) -------------------------- + if acronyms != none { + pre-titulo[Lista de abreviaturas e siglas] + set par(first-line-indent: 0pt) + glossy.glossary(title: "", theme: _sigla-theme, sort: false, show-all: true) + } + + // ---- LISTA DE SIMBOLOS -------------------------------------------------- + if symbols != none { + pre-titulo[Lista de símbolos] + set par(first-line-indent: 0pt) + grid( + columns: (auto, 1fr), + column-gutter: 1cm, + row-gutter: 1.2em, + ..symbols.map(((s, d)) => (s, d)).flatten(), + ) + } + + // ---- SUMARIO ------------------------------------------------------------ + pre-titulo[Sumário] + { + // sumário: linha inteira em azul (prefixo + título + pontilhado + página) + show outline.entry.where(level: 1): it => block(above: 1em, below: 0pt, text(fill: _blue, weight: "bold", { + let e = it.indented(it.prefix(), it.inner()) + // "REFERÊNCIAS" em maiusculas no sumario (quirk do abntex bibsection) + if it.element.body == [Referências] { upper(e) } else { e } + })) + show outline.entry.where(level: 2): it => text(fill: _blue, style: "italic", it.indented(it.prefix(), it.inner())) + show outline.entry.where(level: 3): it => text(fill: _blue, it.indented(it.prefix(), it.inner())) + outline(title: none, depth: 3, indent: 1.2em) + } + + // ---- ELEMENTOS TEXTUAIS ------------------------------------------------- + body +} diff --git a/packages/preview/classic-ppgsi/0.1.0/template/assets/ficha-1.png b/packages/preview/classic-ppgsi/0.1.0/template/assets/ficha-1.png new file mode 100644 index 0000000000000000000000000000000000000000..53656cbe24b71e55e608162cf338b369d3f08039 GIT binary patch literal 12237 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 literal 0 HcmV?d00001 diff --git a/packages/preview/classic-ppgsi/0.1.0/template/assets/figura-exemplo.png b/packages/preview/classic-ppgsi/0.1.0/template/assets/figura-exemplo.png new file mode 100644 index 0000000000000000000000000000000000000000..de2823ba0c2414700d7bf541ee6f0140f8e2381b GIT binary patch literal 6254 zcmb_gcTiK&vkturQl%QHLXaAo^d?AEAT*^DFm!1m5UPlvH0dC{BOtw3K|txDiZm6G z-jNRPCd$lj=DnFWZ|41xTxx{dUiWJ1TixT>agylPnun1OO(OEeC%?p ztze?tY^<4;gxOSaVVT#yoCb`;#60}_kS8lDOD+Le?&6+@$9`*jo%wH>Pn!4lHb#*r z-!A`1;>uH4w>%a;+NhgnA`Ales&$Zpf!`!7;EzS|AugMX!@A30dN~SQqf#o{l$Uy;p`gx=kpS>ePF-}wn}h`d8HVfm()I(E@hbDkkk|kZ39K|3c*4Mg zdQA9G5IqPKkf-{|wu2M|YS+pAQDu$~0-1CF&uZju7p=UmmBDomaV|T{CL;i~gD`?w z{$2_U=qFf zZ9Rzc=eT&_{*aLl)c%r{>lUy^=)_mwcvD=v3`#!v4vSIEj+c9OLtIm~`Yl!SVFp2s zJQm0S>PlH@j=ymXtIPWuxhEv@tpV=VBYAmEG;(ueOIKDsN>b~gg+y}4QrlUSC?6;w z;+~cQZGYyu!r?1uY9gNTFKi<&zaQ!=PCfTYqr4Aa&2b|}y755eBfZaiD`!b-nHtjH zsot+*E@-oE({GTQNWQV0xas+Bx{B^I(FNP@azG~t=dY}q-AV31WGsWa9h}5EEnOA~ zo*g*p%TWJJdT}&aD9YC^>%hO28&u9$Z3b#p9#l-&uo<2>)SF%xk78u3{(@II=rTYL z0BH~tSe#>`;8b-%`!9o8+M^j8rG zl}15)s%Zn)Sj>zCf3z4?4*3Je@+UE}GjkJ2OJdG40t2of)p7;Mon{vQJR7s#6!tDj=oTldARskAW~e!ybq3T;r zfVsS!?PEl5o5N_O;9 zSx~{e>S%Sy8LgdC} zg+0=mdKphBHHQi)Q6J;+3=H{EPXR^X;;uNEtxXg20uFno)tLWmdmyd}ykNjSg0zrKf$21PGcu563Zf0hsK7N518cQ`zU z9-KcW@QT}n?xw*XYg1w`mfIjZ%%XrKolbDRJ51=C z+!caag*w5*=C2r3nBE~E0bA_nh#RwHjU~Z^>e}p2 z$Q^2PA{G=g?^=H*nP8rcyvB+eknno8ImIz_NJC<4664$Z94QING{^m82P4NeQ9k`! z%pH||q{|9&NWRb{9UK4vHeXlb^%>^skzs6m4)x_mS(}YWwiWCIlYbE0 zx!t*oHyunV9NIw;BW!v%6J84oiuCFXc;Y`l!Lp2V2HWvCxI)cwICpsEz0DrFvchym z3nGl`V-l)(g>bs!QV0a|NQNcyoUHbsX$-H)(ot$O0*Xk3&B~}mM40(dFdQM=$0}T? zq)}uLiql_jx#&%*MzX{}s0gsihi`aa1wY z&}i@LRtMxAkabAvPT?Q0g{w^~z#xnR+qX*LUoHQMh5_u5;Afq*8mS)^a1-of+Ne}N zES(*J=#BQQbPxnEGT;m5!E4T^mqq{@_^w4mc6WS30w-#;&q#anG$Z8bdJyz2{58ht zgr2x`aep(0OSNFOQZEGxLgOu#NtxnNS*hz2CIu*k1R9L@3|Vxiy?z=Xjv*F(56Xc< zR_+t0mzu~a7|lAfiG)VMLonJzd*X^?BcPW; zDlYQ^9AObMLkfVsL1Lv=Gm~Y1$Wwh6`(sB#WZJ6V=wjFYpIt3SA>3;SQb<2q&E6EP zu9|Ilb%Mxtz0rFxSmRwAjGb+uaqiMEl{`?<_#<%@#!0oG;+#%P6p>YFe2nkExmE9C zDcsv~$$2C8zIi8I6cQ8y4W_XXmIH7*yyhOCgLV_xIRu=UBE6!SGKlvFSrPb z<>yDdEk+go%Q2#gK|#;}8m%j&uz9l;btnRkJtb%LEUOSheCEWF=`ayzuFDvfk$CZiZ)|`!CH=CMEtdbDGWG`+=4CiXz$Y2W{Bu>3@ zpWo3ZO~f6R8v&o9$QY)lS(VM~sk(pnW>qP`(NP-ZD44ej;br4LsYZbua`Lv4`tf@Z zo9i=rUP`F~GAh^7Xn3wX#PP*$H1)|(Z7X90s1_)sMg915530G_4F8+pSg6jF8txdG za@0K)wg$ZE7dsNJ%O%@MXpTl3AIhLKA~{nSk8jRcO#g;6Hq~{HHBWw8?+$=G>I%6x z)47uz(9ZygjovWprA~caSTE@{QG2)UA;5r-R+uz{q4})nmSZ=LwTs6$fS-gInYcU) zCPjkZf~AFH6>UShFo6P`4c&vf1Wv9{w530%TZog%BHeD$x(zI}lTW|f5e5)OUm;w< z{wA{)ZL=rlh!M7t;;HI*noY<5U3BCTKu${)Jo$Q7t~RDXuL_heV-JwN;4W*Lv7xEk zgh((4)n9z(7<_<(8SE&3L=Y6ztb*3F8l_dvZ|p`Y!eg4HryVeU5xCm5=;cWUFz_#w+>NqJ zSEzj)1ZrX#$+h}OGbIFMw6qpd$yNyUfvRfU01(M zmkI_w*2jwR2{~3dS&eBIdZrulXJUY3(M2c(XDf zI-xws4ub$7_2jQQo<;t*TL#=O;KgNbiTd(#PhQEIES}Fb;g!)-6C6l0B8VV`f0>z4 zw~Z2Ckt6CWbqKPV{XDJBi=aP(Y{6?t4puDVnN~UMY5Tv?&tF zr&WGP;>Z9L0~&}IT6_Y1O_v9iTk6 zeC-EA%WlRFU7;Bq)GNANETk&>mm@^ocxvZb(T$^1qI7(!&3s zDWu8jnRnh#(=a~K9m0;^(YCQ}eE}7;(t?~^gyv8Les0WvEO^1k;zq*PMcY!Y<}DL1 z?*CpDBG*nHt$oOmV*Sn(0ZrD}V&w=g-VeMcj?&VPzA~Tj;VzQhSsRWFKJgPmT)5pz+nz;RUpO)nu6yT|UHI{P_nJ^F(&C=S2f<_VD}%23r};P>&D7o3&sauoa>o|# zKW^47j%PPdf8wBmF0Ef6G5!YUM?XIXwa-erFAyMI6a%42H0&5=rqE5nyC$katTumV zW_Eaj)1>J31@t92rw-ksuG-p3#kl=uzVw+U+9j_KE+n%zj25lJ#&9Rlw^j9wYx=Zh zR_dI=;I6)p@9xLz?CI9qTc@9tJ$CGiE?62I40)u;=hH^mkqW1ew)u~h8c!YBoyloZ z^0edcQweKt-@z4*CL@ikR%?SWXmXA^)9on+2{_&|Awoz&ZeU^xoDV&Xt99U!QV8MP zI-0McyDk;O(S@&Vak_#(GG%hK{WY5|Uh26vVKcSP)1V-fOS5@14+^iu97B*mb05(; zo1XMYj^=mYbmQk0#EPZzXi){gSe=xWy`LoW!YUr2+Fp-OjQ&J+i4V+C#VFP`oAbA{ z6Tie{`YY~P!)v0>JW^^Nwrj1~FKa~|w~DwbU(9{K=PS0M307?J{P5$m*WCdP*w#70 zYOrNukoLz$`zIW^{DxQp=o|%lXU^Nle!6~w6$uzj84D{yJV^uC@2V4jI5J=ly~P^zWqXqTf3;W6g_X!xZ*^l*!@GpLEJ}4&K?o#?0TkVd+`M^+9UT zTA-4JhYsBxcP4+by1Hd%hqF02vfZj!PMiD8&<|5K0MyQ*sD$3u*g2lSqy2Ao8>5Jn zUK-%m7cm=R46hCat~6G`1wth_s@CrTX1eo*Znu06Un)2CuL5*C?o2;P$;0;Cr#VF# zwywZii)vxh1`ZwQYFAKGFAD~M20hV-JeGu$EAeaU`|y%DQW2ALx&X4;=vrdlu)r<*0Bl)%f8_M423`mDf>8tlctj?188IHb?_LBZg9t&^(^;aL&lc z@+Wo4DBs3m0|c?m_h(@{!}j#Kr-rTQGKRKBCZx>v5a#sdTit_&C#Bmfb>oiG(hx^g z6P_VPr|z6ZGC!Y-$Fu2*D&yXVURy3~uuIaRK#@;WVP8&O!lm0=#%m8>aPU*MiK3!- z%`nv_I7!FfO+@GM+T5<+fl>z>5Z)`<^@kTY^bI0w$9h3L{NrXrw+Kt`IpYFX?&d~q z^@O9*sYbQ7f)VRo1>Sq6s%z{uH>GAYvZQ~VZD8@@>8qT?{WAL(HVo`jG-EYEDmw=8 z=<{Lpt>%-aznLqf3EVCV?d)f~T&9Ji@TxD{tz2@)Pp>QZ9eTtw-7J6)C)RlMt&>=K zF>i;Y;uDe^lB3#qFR!l3ayqDmInvK&@5(xd!vl+L-E3{8viv*yF0)s)?U{{t;$W~+ zYY^Y@C#O9Vazm7`IhpFSDql<;B)3!x)|8U!M{XWjZ9wALb6MsNPXDP^2NpEWB z14&6s&B+O$UCCS3e$6N?p~dEGX06?Ds&V5{@Z1f0P=Yq5Kakfz6lU@?v~{;Q>O3em z(7`jl8?E@@-0_Khj+z?U*$kC%EtPA~l?XiN zfH%Z_1^*%h+WgqVnS%z_U@+P@t7)9T9QvhDg9;9V>D45n08)teAm5nxj+=aU;AcHq zF;p{e#$0q^Hrnxsk;xh)@!QA`Q-^_UnON`+P8~MduQ|oX@pt&Wp&0tmYwXUsyLsUS zevDiCFO{oomelh#2`zluCs& zopOfebT6{~d8`WsEuVxfbm3T%*Wd80cCYUE zc~_F+)^ZI63_g*v_E6uQI#A-%^#yD{|d#QkNbPqs4-Hfn77u{*t@BCi8~!hoUh z@mg|+B!S;tqr^~?5*`Mr{w1oJ?KFZFyA+R!uR0Kxxdfc*b7 zhyFjPNf5(9kI{MlV~ma~8~}{eRT0AASr#wVOZ4Dd0X_8wQ442Y9{ki6LyygSM}O;D j;#1(tN4K1uA6^nX#HYRC=bLf~h=J}aYbli}m, " do thesis() automaticamente (próprio autor) +) + +#lorem(30) + +O quadro 1 é um exemplo de como apresentar quadros de acordo com essa norma. Observe as diferenças de formatação entre uma tabela (cf. tabela 1) e um quadro (cf. quadro 1). + +#ppgsi.frame( + caption: [Exemplo de título de quadro], + source: ppgsi.myself, + columns: (1in, 1in, 1in, 1in), + align: left, + header: ([Cabeçalho 1], [Cabeçalho 2], [Cabeçalho 3], [Cabeçalho 4]), + ([Texto], [texto], [texto], [texto]), + ([Texto], [texto], [texto], [texto]), + ([Texto], [texto], [texto], [texto]), + ([Texto], [texto], [texto], [texto]), + ([Texto], [texto], [texto], [texto]), +) + +== Uma seção secundária + +#lorem(40) + +=== Uma seção terciária + +#lorem(40) + +=== Outra seção terciária + +#lorem(40) + +=== Mais uma seção terciária + +#lorem(40) + +A figura 2 também apresenta um exemplo de como incluir em "Fonte:" uma citação para um trabalho já publicado. Nesse caso, use sempre o "prose". + +#ppgsi.figure( + image("assets/figura-exemplo.png"), + caption: [Exemplo de título de ilustração do tipo figura, que pode ser maior para apresentar mais explicações sobre o conteúdo da figura, se for o caso; e com exemplo de citação a um trabalho já publicado, seja do próprio autor ou de outro autor], + source: ppgsi.prose("teste3"), +) + +== Outra seção secundária + +#lorem(40) + +== Mais uma seção secundária + +#lorem(40) + += Outra seção primária + +#lorem(50) + +Atenção ao fazer citações a referências para garantir o uso da forma correta, considerando os seguintes exemplos: + +- Se desejar que uma citação a uma referência apareça no final da frase, use com o comando "cite". Exemplo: "Tal coisa é muito melhor do que aquela outra coisa #ppgsi.cite("teste1", "teste2")". +- Se desejar que uma citação a uma referência apareça no meio da frase, como parte da própria frase, use o comando "prose". Exemplo: "De acordo com #ppgsi.prose("teste3"), tal coisa é muito melhor do que aquela outra coisa." +- *Atenção* - nunca usar o comando "cite" para citações a referências que aparecem no meio da frase, como parte da própria frase. Exemplo - nunca fazer assim: "De acordo com #ppgsi.cite("teste3"), tal coisa é muito melhor do que aquela outra coisa." + +Citações diretas com mais de três linhas (citações longas) devem ser destacadas com recuo de 4 cm, fonte menor e espaçamento simples, sem aspas, com a citação ao final: + +#ppgsi.quote(citation: ppgsi.prose("teste3"))[ + #lorem(45) +] + +O algoritmo 1 é um exemplo de como apresentar ilustrações de acordo com essa norma. + +#ppgsi.algorithm( + caption: [Exemplo de título de ilustração do tipo algoritmo, que pode ser maior para apresentar mais explicações sobre o conteúdo do algoritmo, se for o caso], + source: ppgsi.myself, + [*procedure* #smallcaps[MyProcedure]], + $#h(1em) p a s s o-1$, + $#h(1em) p a s s o-2$, + $#h(1em) p a s s o-3$, + $#h(1em) .$, + $#h(1em) .$, + $#h(1em) p a s s o-n$, + [*end procedure*], +) + +== Uma seção secundária + +#lorem(40) + +As fórmulas 1 e 2 são exemplos de como apresentar fórmulas e equações destacadas do parágrafo normal do texto. + +$ X + Y = Z $ + +$ (X - Y) \/ 5 = n $ + +=== Uma seção terciária + +#lorem(40) + +=== Outra seção terciária + +#lorem(40) + +=== Mais uma seção terciária + +#lorem(40) + +== Outra seção secundária + +#lorem(40) + +== Mais uma seção secundária + +#lorem(40) + += Mais uma seção primária + +#lorem(50) + +== Uma seção secundária + +#lorem(40) + +=== Uma seção terciária + +#lorem(40) + +=== Outra seção terciária + +#lorem(40) + +=== Mais uma seção terciária + +#lorem(40) + +== Outra seção secundária + +#lorem(40) + +== Mais uma seção secundária + +#lorem(40) + += Mais uma outra seção primária + +#lorem(50) + +== Uma seção secundária + +#lorem(40) + +=== Uma seção terciária + +#lorem(40) + +=== Outra seção terciária + +#lorem(40) + +=== Mais uma seção terciária + +#lorem(40) + +== Outra seção secundária + +#lorem(40) + +== Mais uma seção secundária + +#lorem(40) + += Recursos de visualização e código + +Este capítulo demonstra a integração do modelo com pacotes do ecossistema Typst. As siglas são gerenciadas pelo glossy: na primeira menção aparecem por extenso e, nas seguintes, apenas a forma curta. Por exemplo, a @svm é uma técnica de aprendizado supervisionado; a @svm também serve para regressão. Acesso a dados costuma envolver @api, @http e @sql. + +== Gráficos com lilaq + +A figura 3 apresenta um gráfico de dados gerado com o pacote lilaq, embutido em uma figura comum do modelo (com legenda e linha de fonte normais). + +#ppgsi.figure( + ppgsi.lq.diagram( + width: 9cm, + height: 5.5cm, + xlabel: $x$, + ylabel: $y$, + ppgsi.lq.plot((0, 1, 2, 3, 4, 5), (0, 1, 4, 9, 16, 25), mark: "o", label: [medições]), + ), + caption: [Exemplo de gráfico de dados gerado com lilaq], + source: ppgsi.myself, +) + +== Diagramas com cetz + +A figura 4 apresenta uma rede neural feedforward totalmente conectada, desenhada com cetz, o equivalente ao TikZ no Typst. + +#ppgsi.figure( + ppgsi.cetz.canvas({ + import ppgsi.cetz.draw: * + let sizes = (3, 5, 2) + let labels = ([Entrada], [Camada oculta], [Saída]) + let fills = (rgb("#cfe3f7"), rgb("#ececec"), rgb("#d6efd6")) + let xgap = 3.4 + let ygap = 1.1 + let r = 0.34 + let pos(l, i, n) = (l * xgap, (i - (n - 1) / 2) * ygap) + // conexões (atrás dos neurônios) + for l in range(sizes.len() - 1) { + for i in range(sizes.at(l)) { + for j in range(sizes.at(l + 1)) { + line(pos(l, i, sizes.at(l)), pos(l + 1, j, sizes.at(l + 1)), stroke: 0.4pt + luma(65%)) + } + } + } + // neurônios + for l in range(sizes.len()) { + for i in range(sizes.at(l)) { + circle(pos(l, i, sizes.at(l)), radius: r, fill: fills.at(l), stroke: 0.6pt) + } + } + // rótulos das camadas + for l in range(sizes.len()) { + content((l * xgap, -3.1), text(size: 9pt, labels.at(l))) + } + }), + caption: [Exemplo de rede neural feedforward desenhada com cetz], + source: ppgsi.myself, +) + +== Listagens de código com codly + +O código 1 é um exemplo de listagem de código-fonte, estilizada automaticamente pelo codly (numeração de linhas e realce de sintaxe). + +#ppgsi.code( + caption: [Exemplo de listagem de código-fonte do tipo Código], + source: ppgsi.myself, +)[```python +def reconstruir(pontos): + """Reconstrução de superfície homeomórfica.""" + malha = alpha_shape(pontos) + return malha.simplificar() +```] + +== Listas de verificação com cheq + +Listas de tarefas podem ser escritas com a sintaxe de caixas de seleção do cheq: + +- [x] Definir o problema de pesquisa +- [x] Revisar a literatura +- [/] Coletar os dados +- [ ] Analisar os resultados + += Conclusão + +#lorem(50) + +== Uma seção secundária + +#lorem(40) + +=== Uma seção terciária + +#lorem(40) + +=== Outra seção terciária + +#lorem(40) + +=== Mais uma seção terciária + +#lorem(40) + +== Outra seção secundária + +#lorem(40) + +== Mais uma seção secundária + +#lorem(40) + +#ppgsi.references() + +#ppgsi.appendix[Exemplo de apêndice] + +#lorem(30) + +#ppgsi.section[Exemplo de seção de apêndice não apresentada no sumário] + +#lorem(30) + +#ppgsi.subsection[Exemplo de subseção de apêndice não apresentada no sumário] + +#lorem(30) + +#ppgsi.appendix[Exemplo de apêndice] + +#lorem(30) + +#ppgsi.appendix[Exemplo de apêndice] + +#lorem(30) + +#ppgsi.annex[Resumo das normas] + +Considerando a dificuldade para formatar um texto acadêmico sem conhecimento básico do conteúdo da norma NBR 14724 "Informação e documentação -- Trabalhos acadêmicos -- Apresentação", este anexo apresenta um resumo de alguns conceitos dessa norma, conforme publicada em julho de 2011. Sugere-se a leitura completa da norma para garantir que seu documento seja completamente aderente à mesma. Em alguns casos específicos, este anexo apresenta alguns ajustes da norma especificamente para o PPgSI. + +#ppgsi.section[NBR 14724: estrutura e algumas descrições] + +A estrutura de uma tese, dissertação ou qualquer outro trabalho acadêmico, deve compreender elementos pré-textuais, elementos textuais e elementos pós-textuais, que aparecem no texto na seguinte ordem: + +#ppgsi.subsection[Elementos pré-textuais] + +- Capa (obrigatório) +- Folha de rosto (obrigatório) +- Errata (opcional) +- Folha de aprovação (obrigatório) +- Dedicatória (opcional) +- Agradecimentos (opcional) +- Epígrafe (opcional) +- Resumo em língua vernácula (obrigatório) +- Resumo em língua estrangeira (obrigatório) +- Listas de ilustrações: lista de figuras, lista de algoritmos, lista de quadros etc. (opcional) +- Lista de tabelas (opcional) +- Lista de abreviaturas e siglas (opcional) +- Lista de símbolos (opcional) +- Sumário (obrigatório) + +#ppgsi.subsection[Elementos textuais] + +- Introdução +- Desenvolvimento +- Conclusão + +#ppgsi.subsection[Elementos pós-textuais] + +- Referências (obrigatório) +- Apêndice (opcional) +- Anexo (opcional) +- Glossário (opcional) + +#ppgsi.section[Definições relacionadas a elementos pré-textuais] + +A seguir, são apresentadas algumas definições contidas na norma relacionadas a elementos pré-textuais. + +#ppgsi.subsection[Capa] + +Elemento obrigatório, para proteção externa e sobre o qual se imprimem informações que ajudam na identificação e uso do trabalho, na seguinte ordem: + ++ Nome completo do autor: responsável intelectual do trabalho. ++ Título principal do trabalho: deve ser claro e preciso, identificando o seu conteúdo e possibilitando a indexação e recuperação da informação. ++ Subtítulo (se houver): deve ser evidenciada sua subordinação ao título principal, precedido de dois pontos (:). ++ Número do volume (obrigatório apenas se houver mais de um volume, de forma que deve constar em cada capa a especificação do respectivo volume). ++ Local (cidade) da instituição de apresentação. ++ Ano do depósito (entrega). + +#ppgsi.subsection[Folha de rosto (anverso)] + +Os elementos do anverso da folha de rosto devem figurar na seguinte ordem: + ++ Nome completo do autor: responsável intelectual do trabalho. ++ Título principal do trabalho: deve ser claro e preciso, identificando o seu conteúdo e possibilitando a indexação e recuperação da informação. ++ Subtítulo (se houver): deve ser evidenciada sua subordinação ao título principal, precedido de dois pontos (:). ++ Número do volume (obrigatório apenas se houver mais de um volume). ++ Natureza (tese, dissertação e outros) e objetivo (aprovação em disciplina, grau pretendido e outros); nome da instituição a que é submetido; área de concentração. ++ Nome do orientador e, se houver, do co-orientador. ++ Local (cidade) da instituição de apresentação. ++ Ano de depósito (entrega). + +#ppgsi.subsection[Folha de rosto (verso)] + +No verso da folha de rosto deve constar a ficha catalográfica, conforme o Código de Catalogação Anglo-Americano -- CCAA2. + +#ppgsi.subsection[Folha de aprovação] + +Elemento obrigatório, que contém autor, título por extenso e subtítulo, se houver, local e data de aprovação, nome e instituição dos membros componentes da banca examinadora. + +#ppgsi.subsection[Dedicatória e agradecimentos] + +Elementos opcionais. Os agradecimentos devem ser dirigidos apenas àqueles que contribuíram de maneira relevante à elaboração do trabalho. + +#ppgsi.subsection[Resumo na língua vernácula] + +Elemento obrigatório, que consiste na apresentação concisa dos pontos relevantes de um texto; constitui-se em uma sequência de frases concisas e objetivas, e não de uma simples enumeração de tópicos, não ultrapassando 500 palavras, seguido, logo abaixo, das palavras representativas do conteúdo do trabalho, isto é, palavras-chave e/ou descritores. + +#ppgsi.subsection[Resumo em língua estrangeira] + +Elemento obrigatório, que consiste em uma versão do resumo em idioma de divulgação internacional (em inglês Abstract, em castelhano Resumen, em francês Résumé, por exemplo). Deve ser seguido das palavras representativas do conteúdo do trabalho, isto é, palavras-chave e/ou descritores, na respectiva língua estrangeira. + +#ppgsi.subsection[Lista de figuras e lista de tabelas] + +Elementos opcionais, elaborados de acordo com a ordem apresentada no texto, com cada item acompanhado do respectivo número da página. + +#ppgsi.subsection[Lista de abreviaturas e siglas] + +Elemento opcional. Consiste na relação alfabética das abreviaturas e siglas usadas no texto, seguidas das palavras ou expressões correspondentes grafadas por extenso. + +#ppgsi.subsection[Lista de símbolos] + +Elemento opcional, elaborado de acordo com a ordem apresentada no texto, com o devido significado. + +#ppgsi.subsection[Sumário] + +Elemento obrigatório, que consiste na enumeração das principais divisões (seções e outras partes do trabalho) dos elementos textuais e pós-textuais, na mesma ordem e grafia em que a matéria nele sucede, acompanhado do respectivo número da página. + +#ppgsi.section[Definições relacionadas a elementos textuais] + +O autor deve criar quantas seções primárias (também chamadas informalmente de capítulos) desejar para tratar dos seguintes elementos textuais que são obrigatórios: introdução, desenvolvimento e conclusão. Normalmente, existe apenas uma seção primária para a introdução, uma ou mais seções primárias para o desenvolvimento, e apenas uma seção primária para a conclusão. + +#ppgsi.section[Definições relacionadas a elementos pós-textuais] + +A seguir, são apresentadas algumas definições contidas na norma relacionadas a elementos pós-textuais. + +#ppgsi.subsection[Apêndice] + +Elemento opcional, que consiste em um texto ou documento elaborado pelo próprio autor, a fim de complementar sua argumentação, sem prejuízo da unidade nuclear do trabalho. Um apêndice deve ser identificado por uma letra maiúscula, seguida por um hífen (entre caracteres de espaço), seguido pelo respectivo título. Os apêndices devem ser identificados por letras consecutivas, a partir da letra "A" (independentemente dos anexos). + +#ppgsi.subsection[Anexo] + +Elemento opcional, que consiste em um texto ou documento não elaborado pelo autor, a fim de fundamentar, comprovar ou ilustrar a argumentação do autor. Um anexo deve ser identificado por uma letra maiúscula, seguida por um hífen (entre caracteres de espaço), seguido pelo respectivo título. Os anexos devem ser identificados por letras consecutivas, a partir da letra "A" (independentemente dos apêndices). + +#ppgsi.subsection[Glossário] + +Elemento opcional, que consiste em uma lista em ordem alfabética de palavras ou de expressões técnicas de uso restrito ou de sentido obscuro, usadas no texto, acompanhadas das respectivas definições. + +#ppgsi.section[Formas de apresentação] + +A seguir, são apresentadas algumas definições contidas na norma relacionadas a formas de apresentação em geral. + +#ppgsi.subsection[Formato] + +O texto deve estar impresso em papel branco, formato A4 (21,0 cm 29,7 cm), apenas no anverso da folha (ou seja, na "frente" da folha), excetuando-se a folha de rosto que deve estar impressa tanto no anverso quanto no verso (com a ficha catalográfica). + +#ppgsi.subsection[Projeto gráfico] + +O projeto gráfico é de responsabilidade do autor. + +#ppgsi.subsection[Fonte] + +Usar sempre cor preta. + +Usar sempre tamanho de fonte 12, com as seguintes exceções: tamanho de fonte 10 para citações longas (com mais de três linhas), notas de rodapé, legendas de ilustração e de tabela, fontes de ilustração e de tabela, números de página; e tamanho de fonte maiores para títulos de seção. + +#ppgsi.subsection[Margens] + +Todas as folhas devem apresentar margens esquerda e superior de 3 cm; e margens direita e inferior de 2 cm, considerando impressão apenas no anverso (ou seja, apenas na "frente"). + +Se a impressão precisar, por algum motivo especial, ser realizada em anverso e verso, neste caso, há que se configurar as margens de forma diferente, conforme detalhes da norma ABNT; por isso solicita-se não realizar impressão em frente e verso. + +#ppgsi.subsection[Espaçamento entre linhas] + +Usar sempre espaçamento entre linhas de 1,5 linhas, com as seguintes exceções: espaçamento entre linhas "simples" para citações longas (com mais de três linhas), notas de rodapé, referências, resumos (em vernáculo e em língua estrangeira), legendas de ilustração e de tabela, fontes de ilustração e de tabela, ficha catalográfica, natureza do trabalho, grau pretendido, nome da instituição a que é submetido, e área de concentração; e espaçamento entre linhas "duplo" para equações e fórmulas e para separação das referências entre si. + +Os títulos das seções devem começar na margem superior da folha separados do texto que os sucede por um espaço em branco de 1,5 e, da mesma forma, os títulos das subseções devem ser separados do texto que os precede, ou que os sucede, por um espaço em branco de 1,5. + +#ppgsi.subsection[Numeração das seções] + +O indicativo numérico de uma seção precede seu título, alinhado à esquerda, separado por um espaço de caractere. Nos títulos sem indicativo numérico, como lista de ilustrações, sumário, resumo, referências e outros, devem ser centralizados. + +Para evidenciar a sistematização do conteúdo do trabalho, deve-se adotar a numeração progressiva para as seções do texto. Os títulos das seções primárias (chamadas informalmente de capítulos), por serem as principais divisões do texto, devem iniciar em folha distinta. Títulos das seções e subseções devem ser destacados gradativamente, usando-se os recursos de negrito, itálico ou grifo e redondo, caixa alta ou versal. + +#ppgsi.subsection[Paginação] + +Todas as folhas do trabalho, a partir da folha de rosto (desconsiderando a capa, mas considerando a ficha catalográfica), devem ser contadas sequencialmente, mas não numeradas. A numeração é colocada, a partir da primeira folha da dos elementos textuais (ou seja, a partir da "Introdução"), em algarismos arábicos, no canto superior direito da folha, a 2 cm da borda superior, ficando o último algarismo a 2 cm da borda direita da folha. + +Havendo apêndices e/ou anexos, suas folhas devem ser numeradas de maneira contínua e sua paginação deve dar seguimento à do texto principal, em algarismos arábicos. + +No caso de o trabalho ser constituído de mais de um volume, deve-se manter uma única sequência de numeração das folhas, do primeiro ao último volume. + +#ppgsi.subsection[Equações e fórmulas] + +Equações e fórmulas devem aparecer destacadas no texto, para facilitar sua leitura. + +Se as equações e fórmulas forem apresentadas na sequência normal do texto (ou seja, dentro do próprio parágrafo normal de texto), é permitido usar um espaçamento entre linhas duplo para comportar seus elementos (ou seja, expoentes, índices e outros). + +Se as equações e fórmulas forem apresentadas fora do parágrafo, então elas devem ser centralizadas e, se necessário, devem ser numeradas. Quando fragmentadas em mais de uma linha, por falta de espaço, devem ser interrompidas antes do sinal de igualdade ou depois dos sinais de adição, subtração, multiplicação e divisão. + +#ppgsi.subsection[Ilustrações] + +Cada tipo de ilustração (tais como figura, gráfico, algoritmo, fotografia, quadro, esquema, desenhos, esquemas, fluxogramas, mapa, organograma, planta, retrato, entre outros) tem numeração independente e consecutiva. + +Inserir a ilustração o mais próximo possível do parágrafo em que ela é citada pela primeira vez no texto; nunca inserir uma ilustração antes de ela ser citada pela primeira vez no texto. Toda ilustração inserida no trabalho deve ser citada pelo menos uma vez no texto. + +Qualquer que seja o tipo da ilustração, ela deve obrigatoriamente ter uma identificação (ou seja, um título), que deve aparecer sempre na parte superior da ilustração, precedida pela palavra que identifica seu tipo, por exemplo "Figura", seguida de seu número de ordem de ocorrência no texto em algarismo arábico, e de um hífen entre caracteres de espaço (" -- "), em fonte com tamanho 12, sem negrito, sem itálico, com apenas a primeira letra da sentença maiúscula, sem ponto final, e em espaçamento simples. Exemplo: "Figura 1 -- Título da ilustração". + +Para toda ilustração, deve ser apresentada também obrigatoriamente sua fonte (mesmo quando a fonte é o próprio autor do trabalho). A fonte deve apresentada na parte inferior da ilustração e ser informada no seguinte formato: palavra "Fonte", seguida pelo caractere dois pontos ":", seguido por um caractere de espaço, seguido pela citação de onde a ilustração foi obtida (conforme regras de citação da norma ABNT) ou seguido pelo nome completo do autor do trabalho, por uma vírgula e pelo ano de elaboração do trabalho, em fonte com tamanho 10, sem negrito, sem itálico, sem ponto final, e em espaçamento simples. + +#ppgsi.subsection[Tabelas] + +As tabelas têm numeração independente e consecutiva das ilustrações. + +Inserir a tabela o mais próximo possível do parágrafo em que ela é citada pela primeira vez no texto; nunca inserir uma tabela antes de ela ser citada pela primeira vez no texto. Toda tabela inserida no trabalho deve ser citada pelo menos uma vez no texto. + +Usar traços horizontais apenas para delimitar o cabeçalho da tabela e o início e o fim da tabela. Não usar traços horizontais para separar cada linha de conteúdo da tabela e também não usar traços verticais para separar cada coluna de conteúdo da tabela. + +Não confundir "tabela" com "quadro". Uma tabela deve ter dados numéricos como informação central. Outros tipos de organização de informações devem ser apresentados em quadros, que é um dos tipos de ilustração. A formatação de um quadro é muito parecida a de uma tabela, porém todos os traços horizontais e verticais devem ser apresentados. + +#ppgsi.section[Outras normas] + +#ppgsi.subsection[Seções] + +As seções primárias são as principais divisões do texto, denominadas informalmente de "capítulos". As seções primárias podem ser divididas em seções secundárias; e as secundárias em terciárias, em formatação distinta. Não divida o texto mais do que a terceira ordem; ou seja, evite criar seções de profundidade quatro ou cinco. + +Todos títulos, de todas as seções, de todos os níveis, devem ter sempre tamanho 12. O que muda é a formatação, conforme segue abaixo. A formatação adotada para este _template_ em particular é a seguinte: + +- Seções primárias: *negrito*. +- Seções secundárias: _itálico_. +- Seções terciárias: regular. +- Seções quartenárias: [não usar]. +- Seções quinárias: [não usar]. + +São empregados algarismos arábicos na numeração. O "indicativo" de uma seção precede o título ou a primeira palavra do texto, se não houver título, separado por um espaço. + +#ppgsi.subsection[Referências bibliográficas e citações às referências bibliográficas] + +A norma é bastante complexa e extensa em relação às regras de referências bibliográficas e citações às referências bibliográficas, não sendo possível fazer um resumo aqui. Assim, é necessário fazer uma consulta às normas detalhadas. + +As referências devem ser apresentadas em ordem alfabética, com as citações no texto obedecendo ao sistema autor-data. Todos os documentos relacionados nas Referências devem ser citados no texto, assim como todas as citações do texto devem constar nas Referências. + +#ppgsi.annex[Exemplo de anexo] + +#lorem(30) + +#ppgsi.annex[Exemplo de anexo] + +#lorem(30) diff --git a/packages/preview/classic-ppgsi/0.1.0/template/referencias.bib b/packages/preview/classic-ppgsi/0.1.0/template/referencias.bib new file mode 100644 index 0000000000..1299baae09 --- /dev/null +++ b/packages/preview/classic-ppgsi/0.1.0/template/referencias.bib @@ -0,0 +1,45 @@ +@article{teste1, + author = {Nina Amenta and Sunghee Choi and Tamal K. Dey and N. Leekha}, + title = {A simple algorithm for homeomorphic surface reconstruction}, + journal = {International Journal of Computational Geometry and Applications}, + publisher = {World Scientific Publishing Co.}, + volume = {12}, + number = {1-2}, + pages = {125-141}, + year = {2002}, +} + +@article{teste2, + author = {Nina Amenta and Sunghee Choi and Tamal K. Dey and N. Leekha}, + title = {A simple algorithm for homeomorphic surface reconstruction}, + journal = {International Journal of Computational Geometry and Applications}, + publisher = {World Scientific Publishing Co.}, + volume = {12}, + number = {1-2}, + pages = {125-141}, + year = {2002}, +} + +@article{teste3, + author = {Nina Amenta and Sunghee Choi and Tamal K. Dey and N. Leekha}, + title = {A simple algorithm for homeomorphic surface reconstruction}, + journal = {International Journal of Computational Geometry and Applications}, + publisher = {World Scientific Publishing Co.}, + volume = {12}, + number = {1-2}, + pages = {125-141}, + year = {2002}, +} + +% --------------------------------------------------------------------------- +% Modelos de entrada (preencha e renomeie a chave). Mantidos como comentário +% porque o Typst rejeita campos vazios. Descomente e complete conforme o tipo. +% --------------------------------------------------------------------------- +% @article{chave, author={}, title={}, journal={}, volume={}, number={}, pages={}, year={} } +% @book{chave, author={}, title={}, edition={}, publisher={}, year={} } +% @inbook{chave, author={}, title={}, booktitle={}, publisher={}, year={}, chapter={}, pages={} } +% @inproceedings{chave, author={}, title={}, editor={}, booktitle={}, publisher={}, year={}, pages={} } +% @phdthesis{chave, author={}, title={}, school={}, year={} } +% @mastersthesis{chave, author={}, title={}, school={}, year={} } +% @techreport{chave, author={}, title={}, year={} } +% @misc{chave, author={}, title={}, year={}, url={} } diff --git a/packages/preview/classic-ppgsi/0.1.0/thumbnail.png b/packages/preview/classic-ppgsi/0.1.0/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..893472cdb540bf323a45bd1c26aa5f1ecc2fec7a GIT binary patch literal 120671 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 literal 0 HcmV?d00001 diff --git a/packages/preview/classic-ppgsi/0.1.0/typst.toml b/packages/preview/classic-ppgsi/0.1.0/typst.toml new file mode 100644 index 0000000000..bf43a1a7d0 --- /dev/null +++ b/packages/preview/classic-ppgsi/0.1.0/typst.toml @@ -0,0 +1,18 @@ +[package] +name = "classic-ppgsi" +version = "0.1.0" +entrypoint = "lib.typ" +authors = ["Gabriel Francisco dos Santos Silva "] +license = "MIT" +description = "Dissertação/tese ABNT do PPgSI-EACH-USP (abntex2ppgsi)." +repository = "https://github.com/ppgsi-lab/classic-ppgsi" +keywords = ["thesis", "dissertation", "abnt", "ppgsi", "usp", "portuguese"] +categories = ["thesis"] +disciplines = ["computer-science"] +compiler = "0.13.0" +exclude = ["build.sh", "**/*.pdf"] + +[template] +path = "template" +entrypoint = "main.typ" +thumbnail = "thumbnail.png" From 7064ca84cf07fefba63bc9ab9cbbec6a34c00114 Mon Sep 17 00:00:00 2001 From: Gabriel Francisco Date: Sat, 27 Jun 2026 22:11:34 -0300 Subject: [PATCH 2/2] classic-ppgsi:0.1.0: appendix/annex markers + native headings --- .../preview/classic-ppgsi/0.1.0/README.md | 6 +- packages/preview/classic-ppgsi/0.1.0/lib.typ | 109 ++++++++++-------- .../classic-ppgsi/0.1.0/template/main.typ | 90 ++++++++------- 3 files changed, 115 insertions(+), 90 deletions(-) diff --git a/packages/preview/classic-ppgsi/0.1.0/README.md b/packages/preview/classic-ppgsi/0.1.0/README.md index 49506267d7..0c986ff870 100644 --- a/packages/preview/classic-ppgsi/0.1.0/README.md +++ b/packages/preview/classic-ppgsi/0.1.0/README.md @@ -56,8 +56,10 @@ The entrypoint imports the package and configures the whole document via `thesis - Long direct quotations (`quote`) with the 4 cm ABNT indent. - Author–date citations and references via a built-in engine (`cite`, `prose`, `references`) — see `biblio.typ`. -- Appendices and annexes with independent letters (`appendix`, `annex`); their - internal sections (`section`, `subsection`) are numbered automatically. +- Appendices and annexes with independent letters: drop the `appendix` / `annex` + marker, then write the chapter and its sections with native Typst headings + (`=`/`==`/`===`); inner sections are numbered automatically and kept out of the + table of contents. - Bilingual abstract as a single object (`abstract: (pt-br: ..., en-us: ...)`), reused (with `title`/`author`/`keywords`) in the PDF metadata. - The work's own ABNT reference at the top of each abstract is generated diff --git a/packages/preview/classic-ppgsi/0.1.0/lib.typ b/packages/preview/classic-ppgsi/0.1.0/lib.typ index afeacfc2e7..e99a3cd2a6 100644 --- a/packages/preview/classic-ppgsi/0.1.0/lib.typ +++ b/packages/preview/classic-ppgsi/0.1.0/lib.typ @@ -17,6 +17,11 @@ #let cm-dash = "\u{2002}\u{2013}\u{2002}" // " – " (espaco-en + travessao + espaco-en) +// Modo da pos-textual: none | "appendix" | "annex". Os marcadores #appendix / +// #anexo trocam o modo e zeram o contador de headings; os show-rules a seguir +// renderizam os headings nativos (=, ==, ===) como "Apendice A – ...", "1", "1.1". +#let _backmatter = state("ppgsi-backmatter", none) +#let _back-rotulo = modo => if modo == "appendix" { "Apêndice" } else { "Anexo" } #let _heading-numbering = (..nums) => { let n = nums.pos() @@ -31,7 +36,11 @@ )) if chaps.len() == 0 { return none } let h = chaps.last() - if h.numbering != none { + let modo = _backmatter.at(h.location()) + if modo != none { + let letra = numbering("A", counter(heading).at(h.location()).first()) + [#_back-rotulo(modo) #letra#cm-dash#h.body] + } else if h.numbering != none { let num = numbering("1", ..counter(heading).at(h.location())) [Capítulo #num. #h.body] } else { @@ -205,44 +214,23 @@ ) // --------------------------------------------------------------------------- -// APENDICES E ANEXOS (letras A, B, C independentes; capitulo centralizado) +// APENDICES E ANEXOS (marcadores; usam os headings nativos do Typst) // --------------------------------------------------------------------------- -#let _apx = counter("ppgsi-apendice") -#let _anx = counter("ppgsi-anexo") -#let _apx-sec = counter("ppgsi-apx-section") -#let _apx-subsec = counter("ppgsi-apx-subsection") - -// Congela a letra no local do heading (evita vazar valor final no sumario); -// zera a numeração interna de seções a cada novo apêndice/anexo. -#let _back-chapter(contador, rotulo, titulo) = { - contador.step() - _apx-sec.update(0) - _apx-subsec.update(0) - context { - let letra = numbering("A", ..contador.get()) - heading(level: 1, numbering: none, [#rotulo #letra#cm-dash#titulo]) - } +// Marcadores: trocam o modo da pos-textual e reiniciam o contador de headings +// (letra A,B,C por novo capitulo; "1"/"1.1" por seção interna). Apos o marcador, +// escreve-se = / == / === normalmente; os show-rules cuidam da formatação ABNT. +#let appendix = { + _backmatter.update("appendix") + counter(heading).update((0,)) +} +#let annex = { + _backmatter.update("annex") + counter(heading).update((0,)) } - -#let appendix(title) = _back-chapter(_apx, [Apêndice], title) -#let annex(title) = _back-chapter(_anx, [Anexo], title) // cite / prose / references: ver biblio.typ (motor próprio ABNT). -// Seções internas de apêndice/anexo: numeradas automaticamente (1, 1.1), fora do sumário. -#let section(body) = { - _apx-sec.step() - _apx-subsec.update(0) - context heading(level: 2, numbering: none, outlined: false, - [#numbering("1", _apx-sec.get().first()) #body]) -} -#let subsection(body) = { - _apx-subsec.step() - context heading(level: 3, numbering: none, outlined: false, - [#numbering("1.1", _apx-sec.get().first(), _apx-subsec.get().first()) #body]) -} - // --------------------------------------------------------------------------- // PRE-TEXTUAIS // --------------------------------------------------------------------------- @@ -467,23 +455,42 @@ }) } - show heading.where(level: 1): it => { + show heading.where(level: 1): it => context { pagebreak(weak: true) set text(size: 12pt, weight: "bold") set par(first-line-indent: 0pt, justify: false, leading: 0.93em) + let modo = _backmatter.at(it.location()) block(above: 0pt, below: 22pt, width: 100%, { - if it.numbering == none { align(center, it.body) } else { it } + if modo != none { + let letra = numbering("A", counter(heading).at(it.location()).first()) + align(center, [#_back-rotulo(modo) #letra#cm-dash#it.body]) + } else if it.numbering == none { + align(center, it.body) + } else { it } }) } - show heading.where(level: 2): it => { + show heading.where(level: 2): it => context { set text(size: 12pt, weight: "regular", style: "italic") set par(first-line-indent: 0pt, justify: false, leading: 0.93em) - block(above: 32pt, below: 22pt, it) + let modo = _backmatter.at(it.location()) + if modo != none { + let n = numbering("1", counter(heading).at(it.location()).at(1)) + block(above: 32pt, below: 22pt, [#n #it.body]) + } else { + block(above: 32pt, below: 22pt, it) + } } - show heading.where(level: 3): it => { + show heading.where(level: 3): it => context { set text(size: 12pt, weight: "regular", style: "normal") set par(first-line-indent: 0pt, justify: false, leading: 0.93em) - block(above: 32pt, below: 22pt, it) + let modo = _backmatter.at(it.location()) + if modo != none { + let nums = counter(heading).at(it.location()) + let n = numbering("1.1", nums.at(1), nums.at(2)) + block(above: 32pt, below: 22pt, [#n #it.body]) + } else { + block(above: 32pt, below: 22pt, it) + } } // ---- Pacotes integrados (show-rules de documento) ----------------------- @@ -637,13 +644,25 @@ pre-titulo[Sumário] { // sumário: linha inteira em azul (prefixo + título + pontilhado + página) - show outline.entry.where(level: 1): it => block(above: 1em, below: 0pt, text(fill: _blue, weight: "bold", { - let e = it.indented(it.prefix(), it.inner()) - // "REFERÊNCIAS" em maiusculas no sumario (quirk do abntex bibsection) - if it.element.body == [Referências] { upper(e) } else { e } + show outline.entry.where(level: 1): it => context block(above: 1em, below: 0pt, text(fill: _blue, weight: "bold", { + let modo = _backmatter.at(it.element.location()) + if modo != none { + // apêndice/anexo: prefixo "Apêndice A – " no lugar do número + let letra = numbering("A", counter(heading).at(it.element.location()).first()) + it.indented([#_back-rotulo(modo) #letra#cm-dash], it.inner()) + } else { + let e = it.indented(it.prefix(), it.inner()) + // "REFERÊNCIAS" em maiusculas no sumario (quirk do abntex bibsection) + if it.element.body == [Referências] { upper(e) } else { e } + } })) - show outline.entry.where(level: 2): it => text(fill: _blue, style: "italic", it.indented(it.prefix(), it.inner())) - show outline.entry.where(level: 3): it => text(fill: _blue, it.indented(it.prefix(), it.inner())) + // seções internas de apêndice/anexo não entram no sumário + show outline.entry.where(level: 2): it => context if _backmatter.at(it.element.location()) != none { none } else { + text(fill: _blue, style: "italic", it.indented(it.prefix(), it.inner())) + } + show outline.entry.where(level: 3): it => context if _backmatter.at(it.element.location()) != none { none } else { + text(fill: _blue, it.indented(it.prefix(), it.inner())) + } outline(title: none, depth: 3, indent: 1.2em) } diff --git a/packages/preview/classic-ppgsi/0.1.0/template/main.typ b/packages/preview/classic-ppgsi/0.1.0/template/main.typ index 0c5f1ef4f5..db7823dd5c 100644 --- a/packages/preview/classic-ppgsi/0.1.0/template/main.typ +++ b/packages/preview/classic-ppgsi/0.1.0/template/main.typ @@ -379,35 +379,39 @@ Listas de tarefas podem ser escritas com a sintaxe de caixas de seleção do che #ppgsi.references() -#ppgsi.appendix[Exemplo de apêndice] +#ppgsi.appendix + += Exemplo de apêndice #lorem(30) -#ppgsi.section[Exemplo de seção de apêndice não apresentada no sumário] +== Exemplo de seção de apêndice não apresentada no sumário #lorem(30) -#ppgsi.subsection[Exemplo de subseção de apêndice não apresentada no sumário] +=== Exemplo de subseção de apêndice não apresentada no sumário #lorem(30) -#ppgsi.appendix[Exemplo de apêndice] += Exemplo de apêndice #lorem(30) -#ppgsi.appendix[Exemplo de apêndice] += Exemplo de apêndice #lorem(30) -#ppgsi.annex[Resumo das normas] +#ppgsi.annex + += Resumo das normas Considerando a dificuldade para formatar um texto acadêmico sem conhecimento básico do conteúdo da norma NBR 14724 "Informação e documentação -- Trabalhos acadêmicos -- Apresentação", este anexo apresenta um resumo de alguns conceitos dessa norma, conforme publicada em julho de 2011. Sugere-se a leitura completa da norma para garantir que seu documento seja completamente aderente à mesma. Em alguns casos específicos, este anexo apresenta alguns ajustes da norma especificamente para o PPgSI. -#ppgsi.section[NBR 14724: estrutura e algumas descrições] +== NBR 14724: estrutura e algumas descrições A estrutura de uma tese, dissertação ou qualquer outro trabalho acadêmico, deve compreender elementos pré-textuais, elementos textuais e elementos pós-textuais, que aparecem no texto na seguinte ordem: -#ppgsi.subsection[Elementos pré-textuais] +=== Elementos pré-textuais - Capa (obrigatório) - Folha de rosto (obrigatório) @@ -424,24 +428,24 @@ A estrutura de uma tese, dissertação ou qualquer outro trabalho acadêmico, de - Lista de símbolos (opcional) - Sumário (obrigatório) -#ppgsi.subsection[Elementos textuais] +=== Elementos textuais - Introdução - Desenvolvimento - Conclusão -#ppgsi.subsection[Elementos pós-textuais] +=== Elementos pós-textuais - Referências (obrigatório) - Apêndice (opcional) - Anexo (opcional) - Glossário (opcional) -#ppgsi.section[Definições relacionadas a elementos pré-textuais] +== Definições relacionadas a elementos pré-textuais A seguir, são apresentadas algumas definições contidas na norma relacionadas a elementos pré-textuais. -#ppgsi.subsection[Capa] +=== Capa Elemento obrigatório, para proteção externa e sobre o qual se imprimem informações que ajudam na identificação e uso do trabalho, na seguinte ordem: @@ -452,7 +456,7 @@ Elemento obrigatório, para proteção externa e sobre o qual se imprimem inform + Local (cidade) da instituição de apresentação. + Ano do depósito (entrega). -#ppgsi.subsection[Folha de rosto (anverso)] +=== Folha de rosto (anverso) Os elementos do anverso da folha de rosto devem figurar na seguinte ordem: @@ -465,99 +469,99 @@ Os elementos do anverso da folha de rosto devem figurar na seguinte ordem: + Local (cidade) da instituição de apresentação. + Ano de depósito (entrega). -#ppgsi.subsection[Folha de rosto (verso)] +=== Folha de rosto (verso) No verso da folha de rosto deve constar a ficha catalográfica, conforme o Código de Catalogação Anglo-Americano -- CCAA2. -#ppgsi.subsection[Folha de aprovação] +=== Folha de aprovação Elemento obrigatório, que contém autor, título por extenso e subtítulo, se houver, local e data de aprovação, nome e instituição dos membros componentes da banca examinadora. -#ppgsi.subsection[Dedicatória e agradecimentos] +=== Dedicatória e agradecimentos Elementos opcionais. Os agradecimentos devem ser dirigidos apenas àqueles que contribuíram de maneira relevante à elaboração do trabalho. -#ppgsi.subsection[Resumo na língua vernácula] +=== Resumo na língua vernácula Elemento obrigatório, que consiste na apresentação concisa dos pontos relevantes de um texto; constitui-se em uma sequência de frases concisas e objetivas, e não de uma simples enumeração de tópicos, não ultrapassando 500 palavras, seguido, logo abaixo, das palavras representativas do conteúdo do trabalho, isto é, palavras-chave e/ou descritores. -#ppgsi.subsection[Resumo em língua estrangeira] +=== Resumo em língua estrangeira Elemento obrigatório, que consiste em uma versão do resumo em idioma de divulgação internacional (em inglês Abstract, em castelhano Resumen, em francês Résumé, por exemplo). Deve ser seguido das palavras representativas do conteúdo do trabalho, isto é, palavras-chave e/ou descritores, na respectiva língua estrangeira. -#ppgsi.subsection[Lista de figuras e lista de tabelas] +=== Lista de figuras e lista de tabelas Elementos opcionais, elaborados de acordo com a ordem apresentada no texto, com cada item acompanhado do respectivo número da página. -#ppgsi.subsection[Lista de abreviaturas e siglas] +=== Lista de abreviaturas e siglas Elemento opcional. Consiste na relação alfabética das abreviaturas e siglas usadas no texto, seguidas das palavras ou expressões correspondentes grafadas por extenso. -#ppgsi.subsection[Lista de símbolos] +=== Lista de símbolos Elemento opcional, elaborado de acordo com a ordem apresentada no texto, com o devido significado. -#ppgsi.subsection[Sumário] +=== Sumário Elemento obrigatório, que consiste na enumeração das principais divisões (seções e outras partes do trabalho) dos elementos textuais e pós-textuais, na mesma ordem e grafia em que a matéria nele sucede, acompanhado do respectivo número da página. -#ppgsi.section[Definições relacionadas a elementos textuais] +== Definições relacionadas a elementos textuais O autor deve criar quantas seções primárias (também chamadas informalmente de capítulos) desejar para tratar dos seguintes elementos textuais que são obrigatórios: introdução, desenvolvimento e conclusão. Normalmente, existe apenas uma seção primária para a introdução, uma ou mais seções primárias para o desenvolvimento, e apenas uma seção primária para a conclusão. -#ppgsi.section[Definições relacionadas a elementos pós-textuais] +== Definições relacionadas a elementos pós-textuais A seguir, são apresentadas algumas definições contidas na norma relacionadas a elementos pós-textuais. -#ppgsi.subsection[Apêndice] +=== Apêndice Elemento opcional, que consiste em um texto ou documento elaborado pelo próprio autor, a fim de complementar sua argumentação, sem prejuízo da unidade nuclear do trabalho. Um apêndice deve ser identificado por uma letra maiúscula, seguida por um hífen (entre caracteres de espaço), seguido pelo respectivo título. Os apêndices devem ser identificados por letras consecutivas, a partir da letra "A" (independentemente dos anexos). -#ppgsi.subsection[Anexo] +=== Anexo Elemento opcional, que consiste em um texto ou documento não elaborado pelo autor, a fim de fundamentar, comprovar ou ilustrar a argumentação do autor. Um anexo deve ser identificado por uma letra maiúscula, seguida por um hífen (entre caracteres de espaço), seguido pelo respectivo título. Os anexos devem ser identificados por letras consecutivas, a partir da letra "A" (independentemente dos apêndices). -#ppgsi.subsection[Glossário] +=== Glossário Elemento opcional, que consiste em uma lista em ordem alfabética de palavras ou de expressões técnicas de uso restrito ou de sentido obscuro, usadas no texto, acompanhadas das respectivas definições. -#ppgsi.section[Formas de apresentação] +== Formas de apresentação A seguir, são apresentadas algumas definições contidas na norma relacionadas a formas de apresentação em geral. -#ppgsi.subsection[Formato] +=== Formato O texto deve estar impresso em papel branco, formato A4 (21,0 cm 29,7 cm), apenas no anverso da folha (ou seja, na "frente" da folha), excetuando-se a folha de rosto que deve estar impressa tanto no anverso quanto no verso (com a ficha catalográfica). -#ppgsi.subsection[Projeto gráfico] +=== Projeto gráfico O projeto gráfico é de responsabilidade do autor. -#ppgsi.subsection[Fonte] +=== Fonte Usar sempre cor preta. Usar sempre tamanho de fonte 12, com as seguintes exceções: tamanho de fonte 10 para citações longas (com mais de três linhas), notas de rodapé, legendas de ilustração e de tabela, fontes de ilustração e de tabela, números de página; e tamanho de fonte maiores para títulos de seção. -#ppgsi.subsection[Margens] +=== Margens Todas as folhas devem apresentar margens esquerda e superior de 3 cm; e margens direita e inferior de 2 cm, considerando impressão apenas no anverso (ou seja, apenas na "frente"). Se a impressão precisar, por algum motivo especial, ser realizada em anverso e verso, neste caso, há que se configurar as margens de forma diferente, conforme detalhes da norma ABNT; por isso solicita-se não realizar impressão em frente e verso. -#ppgsi.subsection[Espaçamento entre linhas] +=== Espaçamento entre linhas Usar sempre espaçamento entre linhas de 1,5 linhas, com as seguintes exceções: espaçamento entre linhas "simples" para citações longas (com mais de três linhas), notas de rodapé, referências, resumos (em vernáculo e em língua estrangeira), legendas de ilustração e de tabela, fontes de ilustração e de tabela, ficha catalográfica, natureza do trabalho, grau pretendido, nome da instituição a que é submetido, e área de concentração; e espaçamento entre linhas "duplo" para equações e fórmulas e para separação das referências entre si. Os títulos das seções devem começar na margem superior da folha separados do texto que os sucede por um espaço em branco de 1,5 e, da mesma forma, os títulos das subseções devem ser separados do texto que os precede, ou que os sucede, por um espaço em branco de 1,5. -#ppgsi.subsection[Numeração das seções] +=== Numeração das seções O indicativo numérico de uma seção precede seu título, alinhado à esquerda, separado por um espaço de caractere. Nos títulos sem indicativo numérico, como lista de ilustrações, sumário, resumo, referências e outros, devem ser centralizados. Para evidenciar a sistematização do conteúdo do trabalho, deve-se adotar a numeração progressiva para as seções do texto. Os títulos das seções primárias (chamadas informalmente de capítulos), por serem as principais divisões do texto, devem iniciar em folha distinta. Títulos das seções e subseções devem ser destacados gradativamente, usando-se os recursos de negrito, itálico ou grifo e redondo, caixa alta ou versal. -#ppgsi.subsection[Paginação] +=== Paginação Todas as folhas do trabalho, a partir da folha de rosto (desconsiderando a capa, mas considerando a ficha catalográfica), devem ser contadas sequencialmente, mas não numeradas. A numeração é colocada, a partir da primeira folha da dos elementos textuais (ou seja, a partir da "Introdução"), em algarismos arábicos, no canto superior direito da folha, a 2 cm da borda superior, ficando o último algarismo a 2 cm da borda direita da folha. @@ -565,7 +569,7 @@ Havendo apêndices e/ou anexos, suas folhas devem ser numeradas de maneira cont No caso de o trabalho ser constituído de mais de um volume, deve-se manter uma única sequência de numeração das folhas, do primeiro ao último volume. -#ppgsi.subsection[Equações e fórmulas] +=== Equações e fórmulas Equações e fórmulas devem aparecer destacadas no texto, para facilitar sua leitura. @@ -573,7 +577,7 @@ Se as equações e fórmulas forem apresentadas na sequência normal do texto (o Se as equações e fórmulas forem apresentadas fora do parágrafo, então elas devem ser centralizadas e, se necessário, devem ser numeradas. Quando fragmentadas em mais de uma linha, por falta de espaço, devem ser interrompidas antes do sinal de igualdade ou depois dos sinais de adição, subtração, multiplicação e divisão. -#ppgsi.subsection[Ilustrações] +=== Ilustrações Cada tipo de ilustração (tais como figura, gráfico, algoritmo, fotografia, quadro, esquema, desenhos, esquemas, fluxogramas, mapa, organograma, planta, retrato, entre outros) tem numeração independente e consecutiva. @@ -583,7 +587,7 @@ Qualquer que seja o tipo da ilustração, ela deve obrigatoriamente ter uma iden Para toda ilustração, deve ser apresentada também obrigatoriamente sua fonte (mesmo quando a fonte é o próprio autor do trabalho). A fonte deve apresentada na parte inferior da ilustração e ser informada no seguinte formato: palavra "Fonte", seguida pelo caractere dois pontos ":", seguido por um caractere de espaço, seguido pela citação de onde a ilustração foi obtida (conforme regras de citação da norma ABNT) ou seguido pelo nome completo do autor do trabalho, por uma vírgula e pelo ano de elaboração do trabalho, em fonte com tamanho 10, sem negrito, sem itálico, sem ponto final, e em espaçamento simples. -#ppgsi.subsection[Tabelas] +=== Tabelas As tabelas têm numeração independente e consecutiva das ilustrações. @@ -593,9 +597,9 @@ Usar traços horizontais apenas para delimitar o cabeçalho da tabela e o iníci Não confundir "tabela" com "quadro". Uma tabela deve ter dados numéricos como informação central. Outros tipos de organização de informações devem ser apresentados em quadros, que é um dos tipos de ilustração. A formatação de um quadro é muito parecida a de uma tabela, porém todos os traços horizontais e verticais devem ser apresentados. -#ppgsi.section[Outras normas] +== Outras normas -#ppgsi.subsection[Seções] +=== Seções As seções primárias são as principais divisões do texto, denominadas informalmente de "capítulos". As seções primárias podem ser divididas em seções secundárias; e as secundárias em terciárias, em formatação distinta. Não divida o texto mais do que a terceira ordem; ou seja, evite criar seções de profundidade quatro ou cinco. @@ -609,16 +613,16 @@ Todos títulos, de todas as seções, de todos os níveis, devem ter sempre tama São empregados algarismos arábicos na numeração. O "indicativo" de uma seção precede o título ou a primeira palavra do texto, se não houver título, separado por um espaço. -#ppgsi.subsection[Referências bibliográficas e citações às referências bibliográficas] +=== Referências bibliográficas e citações às referências bibliográficas A norma é bastante complexa e extensa em relação às regras de referências bibliográficas e citações às referências bibliográficas, não sendo possível fazer um resumo aqui. Assim, é necessário fazer uma consulta às normas detalhadas. As referências devem ser apresentadas em ordem alfabética, com as citações no texto obedecendo ao sistema autor-data. Todos os documentos relacionados nas Referências devem ser citados no texto, assim como todas as citações do texto devem constar nas Referências. -#ppgsi.annex[Exemplo de anexo] += Exemplo de anexo #lorem(30) -#ppgsi.annex[Exemplo de anexo] += Exemplo de anexo #lorem(30)