Apéndice A — Cómo está hecho el libro (y cómo extenderlo)
Este libro es reproducible de principio a fin. Aquí se explica su maquinaria por si quieres corregir algo, añadir un capítulo o construir un widget nuevo.
A.1 La pila de herramientas
- Quarto — el motor del libro. Cada capítulo es un archivo
.qmd(Markdown + código + LaTeX) y Quarto lo compila a un sitio web estático (_site/). - Python (
numpy,scipy,matplotlib) — genera las figuras. El código va dentro del propio.qmdy se ejecuta al compilar, así que las figuras nunca quedan desactualizadas. - Web Audio API (JavaScript) — los widgets interactivos. Cada uno es un
.htmlautocontenido enwidgets/, sin dependencias externas: el sonido se sintetiza en el navegador del lector. - MathJax — renderiza la matemática LaTeX.
- Bibliografía en BibTeX (
referencias.bib) con estilo IEEE (ieee.csl).
A.2 Ponerlo en marcha
# una sola vez
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# ver el libro con recarga en vivo
./preview.sh # o: quarto previewquarto render genera el sitio completo en _site/.
A.3 Estructura
libro-audio/
├─ _quarto.yml configuración (capítulos, partes, tema, formato)
├─ theme.scss estilos (dos niveles, widgets)
├─ index.qmd prefacio
├─ capitulos/NN-*.qmd un archivo por capítulo
├─ apendices/*.qmd estos apéndices
├─ widgets/*.html widgets Web Audio autocontenidos
├─ referencias.bib bibliografía · ieee.csl (estilo)
└─ iframe-resize.html ajuste automático de altura de los iframes
A.4 El patrón de dos niveles
El nivel amigable es prosa normal. El nivel riguroso es un callout colapsable:
Explicación técnica en prosa…
::: {.callout-important .a-fondo collapse="true"}
## ¿Quieres ir más a fondo? — <tema>
Aquí toda la matemática: $H(j\omega)$, ecuaciones $$…$$
:::A.5 Añadir un capítulo
- Crea
capitulos/NN-nombre.qmdcon untitle:en la cabecera YAML. - Regístralo en
_quarto.yml, bajo la parte que corresponda. - Cita con
[@clave](las claves están enreferencias.bib).
A.6 Añadir una figura en Python
Un bloque de código etiquetado se ejecuta y su salida se incrusta:
A.7 Añadir un widget interactivo
Cada widget es un .html completo y autocontenido en widgets/ (HTML + CSS + JS en el mismo archivo, sin recursos externos). Se embebe con un iframe:
<iframe class="widget-frame" src="../widgets/mi-widget.html" title="…" loading="lazy"></iframe>Convenciones útiles aprendidas construyendo los del libro:
- No uses
{{< include >}}para HTML con JavaScript: Pandoc lo interpreta como código. Va siempre en un archivo aparte y se embebe con<iframe>; eso además aísla el JS y evita choques de identificadores si repites un widget. - El widget informa su altura al libro con
postMessage({type:"widget-height", …}); el scriptiframe-resize.html(incluido en todas las páginas) ajusta el iframe. Copia ese bloque de cualquier widget existente. - No te fíes de aproximaciones en la física: calcula el modelo exacto y verifícalo contra un caso conocido (una alineación Butterworth debe salir plana, un cardioide debe cancelar hacia atrás, la coherencia debe ser \(s/(s+n)\)…). Varios widgets de este libro se reescribieron al descubrir que un atajo daba un resultado físicamente incorrecto.
- Para dibujar respuestas de biquad, calcula los coeficientes RBJ y evalúa \(H(e^{j\omega})\) analíticamente en vez de fiarte de
getFrequencyResponse, que en algunos motores no da un Butterworth limpio.
A.8 Publicar
El repositorio incluye un flujo de GitHub Actions (.github/workflows/publish.yml) que renderiza y publica en GitHub Pages en cada push. Para un dominio propio, ver el README y descomentar site-url/repo-url en _quarto.yml.