SAT405/themes/better.typ
2025-12-13 23:29:19 +08:00

211 lines
5.0 KiB
Typst

/*
betterposter originally developed by Mike Morrison
https://osf.io/ef53g/
*/
#import "../utils/scripts.typ": *
// Different behavior than for basic.typ
#let theme(
primary-color: rgb(28,55,103), // Dark blue
background-color: white,
accent-color: rgb(243,163,30), // Yellow
titletext-color: black,
titletext-size: 2em,
body,
) = {
set page(
margin: 0pt,
)
color-primary.update(primary-color)
color-background.update(background-color)
color-accent.update(accent-color)
color-titletext.update(color-titletext => titletext-color)
size-titletext.update(size-titletext => titletext-size)
body
}
#let focus-box(
footer-kwargs: none,
body
) = {
focus-content.update(focus-body => body)
}
#let normal-box(
color: none,
body
) = {
context[
#let primary-color = color-primary.get()
#let accent-color = color-accent.get()
#if color != none [
#let accent-color = color
#box(
stroke: none, //primary-color+0.2em,
width: 100%,
fill: accent-color,
inset: 0%,
[
#box(
inset: (top: 4%, left: 4%, right: 4%, bottom: 4%),
body
)
]
)
] else [
// #let accent-color = color
#box(
stroke: none, //primary-color+0.0625em,
width: 100%,
fill: accent-color,
inset: 0%,
[
#box(
inset: (top: 4%, left: 4%, right: 4%, bottom: 4%),
body
)
]
)
]
]
}
#let poster-content(
col: 1,
title: none,
subtitle: none,
authors: none,
affiliation: none,
left-logo: none,
right-logo: none,
textcolor: black,
body
)={
context[
#let edge-color = color-background.get()
#let center-color = color-primary.get()
#let titletext-color = color-titletext.get()
#let titletext-size = size-titletext.get()
#let current-title = context title-content.get()
#let current-subtitle = context subtitle-content.get()
#let current-author = context author-content.get()
#let current-affiliation = context affiliation-content.get()
#let current-focus = context focus-content.get()
#let current-footer = context footer-content.get()
// Table captions go above
#show figure.where(kind:table) : set figure.caption(position:top)
#show figure.caption.where(kind:image): it => [
// #context it.counter.display(it.numbering)
// Since the #body is called twice (+1?), subtract half of the total figures to get the correct number
Fig.
#let last-counter = it.counter.final()
#context {it.counter.get().at(0) - (last-counter.at(0)-1)/2}:
#it.body
]
#show figure.caption.where(kind:table): it => [
Table
#let last-counter = it.counter.final()
#context {it.counter.get().at(0) - (last-counter.at(0)-1)/2}:
#it.body
]
// First, need body (hidden) to update header and footer
#block(height: 0pt, hide[#body])
#v(0pt, weak: true)
#grid(
columns: (12.5/52*100%, 28.5/52*100%, 11/52*100%),
rows: (100%),
// Left = title and main text
[
#grid(
columns: (100%),
rows: (auto, 1fr),
[
#box(
stroke: none,
fill: edge-color,
// height: 100%,
width: 100%,
inset: 6%,
[
#align(top+left)[
\
#set text(size: titletext-size/(7/5),
fill: titletext-color,
)
*#current-title*
#current-subtitle \
// i.e. (6/7 = 0.857), which converts 1.4 -> 1.2, or (5/7 = 714) 1.4 -> 1.0
#set text(size: 0.714em)
\
#current-author \
#current-affiliation
]
]
)
#v(0pt, weak: true)
],
[
#align(top+left)[
#box(
inset: 6%,
fill: edge-color,
columns(col)[
#body
]
)
]
]
)
],
// Center = focus box
[
#box(
height: 100%,
width: 100%,
inset: 10%,
fill: center-color,
align(left+horizon)[
#set text(size: 2em,
fill: white)
#current-focus
]
)
],
// Right = declarations and affiliation
[
#box(
stroke: none,
fill: edge-color,
height: 100%,
width: 100%,
inset: 6%,
align(bottom+left)[#current-footer]
)
]
)
]
}