CAP4 num_distr:
- Mueve el párrafo introductorio largo del histograma/boxplot al glosario
(nuevo término clicable "histograma_boxplot"); el cuerpo del capítulo solo
nombra el término con [[term:histograma_boxplot]] y la explicación completa
(código de colores, 1,5·IQR, lectura de asimetría) vive en la entrada del
glosario. La información se traslada, no se pierde.
- Añade por columna numérica la descripción de negocio del LLM y la unidad,
leídas de profile['llm']['dictionary'] (empareja por nombre de columna).
Sin bloque LLM el bloque de descripción se omite limpiamente.
CAP5 cat_distr:
- Mueve el párrafo "Cada columna categórica ocupa su propia página..." al
glosario (nuevo término clicable "pagina_categorica"); el intro solo nombra
los términos entropía y pagina_categorica.
- Añade descripción LLM + unidad por columna (misma fuente que CAP4).
- Cambia el donut/pie por gráfico de barras horizontales (nueva función del
registry categorical_top_bar_figure_py_datascience, contrato de entrada
idéntico al donut para swap directo) más su fallback inline de barras.
- Marca cada Group de columna con layout="side_by_side": en PPTX la tabla de
cardinalidad queda a la izquierda y la barra a la derecha; en PDF se apila
(A5 estrecho). No toca los renderers — el soporte de layout ya existía.
Glosario:
- Catálogo canónico _BASELINE_TERMS con las definiciones de los dos términos
nuevos; build_glosario completa la definición de un término registrado sin
ella desde el catálogo (los chapters solo registran clave+label).
Tests actualizados (donut→barras, side_by_side, LLM desc/unidad, glosario) y
nueva función con sus tests. Suite del subsistema + acceptance verde.
Mejoras transversales del motor de render (no del contenido de capítulos):
1. Fix negrita pisa texto (PDF): _place_rich_lines mide el ancho REAL de cada
span con las métricas de fuente del renderer (peso correcto) en vez del
grid de ancho medio; negrita y normal en la misma línea ya no se solapan.
2. Zebra striping: filas pares sombreadas (#f6f8fa) en DataTable (PDF + PPTX),
coherente al partir tablas largas (índice de fila lógico, no por página).
3. Keep-together: bloque Group nuevo; el renderer mide el grupo entero y lo
mueve completo a la página/slide siguiente si no cabe, y encoge la figura
(height_in) para dejar sitio a su título y texto. num_distr lo usa.
4. Caption siempre visible en toda figura PPTX (fallback al heading); la figura
reserva el alto de su caption para que ambos quepan en el mismo slide.
5. Portada construida al final (con resumen agregado del análisis vía
ctx['document_summary']) pero colocada primera por build_document.
6. Glosario: capítulo nuevo (último) + GlossaryCollector en ctx; los capítulos
registran términos y marcan apariciones con [[term:key]]...[[/term]]. Links
clicables reales: PDF (PyMuPDF, link GOTO) y PPTX (slide-jump nativo).
Enganchado "entropía" en cat_distr como ejemplo end-to-end.
Funciones reutilizables delegadas a fn-constructor (tag eda):
- add_pdf_internal_links_py_datascience (PyMuPDF)
- pptx_link_run_to_slide_py_datascience (slide-jump)
Contrato docs/automatic_eda_contract.md actualizado (§1/§3/§5 + §11 nueva) con
la API de glosario, keep-together y zebra para la siguiente fase. PyMuPDF
declarado en pyproject. Suite verde (90 tests); golden titanic verificado.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>