Documentation

stroke

Defines how to draw a line.

A stroke has a paint (a solid color or gradient), a thickness, a line cap, a line join, a miter limit, and a dash pattern. All of these values are optional and have sensible defaults.

Example

#set line(length: 100%)
#stack(
  spacing: 1em,
  line(stroke: 2pt + red),
  line(stroke: (paint: blue, thickness: 4pt, cap: "round")),
  line(stroke: (paint: blue, thickness: 1pt, dash: "dashed")),
  line(stroke: 2pt + gradient.linear(..color.map.rainbow)),
)
Preview

Simple strokes

You can create a simple solid stroke from a color, a thickness, or a combination of the two. Specifically, wherever a stroke is expected you can pass any of the following values:

For full control, you can also provide a dictionary or a stroke object to any function that expects a stroke. The dictionary's keys may include any of the parameters for the constructor function, shown below.

Fields

On a stroke object, you can access any of the fields listed in the constructor function. For example, (2pt + blue).thickness is 2pt. Meanwhile, stroke(red).cap is auto because it's unspecified. Fields set to auto are inherited.

Constructor
Question mark

Converts a value to a stroke or constructs a stroke with the given parameters.

Note that in most cases you do not need to convert values to strokes in order to use them, as they will be converted automatically. However, this constructor can be useful to ensure a value has all the fields of a stroke.

#let my-func(x) = {
    x = stroke(x) // Convert to a stroke
    [Stroke has thickness #x.thickness.]
}
#my-func(3pt) \
#my-func(red) \
#my-func(stroke(cap: "round", thickness: 1pt))
Preview

paint
auto or color or gradient or pattern
RequiredPositional
Question mark

The color or gradient to use for the stroke.

If set to auto, the value is inherited, defaulting to black.

thickness
auto or length
RequiredPositional
Question mark

The stroke's thickness.

If set to auto, the value is inherited, defaulting to 1pt.

cap
auto or str
RequiredPositional
Question mark

How the ends of the stroke are rendered.

If set to auto, the value is inherited, defaulting to "butt".

VariantDetails
"butt"

Square stroke cap with the edge at the stroke's end point.

"round"

Circular stroke cap centered at the stroke's end point.

"square"

Square stroke cap centered at the stroke's end point.

join
auto or str
RequiredPositional
Question mark

How sharp turns are rendered.

If set to auto, the value is inherited, defaulting to "miter".

VariantDetails
"miter"

Segments are joined with sharp edges. Sharp bends exceeding the miter limit are bevelled instead.

"round"

Segments are joined with circular corners.

"bevel"

Segments are joined with a bevel (a straight edge connecting the butts of the joined segments).

dash
none or auto or str or array or dictionary
RequiredPositional
Question mark

The dash pattern to use. This can be:

If set to auto, the value is inherited, defaulting to none.

View options
VariantDetails
"solid"
"dotted"
"densely-dotted"
"loosely-dotted"
"dashed"
"densely-dashed"
"loosely-dashed"
"dash-dotted"
"densely-dash-dotted"
"loosely-dash-dotted"
View example
#set line(length: 100%, stroke: 2pt)
#stack(
  spacing: 1em,
  line(stroke: (dash: "dashed")),
  line(stroke: (dash: (10pt, 5pt, "dot", 5pt))),
  line(stroke: (dash: (array: (10pt, 5pt, "dot", 5pt), phase: 10pt))),
)
Preview

miter-limit
auto or float
RequiredPositional
Question mark

Number at which protruding sharp bends are rendered with a bevel instead or a miter join. The higher the number, the sharper an angle can be before it is bevelled. Only applicable if join is "miter".

Specifically, the miter limit is the maximum ratio between the corner's protrusion length and the stroke's thickness.

If set to auto, the value is inherited, defaulting to 4.0.

View example
#let points = ((15pt, 0pt), (0pt, 30pt), (30pt, 30pt), (10pt, 20pt))
#set path(stroke: 6pt + blue)
#stack(
    dir: ltr,
    spacing: 1cm,
    path(stroke: (miter-limit: 1), ..points),
    path(stroke: (miter-limit: 4), ..points),
    path(stroke: (miter-limit: 5), ..points),
)
Preview