Traducción no oficial al español rioplatense, generada con IA (Claude Sonnet 5.5) bajo la dirección y revisión de Jassiel Ovando. No es una publicación de Typst GmbH ni cuenta con su aval; ante cualquier duda, prevalece la documentación oficial en inglés. ¿Un error de traducción o una sugerencia? Reportalo. Tipografía: Reforma, de PampaType.

Scripting

Typst incorpora un potente lenguaje de scripting. Podés automatizar tus documentos y crear estilos más sofisticados con código. A continuación, una descripción general de los conceptos de scripting.

Expresiones

En Typst, el marcado y el código están fusionados. Todos los elementos, salvo los más comunes, se crean con funciones. Para que esto sea lo más cómodo posible, Typst ofrece una sintaxis compacta para incrustar una expresión de código en el marcado: una expresión se introduce con un numeral (#) y el análisis normal del marcado se retoma cuando la expresión termina. Si un carácter continuaría la expresión pero debe interpretarse como texto, se puede terminar la expresión a la fuerza con un punto y coma (;). Podés escapar un # o un ; literal con una barra invertida.

#emph[Hello] \ #emoji.face \ #"hello".len()

El ejemplo anterior muestra algunas de las expresiones disponibles, incluidas las llamadas a funciones, los accesos a campos y las llamadas a métodos. En el resto de este capítulo se tratan más tipos de expresiones. Algunos tipos de expresiones no son compatibles con la sintaxis del numeral (por ejemplo, las expresiones con operadores binarios). Para incrustarlas en el marcado, podés usar paréntesis, como en #(1 + 2).

Bloques

Para estructurar tu código e incrustarle marcado, Typst ofrece dos tipos de bloques:

Los bloques de contenido y de código se pueden anidar arbitrariamente. En el siguiente ejemplo, [hello ] se une con la salida de a + [ the ] + b, lo que da [hello from the *world*].

#{ let a = [from] let b = [*world*] [hello ] a + [ the ] + b }

Enlaces y desestructuración

Como ya se demostró arriba, las variables se pueden definir con enlaces let. A la variable se le asigna el valor de la expresión que sigue al signo =. Un nombre de variable válido puede contener -, pero no puede empezar con -. La asignación de un valor es opcional: si no se asigna ningún valor, la variable se inicializa como none. La palabra clave let también se puede usar para crear una función personalizada con nombre. Se puede acceder a las variables durante el resto del bloque que las contiene (o durante el resto del archivo, si no hay un bloque que las contenga).

#let name = "Typst" This is #name's documentation. It explains #name. #let my-add(x, y) = x + y Sum is #my-add(2, 3).

Los enlaces let también se pueden usar para desestructurar arrays y diccionarios. En ese caso, la estructura del lado izquierdo de la asignación debe reflejar el array o el diccionario: con enlaces que se corresponden por posición en los arrays y por nombre de clave en los diccionarios. El operador .. se puede usar una vez en el patrón para recolectar el resto de los elementos del array o del diccionario.

#let (x, y) = (1, 2) The coordinates are #x, #y. #let (a, .., b) = (1, 2, 3, 4) The first element is #a. The last element is #b. #let books = ( Shakespeare: "Hamlet", Homer: "The Odyssey", Austen: "Persuasion", ) #let (Austen,) = books Austen wrote #Austen. #let (Homer: h) = books Homer wrote #h. #let (Homer, ..other) = books #for (author, title) in other [ #author wrote #title. ]

Podés usar el guion bajo para descartar elementos en un patrón de desestructuración:

#let (_, y, _) = (1, 2, 3) The y coordinate is #y.

La desestructuración también funciona en las listas de argumentos de funciones …

#let left = (2, 4, 5) #let right = (3, 2, 6) #left.zip(right).map( ((a,b)) => a + b )

… y en el lado izquierdo de las asignaciones normales. Esto puede ser útil, entre otras cosas, para intercambiar variables.

#{ let a = 1 let b = 2 (a, b) = (b, a) [a = #a, b = #b] }

Condicionales

Con un condicional, podés mostrar o calcular cosas distintas según se cumpla o no una condición. Typst admite las expresiones if, else if y else. Cuando la condición se evalúa como true, el condicional devuelve el valor que resulta del cuerpo del if. De lo contrario, devuelve el valor que resulta del cuerpo del else.

#if 1 < 2 [ This is shown ] else [ This is not. ]

Cada rama puede tener como cuerpo un bloque de código o de contenido.

Bucles

Con los bucles, podés repetir contenido o calcular algo de forma iterativa. Typst admite dos tipos de bucles: for y while. Los primeros iteran sobre una colección especificada, mientras que los segundos iteran mientras se siga cumpliendo una condición. Igual que los bloques, los bucles unen los resultados de cada iteración en un solo valor.

En el siguiente ejemplo, las tres oraciones creadas por el bucle for se unen en un único valor de contenido y los arrays de longitud 1 del bucle while se unen en un array más grande.

#for c in "ABC" [ #c is a letter. ] #let n = 2 #while n < 10 { n = (n * 2) - 1 (n,) }

Los bucles for pueden iterar sobre una variedad de colecciones:

Para controlar la ejecución del bucle, Typst ofrece las sentencias break y continue. La primera sale anticipadamente del bucle, mientras que la segunda salta a la siguiente iteración.

#for letter in "abc nope" { if letter == " " { break } letter }

El cuerpo de un bucle puede ser un bloque de código o de contenido:

Campos

Podés usar la notación con punto para acceder a los campos de un valor. Para los valores de tipo content, también podés usar la función fields para listar los campos.

El valor en cuestión puede ser:

#let it = [= Heading] #it.body \ #it.depth \ #it.fields() #let dict = (greet: "Hello") #dict.greet \ #emoji.face

Métodos

Una llamada a método es una forma cómoda de llamar a una función que pertenece al ámbito del tipo de un valor. Por ejemplo, podemos llamar a la función str.len de las dos maneras equivalentes siguientes:

#str.len("abc") is the same as #"abc".len()

La estructura de una llamada a método es value.method(..args) y su llamada a función completa equivalente es type(value).method(value, ..args). La documentación de cada tipo enumera las funciones de su ámbito. Actualmente no podés definir tus propios métodos.

#let values = (1, 2, 3, 4) #values.pop() \ #values.len() \ #("a, b, c" .split(", ") .join[ --- ]) #"abc".len() is the same as #str.len("abc")

Hay algunas funciones especiales que modifican el valor sobre el que se las llama (por ejemplo, array.push). Estas funciones deben llamarse en forma de método. En algunos casos, cuando el método se llama solo por su efecto secundario, su valor de retorno se debe ignorar (y no participar en la unión). La forma canónica de descartar un valor es con un enlace let: let _ = array.remove(1).

Módulos

Podés dividir tus proyectos de Typst en varios archivos llamados módulos. Un módulo puede referirse al contenido y a las definiciones de otro módulo de varias maneras:

En lugar de una cadena de texto o una ruta, también podés usar un valor de módulo, como se muestra en el siguiente ejemplo:

#import emoji: face #face.grin

Paquetes

Para reutilizar componentes entre proyectos, también podés crear e importar paquetes de Typst. La importación de un paquete se especifica como una tripla formada por un espacio de nombres, un nombre y una versión.

#import "@preview/example:0.1.0": add #add(2, 7)

El espacio de nombres preview contiene paquetes compartidos por la comunidad. Podés encontrar todos los paquetes de la comunidad disponibles en Typst Universe.

Si usás Typst de forma local, también podés crear tus propios paquetes locales del sistema. Para más detalles, mirá el repositorio de paquetes.

Operadores

La siguiente tabla enumera todos los operadores unarios y binarios disponibles, con su efecto, su aridad (unario, binario) y su nivel de precedencia (los más altos se asocian con más fuerza). Algunas operaciones, como el módulo, no tienen una sintaxis especial y se pueden lograr con funciones del módulo calc.

OperadorEfectoAridadPrecedencia
-NegaciónUnario7
+Sin efecto (existe por simetría)Unario7
*MultiplicaciónBinario6
/DivisiónBinario6
+SumaBinario5
-RestaBinario5
==Verifica igualdadBinario4
!=Verifica desigualdadBinario4
<Verifica menor queBinario4
<=Verifica menor o igual queBinario4
>Verifica mayor queBinario4
>=Verifica mayor o igual queBinario4
inVerifica si está en una colecciónBinario4
not inVerifica si no está en una colecciónBinario4
not“No” lógicoUnario3
and“Y” lógico con cortocircuitoBinario3
or“O” lógico con cortocircuitoBinario2
=AsignaciónBinario1
+=Asignación con sumaBinario1
-=Asignación con restaBinario1
*=Asignación con multiplicaciónBinario1
/=Asignación con divisiónBinario1