HoopLang Docs
/
Playground
Referencia del lenguaje

Texto

La primitiva text borda letras con una fuente del catálogo. A diferencia de las demás primitivas (primitivas.md), no recibe una forma: recibe un String, una fuente y una altura (o una caja donde encajarse), y el compilador convierte cada letra en columnas de satín o en relleno tatami. Este capítulo describe sus propiedades, cómo se ubica el texto (at, align, arc, box), cómo se elige entre satín y relleno, las fuentes disponibles y sus límites. La lista de fuentes también está en catalogos.md.

Sintaxis#

Salida del compilador
text HILO "{" propiedades "}"
HoopLang
design "Nombre" { canvas: rect(size: (80mm, 30mm)) }
thread negro = #1c1616 "Negro"
layer texto {
  text negro {
    value: "HANNOVER"
    font: ArialBold
    height: 8mm
    at: (40mm, 19mm)   // con align: center, el centro de la línea base
    align: center
    style: auto
    spacing: 0.5mm
  }
}

Propiedades#

PropiedadTipoPor defectoRango válidoSignificado
valueString— (obligatoria)no vacío (ni sólo espacios)El texto. \n separa líneas.
fontFontStrokever FuentesFuente.
heightLength— (obligatoria sin box)3–300 mmAltura de las mayúsculas (la de la "H"), de la línea base hacia arriba. Con box, es el alto máximo.
atPoint(0mm, 0mm)—Punto de la línea base de la primera línea: su inicio (left), su centro (center) o su final (right). No se permite con box.
alignleft, center, rightleft; center con box—Alineación horizontal respecto de at (o de la caja).
spacingLength0 mm−5–50 mmEspacio extra entre letras; negativo las junta. Se suma al avance de la fuente (con su kerning).
arcLength o nonenone|r| ≥ 10 mmTexto en arco: radio de la línea base. Ver Texto en arco.
styleauto, satin, fillauto—Cómo se bordan las letras. Ver Satín o relleno.
boxShape——Caja en que el texto se encaja solo. Ver Texto en una caja.
min_heightLengthel mínimo de la fuente2–300 mmSólo con box: alto bajo el cual no se achica.

Combinaciones inválidas (todas E007):

MensajeCausa
text is missing valueFalta value.
text needs height, or a box to fit intoNi height ni box.
a text with box is placed by its box: remove `at`box y at juntos.
a text in an arc does not fit a box: use at and heightbox y arc juntos.
min_height is for a text with boxmin_height sin box.

Otros diagnósticos: E004 empty text (valor vacío), E002 para height, min_height, spacing fuera de rango y arc = 5 mm: the radius is at least 10 mm, E002 para una fuente desconocida con sugerencia (`ArialNegrita` is not valid for font; did you mean `ArialBold`?; los nombres anteriores en español se sugieren con su nombre nuevo), y E006 si las letras se salen del canvas.

Ubicación: at y align#

at es un punto de la línea base de la primera línea; align dice qué punto: el inicio (left, por defecto), el centro (center) o el final (right). Las letras se dibujan hacia arriba desde la línea base (y hacia abajo las que bajan, como la "g"). Las coordenadas siguen las del diseño (Y hacia abajo; ver tipos.md).

Varias líneas#

Un \n en value empieza otra línea. Cada línea se alinea por separado respecto del mismo at.x, y la línea base de cada una baja 1.7 × height respecto de la anterior (valor fijo del motor).

HoopLang
design "Dos lineas" { canvas: rect(size: (60mm, 40mm)) }
thread azul = #1f3a8a "Azul"
layer texto {
  text azul { value: "MARÍA\nJOSÉ", font: Roboto, box: canvas.inset(4mm), align: center }
}

Texto en arco#

arc: r dobla la línea base sobre un círculo de radio |r|. La distancia a lo largo de la línea se conserva como largo de arco y la altura de las letras como distancia al círculo. En arco, el texto se centra siempre en at (se ignora align), y at es el punto medio de la línea base:

  • r positivo: el centro del círculo queda r debajo de at; el texto se curva hacia arriba con las letras mirando hacia afuera (el nombre en la parte de arriba de una insignia).
  • r negativo: el centro queda |r| arriba de at; el texto se curva como una sonrisa y las letras miran hacia el centro (el texto de abajo).
HoopLang
design "Insignia" { canvas: circle(center: (40mm, 40mm), r: 40mm) }
thread oro = #d8a21b "Oro"
layer texto {
  // El centro del arco queda 28 mm debajo de `at`: (40mm, 40mm).
  text oro { value: "CLUB DEPORTIVO", font: Varsity, height: 8mm, at: (40mm, 12mm), arc: 28mm }
  // Radio negativo: el centro queda 28 mm arriba de `at`.
  text oro { value: "1926", font: Varsity, height: 8mm, at: (40mm, 68mm), arc: -28mm }
}

Texto en una caja#

Con box, el texto no lleva at: se encaja solo en la caja (se usa el rectángulo que contiene la forma).

  1. Parte del alto height (o, sin height, del alto de la caja; nunca más que el alto de la caja).

  2. Mide las letras reales y, si no caben a lo ancho o a lo alto, achica el alto (unas pocas vueltas, porque spacing no escala con el alto).

  3. No baja de min_height o, sin ella, del alto mínimo de la fuente (tabla de Fuentes). Si ni a ese alto cabe, es E006 con las medidas:

    Salida del compilador
    error E006: text does not fit its box: at the minimum height (12.0 mm) it measures 144.0 × 13.9 mm, the box is 40.0 × 10.0 mm
  4. En horizontal se ubica según align (por defecto center). En vertical se centra la altura de las mayúsculas (de la línea base a height), no la caja de las letras: así todos los nombres de una plancha comparten la línea base, con o sin acentos. Si un acento o una letra que baja se saliera de la caja, el texto se corre lo justo. Con varias líneas, la banda centrada va de las mayúsculas de la primera línea a la línea base de la última.

HoopLang
param nombre = "BENJAMÍN"
design "Parche" { canvas: rect(size: (90mm, 35mm), radius: 8mm) }
thread blanco = #ffffff "Blanco"
layer texto {
  text blanco { value: nombre, font: Montserrat, box: canvas.inset(6mm), height: 12mm, min_height: 6mm }
}

Satín o relleno#

style decide cómo se borda cada letra:

styleFuente StrokeFuentes de contorno
satinCada trazo de la fuente es una columna de satín de ancho fijo.Cada letra se descompone en columnas de satín (las partes demasiado anchas, en relleno).
fillLas letras se rellenan con tatami, con los contornos de la fuente de Block (Archivo Black).Cada letra se rellena con tatami.
autoSatín bajo 20 mm de altura; relleno desde 20 mm.Satín si la mediana del grosor de trazo de las letras es ≤ 6 mm; relleno si no.

Detalles:

  • Columna de Stroke: el ancho es el 17 % de la altura, entre 1.0 y 4.0 mm. El trazo se corta en las esquinas (giros de más de 50°), los tramos se suavizan, y en cada esquina los dos tramos se alargan medio ancho para cubrirla. El punto de la "i" se borda como una columna corta.
  • Parámetros de las puntadas: el satín y el relleno de las letras usan el perfil de la tela del diseño (compensación, underlay automático según el ancho, largo máximo de cruce; ver catalogos.md). En el lenguaje no se pueden cambiar underlay, density ni pull de un texto.
  • Ángulo del relleno: el motor elige uno para todo el texto (el mejor ángulo de la pieza de mayor área), para que las letras se vean parejas.
  • Huecos diminutos: los huecos de una letra de contorno de menos de 0.4 mm se cierran (el hilo los taparía de todos modos).

Orden de las letras#

Las letras se bordan en orden de lectura (línea por línea, de izquierda a derecha). Cada letra termina del lado de la siguiente (en su borde izquierdo, a media altura), para que el tránsito sea corto. Dentro de una capa el compilador puede intercalar otros objetos; dentro de un seq (control.md) el texto se borda entero, letra por letra, en el orden escrito. Un texto girado al montarlo en un hoop (bastidor.md) también se borda letra por letra.

Caracteres#

  • Stroke: ASCII imprimible (32–126) y los acentos y signos del castellano (á é í ó ú ü ñ ¿ ¡ y sus mayúsculas), que se componen sobre la letra base.
  • Fuentes de contorno: los caracteres que trae el archivo TrueType de la fuente (Bebas es sólo mayúsculas).
  • Un carácter que la fuente no tiene se omite sin aviso.

Escalado con fit#

Si el diseño se escala con fit (declaraciones.md), el texto escala con él: height, spacing y arc se multiplican por el mismo factor.

Fuentes#

Stroke es una fuente de un solo trazo (Hershey "futural"); las demás son fuentes de contorno TrueType de licencia libre, incluidas en el compilador. El alto mínimo es el alto de mayúscula bajo el cual sus huecos y uniones son más chicos de lo que el hilo resuelve; se usa como min_height por defecto en una caja.

fontOrigenEstiloAlto mínimo
StrokeHershey futuraltrazo central, ancho parejo4 mm
ArialBoldArimo 700de palo, tipo Arial Bold6 mm
ArialArimo 400de palo, tipo Arial6 mm
FuturaJost 700geométrica6 mm
MontserratMontserrat 700moderna6 mm
PoppinsPoppins Boldmoderna redondeada6 mm
RobotoRoboto 700moderna neutra6 mm
MontserratBlackMontserrat 900extra negra (tipo Arial Black)7 mm
RobotoBlackRoboto 900extra negra7 mm
FuturaBlackJost 900tipo Futura Extra Bold7 mm
BlockArchivo Blackbloque grueso (logos, nombres)7 mm
CondensedAntoncondensada10 mm
BebasBebas Neuecondensada, sólo mayúsculas8 mm
OswaldOswald 600condensada8 mm
VarsityGraduateuniversitaria8 mm
SerifRoboto Slabcon remates6 mm
TimesTinos Boldcon remates clásica6 mm
SlabAlfa Slab Oneremates gruesos8 mm
PlayfairPlayfair Display 700con remates, elegante8 mm
ScriptPacificomanuscrita ligada10 mm
LobsterLobstermanuscrita gruesa10 mm
ElegantDancing Script 700manuscrita elegante10 mm
BrushKaushan Scriptde pincel12 mm
GothicUnifrakturMaguntiagótica12 mm

Nombres anteriores aceptados sólo como sugerencia en el error: Trazo → Stroke, Bloque → Block, Condensada → Condensed, ArialNegrita → ArialBold, Elegante → Elegant, Pincel → Brush, Gotica → Gothic.

HoopLang
design "Estilos" { canvas: rect(size: (120mm, 70mm)) }
thread negro = #1c1616 "Negro"
layer texto {
  text negro { value: "Ana", font: Script, height: 12mm, at: (5mm, 20mm) }                       // auto
  text negro { value: "LUIS", font: Block, height: 25mm, at: (5mm, 55mm), style: fill }           // tatami
  text negro { value: "trazo", font: Stroke, height: 6mm, at: (70mm, 20mm), style: satin }      // columna fija
}

Límites#

  • height entre 3 y 300 mm; min_height entre 2 y 300 mm.
  • Un height explícito (sin box) por debajo del alto mínimo de la fuente da W004 (ver Diagnósticos). También si un place … scale: lo achica bajo ese mínimo.
  • Los caracteres que la fuente no tiene no se bordan y avisan W007.
  • arc de radio al menos 10 mm.
  • spacing entre −5 y 50 mm.