Easier customization of outline entries.
Examples
For the full source see examples/basic.typ
and for more examples see the examples
directory.
Default Style
#import "@preview/outrageous:0.1.0"
#show outline.entry: outrageous.show-entry
Custom Settings
#import "@preview/outrageous:0.1.0"
#show outline.entry: outrageous.show-entry.with(
// the typst preset retains the normal Typst appearance
..outrageous.presets.typst,
// we only override a few things:
// level-1 entries are italic, all others keep their font style
font-style: ("italic", auto),
// no fill for level-1 entries, a thin gray line for all deeper levels
fill: (none, line(length: 100%, stroke: gray + .5pt)),
)
Usage
show-entry
Show the given outline entry with the provided styling. Should be used in a show rule like #show outline.entry: outrageous.show-entry
.
#let show-entry(
entry,
font-weight: presets.outrageous-toc.font-weight,
font-style: presets.outrageous-toc.font-style,
vspace: presets.outrageous-toc.vspace,
font: presets.outrageous-toc.font,
fill: presets.outrageous-toc.fill,
fill-right-pad: presets.outrageous-toc.fill-right-pad,
fill-align: presets.outrageous-toc.fill-align,
body-transform: presets.outrageous-toc.body-transform,
label: <outrageous-modified-entry>,
state-key: "outline-page-number-max-width",
) = { .. }
Arguments:
For all the arguments that take arrays, the array’s first item specifies the value for all level-one entries, the second item for level-two, and so on. The array’s last item will be used for all deeper/following levels as well.
entry
:content
— Theoutline.entry
element from the show rule.font-weight
:array
of (str
orint
orauto
ornone
) — The entry’s font weight. Setting toauto
ornone
keeps the context’s current style.font-style
:array
of (str
orauto
ornone
) — The entry’s font style. Setting toauto
ornone
keeps the context’s current style.vspace
:array
of (relative
orfraction
ornone
) — Vertical spacing to add above the entry. Setting tonone
adds no space.font
:array
of (str
orarray
orauto
ornone
) — The entry’s font. Setting toauto
ornone
keeps the context’s current font.fill
:array
of (content
orauto
ornone
) — The entry’s fill. Setting toauto
keeps the context’s current setting.fill-right-pad
:relative
ornone
— Horizontal space to put between the fill and page number.fill-align
:bool
— Whetherfill-right-pad
should be relative to the current page number or the widest page number. Setting this totrue
has the effect of all fills ending on the same vertical line.body-transform
:function
ornone
— Callback for custom edits to the entry’s body. It gets passed the entry’s level (int
) and body (content
) and should returncontent
ornone
. Ifnone
is returned, no modifications are made.page-transform
:function
ornone
— Callback for custom edits to the entry’s page number. It gets passed the entry’s level (int
) and page number (content
) and should returncontent
ornone
. Ifnone
is returned, no modifications are made.label
:label
— The label to internally use for tracking recursion. This should not need to be modified.state-key
:str
— The key to use for the internal state which tracks the maximum page number width. The state is global for the entire document and thus applies to all outlines. If you wish to re-calculate the max page number width forfill-align
, then you must provide a different key for each outline.
Returns: content
presets
Presets for the arguments for show-entry()
. You can use them in your show rule with #show outline.entry: outrageous.show-entry.with(..outrageous.presets.outrageous-figures)
.
#let presets = (
// outrageous preset for a Table of Contents
outrageous-toc: (
// ...
),
// outrageous preset for List of Figures/Tables/Listings
outrageous-figures: (
// ...
),
// preset without any style changes
typst: (
// ...
),
)
repeat
Utility function to repeat content to fill space with a fixed size gap.
#let repeat(gap: none, justify: false, body) = { .. }
Arguments:
gap
:length
ornone
— The gap between repeated items.justify
:bool
— Whether to increase the gap to justify the items.body
:content
— The content to repeat.
Returns: content
align-helper
Utility function to help with aligning multiple items.
#let align-helper(state-key, what-to-measure, display) = { .. }
Arguments:
state-key
:str
— The key to use for thestate
that keeps track of the maximum encountered width.what-to-measure
:content
— The content to measure at this call.display
:function
— A callback which gets passed the maximum encountered width and the width of the current item (what was given towhat-to-measure
), both aslength
, and should returncontent
which can make use of these widths for alignment.
Returns: content