- feat: add
stretch
parameter for#alternatives[]
function class. This allows us to handle cases where the internal element is a context expression. - feat: add
config-common(align-enum-marker-with-baseline: true)
for aligning the enum marker with the baseline. - feat: add
linebreaks
option tocomponents.mini-slides
. #96 - feat: add
<touying:skip>
label to skip a new-section-slide. - feat: add
config-common(show-hide-set-list-marker-none: true)
to make the markers oflist
andenum
invisible after#pause
. - feat: add
config-common(bibliography-as-footnote: bibliography(title: none, "ref.bib"))
to display the bibliography in footnotes. - refactor: add
config-common(show-strong-with-alert: true)
configuration to display strong text with an alert. (small breaking change for some themes) - refactor: refactor
display-current-heading
for preserving heading style in title and subtitle. #71 - refactor: make
new-section-slide-fn
function class can receivebody
parameter. We can usereceive-body-for-new-section-slide-fn
to control it. (Breaking change)- For example, you can add
#speaker-note[]
for a new section slide, like= Section Title \ #speaker-note[]
. - If you don't want to append content to the body of the new section slide, you can use
---
after the section title.
- For example, you can add
- fix outdated documentation.
- fix bug of
enable-frozen-states-and-counters
in handout mode. - fix unusable
square()
function. #73 - fix hidden footer for
show-notes-on-second-screen: bottom
. #89 - fix metadata element in table cells. #77 #95
- fix
auto-offset-for-heading
tofalse
by default. - fix uncover/only hides more content than it should. #85
- theme(simple): fix wrong title and subtitle. #70
- Fix somg bugs.
This is a significant disruptive version update. Touying has removed many mistakes that resulted from incorrect decisions. We have redesigned numerous features. The goal of this version is to make Touying more user-friendly, more flexible, and more powerful.
Major changes include:
- Avoiding closures and OOP syntax, which makes Touying's configuration simpler and allows for the use of document comments to provide more auto-completion information for the slide function.
- The existing
#let slide(self: none, ..args) = { .. }
is now#let slide(..args) = touying-slide-wrapper(self => { .. })
, whereself
is automatically injected. - We can use
config-xxx
syntax to configure Touying, for example,#show: university-theme.with(aspect-ratio: "16-9", config-colors(primary: blue))
.
- The existing
- The
touying-slide
function no longer includes parameters likesection
,subsection
, andtitle
. These will be automatically inserted into the slide as invisible level 1, 2, or 3 headings viaself.headings
(controlled by theslide-level
configuration).- We can leverage the powerful headings provided by Typst to support numbering, outlines, and bookmarks.
- Headings within the
#slide[= XXX]
function will be adjusted to levelslide-level + 1
using theoffset
parameter. - We can use labels on headings to control many aspects, such as supporting the
<touying:hidden>
and other special labels, implementing short headings, or recalling a slide with#touying-recall()
.
- Touying now supports the normal use of
set
andshow
rules at any position, without requiring them to be in specific locations.
A simple usage example is shown below, and more examples can be found in the examples
directory:
#import "@preview/touying:0.5.0": *
#import themes.university: *
#show: university-theme.with(
aspect-ratio: "16-9",
config-info(
title: [Title],
subtitle: [Subtitle],
author: [Authors],
date: datetime.today(),
institution: [Institution],
logo: emoji.school,
),
)
#set heading(numbering: "1.1")
#title-slide()
= The Section
== Slide Title
#lorem(40)
Theme Migration Guide:
For detailed changes to specific themes, you can refer to the themes
directory. Generally, if you want to migrate an existing theme, you should:
- Rename the
register
function toxxx-theme
and remove theself
parameter. - Add a
show: touying-slides.with(..)
configuration.- Change
self.methods.colors
toconfig-colors(primary: rgb("#xxxxxx"))
. - Change
self.page-args
toconfig-page()
. - Change
self.methods.slide = slide
toconfig-methods(slide: slide)
. - Change
self.methods.new-section-slide = new-section-slide
toconfig-methods(new-section-slide: new-section-slide)
. - Change private theme variables like
self.xxx-footer
toconfig-store(footer: [..])
, which you can access throughself.store.footer
. - Move the configuration of headers and footers into the
slide
function rather than in thexxx-theme
function. - You can directly use
set
orshow
rules inxxx-theme
or configure them throughconfig-methods(init: (self: none, body) => { .. })
to fully utilize theself
parameter.
- Change
- For
states.current-section-with-numbering
, you can useutils.display-current-heading(level: 1)
instead.- If you only need the previous heading regardless of whether it is a section or a subsection, use
self => utils.display-current-heading(depth: self.slide-level)
.
- If you only need the previous heading regardless of whether it is a section or a subsection, use
- The
alert
function can be replaced withconfig-methods(alert: utils.alert-with-primary-color)
. - The
touying-outline()
function is no longer needed; you can usecomponents.adaptive-columns(outline())
instead. Consider usingcomponents.progressive-outline()
orcomponents.custom-progressive-outline()
. - Replace
states.slide-counter.display() + " / " + states.last-slide-number
withcontext utils.slide-counter.display() + " / " + utils.last-slide-number
. That is, we no longer usestates
bututils
. - Remove the
slides
function; we no longer need this function. Instead of implicitly injectingtitle-slide()
, explicitly use#title-slide()
. If necessary, consider adding it in thexxx-theme
function. - Change
#let slide(self: none, ..args) = { .. }
to#let slide(..args) = touying-slide-wrapper(self => { .. })
, whereself
is automatically injected.- Change specific parameter configurations to
self = utils.merge-dicts(self, config-page(fill: self.colors.neutral-lightest))
. - Remove
self = utils.empty-page(self)
and useconfig-common(freeze-slide-counter: true)
andconfig-page(margin: 0em)
instead. - Change
(self.methods.touying-slide)()
totouying-slide()
.
- Change specific parameter configurations to
- You can insert visible headings into slides by configuring
config-common(subslide-preamble: self => text(1.2em, weight: "bold", utils.display-current-heading(depth: self.slide-level)))
. - Finally, don't forget to add document comments to your functions so your users can get better auto-completion hints, especially when using the Tinymist plugin.
Other Changes:
- theme(stargazer): new stargazer theme modified from Coekjan/touying-buaa.
- feat: implemented fake frozen states support, allowing you to use numbering and
#pause
normally. This behavior can be controlled withenable-frozen-states-and-counters
,frozen-states
, andfrozen-counters
inconfig-common()
. - feat: implemented
label-only-on-last-subslide
functionality to prevent non-unique label warnings when working with@equation
and@figure
in conjunction with#pause
animations. - feat: added the
touying-recall(<label>)
function to replay a specific slide. - feat: implemented
nontight-list-enum-and-terms
, which defaults totrue
and forceslist
,enum
, andterms
to have theirtight
parameter set tofalse
. You can control spacing size with#set list(spacing: 1em)
. - feat: replaced
list
withterms
implementation to achievealign-list-marker-with-baseline
, which is off by default. - feat: implemented
scale-list-items
, scaling list items by a factor, e.g.,scale-list-items: 0.8
scales list items by 0.8. - feat: supported direct use of
#pause
and#meanwhile
in math expressions, such as$x + pause y$
. - feat: provided
#pause
and#meanwhile
support for most layout functions, such asgrid
andtable
. - feat: added
#show: appendix
support, essentially equivalent to#show: touying-set-config.with((appendix: true))
. - feat: Introduced special labels
<touying:hidden>
,<touying:unnumbered>
,<touying:unoutlined>
,<touying:unbookmarked>
to simplify control over heading behavior. - feat: added basic
utils.short-heading
support to display short headings using labels, such as displaying<sec:my-section>
as "My Section". - feat: added
#components.adaptive-columns()
to achieve adaptive columns that span a page, typically used with theoutline()
function. - feat: added
#show: magic.bibliography-as-footnote.with(bibliography("ref.bib"))
to display the bibliography in footnotes. - feat: added components like
custom-progressive-outline
,mini-slides
. - feat: removed
touying-outline()
, which can be directly replaced withoutline()
. - fix: replaced potentially incompatible code, such as
type(s) == "string"
andlocate(loc => { .. })
. - fix: Fixed some bugs.
- theme(metropolis): decoupled text color with
neutral-dark
(Breaking change) - feat: add mark-style uncover, only and alternatives
- feat: add warning for styled block for slides
- feat: add warning for touying-temporary-mark
- feat: add markup-text for speaker-note
- fix: fix bug of slides
- feat: support builtin outline and bookmark
- feat: support speaker note for dual-screen
- feat: add touying-mitex function
- fix: add outline-slide for dewdrop theme
- fix: fix regression of default value "auto" for repeat
- feat: add list support for
touying-outline
function - feat: add auto-reset-footnote
- feat: add
freeze-in-empty-page
for better page counter - feat: add
..args
for register method to capture unused arguments
- feat: support
#footnote[]
for all themes. - feat: access subslide and repeat in footer and header by
self => self.subslide
. - feat: support numbered theorem environments by ctheorems.
- feat: support numbering for sections and subsections.
- fix: make nested includes work correctly.
- fix: disable multi-page slides from creating the same section multiple times.
- refactor: remove
self.padding
and addself.full-header
self.full-footer
config.
- template: move template to
touying-aqua
package, make Touying searchable in Typst Universe Packages - themes: fix bugs in university and dewdrop theme
- feat: make set-show rule work without
setting
parameter - feat: make
composer
parameter more simpler - feat: add
empty-slide
function
- fix critical bug: fix
is-sequence
function, makegrid
andtable
work correctly in touying - theme: add aqua theme, thanks for pride7
- theme: make university theme more configurable
- refactor: don't export variable
s
by default anymore, it will be extracted byregister
function (Breaking Change) - meta: add
categories
andtemplate
config totypst.toml
for Typst 0.11
- fix some typos
- fix slide-level bug
- fix bug of pdfpc label
- better show-slides mode.
- support align and pad.
- Add more detailed documentation.
- simplify theme.
- fix many bugs.
- Touying-reducer: support cetz and fletcher animation
- university theme: add university theme
- fix footer progress in metropolis theme
- fix some bugs in simple and dewdrop themes
- fix bug that outline does not display more than 4 sections
- Object-oriented programming: Singleton
s
, binding methodsutils.methods(s)
and(self: obj, ..) => {..}
methods. - Page arguments management: Instead of using
#set page(..)
, you should useself.page-args
to retrieve or set page parameters, thereby avoiding unnecessary creation of new pages. #pause
for sequence content: You can use #pause at the outermost level of a slide, including inline and list.#pause
for layout functions: You can use thecomposer
parameter to add yourself layout function likeutils.side-by-side
, and simply use multiple pos parameters like#slide[..][..]
.#meanwhile
for synchronous display: Provide a#meanwhile
for resetting subslides counter.#pause
and#meanwhile
for math equation: Provide a#touying-equation("x + y pause + z")
for math equation animations.- Slides: Create simple slides using standard headings.
- Callback-style
uncover
,only
andalternatives
: Based on the concise syntax provided by Polylux, allow precise control of the timing for displaying content.- You should manually control the number of subslides using the
repeat
parameter.
- You should manually control the number of subslides using the
- Transparent cover: Enable transparent cover using oop syntax like
#let s = (s.methods.enable-transparent-cover)(self: s)
. - Handout mode: enable handout mode by
#let s = (s.methods.enable-handout-mode)(self: s)
. - Fit-to-width and fit-to-height: Fit-to-width for title in header and fit-to-height for image.
utils.fit-to-width(grow: true, shrink: true, width, body)
utils.fit-to-height(width: none, prescale-width: none, grow: true, shrink: true, height, body)
- Slides counter:
states.slide-counter.display() + " / " + states.last-slide-number
andstates.touying-progress(ratio => ..)
. - Appendix: Freeze the
last-slide-number
to prevent the slide number from increasing further. - Sections: Touying's built-in section support can be used to display the current section title and show progress.
section
andsubsection
parameter in#slide
to register a new section or subsection.states.current-section-title
to get the current section.states.touying-outline
ors.methods.touying-outline
to display a outline of sections.states.touying-final-sections(sections => ..)
for custom outline display.states.touying-progress-with-sections((current-sections: .., final-sections: .., current-slide-number: .., last-slide-number: ..) => ..)
for powerful progress display.
- Navigation bar: Navigation bar like here by
states.touying-progress-with-sections(..)
, indewdrop
theme. - Pdfpc: pdfpc support and export
.pdfpc
file without external tool bytypst query
command simply.