strokeDesde: siempre
Define cómo dibujar una línea.
Un trazo tiene una pintura (un color sólido o un degradado), un grosor, un remate de línea (cap), una unión de línea (join), un límite de inglete (miter limit) y un patrón de guiones (dash). Todos estos valores son opcionales y tienen valores por defecto razonables.
Ejemplo
#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)),
)

Trazos simples
Podés crear un trazo sólido simple a partir de un color, un grosor o una combinación de ambos. Específicamente, dondequiera que se espere un trazo podés pasar cualquiera de los siguientes valores:
- Una longitud que especifica el grosor del trazo. El color se hereda, con negro por defecto.
- Un color para usar en el trazo. El grosor se hereda, con
1ptpor defecto. - Un trazo combinado de color y grosor con el operador
+, como en2pt + red.
Para tener control total, también podés proporcionar un diccionario o un objeto stroke a cualquier función que espere un trazo. Las claves del diccionario pueden incluir cualquiera de los parámetros de la función constructora, que se muestran abajo.
Campos
En un objeto trazo, podés acceder a cualquiera de los campos enumerados en la función constructora. Por ejemplo, (2pt + blue).thickness es 2pt. Mientras tanto, stroke(red).cap es auto porque no está especificado. Los campos establecidos en auto se heredan.
Constructor
Convierte un valor en un trazo o construye un trazo con los parámetros dados.
Tené en cuenta que, en la mayoría de los casos, no necesitás convertir valores en trazos para usarlos, ya que se convertirán automáticamente. Sin embargo, este constructor puede ser útil para asegurarte de que un valor tenga todos los campos de un trazo.
Ver ejemplo
#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))

paint
El color o degradado que se usa para el trazo.
Si se establece en auto, el valor se hereda, con black por defecto.
thickness
El grosor del trazo.
Si se establece en auto, el valor se hereda, con 1pt por defecto.
cap
Cómo se renderizan los extremos del trazo.
Si se establece en auto, el valor se hereda, con "butt" por defecto.
| Variante | Detalles |
|---|---|
"butt" | Terminación de trazo cuadrada con el borde en el punto final del trazo. |
"round" | Terminación de trazo circular centrada en el punto final del trazo. |
"square" | Terminación de trazo cuadrada centrada en el punto final del trazo. |
join
Cómo se renderizan los giros bruscos.
Si se establece en auto, el valor se hereda, con "miter" por defecto.
| Variante | Detalles |
|---|---|
"miter" | Los segmentos se unen con bordes filosos. Los quiebres filosos que superan el límite de inglete se biselan en su lugar. |
"round" | Los segmentos se unen con esquinas redondeadas. |
"bevel" | Los segmentos se unen con un bisel (un borde recto que conecta los extremos de los segmentos unidos). |
dash
El patrón de guiones que se usa. Puede ser:
- Uno de los patrones predefinidos que se enumeran abajo.
none, equivalente al patrón predefinido"solid".- Un array con longitudes alternadas de guiones y espacios. También podés usar la cadena
"dot"para una longitud igual al grosor de la línea. - Un diccionario con las claves
array(igual que el array de arriba) yphase(de tipo longitud), que define en qué parte del patrón se empieza a dibujar.
Si se establece en auto, el valor se hereda, con none por defecto.
Ver ejemplo: Uso
#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))),
)

Ver ejemplo: Patrones predefinidos
#set page(width: auto, height: auto)
#let patterns = (
("dotted", "dashed", "dash-dotted").map(d => (
"loosely-" + d,
d,
"densely-" + d,
))
).flatten()
#let display(dash) = {
set par(spacing: 0.3em)
show "loosely": set text(eastern.darken(17%))
show "densely": set text(purple)
let derived = dash.starts-with("loosely-") or dash.starts-with("densely-")
if derived { dash } else { strong(dash) }
rect(
line(stroke: (dash: dash), length: 100%),
stroke: none,
fill: yellow.transparentize(80%),
)
}
#table(
columns: 3,
stroke: none,
align: (left, center, left),
table.cell(colspan: 3, align: center, display("solid")),
..patterns.map(display),
)

| Variante | Detalles |
|---|---|
"solid" | () |
"dotted" | ("dot", 2pt) |
"densely-dotted" | ("dot", 1pt) |
"loosely-dotted" | ("dot", 4pt) |
"dashed" | (3pt, 3pt) |
"densely-dashed" | (3pt, 2pt) |
"loosely-dashed" | (3pt, 6pt) |
"dash-dotted" | (3pt, 2pt, "dot", 2pt) |
"densely-dash-dotted" | (3pt, 1pt, "dot", 1pt) |
"loosely-dash-dotted" | (3pt, 4pt, "dot", 4pt) |
miter-limit
Número a partir del cual las curvas bruscas que sobresalen se renderizan con un bisel en lugar de una unión en inglete. Cuanto mayor sea el número, más agudo puede ser un ángulo antes de que se bisele. Solo es aplicable si join es "miter".
Específicamente, el límite de inglete es la relación máxima entre la longitud de la protrusión de la esquina y el grosor del trazo.
Si se establece en auto, el valor se hereda, con 4.0 por defecto.
Ver ejemplo
#let items = (
curve.move((15pt, 0pt)),
curve.line((0pt, 30pt)),
curve.line((30pt, 30pt)),
curve.line((10pt, 20pt)),
)
#set curve(stroke: 6pt + blue)
#stack(
dir: ltr,
spacing: 1cm,
curve(stroke: (miter-limit: 1), ..items),
curve(stroke: (miter-limit: 4), ..items),
curve(stroke: (miter-limit: 5), ..items),
)
