Until typst/typst#553 is
resolved, typst
doesn’t natively support wrapping text around figures
or other content. However, you can use wrap-it
to mimic much of this
functionality:
-
Wrapping images left or right of their text
-
Specifying margins
-
And more
Detailed descriptions of each parameter are available in the wrap-it documentation.
The easiest method is to import wrap-it: wrap-content
from the
@preview
package:
#import "@preview/wrap-it:0.1.0": wrap-content
#let fig = figure(
rect(fill: teal, radius: 0.5em, width: 8em),
caption: [A figure],
)
#let body = lorem(30)
#wrap-content(fig, body)
#wrap-content(
fig,
body,
align: bottom + right,
column-gutter: 2em
)
The easiest way to get a uniform, highly-customizable margin is through boxing your image:
#let boxed = box(fig, inset: 0.25em)
#wrap-content(boxed)[
#lorem(30)
]
Note that for longer captions (as is the case in the bottom figure
below), providing an explicit columns
parameter is necessary to inform
caption text of where to wrap.
#let fig2 = figure(
rect(fill: lime, radius: 0.5em),
caption: [#lorem(10)],
)
#wrap-top-bottom(
bottom-kwargs: (columns: (1fr, 2fr)),
box(fig, inset: 0.25em),
fig2,
lorem(50),
)
Typst can only append labels to figures in content mode. So, when wrapping text around a figure that needs a label, you must first place your figure in a content block with its label, then wrap it:
#show ref: it => underline(text(blue, it))
#let fig = [
#figure(
rect(fill: red, radius: 0.5em, width: 8em),
caption:[Labeled]
)<fig:lbl>
]
#wrap-content(fig, [Fortunately, @fig:lbl's label can be referenced within the wrapped text. #lorem(15)])