diff --git a/packages/preview/visillos-excelencia/0.3.0/LICENSE b/packages/preview/visillos-excelencia/0.3.0/LICENSE new file mode 100644 index 0000000000..e6d7607757 --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Jesús Manuel González Meneses + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/preview/visillos-excelencia/0.3.0/README.md b/packages/preview/visillos-excelencia/0.3.0/README.md new file mode 100644 index 0000000000..8306d15c79 --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/README.md @@ -0,0 +1,133 @@ +# Visillos Excelencia + +An unofficial Typst template for Excellence Baccalaureate research projects at IES Carmen Martín Gaite (Spain). + +Plantilla no oficial para la redacción y formateo de los Proyectos del Bachillerato de Excelencia, diseñada específicamente para el IES Carmen Martín Gaite (Navalcarnero). + +![Portada de la plantilla](https://github.com/13Stokes31/visillos-excelencia/raw/v0.3.0/thumbnail.png) + +Esta plantilla automatiza la creación de la portada, los índices (general, de figuras y de tablas), el formato de página, los márgenes, la numeración de ecuaciones y la bibliografía, permitiendo a los alumnos centrarse exclusivamente en el contenido de su investigación. + +## Uso + +Para empezar un nuevo proyecto usando esta plantilla, simplemente abre tu terminal y ejecuta el siguiente comando: + +```bash +typst init @preview/visillos-excelencia mi-proyecto +``` + +Esto creará una nueva carpeta llamada `mi-proyecto` con la estructura de archivos necesaria y un archivo `main.typ` listo para ser editado. + +Si usas la Typst Web App, simplemente dale a "Start from template" y busca `visillos-excelencia`. + +## Compilar el documento + +Para generar el PDF final, navega a la carpeta de tu proyecto en la terminal y ejecuta: + +```bash +typst compile main.typ +``` + +## Estructura generada + +Al inicializar la plantilla, obtendrás una estructura de carpetas lista para trabajar: + +- `main.typ`: El archivo principal donde configuras los datos de tu proyecto y llamas al resto de capítulos. +- `Logo.svg`: El logo del instituto para la portada. +- `referencias.yaml`: Archivo donde guardarás tu bibliografía en formato YAML o BibTeX. +- `Archivos/`: Una carpeta pre-organizada con los diferentes capítulos (Abstract, Introducción, Capítulo 1, etc.) una subcarpeta para tus imágenes y otra, `Datos/`, con el CSV de las medidas. + +Los capítulos traen un **trabajo de ejemplo inventado** («¿Cuánto tarda en enfriarse un café?») que usa casi todo lo que se puede hacer: citas bibliográficas, notas al pie, listas, recuadros, ecuaciones numeradas y citadas, tablas, imágenes, gráficas con `lilaq` leídas de un CSV, anexos y glosario. Cada fichero explica en comentarios cómo se hace cada cosa. Sustitúyelo por tu trabajo. + +Los capítulos **no necesitan importar la plantilla**: basta con el `#import` del `main.typ`. Así, para pasar el proyecto a otra versión (o a otra plantilla con la misma configuración) solo se cambia esa línea. Si en un capítulo quieres usar una función del paquete, como `insertar-imagen`, impórtala en ese capítulo. + +## Configuración del proyecto + +En el archivo `main.typ`, encontrarás la función `proyecto` que configura todo el documento. Puedes modificar los siguientes parámetros: + +- `titulo`: El título de tu investigación. +- `autor`: Tu nombre completo. +- `supervisor`: El nombre de tu tutor/a del proyecto. +- `instituto`: Por defecto, "IES Carmen Martín Gaite". +- `lugar`: Por defecto, "Navalcarnero". +- `fecha`: La fecha de entrega o defensa. +- `logo`: La imagen del logo para la portada (por defecto `image("Logo.svg", width: 30%)`). +- `convocatoria`: Texto opcional al pie de la portada, por ejemplo el premio al que se presenta el proyecto. +- `fuente`: La tipografía del documento. Se recomienda "Libertinus Serif" (incluida en Typst) o "Times New Roman" si la tienes instalada localmente. +- `fuente-portada`: Tipografía solo para la portada (por defecto, la misma que `fuente`). +- `tamano-fuente`: Tamaño del texto (por defecto `12pt`). Los títulos escalan con él. +- `interlineado`: Interlineado del texto (por defecto `1em`). +- `color-acento`: Color de los títulos de capítulo (por defecto `rgb("#279985")`). +- `abstract`, `resumen`, `agradecimientos`: Las páginas iniciales. La plantilla les pone título, página propia, numeración romana y entrada en el índice. +- `bibliografia`: La bibliografía, p. ej. `bibliography("referencias.yaml", style: "apa", title: "Bibliografía")`. Va al final del documento. +- `lista-figuras`, `lista-tablas`: Las listas van al final, después de la bibliografía. Por defecto (`auto`) cada una aparece solo si el documento tiene figuras/tablas; con `true` aparece siempre y con `false` nunca. + +Cualquier pieza opcional (abstract, resumen, agradecimientos, bibliografía y listas) se quita igual: con `false` o `none`. +- `doble-cara`: Por defecto `false`. Ponlo a `true` si vas a imprimir a doble cara: cada capítulo abrirá en página impar (insertando páginas en blanco donde haga falta) y los números de página irán en el lado exterior. +- `contar-palabras`: Por defecto `false`. Con `true`, debajo del índice aparece la extensión del trabajo: las palabras desde el primer capítulo hasta el final de los anexos. No cuenta portada, páginas iniciales, índice, bibliografía, listas, figuras, tablas ni ecuaciones. + +## Anexos + +Escribe `#show: anexos` en el `main.typ` justo antes de incluir los anexos. A partir de ahí: + +- el título `= Anexos` sale sin número; +- cada `==` es un anexo numerado: «Anexo I. Título», «Anexo II. Título»…; +- las figuras, tablas y ecuaciones se numeran con el anexo: Figura I.1, Tabla II.3…; +- si pones una etiqueta al anexo (`== Fotografías `), `@anexo-fotos` escribe «Anexo II» con enlace. + +Además, la plantilla numera figuras, tablas y ecuaciones **por capítulo** (Figura 2.1, ecuación (3.1)…), rellena el título y el autor en las propiedades del PDF, y muestra el capítulo actual en la cabecera de cada página. + +## Figuras: borde y nota + +La plantilla trae en `Archivos/funciones.typ` una función `figura` para poner +borde y nota con un argumento. Se importa al principio del capítulo que la use: + +```typst +#import "funciones.typ": figura + +#figura( + "Imágenes/foto.png", // ruta desde la carpeta Archivos + titulo: [Título de la figura], + ancho: 80%, // opcional + borde: true, // opcional: true (borde negro) o false + nota: [Elaboración propia.], // opcional: «Nota. Elaboración propia.», estilo APA +) +``` + +En lugar de la ruta puede ir una tabla o una gráfica: `#figura(table(…), titulo: […], nota: […])`. +La nota sale debajo, en letra pequeña y con «*Nota.*» delante, y admite citas +(`@etiqueta`). El `#figure` normal de Typst sigue funcionando igual. + +`funciones.typ` no depende de la plantilla: el cambio de una plantilla a otra sigue +siendo solo la línea del `#import` del `main.typ`. + +## Ejemplo de main.typ + +```typst +#import "@preview/visillos-excelencia:0.3.0": * + +#show: proyecto.with( + titulo: "Impacto de la Inteligencia Artificial en la Educación", + autor: "Nombre del Alumno", + supervisor: "Nombre del Profesor", + fecha: "Mayo 2026", + abstract: include "Archivos/00_1_Abstract.typ", + resumen: include "Archivos/00_2_Resumen.typ", + agradecimientos: include "Archivos/00_3_Agradecimientos.typ", + bibliografia: bibliography("referencias.yaml", style: "apa", title: "Bibliografía"), +) + +#include "Archivos/01_Introducción.typ" +// Añade el resto de tus capítulos aquí... + +#show: anexos +#include "Archivos/04_Anexos.typ" +``` + +## Plantilla hermana: luisito-u + +[luisito-u](https://github.com/13Stokes31/luisito-u) acepta exactamente la misma configuración con otra portada (la de los premios de ciencia para Bachillerato). Un proyecto escrito con una se pasa a la otra cambiando solo la línea del `#import`. + +## Licencia + +Este proyecto está distribuido bajo la licencia MIT. diff --git a/packages/preview/visillos-excelencia/0.3.0/lib.typ b/packages/preview/visillos-excelencia/0.3.0/lib.typ new file mode 100644 index 0000000000..45f4a40d67 --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/lib.typ @@ -0,0 +1,296 @@ +#import "@preview/wordometer:0.1.6": word-count-of + +//// Funciones //// + +// Extrae el texto plano de un contenido sencillo (para los metadatos del PDF). +#let a-texto(c) = { + if type(c) == str { c } + else if type(c) != content { str(c) } + else if c == [ ] { " " } + else if c.has("text") { c.text } + else if c.has("children") { c.children.map(a-texto).join() } + else if c.has("body") { a-texto(c.body) } + else { "" } +} + +// ¿Está esta ubicación dentro de los anexos? (después de la marca que pone `anexos`) +#let en-anexos(ubicacion) = query(selector().before(ubicacion)).len() > 0 + +// Prefijo de la numeración por capítulo: el número del capítulo, +// o el del anexo en romanos si estamos en los anexos. +#let prefijo(ubicacion) = { + let h = counter(heading).at(ubicacion) + if en-anexos(ubicacion) and h.len() > 1 and h.at(1) > 0 { + numbering("I", h.at(1)) + } else { + str(h.first()) + } +} + +// Número "capítulo.n" de una figura/tabla/ecuación, calculado en SU ubicación +// (así las referencias y las listas muestran el capítulo correcto). +#let numero-en-capitulo(contador, ubicacion, ecuacion: false) = { + let n = prefijo(ubicacion) + "." + str(contador.at(ubicacion).first()) + if ecuacion { "(" + n + ")" } else { n } +} + +#let insertar-imagen( + anchura: auto, + altura: auto, + borde: none, + ubicacion: none, // la imagen, p. ej. image("Imágenes/foto.png") + descripcion: none, +) = { + figure( + box(stroke: borde, { + // Aplica anchura/altura salvo que la imagen ya traiga los suyos + set image(width: anchura, height: altura) + ubicacion + }), + caption: descripcion + ) +} + +// Anexos: se activa con `#show: anexos` antes de incluirlos. Cada `==` es un +// anexo ("Anexo I.", "Anexo II."…), con sus figuras numeradas I.1, I.2… +// y citable con @etiqueta ("Anexo I"). +#let anexos(body) = { + [#metadata(none) ] + // Los títulos sin numerar no avanzan el contador: se avanza a mano para que + // los anexos empiecen en I aunque el último capítulo tenga apartados. + counter(heading).step(level: 1) + set heading(numbering: (..n) => { + let p = n.pos() + if p.len() == 2 { "Anexo " + numbering("I", p.at(1)) + "." } + else if p.len() > 2 { numbering("I.1.", ..p.slice(1)) } + }) + show heading.where(level: 1): set heading(numbering: none) + // Cada anexo reinicia la numeración de figuras, tablas y ecuaciones + show heading.where(level: 2): it => { + counter(figure.where(kind: image)).update(0) + counter(figure.where(kind: table)).update(0) + counter(math.equation).update(0) + it + } + body +} + +#let proyecto( + titulo: [Título del proyecto], + autor: [Nombre del Alumno], + supervisor: [Nombre del Tutor], + instituto: [IES Carmen Martín Gaite], + lugar: [Navalcarnero], + fecha: [Mayo 2026], + logo: none, + convocatoria: none, // texto opcional al pie de la portada, p. ej. el premio al que se presenta + fuente: "Libertinus Serif", + fuente-portada: none, // fuente de la portada; con none, la misma del texto + tamano-fuente: 12pt, + interlineado: 1em, + color-acento: rgb("#279985"), + // Todas las piezas opcionales se quitan igual: con none o con false. + abstract: none, // contenido para incluirlo + resumen: none, // contenido para incluirlo + agradecimientos: none, // contenido para incluirlo + bibliografia: none, // p. ej. bibliography("referencias.yaml", style: "apa", title: "Bibliografía") + lista-figuras: auto, // auto: solo si hay figuras · true: siempre · false/none: nunca + lista-tablas: auto, // auto: solo si hay tablas · true: siempre · false/none: nunca + doble-cara: false, // true: capítulos en página impar (para imprimir a doble cara) + contar-palabras: false, // true: muestra tras el índice las palabras del primer capítulo al último anexo + body, +) = { + // ¿Está apagada una pieza opcional? (none y false funcionan igual) + let apagado(v) = v == none or v == false + + // Metadatos del PDF + set document(title: a-texto(titulo), author: a-texto(autor)) + + // Salto de sección: solo fuerza página impar si se imprime a doble cara + let salto = () => pagebreak(weak: true, to: if doble-cara { "odd" } else { none }) + // A doble cara el número de página va al lado exterior; a una cara, a la derecha + let lado-de(pagina) = if doble-cara and calc.even(pagina) { left } else { right } + + // Configuración de página + set page( + margin: (left: 2.5cm, right: 2.5cm, top: 2.5cm, bottom: 2.5cm), + ) + + set text(tamano-fuente, font: fuente, lang: "es") + + // Numeración por capítulo: Figura 2.1, Tabla 3.2, ecuación (1.4) + // (en los anexos, con el número del anexo: Figura I.1) + set math.equation(numbering: n => context "(" + prefijo(here()) + "." + str(n) + ")") + set figure(numbering: n => context prefijo(here()) + "." + str(n)) + + // Referencias cruzadas: el capítulo se calcula en la ubicación del elemento + show ref: it => { + let el = it.element + if el == none { return it } + let ubi = el.location() + if el.func() == math.equation { + link(ubi, numero-en-capitulo(counter(math.equation), ubi, ecuacion: true)) + } else if el.func() == figure { + link(ubi, [#el.supplement #numero-en-capitulo(counter(figure.where(kind: el.kind)), ubi)]) + } else if el.func() == heading and el.level == 2 and en-anexos(ubi) { + link(ubi, [Anexo #numbering("I", counter(heading).at(ubi).at(1))]) + } else { + it + } + } + + // Portada + { + set text(font: fuente-portada) if fuente-portada != none + v(2fr) + if logo != none { + align(center, box(radius: 3pt, clip: true, logo)) + } + v(1.6fr) + align(center, text(14pt, "Proyecto de Excelencia")) + v(1fr) + align(center, text(30pt, hyphenate: false, weight: "bold", upper(titulo))) + v(1.6fr) + align(center, text(20pt, [Realizado por: ] + autor)) + v(1.6fr) + align(center, text(14pt, instituto)) + v(0.6fr) + align(center, text(14pt, smallcaps[Bachillerato de Excelencia])) + v(1fr) + align(center, text(14pt, lugar + [, ] + fecha)) + v(0.6fr) + line(start: (25%, 0pt), end: (75%, 0pt)) + v(0.6fr) + align(center, text(14pt, [Supervisado por: ] + supervisor)) + v(1.6fr) + + if not apagado(convocatoria) { + v(1fr) + align(center, text(12pt, convocatoria)) + } + } + salto() + + // Numeración romana para las páginas iniciales y el índice + set par(justify: true, leading: interlineado, spacing: 20pt) + counter(page).update(1) + set page(numbering: "I", footer: context { + let pagina = counter(page).get().first() + align(lado-de(pagina), counter(page).display("I")) + }) + + // Estilos de encabezado (capítulos, portadillas iniciales y títulos de índice) + show heading.where(level: 1): it => [ + #salto() + #counter(figure.where(kind: image)).update(0) + #counter(figure.where(kind: table)).update(0) + #counter(math.equation).update(0) + #v(10pt) + #set text(size: tamano-fuente + 4pt, fill: color-acento) + #it + ] + + show heading.where(level: 2): it => [ + #v(5pt) + #set text(size: tamano-fuente + 2pt, weight: "bold", fill: rgb("#2a2a2a")) + #it + ] + + show heading.where(level: 3): it => [ + #set text(size: tamano-fuente, weight: "regular", style: "italic", fill: black) + #it + ] + + set heading(numbering: "1.") + + // Nota debajo de una figura o tabla, al estilo APA. En el cuerpo de la figura, + // después de la imagen: #[Elaboración propia.] → «Nota. Elaboración propia.» + show : it => block(width: 100%, above: 0.8em, align(left, { + set par(first-line-indent: 0pt) + text(size: tamano-fuente - 2pt)[_Nota._ #it] + })) + + // Formato de las descripciones de figuras y tablas + show figure.caption: set align(left) + set figure.caption(position: top) + + show figure.caption: it => block(width: 100%)[ + #set text(size: tamano-fuente - 2pt) + #set par(spacing: 1em) + #strong[#it.supplement #context it.counter.display(it.numbering)] + #emph[#it.body] + ] + + // Páginas iniciales: cada una con su título, en su página y en el índice + let portadilla(nombre, cuerpo) = { + heading(level: 1, numbering: none, outlined: true, nombre) + cuerpo + } + if not apagado(abstract) { portadilla([Abstract], abstract) } + if not apagado(resumen) { portadilla([Resumen], resumen) } + if not apagado(agradecimientos) { portadilla([Agradecimientos], agradecimientos) } + + // Índice general (capítulos en negrita) + { + show outline.entry.where(level: 1): it => { + v(12pt, weak: true) + strong(it) + } + outline(depth: 2, indent: auto) + } + + // Extensión del trabajo: cuenta el texto del cuerpo (capítulos y anexos), sin + // figuras, tablas ni ecuaciones; las páginas iniciales y la bibliografía van aparte. + if contar-palabras { + let palabras = word-count-of(body, exclude: figure).words + v(1.5em) + align(right, text(style: "italic")[Extensión del trabajo: #palabras palabras]) + } + + // Cuerpo del documento: numeración arábiga y cabecera con el capítulo actual + set page( + numbering: "1", + header: context { + let pagina = here().page() + // En la página donde arranca un capítulo no hay cabecera + if query(heading.where(level: 1)).any(h => h.location().page() == pagina) { return } + let previos = query(selector(heading.where(level: 1)).before(here())) + if previos.len() == 0 { return } + let capitulo = previos.last() + let numero = if capitulo.numbering == none { [] } else { + [#numbering("1.", counter(heading).at(capitulo.location()).first()) ] + } + align(lado-de(pagina), text(tamano-fuente - 2pt, style: "italic", numero + capitulo.body)) + }, + footer: context { + let pagina = counter(page).get().first() + align(lado-de(pagina), counter(page).display("1")) + }, + ) + counter(page).update(1) + + // AQUÍ SE VOLCARÁ EL TEXTO DEL ALUMNO + body + + // Bibliografía + if not apagado(bibliografia) { bibliografia } + + // Listas finales de figuras y tablas, con el número "capítulo.n" de cada una. + // Con auto, la lista solo aparece si el documento tiene elementos de su tipo. + let lista-de(nombre, tipo, modo) = context { + if modo == true or (modo == auto and query(figure.where(kind: tipo)).len() > 0) { + heading(level: 1, numbering: none, outlined: true, nombre) + show outline.entry: it => context { + let el = it.element + v(12pt, weak: true) + strong(it.indented( + [#el.supplement #numero-en-capitulo(counter(figure.where(kind: tipo)), el.location())], + it.inner(), + )) + } + outline(title: none, target: figure.where(kind: tipo)) + } + } + lista-de([Lista de figuras], image, lista-figuras) + lista-de([Lista de tablas], table, lista-tablas) +} diff --git a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/00_1_Abstract.typ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/00_1_Abstract.typ new file mode 100644 index 0000000000..1e7b54c575 --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/00_1_Abstract.typ @@ -0,0 +1,10 @@ +// El título "Abstract" lo pone la plantilla: aquí va solo el texto. +// Es el resumen en inglés. Suele pedirse entre 150 y 250 palabras. + +How long does it take for a cup of coffee to cool down? This project studies the cooling of coffee at home using Newton's law of cooling, which states that the rate at which a hot body loses heat is proportional to the difference between its temperature and the temperature of its surroundings. + +We measured the temperature of two cups of coffee, one with a lid and one without, every two minutes for forty minutes, using a digital thermometer and a stopwatch. The data were fitted to an exponential model by linear regression of the logarithm of the temperature difference. + +Both cups follow Newton's law very closely ($R^2 > 0.999$). The cooling constant of the uncovered cup ($k = 0.045 thin "min"^(-1)$) is about 1.6 times larger than that of the covered cup ($k = 0.028 thin "min"^(-1)$), so a lid keeps coffee above 60 °C for seven extra minutes. These results show that evaporation from the open surface plays an important role in everyday cooling. + +*Keywords:* Newton's law of cooling, heat transfer, exponential decay, linear regression. diff --git a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/00_2_Resumen.typ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/00_2_Resumen.typ new file mode 100644 index 0000000000..fcf1bea457 --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/00_2_Resumen.typ @@ -0,0 +1,9 @@ +// El título "Resumen" lo pone la plantilla: aquí va solo el texto. + +¿Cuánto tarda en enfriarse una taza de café? En este trabajo estudiamos el enfriamiento del café en casa a partir de la ley de enfriamiento de Newton, según la cual la rapidez con la que un cuerpo caliente pierde calor es proporcional a la diferencia entre su temperatura y la del ambiente. + +Medimos la temperatura de dos tazas de café, una con tapa y otra sin ella, cada dos minutos durante cuarenta minutos, con un termómetro digital y un cronómetro. Ajustamos los datos a un modelo exponencial mediante una regresión lineal del logaritmo de la diferencia de temperaturas. + +Las dos tazas siguen la ley de Newton con mucha precisión ($R^2 > 0.999$). La constante de enfriamiento de la taza sin tapa ($k = 0.045 thin "min"^(-1)$) es unas 1.6 veces mayor que la de la taza con tapa ($k = 0.028 thin "min"^(-1)$): la tapa mantiene el café por encima de 60 °C siete minutos más. Los resultados indican que la evaporación por la superficie abierta influye mucho en el enfriamiento cotidiano. + +*Palabras clave:* ley de enfriamiento de Newton, transmisión del calor, decaimiento exponencial, regresión lineal. diff --git a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/00_3_Agradecimientos.typ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/00_3_Agradecimientos.typ new file mode 100644 index 0000000000..e9546786b0 --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/00_3_Agradecimientos.typ @@ -0,0 +1,6 @@ +// El título "Agradecimientos" lo pone la plantilla: aquí va solo el texto. +// (Este trabajo es un ejemplo inventado para enseñar la plantilla.) + +Queremos dar las gracias a nuestra tutora por guiarnos durante todo el proyecto y por enseñarnos que una pregunta sencilla puede llevar a mucha física y muchas matemáticas. + +Gracias también al departamento de Física y Química del centro, que nos prestó el termómetro digital, y a nuestras familias, que soportaron una semana de cafés fríos en la cocina. diff --git "a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/01_Introducci\303\263n.typ" "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/01_Introducci\303\263n.typ" new file mode 100644 index 0000000000..f3e5c40fc7 --- /dev/null +++ "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/01_Introducci\303\263n.typ" @@ -0,0 +1,47 @@ +// Un "=" es un capítulo; "==", un apartado; "===", un subapartado. +// La plantilla los numera y los mete en el índice sola. + += Introducción + +Todos hemos dejado alguna vez una taza de café sobre la mesa y, al volver, nos lo hemos encontrado frío. ¿Cuánto tiempo tenemos antes de que eso pase? ¿Sirve de algo ponerle una tapa? Detrás de estas preguntas tan cotidianas hay una ley física sencilla y muy potente: la *ley de enfriamiento de Newton*. + +Isaac Newton la propuso en 1701 en un breve artículo publicado de forma anónima#footnote[El artículo apareció sin firma en las _Philosophical Transactions_ de la Royal Society, pero hoy se atribuye a Newton sin discusión.] en el que describía cómo se enfrían los cuerpos calientes @newton1701. Más de tres siglos después, se sigue usando para modelizar desde el enfriamiento de los alimentos hasta la estimación de la hora de la muerte en medicina forense @zill2009. + +// Así se cita la bibliografía: @etiqueta, con la etiqueta de referencias.yaml. +// Para citar varias fuentes a la vez, se ponen seguidas: @vollmer2009 @zill2009. + +En este trabajo comprobamos experimentalmente si el café de una taza corriente sigue esta ley, y medimos cuánto cambia el enfriamiento cuando la taza está tapada. + +== Objetivos + +// Lista numerada: cada elemento empieza por "+". +El objetivo general es *comprobar si el enfriamiento de una taza de café sigue la ley de Newton*. Para ello nos planteamos estos objetivos específicos: + ++ Medir la temperatura del café a lo largo del tiempo con un método sencillo y repetible. ++ Ajustar los datos a un modelo exponencial y calcular la constante de enfriamiento. ++ Comparar una taza con tapa y otra sin tapa. ++ Responder a la pregunta inicial: ¿cuánto tarda el café en dejar de estar «caliente»? + +== Hipótesis + +// Un recuadro de color con las herramientas de Typst, sin paquetes. +#block( + fill: rgb("#e8f6f3"), + stroke: (left: 3pt + rgb("#279985")), + inset: 12pt, + width: 100%, +)[ + *Hipótesis.* La temperatura del café se acerca a la del ambiente de forma exponencial, y la taza tapada se enfría más despacio porque pierde menos calor por evaporación. +] + +== Estructura del trabajo + +// Lista de viñetas: cada elemento empieza por "-". Con sangría se anidan. +El trabajo se organiza así: + +- El @marco-teorico[capítulo] explica la física y las matemáticas del enfriamiento. +- El @metodologia[capítulo] describe el material y el procedimiento. +- Los capítulos de resultados y discusión presentan y analizan las medidas: + - primero, los datos y sus gráficas; + - después, su interpretación y sus limitaciones. +- Los anexos recogen los datos completos (@anexo-datos), la deducción de las fórmulas (@anexo-deduccion) y la hoja de registro que usamos (@anexo-registro). diff --git "a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 1.typ" "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 1.typ" new file mode 100644 index 0000000000..68f096e491 --- /dev/null +++ "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 1.typ" @@ -0,0 +1,48 @@ +// La etiqueta permite citar este capítulo con @marco-teorico. + += Marco teórico + +== Calor y temperatura + +La *temperatura* mide lo agitadas que están, de media, las partículas de un cuerpo. El *calor* es la energía que pasa de un cuerpo a otro cuando están a distinta temperatura, siempre del más caliente al más frío. Una taza de café caliente cede calor al aire de la cocina hasta que los dos quedan a la misma temperatura. + +== Cómo pierde calor una taza de café + +El café pierde calor por cuatro vías a la vez @vollmer2009: + +// Lista de términos: "/ Término: explicación". +/ Conducción: a través de la cerámica de la taza y de la mesa. +/ Convección: el aire caliente que está en contacto con el café sube y lo sustituye aire más frío. +/ Radiación: todo cuerpo caliente emite radiación infrarroja. +/ Evaporación: las moléculas más rápidas escapan de la superficie y se llevan energía. Es la vía que una tapa reduce más. + +== La ley de enfriamiento de Newton + +Newton propuso que la rapidez con la que se enfría un cuerpo es proporcional a la diferencia entre su temperatura $T$ y la temperatura del ambiente $T_a$: + +// Una ecuación en su propia línea: con espacios dentro de los $ $. +// La etiqueta sirve para citarla con @eq-newton. La plantilla +// escribe solo el número, «(2.1)»: en el texto, pon delante «la ecuación». +$ (d T) / (d t) = -k (T - T_a) $ + +donde $k > 0$ es la *constante de enfriamiento*, que depende de la forma del recipiente, del material y de si está tapado. Resolviendo la ecuación diferencial @eq-newton (la deducción completa está en el @anexo-deduccion) se obtiene la temperatura en cada instante: + +$ T(t) = T_a + (T_0 - T_a) e^(-k t) $ + +siendo $T_0$ la temperatura inicial. Puede encontrarse una explicación divulgativa de estas fórmulas en @wikipedia-enfriamiento. Según la ecuación @eq-solucion, la diferencia de temperaturas $T - T_a$ disminuye de forma exponencial: el café se enfría deprisa al principio y cada vez más despacio. + +=== Linealización + +Para comprobar si unos datos siguen la ecuación @eq-solucion es cómodo tomar logaritmos neperianos. Despejando $T - T_a$ y aplicando $ln$ a los dos lados: + +$ ln(T - T_a) = ln(T_0 - T_a) - k t $ + +Es decir, si representamos $ln(T - T_a)$ frente al tiempo, los puntos deben quedar sobre una recta de pendiente $-k$. Así, una regresión lineal nos da directamente la constante de enfriamiento. + +=== Tiempo de semienfriamiento + +Llamamos *tiempo de semienfriamiento* $t_(1\/2)$ al tiempo que tarda en reducirse a la mitad la diferencia de temperatura con el ambiente. Imponiendo $T - T_a = (T_0 - T_a) \/ 2$ en la ecuación @eq-solucion: + +$ t_(1\/2) = (ln 2) / k $ + +No depende de la temperatura inicial: el café tarda lo mismo en pasar de 80 °C a 51 °C que de 51 °C a 36.5 °C (con un ambiente de 22 °C). diff --git "a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 2.typ" "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 2.typ" new file mode 100644 index 0000000000..7cc95e574d --- /dev/null +++ "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 2.typ" @@ -0,0 +1,64 @@ +// La función figura (borde y nota fáciles) está en funciones.typ. +#import "funciones.typ": figura + += Metodología + +== Material + +// Una tabla dentro de una figura: la plantilla le pone "Tabla 3.1" y la mete en +// la lista de tablas. table.header marca la fila de títulos. +#figure( + table( + columns: (auto, 1fr, auto), + align: (left, left, center), + table.header[*Material*][*Características*][*Cantidad*], + [Taza de cerámica], [Capacidad de 300 ml, paredes de 4 mm], [2], + [Tapa de silicona], [Ajustada al borde de la taza], [1], + [Termómetro digital], [Sonda de acero, precisión de ±0.1 °C], [1], + [Cronómetro], [El del teléfono móvil], [1], + [Café], [Recién hecho, unos 250 ml por taza], [500 ml], + ), + caption: [Material utilizado en el experimento], +) + +Todo el material, salvo el termómetro, es el que hay en cualquier cocina (@tab-material). + +== Montaje + +La @fig-montaje muestra el montaje: la sonda del termómetro se introduce en el centro del café, a media altura, y se sujeta para que no toque las paredes de la taza. + +// Una imagen con borde y nota. Las imágenes están en Archivos/Imágenes. +// borde: true o false; nota: opcional (bórrala si no la quieres). +#figura( + "Imágenes/montaje.svg", + titulo: [Montaje del experimento], + ancho: 80%, + borde: true, + nota: [Elaboración propia.], +) + +Para comparar, preparamos dos tazas iguales: una sin tapa y otra con tapa (@fig-tazas). + +// Dos imágenes lado a lado: un grid de dos columnas dentro de una sola figura. +#figura( + grid( + columns: 2, + gutter: 2em, + image("Imágenes/taza-sin-tapa.svg", width: 4cm), + image("Imágenes/taza-con-tapa.svg", width: 4cm), + [_a)_ Sin tapa], [_b)_ Con tapa], + ), + titulo: [Las dos tazas del experimento], +) + +== Procedimiento + ++ Dejamos el material en la cocina una hora antes para que estuviera a temperatura ambiente, que fue de 22.0 °C durante todo el experimento. ++ Llenamos las dos tazas con 250 ml de café recién hecho cada una y tapamos una de ellas. ++ Cuando el termómetro marcó 85.0 °C en cada taza, pusimos en marcha el cronómetro. ++ Anotamos la temperatura cada 2 minutos durante 40 minutos en la hoja de registro del @anexo-registro. ++ Repetimos el experimento tres días distintos y comprobamos que los resultados eran parecidos; en este trabajo presentamos los del primer día. + +== Tratamiento de los datos + +Para cada medida calculamos $ln(T - T_a)$ y ajustamos una recta por mínimos cuadrados, como indica la ecuación @eq-lineal. La pendiente de la recta es $-k$, y el coeficiente de determinación $R^2$ indica lo bien que los datos se ajustan al modelo: cuanto más cerca de 1, mejor#footnote[Hicimos los cálculos con una hoja de cálculo. Las gráficas de este trabajo, en cambio, las dibuja Typst directamente a partir del fichero de datos.]. diff --git "a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 3.typ" "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 3.typ" new file mode 100644 index 0000000000..eb4c88ab43 --- /dev/null +++ "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 3.typ" @@ -0,0 +1,92 @@ +// Las gráficas usan el paquete lilaq. Se importa en el capítulo que lo usa. +#import "@preview/lilaq:0.6.0" as lq +#import "funciones.typ": figura + +// Los datos se leen del fichero CSV: si cambias un dato allí, cambian a la vez +// la tabla del Anexo I y las dos gráficas de este capítulo. +#let datos = csv("Datos/enfriamiento.csv", row-type: dictionary) +#let tiempo = datos.map(f => float(f.tiempo)) +#let sin-tapa = datos.map(f => float(f.sin_tapa)) +#let con-tapa = datos.map(f => float(f.con_tapa)) + +// Valores del ajuste (ver la tabla de resultados) y temperatura ambiente +#let Ta = 22.0 +#let k-sin = 0.0451 +#let k-con = 0.0280 +#let modelo(k) = t => Ta + (85.0 - Ta) * calc.exp(-k * t) + +// Un color para cada taza: el mismo en los puntos y en su curva +#let azul = rgb("#3a7dc9") +#let naranja = rgb("#e08a1e") + += Resultados + +== Medidas + +La @tab-resumen recoge las temperaturas cada 10 minutos. Todas las medidas, cada 2 minutos, están en el @anexo-datos. + +#figure( + table( + columns: 3, + table.header[*Tiempo (min)*][*Sin tapa (°C)*][*Con tapa (°C)*], + [0], [85.0], [85.0], + [10], [61.8], [69.6], + [20], [47.7], [57.9], + [30], [38.1], [49.3], + [40], [32.3], [42.6], + ), + caption: [Temperatura del café cada 10 minutos], +) + +A los 40 minutos, el café de la taza tapada está 10.3 °C más caliente que el de la taza sin tapa. + +== Curvas de enfriamiento + +La @fig-curvas representa todas las medidas junto con la curva del modelo de Newton, ecuación @eq-solucion, para cada taza. + +// figura también vale para gráficas y tablas: van en lugar de la ruta. +#figura( + lq.diagram( + width: 12cm, + height: 7cm, + xlabel: [Tiempo (min)], + ylabel: [Temperatura (°C)], + lq.plot(tiempo, sin-tapa, stroke: none, mark: "o", color: azul, label: [Sin tapa]), + lq.plot(tiempo, con-tapa, stroke: none, mark: "s", color: naranja, label: [Con tapa]), + lq.plot(lq.linspace(0, 40), modelo(k-sin), mark: none, color: azul), + lq.plot(lq.linspace(0, 40), modelo(k-con), mark: none, color: naranja), + ), + titulo: [Temperatura del café frente al tiempo], + nota: [Los puntos son las medidas y las líneas, el modelo de Newton con los valores de $k$ de la @tab-ajuste.], +) + +== Ajuste al modelo + +Si el enfriamiento sigue la ley de Newton, al representar $ln(T - T_a)$ frente al tiempo los puntos deben quedar alineados, como indica la ecuación @eq-lineal. La @fig-lineal muestra que es así en las dos tazas. + +#figure( + lq.diagram( + width: 12cm, + height: 6cm, + xlabel: [Tiempo (min)], + ylabel: $ln(T - T_a)$, + lq.plot(tiempo, sin-tapa.map(T => calc.ln(T - Ta)), stroke: none, mark: "o", color: azul, label: [Sin tapa]), + lq.plot(tiempo, con-tapa.map(T => calc.ln(T - Ta)), stroke: none, mark: "s", color: naranja, label: [Con tapa]), + ), + caption: [Linealización de las medidas], +) + +Los resultados del ajuste por mínimos cuadrados están en la @tab-ajuste. El tiempo de semienfriamiento se calcula con la ecuación @eq-tiempo-medio. + +#figura( + table( + columns: 3, + table.header[][*Sin tapa*][*Con tapa*], + [Constante de enfriamiento $k$ (min#super[−1])], [0.0451], [0.0280], + [Coeficiente de determinación $R^2$], [0.9997], [0.9997], + [Tiempo de semienfriamiento $t_(1\/2)$ (min)], [15.4], [24.7], + [Tiempo hasta bajar de 60 °C (min)], [11.2], [18.0], + ), + titulo: [Resultados del ajuste al modelo de Newton], + nota: [Ajuste por mínimos cuadrados de $ln(T - T_a)$ frente a $t$, con $T_a = 22.0$ °C.], +) diff --git "a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 4.typ" "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 4.typ" new file mode 100644 index 0000000000..b36ea6f9e8 --- /dev/null +++ "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/02_Cap\303\255tulo 4.typ" @@ -0,0 +1,26 @@ += Discusión + +== ¿Se cumple la ley de Newton? + +Sí, y con mucha precisión. En las dos tazas, los puntos de la @fig-lineal quedan prácticamente sobre una recta y el coeficiente de determinación es $R^2 = 0.9997$ (@tab-ajuste). Las curvas del modelo de la @fig-curvas pasan por todas las medidas, y la temperatura inicial que da el ajuste (84.9 °C) coincide casi exactamente con la medida (85.0 °C). + +== El efecto de la tapa + +La constante de enfriamiento de la taza sin tapa es $0.0451 \/ 0.0280 approx 1.6$ veces la de la taza tapada. Como la cerámica, el volumen de café y el ambiente eran iguales, la diferencia se debe a lo que ocurre en la superficie: con la tapa, el vapor no escapa y se pierde mucho menos calor por evaporación y por convección. Esto confirma nuestra hipótesis y coincide con lo que describe #cite(, form: "prose"). + +// #cite(, form: "prose") escribe el autor dentro de la frase, +// por ejemplo «Vollmer (2009)», en lugar de «(Vollmer, 2009)». + +== Fuentes de error + +Las principales fuentes de error del experimento son: + +- *La posición de la sonda.* El café no está a la misma temperatura en el centro que junto a las paredes. +- *La lectura del tiempo.* Leer el termómetro y el cronómetro a la vez introduce un retraso de uno o dos segundos. +- *La temperatura ambiente.* Supusimos que era constante, pero pudo variar unas décimas durante los 40 minutos. + +Ninguna de ellas parece importante, porque el ajuste es casi perfecto. + +== Limitaciones + +La ley de Newton es una aproximación: supone que la pérdida de calor es proporcional a la diferencia de temperaturas, lo que deja de ser cierto cuando esa diferencia es muy grande o cuando la evaporación domina @vollmer2009. En el rango de temperaturas de una taza de café (de 85 °C a 30 °C) la aproximación funciona muy bien, como muestran nuestros datos, pero no conviene extrapolar el modelo a temperaturas mucho más altas. diff --git "a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/03_Conclusi\303\263n.typ" "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/03_Conclusi\303\263n.typ" new file mode 100644 index 0000000000..460f84115f --- /dev/null +++ "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/03_Conclusi\303\263n.typ" @@ -0,0 +1,7 @@ += Conclusión + +Hemos comprobado que una taza de café se enfría siguiendo la ley de enfriamiento de Newton: la diferencia entre su temperatura y la del ambiente disminuye de forma exponencial, con una constante de enfriamiento que hemos medido con mucha precisión. + +Volviendo a la pregunta del título: si consideramos que el café deja de estar «caliente» por debajo de 60 °C, una taza sin tapa tarda unos *11 minutos* en enfriarse, y una taza tapada, unos *18 minutos*. Una tapa sencilla regala siete minutos más de café caliente. + +Este trabajo podría ampliarse estudiando otros materiales (vidrio, metal, plástico), tazas de distintas formas o el efecto de añadir leche fría, siempre con el mismo método: medir, linealizar y ajustar. diff --git a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/04_Anexos.typ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/04_Anexos.typ new file mode 100644 index 0000000000..95eda0d08f --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/04_Anexos.typ @@ -0,0 +1,53 @@ +// Cada "==" es un anexo: la plantilla lo numera solo (Anexo I, Anexo II…). +// Con una etiqueta, como , se cita con @anexo-datos. + += Anexos + +== Tabla completa de medidas + +// La tabla se construye a partir del fichero CSV: no hay que copiar los datos. +#let datos = csv("Datos/enfriamiento.csv", row-type: dictionary) + +#figure( + table( + columns: 3, + table.header[*Tiempo (min)*][*Sin tapa (°C)*][*Con tapa (°C)*], + ..datos.map(f => (f.tiempo, f.sin_tapa, f.con_tapa)).flatten(), + ), + caption: [Temperatura del café cada 2 minutos], +) + +== Deducción de las fórmulas + +Partimos de la ley de Newton, ecuación @eq-newton, y separamos las variables, pasando todo lo que depende de $T$ a la izquierda y lo que depende de $t$ a la derecha: + +$ (d T) / (T - T_a) = -k thin d t $ + +Integramos los dos miembros: + +$ integral (d T) / (T - T_a) = integral -k thin d t quad arrow.double quad ln abs(T - T_a) = -k t + C $ + +Como el café está más caliente que el ambiente, $T - T_a > 0$ y podemos quitar el valor absoluto. Tomando exponenciales: + +$ T - T_a = e^C e^(-k t) $ + +En el instante inicial, $t = 0$ y $T = T_0$, así que $e^C = T_0 - T_a$, y se llega a la ecuación @eq-solucion. Por último, el tiempo de semienfriamiento se obtiene imponiendo que la diferencia de temperaturas se reduzca a la mitad: + +$ (T_0 - T_a) / 2 = (T_0 - T_a) e^(-k t_(1\/2)) quad arrow.double quad t_(1\/2) = (ln 2) / k $ + +Las ecuaciones de este anexo se numeran con el número del anexo: ecuaciones @eq-separadas y @eq-integradas. + +== Hoja de registro + +Esta es la hoja que rellenamos durante cada medida. Las celdas vacías se completan a mano. + +// Una tabla vacía para imprimir: las celdas [] quedan en blanco. +#figure( + table( + columns: (auto, 1fr, 1fr, 2fr), + rows: 0.8cm, + table.header[*Tiempo (min)*][*Sin tapa (°C)*][*Con tapa (°C)*][*Observaciones*], + ..range(0, 42, step: 2).map(t => ([#t], [], [], [])).flatten(), + ), + caption: [Hoja de registro], +) diff --git a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/05_Glosario.typ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/05_Glosario.typ new file mode 100644 index 0000000000..4389c140bb --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/05_Glosario.typ @@ -0,0 +1,15 @@ +// Lista de términos: "/ Término: explicación". + += Glosario + +/ Coeficiente de determinación ($R^2$): número entre 0 y 1 que mide lo bien que un modelo se ajusta a los datos. Cuanto más cerca de 1, mejor. + +/ Constante de enfriamiento ($k$): rapidez con la que se enfría un cuerpo según la ley de Newton. Se mide en min#super[−1]. + +/ Linealizar: transformar unos datos, por ejemplo tomando logaritmos, para que una relación curva se convierta en una recta. + +/ Mínimos cuadrados: método para encontrar la recta que mejor se ajusta a unos puntos. + +/ Temperatura ambiente ($T_a$): temperatura del aire que rodea al cuerpo que se enfría. + +/ Tiempo de semienfriamiento ($t_(1\/2)$): tiempo que tarda en reducirse a la mitad la diferencia de temperatura entre un cuerpo y el ambiente. diff --git a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Datos/enfriamiento.csv b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Datos/enfriamiento.csv new file mode 100644 index 0000000000..29f094e418 --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Datos/enfriamiento.csv @@ -0,0 +1,22 @@ +tiempo,sin_tapa,con_tapa +0,85.0,85.0 +2,79.5,81.3 +4,74.7,78.0 +6,70.1,75.2 +8,65.6,72.4 +10,61.8,69.6 +12,58.4,66.7 +14,55.5,64.8 +16,52.4,62.1 +18,50.1,60.4 +20,47.7,57.9 +22,45.7,55.7 +24,43.6,54.0 +26,41.3,52.2 +28,39.7,51.0 +30,38.1,49.3 +32,37.0,47.6 +34,35.7,46.0 +36,34.2,44.8 +38,33.5,43.7 +40,32.3,42.6 diff --git "a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Im\303\241genes/montaje.svg" "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Im\303\241genes/montaje.svg" new file mode 100644 index 0000000000..7418dd21fa --- /dev/null +++ "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Im\303\241genes/montaje.svg" @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + 85.0 °C + TERMÓMETRO + + + + + + + Taza con 250 ml de café + Cronómetro + diff --git "a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Im\303\241genes/taza-con-tapa.svg" "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Im\303\241genes/taza-con-tapa.svg" new file mode 100644 index 0000000000..0b6e89c7bb --- /dev/null +++ "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Im\303\241genes/taza-con-tapa.svg" @@ -0,0 +1,8 @@ + + + + + + + + diff --git "a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Im\303\241genes/taza-sin-tapa.svg" "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Im\303\241genes/taza-sin-tapa.svg" new file mode 100644 index 0000000000..01f74d59c8 --- /dev/null +++ "b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/Im\303\241genes/taza-sin-tapa.svg" @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/preview/visillos-excelencia/0.3.0/template/Archivos/funciones.typ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/funciones.typ new file mode 100644 index 0000000000..7b0c222035 --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/Archivos/funciones.typ @@ -0,0 +1,23 @@ +// Funciones de ayuda para los capítulos. Este fichero no depende de la +// plantilla: cada capítulo que lo use lo importa al principio con +// #import "funciones.typ": figura + +// Figura con título y, si quieres, borde negro y nota debajo (estilo APA). +// +// #figura( +// "Imágenes/foto.png", // la imagen (ruta desde la carpeta Archivos) +// titulo: [Título de la figura], +// ancho: 80%, // opcional: tamaño de la imagen +// borde: true, // opcional: true o false (sin borde) +// nota: [Elaboración propia.], // opcional: sale como «Nota. Elaboración propia.» +// ) +// +// En lugar de la ruta puede ir cualquier contenido: una tabla, una gráfica… +#let figura(contenido, titulo: none, ancho: auto, borde: false, nota: none) = { + let cuerpo = if type(contenido) == str { image(contenido, width: ancho) } else { contenido } + if borde { cuerpo = box(stroke: 1pt, cuerpo) } + figure( + if nota == none { cuerpo } else { [#cuerpo #[#nota] ] }, + caption: titulo, + ) +} diff --git a/packages/preview/visillos-excelencia/0.3.0/template/Logo.svg b/packages/preview/visillos-excelencia/0.3.0/template/Logo.svg new file mode 100644 index 0000000000..4844174a4f --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/Logo.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/preview/visillos-excelencia/0.3.0/template/main.typ b/packages/preview/visillos-excelencia/0.3.0/template/main.typ new file mode 100644 index 0000000000..4a08ebec8e --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/main.typ @@ -0,0 +1,55 @@ +#import "@preview/visillos-excelencia:0.3.0": * + +// Aquí configuras los datos de tu proyecto. +// (El trabajo de ejemplo es inventado: sustituye los capítulos por los tuyos.) +#show: proyecto.with( + titulo: "¿Cuánto tarda en enfriarse un café?", + autor: "Lucía Martín Ortega y Daniel Ruiz Serrano", + supervisor: "Elena Gómez Prieto", + instituto: "IES Carmen Martín Gaite", + lugar: "Navalcarnero", + fecha: "Mayo 2026", // Cambia la fecha a la de entrega + logo: image("Logo.svg", width: 30%), + fuente: "Libertinus Serif", // Puedes cambiar a "Times New Roman" si la tienes instalada + // tamano-fuente: 12pt, // Descomenta para ajustar el tamaño del texto + // interlineado: 1em, // Descomenta para ajustar el interlineado + // color-acento: rgb("#279985"), // Descomenta para cambiar el color de los títulos + doble-cara: false, // Pon true si vas a imprimir a doble cara (capítulos en página impar) + contar-palabras: false, // Pon true para ver, tras el índice, cuántas palabras tiene el trabajo + + // Páginas iniciales: la plantilla les pone título, página propia y entrada en el índice. + // Cualquier pieza opcional se quita poniendo false (o none), o borrando su línea. + abstract: include "Archivos/00_1_Abstract.typ", + resumen: include "Archivos/00_2_Resumen.typ", + agradecimientos: include "Archivos/00_3_Agradecimientos.typ", + + // Bibliografía: tus fuentes van en referencias.yaml. Estilos habituales: + // "apa", "ieee", "mla", "chicago-author-date", "harvard-cite-them-right", + // "iso-690-author-date", "vancouver". + bibliografia: bibliography("referencias.yaml", style: "apa", title: "Bibliografía"), + + // Listas de figuras y tablas (van al final, tras la bibliografía). Por defecto + // salen solas si el documento tiene figuras o tablas. Para forzarlas: + // lista-figuras: true, // o false para quitarla + // lista-tablas: true, // o false para quitarla +) + +// ========================================== +// INCLUYE AQUÍ LOS ARCHIVOS DE TU PROYECTO +// ========================================== + +// Capítulos principales +#include "Archivos/01_Introducción.typ" +#include "Archivos/02_Capítulo 1.typ" +#include "Archivos/02_Capítulo 2.typ" +#include "Archivos/02_Capítulo 3.typ" +#include "Archivos/02_Capítulo 4.typ" +// #include "Archivos/02_Capítulo 5.typ" // Quita las barras (//) para añadir más capítulos + +// Páginas finales +#include "Archivos/03_Conclusión.typ" + +// A partir de aquí, cada "==" es un anexo numerado (Anexo I, Anexo II…) +#show: anexos +#include "Archivos/04_Anexos.typ" +#include "Archivos/05_Glosario.typ" diff --git a/packages/preview/visillos-excelencia/0.3.0/template/referencias.yaml b/packages/preview/visillos-excelencia/0.3.0/template/referencias.yaml new file mode 100644 index 0000000000..1e0fb25fd7 --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/template/referencias.yaml @@ -0,0 +1,47 @@ +# Bibliografía en formato Hayagriva (el de Typst). También vale un fichero .bib. +# Cada entrada tiene una etiqueta (newton1701, vollmer2009…) que se cita en el +# texto con @etiqueta. El estilo (APA, IEEE…) se elige en main.typ. + +newton1701: + type: Article + title: "Scala graduum caloris. Calorum descriptiones & signa" + author: Newton, Isaac + date: 1701 + page-range: 824-829 + serial-number: + doi: "10.1098/rstl.1700.0082" + parent: + type: Periodical + title: Philosophical Transactions of the Royal Society of London + volume: 22 + issue: 270 + +vollmer2009: + type: Article + title: "Newton's law of cooling revisited" + author: Vollmer, Michael + date: 2009 + page-range: 1063-1084 + serial-number: + doi: "10.1088/0143-0807/30/5/014" + parent: + type: Periodical + title: European Journal of Physics + volume: 30 + issue: 5 + +zill2009: + type: Book + title: Ecuaciones diferenciales con aplicaciones de modelado + author: Zill, Dennis G. + edition: 9 + date: 2009 + publisher: Cengage Learning + +wikipedia-enfriamiento: + type: Web + title: Ley del enfriamiento de Newton + author: Wikipedia + url: + value: https://es.wikipedia.org/wiki/Ley_del_enfriamiento_de_Newton + date: 2026-10-17 diff --git a/packages/preview/visillos-excelencia/0.3.0/thumbnail.png b/packages/preview/visillos-excelencia/0.3.0/thumbnail.png new file mode 100644 index 0000000000..ddea10c0b5 Binary files /dev/null and b/packages/preview/visillos-excelencia/0.3.0/thumbnail.png differ diff --git a/packages/preview/visillos-excelencia/0.3.0/typst.toml b/packages/preview/visillos-excelencia/0.3.0/typst.toml new file mode 100644 index 0000000000..b16e61fd0a --- /dev/null +++ b/packages/preview/visillos-excelencia/0.3.0/typst.toml @@ -0,0 +1,17 @@ +[package] +name = "visillos-excelencia" +version = "0.3.0" +entrypoint = "lib.typ" +compiler = "0.13.0" +authors = ["Jesús Manuel González Meneses"] +license = "MIT" +repository = "https://github.com/13Stokes31/visillos-excelencia" +description = "Unofficial template for Excellence Baccalaureate projects at IES Carmen Martín Gaite (Spain) // Plantilla para los proyectos del Bachillerato de Excelencia del IES Carmen Martín Gaite." +categories = ["report", "thesis"] +keywords = ["proyecto", "investigación", "bachillerato", "excelencia", "spanish", "research"] +exclude = ["ROADMAP.md", "TESTING.md", "tests"] + +[template] +path = "template" +entrypoint = "main.typ" +thumbnail = "thumbnail.png"