diff --git a/.gitignore b/.gitignore index b485147..67debb1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ output/ out/ universe/ +# Font directory, due to licensing +fonts/ + # LaTeX *.aux *.log diff --git a/acm-suite/docs/acmart b/acm-suite/docs/acmart index 43e38c9..8fdf566 160000 --- a/acm-suite/docs/acmart +++ b/acm-suite/docs/acmart @@ -1 +1 @@ -Subproject commit 43e38c9967c2e1e03a4adee091dec2d816457899 +Subproject commit 8fdf566e3ba62c6065a4a2869bb125442fbd16cb diff --git a/acm-suite/formats/manuscript.typ b/acm-suite/formats/manuscript.typ index 47ebd42..89d409a 100644 --- a/acm-suite/formats/manuscript.typ +++ b/acm-suite/formats/manuscript.typ @@ -98,7 +98,7 @@ abstract parbreak() - [CCS Concepts: • #process-ccs(ccs)] + [CCS Concepts: • #process-ccs(ccs).] parbreak() [Additional Key Words and Phrases: #keywords.join(", ")] diff --git a/acm-suite/formats/small.typ b/acm-suite/formats/small.typ index ebefd25..490d4e8 100644 --- a/acm-suite/formats/small.typ +++ b/acm-suite/formats/small.typ @@ -14,7 +14,7 @@ number: none, article: none, month: none, - authors: none, + author-groups: none, affiliations: none, year: none, doi: none, @@ -22,18 +22,96 @@ keywords: none, abstract: none, short-authors: none, - no-acm: false, + nonacm: false, body, ) = { + set text(ligatures: false) + let font-sizes = get-font-size(10pt) + let leading = 2pt set document(title: title, keywords: keywords) - set heading(numbering: "1.1") + set text(font: "Linux Libertine G", size: font-sizes.normal, top-edge: 1em, bottom-edge: 0em, weight: "regular") + set par( + leading: leading, + spacing: leading, + justify: true, + linebreaks: "optimized", + justification-limits: (spacing: (min: 50% + 0pt, max: 150% + 0pt), tracking: (min: 0pt, max: 0pt)), + first-line-indent: ( + amount: 1em, + all: false, + ), + ) + set block(spacing: leading) + + set heading(numbering: (..n) => numbering("1.1", ..n) + h(7pt)) + show heading: set text(size: font-sizes.normal, font: "Linux Biolinum G") + show heading: set block(above: 1em, below: 4pt) + show heading.where(depth: 3): set text(style: "italic") + show heading.where(depth: 3): set text(style: "italic", weight: "regular") + show heading.where(depth: 4): set text(style: "italic", weight: "regular") + show heading.where(depth: 5): set text(style: "normal", weight: "regular") + show heading.where(depth: 3): set heading(outlined: false) + show heading.where(depth: 4): set heading(numbering: none, outlined: false) + show heading.where(depth: 5): set heading(numbering: none, outlined: false) + show heading.where(level: 4): it => box[#it.body.] + // show heading.where(level: 5): set par(first-line-indent: 0in) + show heading.where(level: 5): it => box(inset: (left: -1em))[ + #set par(first-line-indent: 0in) + #it.body + ] + + // show heading.where(level: 4): set text() + + // show heading.where(depth: 3): it => counter(selector(heading).before(here())).display() + h(font-sizes.normal) + box(strong(it.body)) + [.] + // show heading.where(depth: 4): e => e.body + [. ] + // show heading.where(depth: 5): e => e.body + [. ] // FIXME: indentation should be that of the paragraph above + + show std.title: set align(left) - let font-sizes = get-font-size(10pt) - show std.title: set text(font: "Libertinus Sans", size: font-sizes.LARGE) - set text(font: "Libertinus Serif", size: font-sizes.normal) + show std.title: set text( + font: ("Linux Biolinum", "Linux Biolinum G"), + size: font-sizes.Large, + top-edge: font-sizes.normal, + ) + show std.title: set block(below: font-sizes.large) + show footnote.entry: set text(size: font-sizes.footnote) - set par(justify: true) + + set table( + stroke: (x, y) => ( + top: if y == 0 { 1pt } else if y == 1 { 1pt / 2 } else { 0pt }, + bottom: 1pt, + ), + ) + + set table(stroke: (_, y) => if y == 0 { (bottom: .5pt) }, row-gutter: (-5pt, -8pt)) + show table: block.with(stroke: (y: 1pt), inset: (top: -3pt)) + + set figure(gap: 1.5em, supplement: "Fig.", placement: top) + show figure.caption: set text(font: ("Linux Biolinum", "Linux Biolinum G")) + show figure: set block(spacing: 2em) // for non floating figures + show figure: set place(clearance: 2em) // for floating figures + show figure: set figure.caption(separator: ". ") + show figure.where(kind: table): set figure.caption(position: top) + show figure.where(kind: table): set figure(placement: top, supplement: "Table") + + // https://tex.stackexchange.com/a/540068 + show raw: set text(font: "Inconsolata", size: font-sizes.normal) + show raw.where(block: true): box.with(inset: (y: 0.25em)) + set enum(indent: 1em, body-indent: .35em) + set list(indent: 2em, body-indent: .35em) + set footnote.entry(indent: 0em) + // credits: shampoohere, https://sitandr.github.io/typst-examples-book/book/snippets/math/numbering.html#simple-code + show math.equation.where(block: true): it => { + set text(font: ("Linux Libertine", "Linux Libertine G")) + if it.fields().keys().contains("label") { + block(math.equation(block: true, numbering: "(1)", it), inset: .4em) + } else { + block(it, inset: .4em) + } + } + let copyright-notice = processed( copyright: copyright, @@ -46,11 +124,25 @@ doi: doi, ) + set page( + height: 10in, + width: 6.75in, + header-ascent: 27pt - font-sizes.normal, + footer-descent: 20pt - font-sizes.normal, // TODO: finetune + margin: ( + top: 58pt + 27pt, + bottom: 44pt + 20pt, + inside: 46pt, + outside: 46pt, + ), header: context { + set text(size: font-sizes.footnote, font: "Linux Biolinum G", weight: "regular") + set block(spacing: .2em) + // the page with the title shouldn't have a header (usually the first one) let current-page = here().position().page - let the-page = if no-acm [#current-page] else [#article:#current-page] + let the-page = if nonacm [#current-page] else [#article:#current-page] set grid(inset: 0in, columns: (1fr, auto)) show grid: set block(spacing: 0in, inset: 0in, outset: 0in) @@ -68,7 +160,7 @@ ) } }, - footer: if not no-acm { + footer: if not nonacm { context { let current-page = here().position().page let the-date = datetime(year: year, month: month, day: 1) @@ -87,11 +179,12 @@ } else { none }, ) - set footnote.entry(indent: 0in) + set footnote.entry(indent: 0in, separator: line(length: 13% + 0pt, stroke: 0.5pt)) std.title() - let author-result = print-acm-authors(authors, affiliations, "en") + // FIXME: author with same address should be one a different line: only join authors with same mark? + let author-result = print-acm-authors(author-groups, affiliations, "en") author-result.authors if author-result.notes.len() > 0 { @@ -101,41 +194,59 @@ } ] } - - thanks(line(length: 100%, stroke: 0.5pt)) - thanks[Authors' Contact Information: #print-contact-info(authors, affiliations)] - if not no-acm { + { + thanks({ + line(length: 100%, stroke: 0.5pt) + // FIXME: if multiple authors have same address and author note, then group them together + par( + [Authors' Contact Information: #print-contact-info(author-groups, affiliations)], + leading: .1em, + first-line-indent: ( + amount: 0pt, + ), + ) + }) + } + if not nonacm { thanks(line(length: 100%, stroke: 0.5pt)) thanks(copyright-notice) } context { set text(size: font-sizes.small) - parbreak() + set par(spacing: 1em, first-line-indent: 0em) + + // FIXME: edge case when multiple paragraphs inside abstract abstract + parbreak() - [CCS Concepts: • #process-ccs(ccs)] + [CCS Concepts: #process-ccs(ccs).] parbreak() [Additional Key Words and Phrases: #keywords.join(", ")] - parbreak() - // TODO: ACM Reference format - strong[ACM Reference Format:] - parbreak() - let the-pages = 11 - format-acm-reference( - authors, - year, - title, - journal, - volume, - number, - article, - month, - the-pages, // You'll need to add this parameter - doi, - text.lang, - ) + if not nonacm { + parbreak() + // TODO: ACM Reference format + strong[ACM Reference Format:] + parbreak() + let the-pages = counter(page).final() + format-acm-reference( + author-groups, + year, + title, + journal, + volume, + number, + article, + month, + the-pages, + doi, + text.lang, + ) + } } + show bibliography: set text(size: font-sizes.footnote) + set bibliography(style: "association-for-computing-machinery", title: "References") + body } diff --git a/acm-suite/formats/utils/authoring.typ b/acm-suite/formats/utils/authoring.typ index 1b17e69..52bc64d 100644 --- a/acm-suite/formats/utils/authoring.typ +++ b/acm-suite/formats/utils/authoring.typ @@ -127,24 +127,32 @@ } // Print authors in ACM format -#let print-acm-authors(authors, affiliations, language) = { - if authors == none or authors.len() == 0 { +#let print-acm-authors(author-groups-raw, affiliations, language) = { + let author-groups = author-groups-raw.map(e => if "members" in e { + e + } else { + ( + affiliations: e.affiliations, + members: (e,), + ) + }) + if author-groups == none or author-groups.len() == 0 { return none } // FIXME: Make this contextual on the base font size let font-sizes = get-font-size(10pt) - let groups = group-authors-by-affiliation(authors, affiliations) - let note-info = collect-author-notes(authors) + let note-info = collect-author-notes(author-groups.map(e => e.members).flatten()) let output = () // Process each affiliation group - for (aff-id, group-authors) in groups { + for group-authors in author-groups { let author-names = () + let aff-id = group-authors.affiliations - for author in group-authors { - let name = upper(author.name) + for author in group-authors.members { + let name = text(upper(author.name), font: "Linux Biolinum G") let orcid = if "orcid" in author { author.orcid } else { none } let formatted-name = format-author-name(name, orcid) let note-mark = get-note-mark(author, note-info) @@ -170,7 +178,8 @@ if aff-id != "no-affiliation" and aff-id in affiliations { let aff-text = format-affiliation-short(affiliations.at(aff-id)) - output.push([#text(size: font-sizes.large)[#authors-text, ]#text(aff-text, size: font-sizes.small)]) + // FIXME: somehow size is 11 and not "normal" + output.push([#text(size: 11pt)[#authors-text, ]#text(aff-text, size: font-sizes.small)]) } else { output.push(text(authors-text, size: font-sizes.large)) } @@ -190,23 +199,27 @@ let contacts = () - for author in authors { + for author-group in authors { let parts = () - // Name - parts.push(author.name) + let members = author-group.at("members", default: (author-group,)) - // Email (if exists) - if "email" in author and author.email != none { - parts.push(author.email) + let author-parts = () + for author in members { + // Name + let name = author.name + let email = author.at("email", default: none) + + author-parts.push((name, email).filter(e => e != none).join(", ")) } + parts.push(author-parts.join("; ")) // Full affiliation (if exists) - if "affiliations" in author and author.affiliations != none { - let primary-aff = if type(author.affiliations) == array and author.affiliations.len() > 0 { - author.affiliations.at(0) - } else if type(author.affiliations) == str { - author.affiliations + if "affiliations" in author-group and author-group.affiliations != none { + let primary-aff = if type(author-group.affiliations) == array and author-group.affiliations.len() > 0 { + author-group.affiliations.at(0) + } else if type(author-group.affiliations) == str { + author-group.affiliations } else { none } @@ -224,7 +237,8 @@ } // Print authors in simple list format (for ACM Reference Format) -#let print-authors-list(authors, language) = { +#let print-authors-list(author-groups, language) = { + let authors = author-groups.map(e => if "members" in e { e.members } else { (e,) }).flatten() if authors == none or authors.len() == 0 { return none } diff --git a/acm-suite/formats/utils/ccs.typ b/acm-suite/formats/utils/ccs.typ index 4fe69ae..d7ff10e 100644 --- a/acm-suite/formats/utils/ccs.typ +++ b/acm-suite/formats/utils/ccs.typ @@ -1,77 +1,42 @@ /// Process ACM CCS XML, the content must be a parsed XML structure -#let process-ccs(ccs) = { - // FIXME: The CCS main concept seems to be missing sometimes or at least omitted if it's repeated. - let concepts = () - - for root in ccs { - if type(root) == dictionary and root.at("tag", default: none) == "ccs2012" { - // Process children of ccs2012 - for child in root.children { - if type(child) == dictionary and child.at("tag", default: none) == "concept" { - // Extract concept_desc from this concept - let concept-desc = none - let significance = none - - for elem in child.children { - if type(elem) == dictionary { - if elem.at("tag", default: none) == "concept_desc" { - // Get the text content (first child) - if elem.children.len() > 0 { - concept-desc = elem.children.at(0) - } - } else if elem.at("tag", default: none) == "concept_significance" { - // Get the significance value - if elem.children.len() > 0 { - significance = int(elem.children.at(0)) - } - } - } - } - - if concept-desc != none and significance != none { - concepts.push((desc: concept-desc, sig: significance)) - } - } - } - } - } - - // Format output - if concepts.len() == 0 { - return [] - } - - // Sort concepts by significance: 500 first, then 300, then rest - let sig500 = concepts.filter(c => c.sig == 500) - let sig300 = concepts.filter(c => c.sig == 300) - let sigRest = concepts.filter(c => c.sig != 500 and c.sig != 300) - - // Helper function to replace ~ with arrow - let replace-tilde(to-replace) = { - // PLACEHOLDER: Replace "~" with arrow.r symbol here - // Example: text.replace("~", arrow.r) - to-replace.split("~").join(sym.arrow.r) - } - - // Build formatted parts - let parts = () - - // Add 500 significance concepts (regular text) - for c in sig500 { - parts.push(strong(replace-tilde(c.desc))) - } - - // Add 300 significance concepts (emphasized) - for c in sig300 { - parts.push(emph(replace-tilde(c.desc))) - } - - // Add rest (regular text) - for c in sigRest { - parts.push(replace-tilde(c.desc)) +#let process-ccs(ccs-concepts) = { + let find-child(elem, tag) = { + elem.children.filter(e => type(e) != str).find(e => "tag" in e and e.tag == tag) } - // Join with semicolons and add period at the end - parts.join([; ]) + [.] + let ccs = ( + ccs-concepts + .first() + .children + .filter(e => type(e) != str) + .map(concept => { + let concept_desc = find-child(concept, "concept_desc").children.first() + ( + concept_id: find-child(concept, "concept_id").children.first(), + concept_significance: int(find-child(concept, "concept_significance").children.first()), + topic: concept_desc.split("~").first(), + sub_topic: concept_desc.split("~").last(), + ) + }) + ) + + ccs + .fold(().to-dict(), (acc, e) => { + let arr = acc.at(e.topic, default: ()) + arr.push(e) + acc.insert(e.topic, arr) + acc + }) + .pairs() + .map(p => { + let topic = p.first() + let subs = p.last() + [*• #topic* → #subs.map(e => { + if e.concept_significance == 500 { text(e.sub_topic, weight: "bold") } else if e.concept_significance == 300 { + text(e.sub_topic, style: "italic") + } else { [#e.sub_topic] } + }).join("; ")] + }) + .join("; ") } diff --git a/acm-suite/formats/utils/utils.typ b/acm-suite/formats/utils/utils.typ new file mode 100644 index 0000000..7cd5355 --- /dev/null +++ b/acm-suite/formats/utils/utils.typ @@ -0,0 +1,6 @@ +#let description(dict: (:)) = par({ + for (k, v) in dict.pairs() { + h(2em) + [#text(raw(k), weight: "bold"): #v] + linebreak() + } +}, first-line-indent: (amount: 0pt, all: false)) diff --git a/acm-suite/template/assets/ccs.xml b/acm-suite/template/assets/ccs.xml index 97c0a28..8a3f07c 100644 --- a/acm-suite/template/assets/ccs.xml +++ b/acm-suite/template/assets/ccs.xml @@ -1,22 +1,22 @@ 00000000.0000000.0000000 - Do Not Use This Code, Generate the Correct Terms for Your Paper + Do Not Use This Code~Generate the Correct Terms for Your Paper 500 00000000.00000000.00000000 - Do Not Use This Code, Generate the Correct Terms for Your Paper + Do Not Use This Code~Generate the Correct Terms for Your Paper 300 00000000.00000000.00000000 - Do Not Use This Code, Generate the Correct Terms for Your Paper + Do Not Use This Code~Generate the Correct Terms for Your Paper 100 00000000.00000000.00000000 - Do Not Use This Code, Generate the Correct Terms for Your Paper + Do Not Use This Code~Generate the Correct Terms for Your Paper 100 diff --git a/acm-suite/template/assets/data/sample-base.bib b/acm-suite/template/assets/data/sample-base.bib index c8bfdac..b0b4e62 100644 --- a/acm-suite/template/assets/data/sample-base.bib +++ b/acm-suite/template/assets/data/sample-base.bib @@ -707,6 +707,7 @@ @Article{1984:1040142 % grinder @inproceedings{2004:ITE:1009386.1010128, key = {IEEE}, + author = {IEEE}, title = {IEEE TCSC Executive Committee}, booktitle = {Proceedings of the IEEE International Conference on Web Services}, series = {ICWS '04}, @@ -1314,6 +1315,7 @@ @article{Zhou:2010:MMS:1721695.1721705 @online{TUGInstmem, key = {TUG}, + author = {TUG}, year = 2017, title = "Institutional members of the {\TeX} Users Group", url = "http://wwtug.org/instmem.html", diff --git a/acm-suite/template/cover-page.typ b/acm-suite/template/cover-page.typ index 99ce8a8..f943cd2 100644 --- a/acm-suite/template/cover-page.typ +++ b/acm-suite/template/cover-page.typ @@ -22,47 +22,47 @@ authors: ( ( name: [Ben Trovato], - affiliations: ("inst1",), + affiliations: "inst1", email: [trovato\@corporation.com], orcid: "1234-5678-9012-0000", note: [Both authors contributed equally to this research.], ), ( name: [G.K.M. Tobin], - affiliations: ("inst1",), + affiliations: "inst1", email: [webmaster\@marysville-ohio.com], note-mark: 1, // References Ben's note ), ( name: [Lars Thørväld], - affiliations: ("inst2",), + affiliations: "inst2", email: [larst\@affiliation.org], ), ( name: [Valerie Béranger], - affiliations: ("inst3",), + affiliations: "inst3", ), ( name: [Aparna Patel], - affiliations: ("inst4",), + affiliations: "inst4", ), ( name: [Huifen Chan], - affiliations: ("inst5",), + affiliations: "inst5", ), ( name: [Charles Palmer], - affiliations: ("inst6",), + affiliations: "inst6", email: [cpalmer\@prl.com], ), ( name: [John Smith], - affiliations: ("inst2",), + affiliations: "inst2", email: [jsmith\@affiliation.org], ), ( name: [Julius P. Kumquat], - affiliations: ("inst7",), + affiliations: "inst7", email: [jpkumquat\@consortium.net], ), ), diff --git a/acm-suite/template/manuscript.typ b/acm-suite/template/manuscript.typ index 11715d0..6ec0fef 100644 --- a/acm-suite/template/manuscript.typ +++ b/acm-suite/template/manuscript.typ @@ -13,47 +13,47 @@ authors: ( ( name: [Ben Trovato], - affiliations: ("inst1",), + affiliations: "inst1", email: [trovato\@corporation.com], orcid: "1234-5678-9012-1111", note: [Both authors contributed equally to this research.], ), ( name: [G.K.M. Tobin], - affiliations: ("inst1",), + affiliations: "inst1", email: [webmaster\@marysville-ohio.com], note-mark: 1, // References Ben's note ), ( name: [Lars Thørväld], - affiliations: ("inst2",), + affiliations: "inst2", email: [larst\@affiliation.org], ), ( name: [Valerie Béranger], - affiliations: ("inst3",), + affiliations: "inst3", ), ( name: [Aparna Patel], - affiliations: ("inst4",), + affiliations: "inst4", ), ( name: [Huifen Chan], - affiliations: ("inst5",), + affiliations: "inst5", ), ( name: [Charles Palmer], - affiliations: ("inst6",), + affiliations: "inst6", email: [cpalmer\@prl.com], ), ( name: [John Smith], - affiliations: ("inst2",), + affiliations: "inst2", email: [jsmith\@affiliation.org], ), ( name: [Julius P. Kumquat], - affiliations: ("inst7",), + affiliations: "inst7", email: [jpkumquat\@consortium.net], ), ), diff --git a/acm-suite/template/small.typ b/acm-suite/template/small.typ index 57691da..e2e839d 100644 --- a/acm-suite/template/small.typ +++ b/acm-suite/template/small.typ @@ -1,5 +1,6 @@ #import "../lib.typ" as acm-suite -#import "@preview/metalogo:1.2.0": LaTeX +#import "@preview/metalogo:1.2.0": LaTeX, TeX +#import "../formats/utils/utils.typ": description #show: acm-suite.small.template.with( title: [The Name of the Title Is Hope], @@ -15,19 +16,23 @@ year: 2018, copyright-year: 2018, number: 4, - authors: ( + // nonacm: true, + author-groups: ( ( - name: [Ben Trovato], affiliations: "inst1", - email: "trovato@corporation.com", - orcid: "0009-0004-4390-7419", - note: [Both authors contributed equally to this research.], - ), - ( - name: [G.K.M. Tobin], - affiliations: "inst1", - email: "webmaster@marysville-ohio.com", - note-mark: 1, + members: ( + ( + name: [Ben Trovato], + email: "trovato@corporation.com", + orcid: "0009-0004-4390-7419", + note: [Both authors contributed equally to this research.], + ), + ( + name: [G.K.M. Tobin], + email: "webmaster@marysville-ohio.com", + note-mark: 1, + ), + ), ), ( name: [Lars Thørväld], @@ -103,7 +108,7 @@ country: [USA], ), ), - abstract: [A clear and well-documented LaTeX document is presented as an article formatted for publication by ACM in a conference proceedings or journal publication. Based on the ``acmart'' document class, this article presents and explains many of the common variations, as well as many of the formatting elements an author may use in the preparation of the documentation of their work.], + abstract: [A clear and well-documented #LaTeX document is presented as an article formatted for publication by ACM in a conference proceedings or journal publication. Based on the "acmart" document class, this article presents and explains many of the common variations, as well as many of the formatting elements an author may use in the preparation of the documentation of their work.], ) = Introduction @@ -120,20 +125,512 @@ This document will explain the major features of the document class. For further == Template Styles +The primary parameter given to the "`acmart`" document class is the _template style_ which corresponds to the kind of publication or SIG publishing the work. This parameter is enclosed in square brackets and is a part of the `documentclass` command: + +``` +\documentclass[STYLE]{acmart} +``` + +Journals use one of three template styles. All but three ACM journals use the `acmsmall` template style: + +- `acmsmall`: The default journal template style. +- `acmlarge`: Used by JOCCH and TAP. +- `acmtog`: Used by TOG. + + +The majority of conference proceedings documentation will use the `acmconf` template style. + +- `sigconf`: The default proceedings template style. +- `sigchi`: Used for SIGCHI conference articles. +- `sigplan`: Used for SIGPLAN conference articles. + +== Template parameters + +In addition to specifying the _template style_ to be used in +formatting your work, there are a number of _template parameters_ +which modify some part of the applied template style. A complete list +of these parameters can be found in the _#LaTeX User's Guide._ + +Frequently-used parameters, or combinations of parameters, include: +- `anonymous,review`: Suitable for a "double-anonymous" conference submission. Anonymizes the work and includes line numbers. Use with the `\acmSubmissionID` command to print the submission's unique ID on each page of the work. +- `authorversion`: Produces a version of the work suitable for posting by the author. +- `screen`: Produces colored hyperlinks. + +This document uses the following string as the first command in the +source file: `\documentclass[acmsmall,screen,review]{acmart}` + + = Modifications + +Modifying the template --- including but not limited to: adjusting +margins, typeface sizes, line spacing, paragraph and list definitions, +and the use of the `\vspace` command to manually adjust the +vertical spacing between elements of your work --- is not allowed. + +*Your document will be returned to you for revision if modifications are discovered.* + = Typefaces + +The "`acmart`" document class requires the use of the +"Libertine" typeface family. Your #TeX installation should include +this set of packages. Please do not substitute other typefaces. The +"`lmodern`" and "`ltimes`" packages should not be used, +as they will override the built-in typeface families. + = Title Information + +The title of your work should use capital letters appropriately - +#link("https://capitalizemytitle.com/") has useful rules for +capitalization. Use the `title` command to define the title of +your work. If your work has a subtitle, define it with the +`subtitle` command. Do not insert line breaks in your title. + +If your title is lengthy, you must define a short version to be used +in the page headers, to prevent overlapping text. The `title` +command has a "short title" parameter: + +`\title[short title]{full title}` + = Authors and Affiliations + +Each author must be defined separately for accurate metadata +identification. As an exception, multiple authors may share one +affiliation. Authors' names should not be abbreviated; use full first +names wherever possible. Include authors' e-mail addresses whenever +possible. + +Grouping authors' names or e-mail addresses, or providing an "e-mail alias," as shown below, is not acceptable: + +``` + \author{Brooke Aster, David Mehldau} + \email{dave,judy,steve@university.edu} + \email{firstname.lastname@phillips.org} +``` + +The `authornote` and `authornotemark` commands allow a note +to apply to multiple authors --- for example, if the first two authors +of an article contributed equally to the work. + +If your author list is lengthy, you must define a shortened version of +the list of authors to be used in the page headers, to prevent +overlapping text. The following command should be placed just after +the last `\author{}` definition: +``` + \renewcommand{\shortauthors}{McCartney, et al.} +``` +Omitting this command will force the use of a concatenated list of all +of the authors' names, which may result in overlapping text in the +page headers. + +The article template's documentation, available at +#link("https://www.acm.org/publications/proceedings-template"), has a +complete explanation of these commands and tips for their effective +use. + +Note that authors' addresses are mandatory for journal articles. + = Rights Information + +Authors of any work published by ACM will need to complete a rights +form. Depending on the kind of work, and the rights management choice +made by the author, this may be copyright transfer, permission, +license, or an OA (open access) agreement. + +Regardless of the rights management choice, the author will receive a +copy of the completed rights form once it has been submitted. This +form contains #LaTeX commands that must be copied into the source +document. When the document source is compiled, these commands and +their parameters add formatted text to several areas of the final +document: +- the "ACM Reference Format" text on the first page. +- the "rights management" text on the first page. +- the conference information in the page header(s). + +Rights information is unique to the work; if you are preparing several +works for an event, make sure to use the correct set of commands with +each of the works. + +The ACM Reference Format text is required for all articles over one +page in length, and is optional for one-page articles (abstracts). + = CCS Concepts and User-Defined Keywords + +Two elements of the "acmart" document class provide powerful +taxonomic tools for you to help readers find your work in an online +search. + +The ACM Computing Classification System --- +#link("https://www.acm.org/publications/class-2012") --- is a set of +classifiers and concepts that describe the computing +discipline. Authors can select entries from this classification +system, via #link("https://dl.acm.org/ccs/ccs.cfm"), and generate the +commands to be included in the #LaTeX source. + +User-defined keywords are a comma-separated list of words and phrases +of the authors' choosing, providing a more flexible way of describing +the research being presented. + +CCS concepts and user-defined keywords are required for for all +articles over two pages in length, and are optional for one- and +two-page articles (or abstracts). + = Sectioning Commands + +Your work should use standard #LaTeX sectioning commands: +`\section`, `\subsection`, `\subsubsection`, +`\paragraph`, and `\subparagraph`. The sectioning levels up to +`\subsusection` should be numbered; do not remove the numbering +from the commands. + +Simulating a sectioning command by setting the first word or words of +a paragraph in boldface or italicized text is *not allowed.* + +Below are examples of sectioning commands. + +== Subsection + +This is a subsection. + +#(heading(depth: 3)[Subsubsection.]) + +Paragraph. This is a paragraph. + +Subparagraph This is a subparagraph. + = Tables + +The "`acmart`" document class includes the "`booktabs`" +package --- #link("https://ctan.org/pkg/booktabs") --- for preparing +high-quality tables. + +Table captions are placed _above_ the table. + +Because tables cannot be split across pages, the best placement for +them is typically the top of the page nearest their initial cite. To +ensure this proper "floating" placement of tables, use the +environment *table* to enclose the table's contents and the +table caption. The contents of the table itself must go in the +*tabular* environment, to be aligned properly in rows and +columns, with the desired horizontal and vertical rules. Again, +detailed instructions on *tabular\** material are found in the +_#LaTeX User's Guide_. + +Immediately following this sentence is the point at which +Table#ref() is included in the input file; compare the +placement of the table here with the table in the printed output of +this document. + +#figure( + table( + columns: (auto, auto, auto), + align: (center, center, left), + table.header[Non-English or Math][Frequency][Comments], + [#sym.nothing], [1 in 1,000], [For Swedish names], + [#sym.pi], [1 in 5], [Common in math], + [#sym.dollar], [4 in 5], [Used in business], + $Psi^2_1$, [1 in 40,000], [Unexplained usage], + ), + caption: "Frequency of Special Characters", +) + + +To set a wider table, which takes up the whole width of the page's +live area, use the environment *table* to enclose the table's +contents and the table caption. As with a single-column table, this +wide table will "float" to a location deemed more +desirable. Immediately following this sentence is the point at which +Table#ref() is included in the input file; again, it is +instructive to compare the placement of the table here with the table +in the printed output of this document. + +#figure( + table( + columns: (auto, auto, auto), + align: (center, center, left), + table.header[Command][A Number][Comments], + `\author`, [100], [Author], + `\table`, [300], [For tables], + `\table*`, [400], [For wider tables], + ), + caption: "Some Typical Commands", +) + + +Always use midrule to separate table header rows from data rows, and +use it only for this purpose. This enables assistive technologies to +recognise table headers and support their users in navigating tables +more easily. + = Math Equations +You may want to display math equations in three distinct styles: +inline, numbered or non-numbered display. Each of the three are +discussed in the next sections. + +== Inline (In-text) Equations +A formula that appears in the running text is called an inline or +in-text formula. It is produced by the *math* environment, +which can be invoked with the usual +`\begin . . . \end` construction or with +the short form `$ . . . $`. You can use any of the symbols +and structures, from $alpha$ to $omega$, available in +#LaTeX#cite(); this section will simply show a few examples of in-text equations in context. Notice how this equation: +$lim_(n arrow infinity) x = 0$ +set here in in-line math style, looks slightly different when +set in display style. (See next section). + +== Display Equations +A numbered display equation---one set off by vertical space from the +text and centered horizontally---is produced by the *equation* +environment. An unnumbered display equation is produced by the +*displaymath* environment. + +Again, in either environment, you can use any of the symbols and +structures available in #LaTeX; this section will just give a couple +of examples of display equations in context. First, consider the +equation, shown as an inline equation above: + +$ + lim_(n arrow infinity) x = 0 +$ + + +Notice how it is formatted somewhat differently in +the *displaymath* +environment. Now, we'll enter an unnumbered equation: + +$ + sum_(i=0)^(infinity) x + 1 +$ + +and follow it with another numbered equation: + +$ + sum_(i=0)^(infinity)x_i= integral_(0)^(pi+2) f +$ + +just to demonstrate #LaTeX's able handling of numbering. + = Figures + +The "`figure`" environment should be used for figures. One or +more images can be placed within a figure. If your figure contains +third-party material, you must clearly identify it as such, as shown +in the example below. +#figure( + image("assets/images/sample-franklin.png", alt: "A woman and a girl in white dresses sit in an open car."), + caption: [1907 Franklin Model D roadster. Photograph by Harris \& + Ewing, Inc. [Public domain], via Wikimedia + Commons. (#link("https://goo.gl/VLCRBB")).], +) + +Your figures should contain a caption which describes the figure to +the reader. + +Figure captions are placed _below_ the figure. + +Every figure should also have a figure description unless it is purely +decorative. These descriptions convey what’s in the image to someone +who cannot see it. They are also used by search engine crawlers for +indexing images, and when images cannot be loaded. + +A figure description must be unformatted plain text less than 2000 +characters long (including spaces). *Figure descriptions +should not repeat the figure caption – their purpose is to capture +important information that is not already provided in the caption or +the main text of the paper.* For figures that convey important and +complex new information, a short text description may not be +adequate. More complex alternative descriptions can be placed in an +appendix and referenced in a short figure description. For example, +provide a data table capturing the information in a bar chart, or a +structured list representing a graph. For additional information +regarding how best to write figure descriptions and why doing this is +so important, please see +#link("https://www.acm.org/publications/taps/describing-figures/"). + +== The "Teaser Figure" + +A "teaser figure" is an image, or set of images in one figure, that +are placed after all author and affiliation information, and before +the body of the article, spanning the page. If you wish to have such a +figure in your article, place the command immediately before the +`\maketitle` command: + +``` + \begin{teaserfigure} + \includegraphics[width=\textwidth]{sampleteaser} + \caption{figure caption} + \Description{figure description} + \end{teaserfigure} +``` + = Citations and Bibliographies + +The use of Bib#TeX for the preparation and formatting of one's +references is strongly recommended. Authors' names should be complete +--- use full first names ("Donald E. Knuth") not initials +("D. E. Knuth") --- and the salient identifying features of a +reference should be included: title, year, volume, number, pages, +article DOI, etc. + +The bibliography is included in your source document with these two +commands, placed just before the `\end{document}` command: +``` + \bibliographystyle{ACM-Reference-Format} + \bibliography{bibfile} +``` +where "`bibfile`" is the name, without the "`.bib`" +suffix, of the Bib#TeX file. + +Citations and references are numbered by default. A small number of +ACM publications have citations and references formatted in the +"author year" style; for these exceptions, please include this +command in the *preamble* (before the command +"`\begin{document}`") of your #LaTeX source: +``` + \citestyle{acmauthoryear} +``` + + +Some examples. A paginated journal article #cite(), an +enumerated journal article #cite(), a reference to an entire +issue #cite(), a monograph (whole book) #cite(), a +monograph/whole book in a series (see 2a in spec. document) +#cite(), a divisible-book such as an anthology or compilation +#cite() followed by the same example, however we only output +the series if the volume number is given #cite() (so +Editor00a's series should NOT be present since it has no vol. no.), +a chapter in a divisible book #cite(), a chapter in a +divisible book in a series #cite(), a multi-volume work as +book #cite(), a couple of articles in a proceedings (of a +conference, symposium, workshop for example) (paginated proceedings +article) @Andler79@Hagerup1993, a proceedings article with +all possible elements #cite(), an example of an enumerated +proceedings article #cite(), an informally published work +#cite(), a couple of preprints @Bornmann2019@AnzarootPBM14, a doctoral dissertation #cite(), a +master's thesis: #cite(), an online document / world wide web +resource @Thornburg01@Ablamowicz07@Poker06, a video game +(Case 1) #cite() and (Case 2) #cite() and #cite() +and (Case 3) a patent #cite(), work accepted for +publication #cite(), 'YYYYb'-test for prolific author +#cite() and #cite(). Other cites might +contain 'duplicate' DOI and URLs (some SIAM articles) +#cite(). Boris / Barbara Beeton: +multi-volume works as books #cite() and #cite(). A +presentation#cite(). An article under +review#cite(). A +couple of citations with DOIs: +@2004:ITE:1009386.1010128@Kirschmer:2010:AEI:1958016.1958018. Online +citations: @TUGInstmem@Thornburg01@CTANacmart. +Artifacts: #cite() and #cite(). + = Acknowledgments + +Identification of funding sources and other support, and thanks to +individuals and groups that assisted in the research and the +preparation of the work should be included in an acknowledgment +section, which is placed just before the reference section in your +document. + +This section has a special environment: +``` + \begin{acks} + ... + \end{acks} +``` +so that the information contained therein can be more easily collected +during the article metadata extraction phase, and to ensure +consistency in the spelling of the section heading. + +Authors should not prepare this section as a numbered or unnumbered `\section`; please use the "`acks`" environment. + = Appendices + +If your work needs an appendix, add it before the +"`\end{document}`" command at the conclusion of your source +document. + +Start the appendix with the "`appendix`" command: +``` + \appendix +``` +and note that in the appendix, sections are lettered, not +numbered. This document has two appendices, demonstrating the section +and subsection identification method. + = Multi-language papers + +Papers may be written in languages other than English or include +titles, subtitles, keywords and abstracts in different languages (as a +rule, a paper in a language other than English should include an +English title and an English abstract). Use `language=...` for +every language used in the paper. The last language indicated is the +main language of the paper. For example, a French paper with +additional titles and abstracts in English and German may start with +the following command + +``` +\documentclass[sigconf, language=english, language=german, + language=french]{acmart} +``` + +The title, subtitle, keywords and abstract will be typeset in the main +language of the paper. The commands `\translatedXXX`, `XXX` +begin title, subtitle and keywords, can be used to set these elements +in the other languages. The environment `translatedabstract` is +used to set the translation of the abstract. These commands and +environment have a mandatory first argument: the language of the +second argument. See `sample-sigconf-i13n.tex` file for examples +of their usage. + = SIGCHI Extended Abstracts + +The "`sigchi-a`" template style (available only in #LaTeX and +not in Word) produces a landscape-orientation formatted article, with +a wide left margin. Three environments are available for use with the +"`sigchi-a`" template style, and produce formatted output in +the margin: +#description( + dict: ( + sidebar: [ Place formatted text in the margin.], + marginfigure: [Place a figure in the margin.], + margintable: [Place a table in the margin.], + ), +) +#heading("Acknowledgments", numbering: none) +To Robert, for the bagels and explaining CMYK and color spaces. + +#bibliography("assets/data/sample-base.bib") + +// %% +// %% If your work has an appendix, this is the place to put it. +// \appendix + = Research Methods + +== Part One + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi +malesuada, quam in pulvinar varius, metus nunc fermentum urna, id +sollicitudin purus odio sit amet enim. Aliquam ullamcorper eu ipsum +vel mollis. Curabitur quis dictum nisl. Phasellus vel semper risus, et +lacinia dolor. Integer ultricies commodo sem nec semper. + +== Part Two + +Etiam commodo feugiat nisl pulvinar pellentesque. Etiam auctor sodales +ligula, non varius nibh pulvinar semper. Suspendisse nec lectus non +ipsum convallis congue hendrerit vitae sapien. Donec at laoreet +eros. Vivamus non purus placerat, scelerisque diam eu, cursus +ante. Etiam aliquam tortor auctor efficitur mattis. + = Online Resources + +Nam id fermentum dui. Suspendisse sagittis tortor a nulla mollis, in +pulvinar ex pretium. Sed interdum orci quis metus euismod, et sagittis +enim maximus. Vestibulum gravida massa ut felis suscipit +congue. Quisque mattis elit a risus ultrices commodo venenatis eget +dui. Etiam sagittis eleifend elementum. + +Nam interdum magna at lectus dignissim, ac dignissim lorem +rhoncus. Maecenas eu arcu ac neque placerat aliquam. Nunc pulvinar +massa et mattis lacinia. diff --git a/acm-suite/typst.toml b/acm-suite/typst.toml index 2e2d3da..5079b0f 100644 --- a/acm-suite/typst.toml +++ b/acm-suite/typst.toml @@ -4,7 +4,7 @@ version = "0.1.216" compiler = "0.14.0" repository = "https://github.com/jassielof/typst-templates" entrypoint = "lib.typ" -authors = ["Jassiel Ovando <@jassielof>"] +authors = ["Jassiel Ovando <@jassielof>", "Amejonah1200 "] license = "MPL-2.0" description = "ACM template suite, port of the LaTeX acm-article template." keywords = [