diff --git a/packages/preview/juti/0.1.0/.gitignore b/packages/preview/juti/0.1.0/.gitignore
new file mode 100644
index 0000000000..a136337994
--- /dev/null
+++ b/packages/preview/juti/0.1.0/.gitignore
@@ -0,0 +1 @@
+*.pdf
diff --git a/packages/preview/juti/0.1.0/LICENSE b/packages/preview/juti/0.1.0/LICENSE
new file mode 100644
index 0000000000..f19aaa6d09
--- /dev/null
+++ b/packages/preview/juti/0.1.0/LICENSE
@@ -0,0 +1,14 @@
+MIT No Attribution
+
+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.
+
+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.
\ No newline at end of file
diff --git a/packages/preview/juti/0.1.0/README.md b/packages/preview/juti/0.1.0/README.md
new file mode 100644
index 0000000000..e5e6de1797
--- /dev/null
+++ b/packages/preview/juti/0.1.0/README.md
@@ -0,0 +1,3 @@
+# Template for the _JUTI: Jurnal Ilmiah Teknologi Informasi_
+
+The [_JUTI: Jurnal Ilmiah Teknologi Informasi_](https://juti.if.its.ac.id) is focusing on publishing original research, communication, and notes as a result of original and high quality research. The journal also invites well known researchers to write a review paper. JUTI accepts high quality papers in the field of engineering, science, and technology. The journal is published biannually (January and July) and is available in an open-access electronic version.
diff --git a/packages/preview/juti/0.1.0/cover_background.png b/packages/preview/juti/0.1.0/cover_background.png
new file mode 100644
index 0000000000..8cba9f7c57
Binary files /dev/null and b/packages/preview/juti/0.1.0/cover_background.png differ
diff --git a/packages/preview/juti/0.1.0/juti.typ b/packages/preview/juti/0.1.0/juti.typ
new file mode 100644
index 0000000000..72de61459c
--- /dev/null
+++ b/packages/preview/juti/0.1.0/juti.typ
@@ -0,0 +1,667 @@
+#import "@preview/numbly:0.1.0": numbly
+
+#let warn(body) = {
+ show: highlight.with(fill: red.lighten(75%))
+ body
+}
+#let empty-warn(body) = {
+ if body == "" or body == [] or body == none {
+ show: warn
+ lorem(6)
+ } else {
+ body
+ }
+}
+#let link-b(url, body) = {
+ // show: underline
+ // show: text.with(fill: rgb(0, 0, 238))
+
+ if url != none {
+ link(url, if body == [] {
+ url
+ } else {
+ body
+ })
+ } else {
+ body
+ }
+}
+#let parse-date(date-str) = {
+ let (year, month, day) = date-str.split("-")
+ return datetime(year: int(year), month: int(month), day: int(day))
+}
+#let phantom(body) = place(top, scale(x: 0%, y: 0%, hide(body)))
+#let inline-enum(
+ join-sym: [,],
+ last-join: [and],
+ prefix-fn: i => [(#{ i + 1 }) ],
+ ..entries,
+) = {
+ entries = entries.pos()
+ let n = entries.len()
+ if n == 1 {
+ return entries.at(0)
+ }
+ for (i, v) in entries.enumerate() {
+ if i > 0 {
+ [#join-sym ]
+ }
+ if n != 0 and i == n - 1 and last-join != none {
+ [#last-join ]
+ }
+ let prefix = if prefix-fn != none {
+ prefix-fn(i)
+ }
+ [#prefix#v]
+ }
+}
+#let nth(ordinal-num, sup: bool) = {
+ // Conditinally define ordinal-num, and if it's an integer change it to a string
+ let ordinal-str = if type(ordinal-num) == int {
+ str(ordinal-num)
+ } else {
+ ordinal-num
+ }
+ // Main if-else tree for this function
+ let ordinal-suffix = if ordinal-str.ends-with(regex("1[0-9]")) {
+ "th"
+ } else if ordinal-str.last() == "1" {
+ "st"
+ } else if ordinal-str.last() == "2" {
+ "nd"
+ } else if ordinal-str.last() == "3" {
+ "rd"
+ } else {
+ "th"
+ }
+ // Check whether sup attribute is set, and if so return suffix superscripted
+ if sup == true {
+ return ordinal-str + super(ordinal-suffix)
+ } else {
+ return ordinal-str + ordinal-suffix
+ }
+}
+
+// define nths function, which is just nth with sup attribute applied
+#let nths(ordinal) = {
+ nth(ordinal, sup: true)
+}
+
+#let i(body) = {
+ set cite(form: "prose")
+ body
+}
+
+#let debug-outline() = {
+ block(fill: red.lighten(80%), inset: 1em, outline())
+}
+
+#let format-date(d) = {
+ if (
+ type(d) == datetime
+ ) [
+ #d.display("[month repr:short]") #nths(d.day()), #d.display("[year]")] else [
+ #d]
+}
+
+#let JOURNAL-NAME = [JUTI: Jurnal Ilmiah Teknologi Informasi]
+#let get-align-by-page(pagei) = if calc.rem-euclid(pagei, 2) == 0 {
+ left
+} else {
+ right
+}
+
+#let paper-idx = state("paper-idx", "single")
+#let book-state = state(
+ "book-state",
+ (
+ volume: [-],
+ number: [-],
+ month: 2,
+ year: 2025,
+ ),
+)
+
+#let contributions = (
+ /* 0 */ [Conceptualization],
+ /* 1 */ [Methodology],
+ /* 2 */ [Software],
+ /* 3 */ [Validation],
+ /* 4 */ [Formal analysis],
+ /* 5 */ [Investigation],
+ /* 6 */ [Resources],
+ /* 7 */ [Data Curation],
+ /* 8 */ [Writing -- Original Draft],
+ /* 9 */ [Writing -- Review & Editing],
+ /* 10 */ [Visualization],
+ /* 11 */ [Supervision],
+ /* 12 */ [Project Administration],
+ /* 13 */ [Funding Acquisition],
+)
+#let get-contributions(author) = author.contribution-refs.map(i => contributions.at(i)).join([, ])
+
+#let credits(authors) = authors.map(author => [*#author.short:* #get-contributions(author).]).join([ ])
+
+#let init-authors(authors) = {
+ for (i, author) in authors.enumerate() {
+ if author.at("short", default: none) == none {
+ let cleaned = author.name.replace(regex("[^a-zA-Z ]"), "")
+ let splitted = cleaned.split(" ")
+ authors.at(i).short = splitted
+ .enumerate()
+ .map(((j, v)) => {
+ if j == splitted.len() - 1 {
+ v
+ } else {
+ v.slice(0, 1) + "."
+ }
+ })
+ .join(" ")
+ }
+ }
+
+ authors
+}
+
+#let enumlist-level = state("enumlist-level", 1)
+
+#let template(
+ title: "Preparation of Papers for jurnal ilmiah teknologi informasi",
+ title-content: [],
+ authors: (
+ (
+ name: "First Alpha Author",
+ institution-ref: 0,
+ email: "first.author@email.com",
+ contribution: [],
+ contribution-refs: range(0, 10),
+ ),
+ (
+ name: "Second Beta Author",
+ institution-ref: 0,
+ email: "second.author@email.com",
+ contribution: [],
+ contribution-refs: range(7, 13),
+ ),
+ (
+ name: "Third Charlie Author",
+ institution-ref: 1,
+ email: "third.author@email.com",
+ contribution: [],
+ contribution-refs: range(7, 13),
+ ),
+ ),
+ corresponding-ref: 0,
+ institutions: (
+ (
+ name: "Department and institution name of authors",
+ address: "Address of institution",
+ ),
+ (
+ name: "Department and institution name of authors",
+ address: "Address of institution",
+ ),
+ ),
+ abstract: [],
+ keywords: (),
+ meta: (
+ // No need to change
+ received: datetime.today(),
+ revised: datetime.today(),
+ accepted: datetime.today(),
+ online: datetime.today(),
+ doi: "https://doi.org/10.12962/j24068535.vXXXX.aXXXX",
+ ),
+ start-page: 1,
+ body,
+ bib: none,
+) = context {
+ let paper-id = paper-idx.get()
+ let book = book-state.get()
+ counter(heading).update(0)
+ counter(figure.where(kind: image)).update(0)
+ counter(figure.where(kind: table)).update(0)
+ counter(math.equation).update(0)
+ counter(figure.where(kind: math.equation)).update(0)
+ counter(figure.where(kind: raw)).update(0)
+ if start-page != none {
+ counter(page).update(start-page)
+ }
+ let title-content = if title-content == none or title-content == [] {
+ [#title]
+ } else {
+ title-content
+ }
+ set page(
+ paper: "a4",
+ header: context {
+ show: pad.with(bottom: 1em)
+ let paper-page-range = (
+ counter(page).at(query(label(paper-id + ":start")).last().location()).at(0),
+ counter(page).at(query(label(paper-id + ":end")).last().location()).at(0),
+ )
+ let pagei = counter(page).get().at(0)
+ let aligned-pagei = pagei + paper-page-range.at(0) + 1
+ set text(size: 9pt)
+ set align(get-align-by-page(aligned-pagei))
+ if calc.rem-euclid(aligned-pagei, 2) == 0 {
+ if authors.len() > 2 {
+ [#empty-warn(authors.at(0).short) et al.]
+ } else {
+ let names = authors.enumerate().map(((i, v)) => [#empty-warn(v.short)])
+ inline-enum(prefix-fn: none, ..names)
+ }
+ [ -- ]
+ text(style: "italic", empty-warn(title.replace("\n", " ")))
+ } else {
+ let month-year = datetime(
+ year: book.year,
+ month: book.month,
+ day: 1,
+ ).display("[month repr:long] [year]")
+ let right-content = [#JOURNAL-NAME -- _Volume #book.volume, Number #book.number, #month-year: #paper-page-range.map(v => [#v]).join([ -- ])_]
+ if pagei == paper-page-range.at(0) {
+ grid(
+ columns: (auto, 1fr),
+ column-gutter: 2em,
+ place(float: true, top, dy: 1em, image("logo.svg", height: 6em)), align(right, right-content),
+ )
+ } else {
+ right-content
+ }
+ }
+ },
+ footer: context {
+ let pagei = counter(page).get().at(0)
+ set text(size: 10pt)
+ set align(get-align-by-page(pagei))
+ pagei
+ },
+ margin: (
+ x: 0.65in,
+ y: 1in,
+ ),
+ )
+ set text(font: ("Liberation Serif", "Segoe UI Symbol"), fallback: false)
+ // set text(font: "Times New Roman", fallback: false)
+ set bibliography(
+ style: "ieee",
+ title: none,
+ )
+ set par(linebreaks: "optimized")
+
+ //? Figure
+ // set figure(placement: top)
+
+ //? Image
+ show figure.where(kind: image): set figure(placement: top, supplement: [Fig.])
+ show figure.where(kind: image): set text(size: .8em)
+
+ //? Table
+ show figure.where(kind: table): set block(breakable: true)
+ show figure.where(kind: table): set figure(placement: top, supplement: [Table])
+ set table(align: left)
+
+ //? Algorithm
+ show figure.where(kind: "algorithm"): set figure(placement: top, supplement: [Algorithm])
+
+ //? Caption
+ set figure.caption(separator: [. ])
+ show figure.caption: set align(left)
+ show figure.caption: set par(first-line-indent: 0pt)
+ show figure.caption: it => context [
+ *#it.supplement #it.counter.get().at(0)#it.separator* #it.body
+ ]
+
+ // TODO: Still not fixed
+ // show enum.item: it => {
+ // enumlist-level.update(l => l + 1)
+ // it
+ // enumlist-level.update(l => l - 1)
+ // }
+ set enum(indent: 1em)
+ // show enum: it => context {
+ // set enum(indent: 0em) if enumlist-level.get() > 0
+ // it
+ // }
+ // show list.item: it => {
+ // enumlist-level.update(l => l + 1)
+ // it
+ // enumlist-level.update(l => l - 1)
+ // }
+ set list(indent: 1em)
+ // show list: it => context {
+ // set list(indent: 0em) if enumlist-level.get() > 0
+ // it
+ // }
+ show table: set enum(indent: 0em)
+ show table: set list(indent: 0em)
+ show table: set par(justify: false, first-line-indent: 0em)
+ show table.header: set text(weight: "bold")
+ set table(stroke: none)
+ show figure.where(kind: table): set text(size: .8em)
+ show figure.where(kind: table): set figure.caption(position: top)
+
+ //? Equation
+ // show math.equation: set text(font: "New Computer Modern Math")
+ set math.equation(numbering: "(1)")
+ show math.equation: math.italic
+ show ref: it => {
+ let eq = math.equation
+ let el = it.element
+ if el != none and el.func() == eq {
+ // Override equation references.
+ link(el.location(), numbering(el.numbering, ..counter(eq).at(el.location())))
+ } else {
+ // Other references as usual.
+ it
+ }
+ }
+
+ //? START OF CONTENT
+ [#metadata(none)#label(paper-id + ":start")]
+
+ //? Title
+ {
+ set align(left)
+ set text(size: 16pt, weight: "bold")
+ // show: upper
+ empty-warn(title-content)
+ phantom(heading(title-content, bookmarked: true))
+ }
+
+ //? Author names
+ {
+ set align(left)
+ set text(size: 12pt, weight: "bold")
+ let names = authors
+ .enumerate()
+ .map(((i, v)) => box[
+ #empty-warn(v.name)
+ #set text(weight: "regular")
+ #super[#{ v.institution-ref + 1 }#if corresponding-ref == i [,\*]]])
+
+ inline-enum(prefix-fn: none, ..names)
+ }
+
+ //? Institutions
+ {
+ set align(left)
+ set text(size: 8pt, style: "italic")
+ set par(spacing: .5em)
+
+ for (i-institution, institution) in institutions.enumerate() {
+ let author-indices = authors
+ .enumerate()
+ .map(((i, v)) => (
+ ..v,
+ _index: i,
+ ))
+ .filter(v => if type(v.institution-ref) == array {
+ v.institution-ref.contains(i-institution)
+ } else {
+ v.institution-ref == i-institution
+ })
+ .map(v => v._index + 1)
+
+ [
+ #super[#{ i-institution + 1 }] #empty-warn(institution.name), #institution.address
+
+ ]
+ }
+ }
+
+ //? Emails
+ // {
+ // set align(center)
+ // set text(size: 10pt)
+ // let emails = authors
+ // .enumerate()
+ // .map(
+ // //
+ // ((i, v)) => box(if type(v.email) == array {
+ // v.email.map(v => [#empty-warn(v)#super[#{ i + 1 })]]).join([, ])
+ // } else [
+ // #empty-warn(v.email)#super[#{ i + 1 })]
+ // ]),
+ // )
+
+ // [E-mail: ]
+ // inline-enum(prefix-fn: none, ..emails)
+ // }
+
+ v(.5em)
+ grid(
+ columns: (25%, auto),
+ column-gutter: 1.5em,
+ {
+ line(length: 100%, stroke: 0.6pt)
+ {
+ set align(left)
+ set text(size: 10pt, weight: "regular")
+ [ARTICLE INFO]
+ }
+ set text(size: 8pt, style: "italic")
+ [
+
+ //? Keywords
+ Keywords: \
+ #{
+ [
+ #inline-enum(prefix-fn: none, last-join: none, join-sym: [\ ], ..keywords.map(v => empty-warn(v)))
+ ]
+ }
+ #v(.6em)
+ \* Corresponding author: #authors.at(corresponding-ref).email \
+ #v(.6em)
+ Article history: \
+ Received: #format-date(meta.received) \
+ Revised: #format-date(meta.revised) \
+ Accepted: #format-date(meta.accepted) \
+ Available online: #format-date(meta.online) \
+ ]
+ },
+ {
+ line(length: 100%, stroke: 0.6pt)
+
+ //? Abstract Title
+ {
+ set align(left)
+ set text(size: 10pt, weight: "regular")
+ [ABSTRACT]
+ }
+
+ //? Abstract
+ {
+ set text(
+ size: 10pt,
+ // weight: "regular",
+ // style: "italic",
+ )
+ // set par(justify: true, first-line-indent: (amount: 2em, all: true))
+ set par(justify: true)
+ empty-warn(abstract)
+ }
+
+ // //? Keywords
+ // {
+ // set text(
+ // size: 10pt,
+ // // weight: "regular",
+ // // style: "italic",
+ // )
+ // set par(justify: true)
+ // text(style: "normal")[Keywords: ]
+ // [
+ // #inline-enum(prefix-fn: none, last-join: none, ..keywords.map(v => empty-warn(v))).
+ // ]
+ // }
+ },
+ )
+ line(length: 100%, stroke: 0.6pt)
+ v(.5em)
+
+ //? Numberings
+ set heading(
+ numbering: numbly(
+ "{1}.",
+ "{1}.{2}.",
+ "{3:A}.",
+ ),
+ )
+ // set enum(numbering: "1)")
+ //? Heading 1
+ show heading.where(level: 1): it => {
+ // set align(center)
+ set text(size: 11pt, weight: "bold")
+ it
+ // smallcaps(it)
+ v(.5em)
+ }
+ //? Heading 2
+ show heading.where(level: 2): it => {
+ set text(
+ size: 11pt,
+ weight: "regular",
+ style: "italic",
+ )
+ it
+ }
+ //? Heading 3
+ show heading.where(level: 3): it => {
+ set text(
+ size: 11pt,
+ weight: "regular",
+ style: "italic",
+ )
+ it
+ }
+ //? Heading 4
+ show heading.where(level: 4): it => {
+ set text(
+ size: 11pt,
+ weight: "regular",
+ style: "italic",
+ )
+ it
+ }
+
+ //? Metadata Footnote
+ figure(
+ pad(bottom: -1.2em)[
+ #set align(left)
+ #set text(size: 9pt)
+
+ #pad(y: -.65em, line(length: 100%))
+
+ © #context { book-state.get().year } The Authors. This is an open access article under the CC BY-SA license (#link-b("https://creativecommons.org/licenses/by-sa/4.0/")[])\ DOI: #link-b(meta.doi)[]
+ ],
+ placement: bottom,
+ supplement: none,
+ kind: "footnote-metadata",
+ )
+
+ set par(justify: true, first-line-indent: (amount: 2em, all: true))
+ set text(size: 11pt, weight: "regular")
+
+ body
+
+ //? References
+ if bib != none {
+ heading(numbering: none, outlined: false)[References]
+
+ set text(size: 8pt)
+ set par(spacing: .65em)
+ bib
+ }
+ //? END OF CONTENT
+ [#metadata(none)#label(paper-id + ":end")]
+}
+
+#let cover(
+ issn: "1412-6389",
+ eissn: "2406-8535",
+ papers: (),
+) = context {
+ let book = book-state.get()
+ let juti-blue = rgb("#113E68")
+ let juti-yellow = rgb("FFBD07")
+ let primary-color = white
+ let accent-color = rgb("#1e90ff")
+
+ set page(
+ paper: "a4",
+ margin: (x: 0.65in, y: 0.65in),
+ header: none,
+ footer: none,
+ background: image("cover_background.png", width: 100%, height: 100%),
+ )
+ set text(font: ("Liberation Sans", "Arial", "Helvetica"), fallback: true)
+
+ // ISSN top right — stays above shield zone (shield center y≈52pt in content)
+ {
+ set align(right)
+ set text(size: 12pt, fill: primary-color, weight: "bold")
+ [P-ISSN #issn \ E-ISSN #eissn]
+ }
+
+ v(-5em)
+
+ // JUTI large — left-aligned, clear of binary data motif (that's in margin)
+ {
+ set text(size: 72pt, weight: "black", fill: juti-yellow.lighten(50%))
+ [JUTI]
+ }
+
+ v(-5em)
+
+ // Full name
+ {
+ set text(size: 28pt, weight: "bold", fill: juti-yellow.lighten(50%))
+ [Jurnal Ilmiah Teknologi Informasi]
+ }
+
+ linebreak()
+
+ // Subtitle italic
+ {
+ set text(size: 16pt, style: "italic", weight: "regular", fill: primary-color)
+ [Scientific Journal of Information Technology]
+ }
+
+ v(1em)
+ line(length: 100%, stroke: 2pt + primary-color)
+ v(1em)
+
+ // TOC entries — left-padded 36% to avoid robot head + brain circle
+ // (robot occupies x=0–177pt in content, brain circle x=0–120pt; both y=46–85% of page)
+ pad(left: 0%, {
+ {
+ set align(center)
+ set text(size: 18pt, weight: "bold", fill: primary-color)
+ let month-year = datetime(year: book.year, month: book.month, day: 1).display("[month repr:long] [year]")
+ [Vol. #book.volume, No. #book.number, #month-year]
+ }
+
+ v(1em)
+ set text(size: 10pt, fill: primary-color)
+ set par(justify: false, leading: .5em, spacing: 1.2em)
+ for paper in papers {
+ grid(
+ columns: (1fr, auto),
+ column-gutter: 1em,
+ {
+ text(weight: "bold", fill: juti-yellow.lighten(50%), upper(paper.title))
+ linebreak()
+ text(style: "italic", paper.authors)
+ },
+ {
+ set align(right + top)
+ if paper.at("pages", default: none) != none {
+ text(fill: juti-yellow.lighten(50%), weight: "bold", paper.pages)
+ }
+ },
+ )
+ }
+ })
+}
diff --git a/packages/preview/juti/0.1.0/logo.svg b/packages/preview/juti/0.1.0/logo.svg
new file mode 100644
index 0000000000..dc38bc3c7c
--- /dev/null
+++ b/packages/preview/juti/0.1.0/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/preview/juti/0.1.0/template/figure1.jpg b/packages/preview/juti/0.1.0/template/figure1.jpg
new file mode 100644
index 0000000000..8c7b86c671
Binary files /dev/null and b/packages/preview/juti/0.1.0/template/figure1.jpg differ
diff --git a/packages/preview/juti/0.1.0/template/main.typ b/packages/preview/juti/0.1.0/template/main.typ
new file mode 100644
index 0000000000..4538a07e27
--- /dev/null
+++ b/packages/preview/juti/0.1.0/template/main.typ
@@ -0,0 +1,155 @@
+#import "@preview/juti:0.1.0"
+#import "setup.typ": *
+
+/**
+ * Contribution References
+ * 0. Conceptualization
+ * 1. Methodology
+ * 2. Software
+ * 3. Validation
+ * 4. Formal analysis
+ * 5. Investigation
+ * 6. Resources
+ * 7. Data Curation
+ * 8. Writing -- Original Draft
+ * 9. Writing -- Review & Editing
+ * 10. Visualization
+ * 11. Supervision
+ * 12. Project Administration
+ * 13. Funding Acquisition
+ **/
+
+#let authors = juti.init-authors((
+ (
+ name: "First Alpha Author",
+ institution-ref: 0,
+ email: "first.author@email.com",
+ contribution-refs: (0, 1, 2, 5, 6, 7, 8, 10, 13),
+ ),
+ (
+ name: "Second Beta Author",
+ institution-ref: 0,
+ email: "second.author@email.com",
+ contribution-refs: (6, 9, 11),
+ ),
+ (
+ name: "Third Charlie Author",
+ institution-ref: 1,
+ email: "third.author@email.com",
+ contribution-refs: (3, 4, 6, 9, 11, 12),
+ ),
+))
+
+#let institutions = (
+ (
+ name: "Department and institution name of authors",
+ address: "Address of institution",
+ ),
+ (
+ name: "Department and institution name of authors",
+ address: "Address of institution",
+ ),
+)
+
+#show: juti.template.with(
+ title: "Preparation of papers for jurnal ilmiah teknologi informasi",
+ authors: authors,
+ corresponding-ref: 0,
+ institutions: institutions,
+ abstract: [
+ These instructions give you guidelines for preparing JUTI (Jurnal Ilmiah Teknologi Informasi) papers. The electronic file of your paper will be formatted further by JUTI editorial board. Paper titles should be written in uppercase. Avoid writing long formulas with subscripts in the title; short formulas that identify the elements are fine (e.g., "Nd--Fe--B"). Do not write “(Invited)” in the title. Full names of authors are preferred in the author field but are not required. If you have to shorten the author’s name, leave first name and last name unshorten. Put a space between authors’ initials. Do not cite references in the abstract. The length of abstract must between 150 -- 250 words.
+ ],
+ keywords: (
+ [Keyword1],
+ [keyword2],
+ [keyword3],
+ [keyword4],
+ ),
+ bib: bibliography("references.bib"),
+ ..setup,
+)
+
+= Introduction
+
+Example of citation @abbas2009automatic, or multiple citations @abbas2009automatic @yuhana2022automatic. #lorem(100)
+
+= Literature review
+
+#lorem(100)
+Table example can be seen on @tab-example.
+Image example can be seen on @img-example.
+The Schrodinger's famous equation can be seen on @eq-example.
+
+#let hbar = (sym.wj, move(dy: -0.08em, strike(offset: -0.55em, extent: -0.05em, sym.planck)), sym.wj).join()
+$ i hbar (partial Psi(x, t)) / (partial t) = -frac(hbar^2, 2m) nabla^2 Psi(x, t) + V(x) Psi(x, t) $
+
+== Subsection title
+
+#lorem(100)
+
+#figure(
+ table(
+ columns: 4,
+ align: (x, y) => if x > 0 and y > 0 { left } else { center },
+ table.header(
+ table.hline(),
+ [*No*],
+ [*Year*],
+ [*Climate Change Event*],
+ [*Impact*],
+ table.hline(),
+ ),
+ [1], [1988], [Establishment of the IPCC], [Increased global awareness and scientific assessments],
+ [2], [1997], [Kyoto Protocol Adopted], [Legally binding emission reduction targets for developed countries],
+ [3], [2015], [Paris Agreement Signed], [Global commitment to limit warming below 2°C],
+ [4], [2021], [COP26 Held in Glasgow], [Strengthened climate targets and financial commitments],
+ [5], [2009], [Copenhagen Accord], [Pledged climate finance of \$100 billion per year],
+ [6], [2007], [IPCC Fourth Assessment Report], [Highlighted human influence on climate change],
+ [7], [2018], [IPCC Special Report on 1.5°C], [Urgent need for emission reductions to avoid severe impacts],
+ table.hline(),
+ ),
+ caption: [Table example.],
+)
+
+#figure(
+ image("figure1.jpg", width: 40%),
+ caption: [Logo of JUTI: Jurnal Ilmiah Teknologi Informasi. Note that #quote[Fig.] is abbreviated. There is a period after the figure number, followed by two spaces. It is good practice to explain the significance of the figure in the caption.],
+)
+
+#lorem(100)
+
+=== Subsubsection title
+
+#lorem(100)
+
+#lorem(100)
+
+#set heading(numbering: none)
+
+= CRediT authorship contribution statement
+
+#juti.credits(authors)
+
+= Declaration of competing interest
+
+The authors declare that they have no known competing financial interests or personal relationships that could have appeared to influence the work reported in this paper.
+
+= Acknowledgement
+
+This research was funded by ...
+
+= Data availability
+
+Please choose the appropriate data availability statement that applies to this study. If none apply, provide a custom statement.
+- The data used to support the findings of this study are available from the corresponding author upon request.
+- All relevant data are within the manuscript and its supporting information files.
+- The dataset was openly provided [link provided].
+- Data sharing is not applicable to this article as no datasets were generated or analyzed during the current study.
+- Data sharing is not applicable as the data are secondary data drawn from already published literature.
+- The datasets generated during and/or analyzed during the current study are available from the corresponding author on reasonable request.
+- Following acceptance and before publication, all data will be provided on a public repository.
+- No data are available.
+
+= Declaration of generative AI and AI-assisted technologies in the writing process
+
+The authors used generative AI to improve the writing clarity of this paper. They reviewed and edited the AI-assisted content and take full responsibility for the final publication.
diff --git a/packages/preview/juti/0.1.0/template/references.bib b/packages/preview/juti/0.1.0/template/references.bib
new file mode 100644
index 0000000000..c338523a1e
--- /dev/null
+++ b/packages/preview/juti/0.1.0/template/references.bib
@@ -0,0 +1,19 @@
+@article{abbas2009automatic,
+ title={An automatic system to grade multiple choice questions paper based exams},
+ author={Abbas, Ammar Awny},
+ journal={Journal of university of Anbar for Pure science},
+ volume={3},
+ number={1},
+ pages={174--181},
+ year={2009},
+ publisher={University of Anbar}
+}
+
+@article{yuhana2022automatic,
+ title={Automatic Assessment of Answers to Mathematics Stories Question Based on Tree Matching and Random Forest.},
+ author={Yuhana, Umi Laili and Oktavia, Vessa Rizky and Fatichah, Chastine and Purwarianti, Ayu},
+ journal={International Journal of Intelligent Engineering \& Systems},
+ volume={15},
+ number={2},
+ year={2022}
+}
diff --git a/packages/preview/juti/0.1.0/template/setup.typ b/packages/preview/juti/0.1.0/template/setup.typ
new file mode 100644
index 0000000000..463007d4a7
--- /dev/null
+++ b/packages/preview/juti/0.1.0/template/setup.typ
@@ -0,0 +1 @@
+#let setup = (start-page: 1)
diff --git a/packages/preview/juti/0.1.0/thumbnail.png b/packages/preview/juti/0.1.0/thumbnail.png
new file mode 100644
index 0000000000..eef2329b42
Binary files /dev/null and b/packages/preview/juti/0.1.0/thumbnail.png differ
diff --git a/packages/preview/juti/0.1.0/typst.toml b/packages/preview/juti/0.1.0/typst.toml
new file mode 100644
index 0000000000..419bde066a
--- /dev/null
+++ b/packages/preview/juti/0.1.0/typst.toml
@@ -0,0 +1,18 @@
+[package]
+name = "juti"
+version = "0.1.0"
+entrypoint = "juti.typ"
+authors = [
+ "Moch. Nafkhan Alzamzami ",
+ "Muhammad 'Arif Faizin ",
+ "Imam Mustafa Kamal ",
+]
+license = "MIT"
+description = "Template for writing articles for JUTI: Jurnal Ilmiah Teknologi Informasi"
+# repository = ""
+categories = ["paper"]
+
+[template]
+path = "template"
+entrypoint = "main.typ"
+thumbnail = "thumbnail.png"