Generar una Web Interactica con LaTeX (con Make4ht y Asistida por IA)

Walter Mora Flores
make4ht, html y ccs

Contenido

1. Introducción
2. Make4ht para impacientes
2.1 Compilar esta plantilla
2.11 Errores de compilación
2.2 Comandos importantes.
2.3 Figuras
2.4 Entorno minipage
2.5 Ambiente tikzpicture
2.6 Matrices, ecuaciones y arreglos
2.7 Paquete subfigure.
2.8 Tablas
2.9 Listas de ejercicios
2.10 Tabla de contenidos: Ver/Ocultar
3. Convertir entornos "complicados" en imágenes svg
4. Entornos definición, teorema, ejemplo, etc.
5. Agregar actividades interactivas
5.1 JavaScript
6. Ejemplos de actividades interactivas
6.1 Intersección de Intervalos
6.2 Interpretación geométrica de la derivada
6.3 Un problema de optimización: Ejercicio y respuesta.
6.4 Sumas de Riemann con particiones regulares
6.5 Plano Tangente
6.6 Efecto hover en tablas
6.7 Incrustar applets GeoGebra
6.71 Ejemplos.
6.8 Incrustar videos de Youtube
7. Configurar Make4ht
7.1 Algunos comandos de configuración
7.2 Configuración en el preámbulo
7.3 Archivo (personalizado) de configuración
8. Conclusión

Resumen:  Este documento presenta una guía detallada para convertir documentos LaTeX en páginas web interactivas utilizando herramientas como Make4ht y asistencia con IA. Se abordan temas como la configuración de Make4ht, la conversión de entornos complejos a imágenes SVG, la inclusión de actividades interactivas con JavaScript, y la integración de elementos multimedia como applets de GeoGebra y videos de YouTube. El enfoque bimodal permite generar tanto PDF como HTML, aprovechando las ventajas de cada formato: el PDF para impresión y citación formal, y el HTML para accesibilidad e interactividad en dispositivos digitales.

Palabras Clave: Palabras clave: Make4ht, LaTeX, HTML, interactividad, JavaScript, SVG, GeoGebra, IA, conversión de documentos, diseño web.

Abstract: This paper provides a detailed guide for converting LaTeX documents into interactive web pages using tools like Make4ht and AI assistance. It covers configuration of Make4ht, conversion of complex environments into SVG images, incorporation of interactive JavaScript activities, and integration of multimedia elements such as GeoGebra applets and YouTube videos. The bimodal approach facilitates generating both PDF and HTML outputs, harnessing the advantages of each format: PDFs for print and formal citation, and HTML for enhanced accessibility and interactivity on digital devices.

Keywords: Make4ht, LaTeX, HTML, interactivity, JavaScript, SVG, GeoGebra, AI, document conversion, web design.

1. Introducción

Un documento .tex se puede compilar de varias maneras. En nuestro caso queremos algo bimodal: Queremos como salida un documento pdf y un documento html (para agregar contenido interactivo).

Para obtener un documento pdf, compilamos con PDFLaTeX y para traducir el documento y obtener un sitio web, con su archivo de estilo css, compilamos con Make4ht. El archivo css se modifica y/o se amplia con un archivo personalizado config.cfg. En la Figura 1 se muestra el proceso de manera simplificada.

(a) PDFLaTeX
           

(b) Make4ht
Figura 1: Compilar con PDFLaTeX o con Make4ht

La plantilla doc.tex (que que usa este documento) está implementado con código que ejecutan tanto PdfLaTeX como Make4ht. Pero hay partes en que solo nos interesa una salida html y otras en las que solo nos interesa la salida pdf, para esto usamos comandos que PDFLaTeX ignora y que Make4ht sí compila y viceversa.

Make4ht se enfoca en la estructura del contenido y, si no hay errores de compilación fatales, entrega un archivo html correcto pero con un diseño simple. Este artículo es un ejemplo (y al mismo tiempo es una plantilla) de cómo agregar diseño web moderno y responsivo, de manera manual, a través de un archivo de configuración y también a través de un framework como Bootstrap, [1].

Este documento considera las tareas comunes en la implementación de material didáctico en matemáticas y agrega un archivo de configuración para la salida moderna y correcta en Html. La manera de configurar Make4ht para lograr este objetivo se describe en la sección 7.

¿Qué nivel necesitamos? Para usar la plantilla, se requiere ser un usuario normal de LaTeX y posiblemente conocer cosas básicas de html y css (sino, podríamos empezar con [14] y [13]). La parte interactiva requiere conocer JavaScript, en principio, en un nivel básico.

La IA puede generar código Latex, código de estilo (css) y scripts interactivos, con peticiones en lenguaje natural. Pero en el estado actual de la IA, para tareas más complejas, hay un aumento significativo en la productividad si hacemos peticiones con modelos de código y en lenguaje técnico preciso. También debemos estar atentos a las repuestas de la IA, porque ocasionalmente nos da resuestas basadas en información desactualizada (cosas raras, comandos que no existen, etc.).

Si quiere conocer cómo se configuró la plantilla y eventualmente modificarla, entonces se debe leer la sección 7. También conviene leer [2].

¿Por qué traducir un documento pdf a html? El formato html ofrece accesibilidad, interactividad y un mayor alcance en el entorno digital actual. Generar el html desde un archivo Latex permite aplicar revisiones y/o modificaciones al archivo .tex sin necesidad de tener que volver a editar manualmente la salida html.

Mientras el formato pdf es ideal para impresión y citación formal, el html se adapta a cualquier dispositivo y permite integrar elementos dinámicos como visualizaciones, actividades interactivas y contenido multimedia. Este enfoque promueve la ciencia abierta y la educación digital al hacer el contenido más flexible y accesible.

2. Make4ht para impacientes

Bien, tenemos una plantilla doc.zip con figuras y varios archivos .tex y un archivo de configración config.cdf (entre otras cosas) que Make4ht traduce bien a html.

Podemos agregar paquetes y comandos personales, en el archivo ComandosdelUsuario.tex que está en la carpeta "Paquetes". Pero hay que observar que hay paquetes incompatibles con Make4ht y posiblemente también comandos. Siempre hay que estar compilando para ir probando como funcionann las cosas.

Make4ht es altamente configurable, por lo que el diseño del sitio web final lo podemos automatizar a través de un archivo de configuración que contiene código css, para aplicar ajustes específicos para el formato de salida html.

Sentido común. Hay que pensar en "modo pdf" si visualizamos el pdf de salida, y en "modo html" si visualizamos la página web de salida. Son mundos parecidos, pero hay cosas en pdf que no tiene equivalente en html y viceversa. Así que hay que estar valorando qué cosas tienen sentido en uno y en el otro ambiente. La buena noticia es que tenemos dos comandos para saltar de uno a otro modo en este documento doc.tex: Las cosas sofisticadas en Latex , buenas para pdf pero que podrían no compilar bien con Make4ht, las podemos simplicar y hacer una versión Latex más sencilla (pero equivalente) o inyectar código html de manera directa.

Cosas demasiado complicadas se puede recortar e incluir como una imagen svg. Este formato esta bien soportado por el html y permite renderizar texto, figuras y componente de scripts interactivos en alta calidad y permite escalar sin pérdidas.

La estructura de la carpeta de trabajo se muestra en la Figura 2.

Figura 2: Carpeta de trabajo

1.
La carpeta images contiene figuras .png, .svg y .pdf. Para html son preferibles los formatos vectoriales con svg (o sino png con buena resolución). Esto se puede personalizar un poco, por ejemplo usando Inkscape.

Algunas figuras generadas con código Latex las podemos convertir, de manera automática, con el paquete ltximg [8]. Lo vemos en la sección 3.

2.
La carpeta js contiene los scripts JavaScript interactivos
3.
La carpeta css contiene archivos de estilo.css personalizados y el archivo doc.css que genera automáticamente Make4ht
4.
La carpeta Paquetes contiene el archivo WebPreambuloyEntornos.tex y el archivo
ComandosdelUsuario.tex
5.
La carpeta SitioWeb recibe, con la compilación Make4ht , los archivos doc.css y doc.html (si la carpeta no está, entonces la crea).
6.
El archivo config.cfg es el archivo de configuración para este documento, mayormente habilita, deshabilita o modifica entornos creados por Make4ht e inserta código css para el diseño web de la salida html. Este archivo ya viene implementado para esta plantilla. Para comprender y/o modificar algo, es necesario leer la sección 7.
7.
El archivo plantilla.tex es este mismo documento, pero solo con cosas relevantes, para editar un documento propio. El archivo ejemplos.tex viene con código Latex que amplia los ejemplos del archivo principal.

2.1 Compilar esta plantilla

Make4ht ofrece varias opciones de compilación a través de un archivo de configuración y/o con opciones entre comillas. En este documento mayormente compilamos en la terminal, con el comando

 make4ht -u -c config.cfg -u -f html5 -d SitioWeb doc.tex "mathml,svg,Gin-dim" 
 % opción limpiar:  agregar -m clean (y quitar después) 
 % opción debug:    agregar -a debug 
 

N En esta plantilla, el archivo config.cfg puede cargar el script MathJax más personalizado, si se ocupan paquetes y comandos adicionales. Ver sección 7.

1.
La opción -c config.cfg "inyecta" nuestro código, configuración de entornos y código de estilo css, en el archivo doc.css, de tal manera que prevalezca sobre el código css que genera Make4ht.
2.
La opción -d SitioWeb inserta en SitioWeb, en la carpeta de trabajo, los archivos css y html (si no está la carpeta, la crea).

Otras opciones. Se pueden agregar opciones de compilación (máximo 9) en el formato

make4ht filename.tex "op1,op2,..,optn" 
 

En el capítulo 6 de [2, Tex4ht (2024)] hay una lista de opciones que se pueden aplicar. Incluye: Partir el documento en varias páginas, agregar las "notas de pie de página" en una página final, usar imágenes para el texto, etc.

2.11 Errores de compilación

Make4ht compila el archivo .tex con htlatex. Esta compilación Usa "motores" como PDFtex o Luatex, pero soporta solo paquetes básicos, en realidad, una cantidad suficiente de paquetes básicos. Así que la primera fuente de errores de compilación están en el código .tex. Una vez superada esta etapa, podrían haber errores en la traducción a html. Hay que evitar que el html se "rompa" (evitar que el DOM se rompa) digamos por etiquetas que abren, pero no cierran como en <div><p>Contenido</div>. También el DOM se puede romper por paquetes incompatibles con Make4ht o entornos matemáticos complejos mal interpretados.

En la compilación con Make4ht, una "advertencia" del tipo

[WARNING] domfilter: DOM parsing of test.html failed: 
[WARNING] domfilter: /home/.../ ... nbalanced Tag (/p) [char=   ]

significa que la estructura del documento (DOM) se ha roto y la "advertencia" nos dice que una o varias cosas ya no van a salir bien. Lo normal es corregir el problema directamente o hacer modificaciones. Como en cualquier compilación normal, revisamos el .log para tratar de aislar el problema y corregirlo.

2.2 Comandos importantes.

Como estamos en un ambiente bimodal, algunas cosas se pueden usar tanto para PDFLatex como para Make4ht, pero hay otras cosas son exclusivas para PDFLaTex y hay algún equivalente para Make4ht y viceversa.

N Observe que tanto PDFLatex como Make4ht, compilan todo el archivo .tex, solo que algunos bloques de código son exclusivos, por razones especiales, para PDFLatex y otros para Make4ht.

En esta plantilla tenemos tres comandos personalizados (están en WebPreambuloyEntornos.tex):


\pdfomk{#1}{#2}: PDFLatex ignora #2 y ejecuta #1 y Make4ht ignora #2 y ejecuta #1
\insertarhtm{#1}: Insertar código html puro con Make4ht , pero PDFLatex lo ignora
\pdfomk{#1}{}: Solo PDFLatex ejecuta #1
\pdfomk{}{#2}: Solo Make4ht ejecuta #2


Comandos adicionales para generar código html desde Latex se muestran en la sección 5.

Adicionalmente vamos a usar programas externos que se ejectan en la terminal o consola (editores como Texstudio, TexMaker, Kile, etc. tienen la "consola" en la parte baja)


ltximg: Extrae entornos LaTeX y los convierte en imágenes svg.
%<*ltximg> %</ltximg> Identificar entornos que va a ser convertidos en imágenes svg
rsvg-convert (Linux) Escalar imágenes svg (también tareas de conversión)
Inkscape Varias tareas sobre imágenes (Windows, Linux, Mac)


2.3 Figuras

En html, los formatos mejor soportados son .png, .jpg y .svg.

1.
png. Incluir una figura png no requiere hacer cambios, compila igual con PDFLaTeX y Make4ht.

\includegraphics[width=0.7\textwidth]{images/fig2.png}

Para escalar una figura png (o jpg) se puede usar la opción, [width=0.x\textwidth]. Esta opción, en términos de \textwidth, es adecuada para pdf y html.

Estas figuras se inyectan en el html con algo como

<img alt=’PIC’ class=’includegraphics’ src=’images/fig2.png’ width=’310’ />.

Es decir, también podemos insertar figras png desde latex . Por ejemplo,

\insertarhtml{% Make4ht -> html 
   <img alt=’PIC’ class=’includegraphics src=’images/fig3.png’ 
         width=’150’ />}
2.
svg. El formato svg (Scalable Vector Graphics) se usa para mostrar gráficos vectoriales escalables y nítidos en la web.

Se puede incluir incluir una figura svg con Make4ht, usando el código

\pdfomk{ 
% 
}{% Make4ht -> html 
\includegraphics{images/fig1.svg} 
}

PDFLatex puede incluir figuras svg con el paquete svg, pero solo funciona para PDFLaTeX.

Make4ht inyecta la figura .svg en el html con algo como

<object class=’graphics’ data=’images/fig1.svg’ type=’image/svg+xml’></object>

(a)
<object>...,/object> es un elemento html que incrusta contenido externo (svg, pdf, html, etc.) como un "documento embebido".
(b)
Estas figuras svg no se pueden escalar con la opción usual [width=0.x\textwidth].
El navegador web las inserta con un tamaño absoluto. Esto se debe a que una figura svg se puede escalar si accedemos a su atributo viewBox (sistema de coordenadas), pero Make4ht no hace eso, solo inserta la figura.
(c)
Si fuera necesario escalar estas figuras svg, se pueden usar programas externos.
(d)
Podemos escalar las figuras svg visualmente (o con comandos en terminal) por ejemplo con con Inkscape ( u otro programa equivalente), como se muestra en la Figura 4

En Linux se puede hacer en la terminal con rsvg-convert (también se puede instalar en Windows y Mac).

Por ejemplo si queremos escalar fig1.svg a un ancho 150pt, ejecutamos la instrucción

  cd images 
  % sudo apt install librsvg2-bin 
  rsvg-convert -f svg -w 150 fig1.svg -o sfig1.svg 
 

sfig1.svg es la figura escalada. Como el html toma las figuras de la carpeta images, podemos seguir ajustando al figura y recargando el html.

PIC

Figura 4: Escalar una figura .svg con Inkscape


pdf. Los navegadores no renderizan los figuras pdf como imágenes (excepto con el elemento <object>). A veces Make4ht puede convertir estas figuras automáticamente (en la compilación) a png o svg, mediante herramientas externas (como ghostscript o pdf2svg). Esto depende de si en el sistema están instaladas estas herramientas.

2.4 Entorno minipage

La práctica usual de colocar un minipage al lado de otro minpage está configurado en el archivo config.cfg (porque necesitamos manejar de manera correcta las dimensiones de cada minipage).

Introducimos ambientes minipage en hmtl con el siguiente formato:

\begin{mi\begin{mi\begin{minnniiipppaaagggeee}}}{{{100...0yx  \\\ttteeexxxtttwwwiiidddttthhh}}}

Figura 5: Entorno minipage
\linea 
\begin{minipage}{1.0\textwidth} 
        \begin{minipage}{0.x\textwidth} 
                % Contenido 1... 
        \end{minipage}\hfill\begin{minipage}{0.y\textwidth} 
                % Contenido 2... 
        \end{minipage} 
\end{minipage} 
\linea

2.5 Ambiente tikzpicture

Make4ht traduce bien, en general, los ambientes tikzpicture. Con cosas muy complicadas todavía tenemos la opción de recoratr la figura, como se indica en la subsección 3.

Ejemplo. Una diagrama generado con tikz


\begin{center} 
\begin{tikzpicture} 
 \matrix (m) [matrix of math nodes, row sep=3.5em, column sep=3.5em, nodes={anchor=center}] 
  {A & A[1] \\ 
   A’ & A’[1] \\}; 
    \path[-stealth] 
    (m-1-1) edge node [above] {$x$} (m-1-2) 
    (m-2-1) edge node [above] {$y$} (m-2-2) 
    (m-1-1) edge node [right] {$z$} (m-2-1) 
    (m-1-2) edge node [right] {$t$} (m-2-2); 
\end{tikzpicture} 
\end{center}

 A          A[1]



xyztA ′        A ′[1]


Ejemplo. Una figura generada con tikz

\begin{tikzpicture}[scale=0.7, x=(-15:1.2), y=(90:1.0), z=(-150:1.0), 
        line cap=round, line join=round, 
        axis/.style={black, thick,->}, 
        vector/.style={>=stealth,->}] 
 
        ...     % El código lo puede ver en el archivo "ejemplos.tex" 
 
\end{tikzpicture}

           (         )
 E = E0 sin  ˆk ⋅ x − c0t
xyzkEBEˆ⋅kˆ=  0,B(ˆ⋅ ˆk = 0,B )= -1ˆk × E
B  = B0 sin  k ⋅ x − c0t c0

2.6 Matrices, ecuaciones y arreglos

Make4ht traduce estos entornos sin problema. Entornos demasiado complejos, posiblemente sea mejor, insertarlos en el html como una imagen svg, como se indica en la subsección 3., o generar el equivalente html con IA, si se pudiera.

El código completo de algunos ejemplos, se puede ver en el archivo ejemplos.tex

1.
equation con underbrace

\begin{equation} 
  \norm{f - L}_{\infty} = \overbrace{\abs{\frac{K_2}{2}}}^{\mathclap{\text{worst $f’’(x)$ }}}\underbrace{\left(\frac{h}{2}\right)^2}_{\mathclap{\text{worst (b - a)}}} 
\end{equation}

f L = |K2 2 | worst f(x)  (h 2 ) 2 worst (b - a) (1)

equation y cases
\begin{equation}\label{eq:cases} 
S_{i,t}= 
\begin{cases} 
 \begin{cases} 
  [x_{i,t}=X^*, r_{i,t}=1] & \text{if  $\max\{X_{i,t}\}=X^*$} \\ 
  [x_{i,t}=\max\{X_{i,t}\}, r_{i,t}=0] & \text{if $\max\{X_{i,t}\} \neq X^*$} 
 \end{cases} 
  &\text{if $\sum_{i=1}^I u_{i,t-1}= \theta^{t-2} X^*$}\\ 
 \begin{cases} 
  [x_{i,t}=1, r_{i,t}=1] & \hspace{\maxmin} \text{if $\min\{X_{i,t}\}=1$} \\ 
  [x_{i,t}=\min\{X_{i,t}\}, r_{i,t}=0] & \hspace{\maxmin} \text{if $\min\{X_{i,t}\} \neq 1$} 
 \end{cases} 
 &\text{otherwise} 
 \end{cases} 
\end{equation}

Si,t = { { [xi,t = X, ri,t = 1] if  max {Xi,t} = X [xi,t = max {Xi,t}, ri,t = 0]if  max {Xi,t}X if  i=1Iui,t1 = 𝜃t2X { [xi,t = 1, ri,t = 1] if  min {Xi,t} = 1 [xi,t = min {Xi,t}, ri,t = 0]if  min {Xi,t}1 otherwise (2)

En la ecuación \ref{eq:cases}, o el formato \eqref{eq:cases}, se tiene que ...
En la ecuación 2, o el formato (2), se tiene que ...

equation y array
( b1 b2 b3 b n ) 𝒃 = ( s11 s12 s13 s1n s21 s22 s23 s2n s31 s32 s33 s3n s n1 s𝑛𝑛 )𝑺 ( a1 a2 a3 a n ) 𝒂
pmatrix con block

( 1 11 k 1 11 k 1 11 k ) T

2.7 Paquete subfigure.

Usamos este paquete para colocar dos figuras, una al lado de la otra, con diferentes caption. El archivo de configuración tiene el código para manejar esta situación en la traducción a html. En la Figura 1 usamos un código bimodal, porque usamos figuras .pdf para el pdf y el formato .svg para el html.

\pdfomk{% subfiguras para pdflatex..., con formato .pdf 
% 
}{% subfiguras para que compile make4ht, en formato .svg 
\begin{figure}[h] 
        \centering 
        \begin{minipage}{1.0\textwidth} 
                \centering 
                \begin{subfigure}{0.4\textwidth} 
                        \centering 
                        \includegraphics{images/fig0a.svg} 
                        \caption{PDFLaTeX} 
                        \label{fig:fig0a} 
                \end{subfigure}% 
                ~ 
                \begin{subfigure}{0.4\textwidth} 
                        \centering 
                        \includegraphics{images/fig0b.svg} 
                        \caption{Make4ht} 
                        \label{fig:fig0b} 
                \end{subfigure}% 
                % caption general 
                \centering\caption{Compilar con PDFLaTeX o con Make4ht} 
                \label{fig:fig0} 
        \end{minipage} 
\end{figure} 
}

2.8 Tablas

Make4ht traduce correctamente a html, tanto tablas simples como otras más elaboradas, que utilizan paquetes como multirow, color o booktabs. Sin embargo, cuando se trata de estructuras más complejas como celdas combinadas de forma irregular, múltiples líneas horizontales o disposiciones no estándar es necesario recurrir a soluciones alternativas, como las que se ilustran en la sección 3. Además, una vez generado el archivo html, es posible agregar interactividad directamente desde este mismo documento .tex. (sección 5.)

A continuación mostramos algunos ejemplos de tablas que Make4ht traduce bien a html.

1.
Tablas con \multicolumn (no usar \arrayrulecolor)

\begin{table}[h!!!] 
  % Make4ht -> html. No lo soporta \arrayrulecolor{black} 
  {\centering 
 \begin{tabular}{ | l | c | c | c | c | c | c |}\hline\hline 
  Tipo de Instrucción & opcode &  &  & & & \\\hline 
  \multicolumn{1}{|r|}{\#bits} & 6 & 5 & 5 & 5 & 5 & 6\\\hline\hline 
  Tipo-R & op & rs & rt & rd & shamt & funct\\\hline 
  Tipo-I & op & rs & rt & \multicolumn{3}{c|}{dirección/inmediato}\\\hline 
  Tipo-J & op & \multicolumn{5}{l|}{dirección objetivo}  \\\hline 
 \end{tabular} 
\caption{\label{tab:4.1}Tipos de instrucciones de código máquina MIPS} 
} 
\end{table}

Tipo de Instrucción opcode
#bits
6 5 5 5 5 6
Tipo-R op rs rt rd shamt funct
Tipo-I op rs rt
dirección/inmediato
Tipo-J op
dirección objetivo
Tabla 1: Tipos de instrucciones de código máquina MIPS

2.
Tablas con \multirow y \rowcolor
 
\begin{table}[h!!!] 
\centering 
\begin{tabular}{|l|l|l|l|} 
\hline 
\rowcolor{gray!30} 
\textbf{Categoría} & \textbf{Item} & \textbf{Cantidad} 
        & \textbf{Precio} \\ \hline 
        \multirow{2}{*}{Frutas} & Manzanas & 10 & \$5.00 \\ \cline{2-4} 
        & Naranjas & 20 & \$8.00 \\ \hline 
        \multirow{2}{*}{Vegetales} & Zanahorias & 15 & \$4.00 \\ \cline{2-4} 
        & Papas& 25 & \$6.00 \\ \hline 
\end{tabular} 
        \captionof{table}{Tabla sofisticada}\label{tab:4.2} 
\end{table} 
 

Categoría Item Cantidad Precio
Frutas
Manzanas 10 $5.00
Naranjas 20 $8.00
Vegetales
Zanahorias 15 $4.00
Papas 25 $6.00
Tabla 2: Tabla sofisticada

3.
Tablas con color en las filas. Esta tabla se puede traducir como una tabla "fija" o se puede traducir con efecto hover sobre sus filas, como veremos en la sección 5..

\setlength{\arrayrulewidth}{0.5pt} 
\arrayrulecolor{headerblue!80} 
\begin{tabular}{cc||ccc||ccc||ccc||ccc} 
\toprule 
\rowcolor{headerblue!90} 
... 
\end{tabular}

Negación
Conjunción
Disyunción
Implicación
Equivalencia
P ¬P P Q P Q P Q P Q P Q P Q P Q P Q
V F V V V V V V V V V V V V
V F V F F V F V V F F V F F
F V F V F F V V F V V F V F
F V F F F F F F F F V F F V
Tabla 3: Tablas de verdad básicas

2.9 Listas de ejercicios

El documento doc.tex usa el paquete exsheets para listas de ejercicos. Definimos dos comandos en el preámbulo

1.
\hejersol{}{}. Este comando lo ignora PDFLatex y Make4ht lo convierte en un enunciado con un botón Ver/Ocultar, para ver la respuesta en el renglón que sigue.
2.
\ejersol{}{}.

Este comando funciona para PDFLatex y Make4ht. PDFLatex lo convierte en un ejercicio normal y, para ver las soluciones, usualmente se pone al final del documento

\pdfomk{ \section*{Respuestas} \printsolutions }{}

Si compila Make4ht, \ejersol{}{} se convierte en \hejersol{}{}.


La idea es que a veces, un mismo ejercicio tiene un enunciado en el pdf, digamos con una figura fija por ejemplo, mientras que el enunciado en html no necesita la figura porque viene con un script.

Ejemplo: Lista de Ejercicos.

% Ejercicio 1: 
\ejersol{Resuelve para $x$: $2x + 5 = 13$}{$x = 4$}\\ 
% Ejercicio 2: 
\ejersol{Calcula el área de un cuadrado de lado 3 cm}{$9\ \text{cm}^2$}\\ 
% Ejercicio 3: 
\ejersol{Deriva $f(x) = 3x^2 + 2x - 1$}{$f’(x) = 6x + 2$}\\ 
% Ejercicio 4: 
\ejersol{Simplifica $\sin^2 \theta + \cos^2 \theta$}{$1$}\\ 
% Ejercicio 5:  Solo PDFLatex 
\pdfomk{\ejersol{Calcula la velocidad final si $v_0=10\,m/s$, 
        $a=2\,m/s^2$ y $t=3\,s$}{$16\,m/s$} 
}{}\\ 
% Ejercicio 6: Solo Make4ht 
\pdfomk{}{ \ejersol{Encuentra la energía cinética de un objeto de 5 kg 
           moviéndose a 4 m/s}{$40\,J$} }\\ 
% Ejercicio 7:  Solo Make4ht 
\hejersol{Halla la corriente si $V=12\,V$ y $R=4\,\Omega$}{$3\,A$}\\ 
 
% Al final: \pdfomk{ \section*{Respuestas} \printsolutions }{}

Ejercicio 2..1 Resuelve para x: 2x + 5 = 13
x = 4

Ejercicio 2..2 Calcula el área de un cuadrado de lado 3 cm
9cm2

Ejercicio 2..3 Deriva f(x) = 3x2 + 2x 1
f(x) = 6x + 2

Ejercicio 2..4 Simplifica sin2𝜃 + cos2𝜃
1

Ejercicio 2..5 Encuentra la energía cinética de un objeto de 5 kg moviéndose a 4 m/s
40J

Ejercicio 2..6 Halla la corriente si V = 12V y R = 4Ω
3A

2.10 Tabla de contenidos: Ver/Ocultar

Para generar una tabla de contenidos en el pdf solo agregamos \tableofcontents. Make4ht compila \tableofcontents y genera una tabla de contenidos adecuada para html.

Lo que queremos ahora es un botón minimalista que abre y cierra una ventanda con el contenido en doc.html. Se requiere un script +toc-toggle.js+ y un archivo toc-toggle.css para hacer eso. Estso archivos ya están incluidos en la plantilla. Para habilitarlos debemos agregar algunas cosas:

% Make4ht -> html 
% En el preámbulo se debe agregar la ruta del .css 
% \ifdefined\HCode\Configure{HEAD}{ 
% \HCode{<link rel="stylesheet" href="css/toc-toggle.css" />} 
% \HCode{<script src="js/toc-toggle.js"></script>} 
%  } 
%\fi 
% \begin{document} 
%  ... 
\pdfomk{%PDFLatex->pdf 
\tableofcontents 
}{ 
\ifdefined\HCode 
\ifvmode\IgnorePar\fi\EndP\par 
    \HCode{<link rel="stylesheet" href="css/toc-togogle.css">} 
    \HCode{<script src="js/toc-toogle.js"></script>} 
\HCode{<button class="toc-btn">Tabla de Contenidos</button>} 
\HCode{<div id="toc-container">} 
\ifvmode\IgnorePar\fi\EndP\par 
\fi 
 
\tableofcontents 
 
\ifdefined\HCode 
\ifvmode\IgnorePar\fi\EndP\par 
\HCode{</div>} 
\ifvmode\IgnorePar\fi\EndP\par 
\fi 
}

3. Convertir entornos "complicados" en imágenes svg

Make4ht no ofrece soporte para muchos paquetes que se usan para implementar tablas o arreglos complejos, como las que se implementan con hhline, nicematrix, polynom etc. Podemos convertir estos entornos en imágnes svg o también, si se presta, se podrían convertir en html interactivo (sección 5.)

1.
Tablas o matrices se puede entregar el código Latex a la IA para que genere un equivalente en html e insertarlo con \insertarhtml{}. A veces el resultado es bueno.
2.
Más generalmente, una opción es abrir el doc.pdf con Inkscape. Este programa (v. 1.4.1, 2025 [7]) abre todas las páginas y solo seleccionamos las que nos interesan (ver Figura 7).

Figura 7: Recortar una figura y guardarla como .svg con Inkscape

Cargamos la página correspondiente del archivo doc.pdf con la o las figuras. Seleccionamos la figura (si hay que desagrupar usamos Crtl-U) y la pegamos en otro documento. Recortamos la figura seleccionada con file-Document Properties-Resize to Content y luego guardamos como .svg.
Recordemos que Inkscape es muy convienente para escalar y/o editar cosas adicionales con la extensión Textext (Extensions-Text-TexText)

3.
Otra opción, en presencia de muchas figuras, es el paquete ltximg [8]. Se ejecuta con un comando en la terminal: Busca los entornos marcados con %<*ltximg> %</ltximg> y los convierte en imágenes .svg

Figura 8: ltximg convierte entornos a .svg

El entorno %<*ltximg> %</ltximg> es ingnorado por PDFLatex y por Make4ht. . Pero ltximg si lo interpreta como un identificador.

%<*ltximg> 
  Entorno... 
%</ltximg>

Preparamos un archivo conv.tex con los entornos y los paquetes y comandos que necesitan

% conv.tex 
\documentclass{article} 
\usepackage[utf8]{inputenc} 
% Preámbulos para cada entorno 
\usepackage{polynom} 
\usepackage{nicematrix,tikz} 
\usetikzlibrary{fit} 
\newcommand{\ff}{\mathtt{f}} 
 
\begin{document} 
% conv-fig-1.svg 
%<*ltximg> 
%<- polynom NO requiere entorno matemático 
\polylongdiv[style=D]{6x^3-2x^2+x+3}{x^2-x+1} 
%</ltximg> 
 
% conv-fig-2.svg 
%<*ltximg> 
\begin{NiceTabular}[hvlines]{ccc} 
\CodeBefore [create-cell-nodes] 
  \tikz \node [draw,fill=blue!15,rounded corners,fit = (2-1) (2-3)] {} ; 
\Body 
  a & b & c \\ 
  d & e & f 
\end{NiceTabular} 
%</ltximg> 
... 
\end{document}

Una vez que tenemos idenficados los entornos que vamos a convertir a imagen svg, tenemos que correr en terminal el comando que recorta y hace las conversiones.

% Ignoramos  entornos tikzpicture, podría habilitarlos si se necesita 
ltximg --skipenv ’tikzpicture’ --runs 2 --subenv --svg --imgdir images -o conv-out conv.tex 
 

Funciona así: Este comando recorre el documento conv.tex y localiza los entornos que están envueltos en el entorno %<*ltximg> %</ltximg>, luego genera y pega en la carpeta images, un archivo conv.tex con solamente los entornos y el preámbulo del documento, luego genera la imagen .pdf de cada entorno y las convierte a .svg.

Los nombres de las imágenes van numeradas por orden de aparición:

conv-fig-1.svg, conv-fig-2.svg, etc.

Para escalar las figuras svg usamos rsvg-convert o inkscape (o programas equivalentes), como se indicó en la sección 2.3.

Ejemplos.

Vamos a recortar entornos con los paquetes nicematrix, polynomial y hhline. Recuerde que estos paquetes no son soportados por Make4ht, pero sí por PDFLatex.

El orden de aparición es importante, porque eso define el nombre de la imagen .svg

1.
Entorno polynom (no requiere entonrno matemático).
\pdfomk{% PDFLatex -> pdf 
\bc 
        \polylongdiv[style=D]{6x^3-2x^2+x+3}{x^2-x+1} % Genera conv-fig-1.svg 
\captionof{figure}{División con el paquete \tt{polynom}} 
\ec 
}{ % Make4ht -> html recoge la imagen generada por "ltximg" 
\bc 
        \includegraphics[width=0.5\textwidth]{images/doc-fig-1.svg} 
        \captionof{figure}{División con el paquete \tt{polynom}} 
\ec 
}

Figura 9: División con el paquete polynom

2.
NiceMatrix

\pdfomk{% PDFLatex -> pdf %conv-fig-2.svg 
  %\newcommand{\ff}{\mathtt{f}} 
   \begin{equation*} 
    \boldsymbol{\mathcal{F}}^{i} = 
    \begin{bNiceMatrix}[margin,nullify-dots] 
     ... 
        \end{bNiceMatrix} 
    \end{equation*} 
}{ % Make4ht -> html 
 \includegraphics[width=0.5\textwidth]{images/conv-fig-2.svg} 
}

Para generar las imágenes svg ejecutamos en terminal

ltximg --skipenv ’tikzpicture’ --runs 2 --subenv --svg --imgdir images -o conv-out conv.tex 
 

4. Entornos definición, teorema, ejemplo, etc.

La plantilla tiene varios entornos ya configurados para que compilen bien con Make4ht.

Agregar nuevos entornos posiblemente requiera agregar nuevo código al archivo de configuración config.cfg (ver sección 7.). Lo recomendable es usar los modelos que ya están en este archivo. Si usa IA, lo mejor es indicarle primero que quiere el código siguiendo esos modelos.

Cosas de diseño de cada entorno, como bordes, color, color de fondo, etc. se puede modificar en WebPreambuloyEntornos.tex.

Para modificar el diseño de cada entorno, para la salida html, requiere modificar el \Css{...} del entorno en el archivo config.cfg. Por ejemplo, para el entorno definción se tiene

\Css{% No dejar renglones en blanco 
 .definicion { 
   background-color: rgb(251, 251, 250);      %/* gris magenta */ 
   border-left: 4pt solid rgb(255, 20, 147);  %/* magenta */ 
   margin: 20pt 0; 
   padding: 0pt 4pt 0 4pt; %/* padding-bottom reducido a 0 */ 
   overflow: auto; %/* Contiene floats */ 
   clear: both; %/* Evita solapamientos */ 
        } 
        %/* Título de la definición */ 
  .definicion-title { 
   color: rgb(255, 20, 147); 
   font-weight: bold; 
   margin-bottom: 0.5em; 
   display: block; 
}                                                                                                                                                                                                                               

A continuación tenemos una lista de entornos con ejemplos.

1.
Definición
\label{def:defi1} 
\begin{definicion}[nombre-opcional] 
 Contenido... 
\end{definicion}

Una definción con nombre.

Definición 1 (Envoltura Convexa).

Sea S n un conjunto de puntos. La envoltura convexa de S, denotada por Conv(S), es el conjunto convexo más pequeño que contiene a S. Formalmente:

Conv(S) = { i=1kλ ixi|xi S, λi 0, i=1kλ i = 1, k }

Es decir, Conv(S) está formado por todas las combinaciones convexas finitas de puntos de S.

Bien, ahora podemos hacer referencia con usual con \ref: En la Definición 1...

Sean A = (1, 1), B = (2, 4), C = (4, 0). El punto P = (3, 1) está dentro del triángulo pues:

P = 1 4 A + 1 4 B + 1 2 𝐶.

Como λ1 = 1 4 , λ2 = 1 4 , λ3 = 1 2 , y λi 0, entonces se concluye que P Conv{A, B, C}.

Figura 10: 𝐴𝐵𝐶

Una definición con minipage

Definición 2 (Modelo para Geometría Hipérbolica).

Un modelo para la geometría hiperbólica es el semiplano superior

= {(x, y) 2|y> 0}

equipado con la métrica

ds2 = dx2 + dy2 y2 . (C)

Al conjunto se le llama semiplano superior de Poincaré, en honor al gran matemático francés que lo descubrió

Figura 11: Rectas paralelas

2.
Teoremas. El formato general es:
\label{teo:teo1} 
\begin{teorema}[nombre-opcional] 
                Contenido... 
\end{teorema}

Teorema con nombre.

Teorema 1 (Parametrización de un triángulo).

Sean A, B, C 2 no colineales entonces existen t, s, w únicos tales que

𝐴𝐵𝐶 = {𝑡𝐴 + 𝑠𝐵 + 𝑤𝐶, donde t, s, w 0, t + s + w = 1}

Teorema con demostración. Tenemos un entorno caja. Es una caja simple, con fondo blanco pero tiene atributos bien definidos en la configuración para la traducción a html.

\label{teo:teo2} 
\begin{teorema}[La recta es el camino más corto] 
... 
\begin{caja}[Demostración.] 
... 
\end{caja} 
\end{teorema}

Teorema 2 (La recta es el camino más corto).

En el plano euclidiano 2 con la métrica usual, el camino más corto entre dos puntos A y B es el segmento de recta que los une.

Demostración.. Sea γ(t) = (x(t), y(t)) una curva suave que une dos puntos A y B en el intervalo [a, b]. Su longitud es:
L[γ] = abx (t)2 + y (t)2𝑑𝑡.

Aplicamos la desigualdad de Cauchy–Schwarz:

L[γ] (x(b) x(a))2 + (y(b) y(a))2,

con igualdad si y solo si γ(t) es constante y paralelo al vector B A, es decir, si γ es una recta.

Por lo tanto, la longitud mínima se alcanza exactamente cuando γ es el segmento de recta entre A y B.

3.
Ejemplo ilustrativo y con solución

\label{ej:ejemplo1} 
\begin{ejemplo}[nombre-opcional] 
 % Enunciado 
\end{ejemplo}

Ejemplo: Vamos a usar un entorno minipage

\pdfomk{ % PDFLatex -> pdf 
\label{ej:ejemplo1} 
\begin{ejemplo}[Punto dentro del triángulo] 
   \begin{minipage}{0.7\textwidth} 
          Sean \( A = (1,1) \), \( B = (2,4) \), \( C = (4,0) \). 
        ... 
   \end{minipage}\hfill\begin{minipage}{0.2\textwidth} 
       ... 
    \includegraphics[scale=0.7]{images/fig2.pdf} 
  \end{minipage} 
\end{ejemplo} 
 }{  % Make4ht -> html 
\label{ej:ejemplo1} 
\begin{ejemplo}[Punto dentro del triángulo] 
   \begin{minipage}{0.7\textwidth} 
          Sean \( A = (1,1) \), \( B = (2,4) \), \( C = (4,0) \). 
        ... 
   \end{minipage}\hfill\begin{minipage}{0.2\textwidth} 
       ... 
   \includegraphics[scale=0.7]{images/fig2.svg} 
   \end{minipage} 
   \end{ejemplo} 
\end{ejemplo} 
} 
 

Ejemplo 1 (Punto dentro del triángulo).

Sean A = (1, 1), B = (2, 4), C = (4, 0). El punto P = (3, 1) está dentro del triángulo 𝐴𝐵𝐶 pues, como este triágulo es un conjunto comvexo y

P = 1 4 A + 1 4 B + 1 2 𝐶.

entonces se concluye que P Conv{A, B, C} = 𝐴𝐵𝐶.

Figura 12: 𝐴𝐵𝐶 y P

Ejemplo con solución

Ejemplo 2 (Punto fuera del triángulo).

Sean A = (1, 1), B = (2, 4), C = (4, 0). Sea P = (3, 4). Verifique que P está fuera del triángulo 𝐴𝐵𝐶.

Solución. Resolviendo el sistema 3 × 3
P = 𝑡𝐴 + 𝑠𝐵 + 𝑤𝐶, t + s + w = 1,

obtenemos la única solución t = 1, s = 2, w = 0, y como uno de los coeficientes es negativo, PConv{A, B, C} = 𝐴𝐵𝐶.

En esta plantilla se han definido más entornos. El disenño se puede modoficar tanto en el archivo WebPreambuloyEntornos.tex como en el archivo de configuración config.cfg. La lista de entornos es

1.
Entornos:
(a)
\ObjetivoGeneral{...}
(b)
\ObjetivosEspecificos{...}
(c)
\resumen{...}
(d)
\palabrasclave{...}
(e)
\abstract{...}
(f)
\keywords{...}
(g)
\label{...}\begin{definicion}...\end{definicion}
(h)
\label{...}\begin{teorema}...\end{teorema}
(i)
\label{...}\begin{ejemplo}...\end{ejemplo}
(j)
\label{...}\begin{corolario}...\end{corolario}
(k)
\label{...}\begin{proposicion}...\end{proposicion}
(l)
\label{...}\begin{lema}...\end{lema}
(m)
\label{...}\begin{caja}...\end{caja}
(n)
\label{...}\begin{axioma}...\end{axioma}
(o)
\label{...}\begin{actividad}...\end{actividad}
(p)
\label{...}\begin{notahistorica}...\end{notahistorica}
(q)
\label{...}\begin{problema}...\end{problema}
(r)
\label{...}\begin{ejercicio}...\end{ejercicio}
(s)
\label{...}\begin{proyecto}...\end{proyecto}
(t)
\label{...}\begin{aplicacion}...\end{aplicacion}

5. Agregar actividades interactivas

Ahora que ya tenemos una manera fiable de traducir Latex a html para introducir contenido matemático, pasamos a introducir interactividad. En esta parte, usamos \insertarhtml{} para incrustar el bloque html para nuestras actividades interactivas (en el caso de que no queramos que estén en páginas independientes).

5.1 JavaScript

Las actividades interactivas en JavaScript requieren separación modular. Cada actividad puede tener su propia lógica, estilo y comportamiento: Sus componentes de estilo css y el código js los separamos de las otras actividades. Esto hace que el código se pueda mantener mejor, evita conflictos de estilo entre módulos distintos y se puede reutilizar fácilmente un módulo en otra parte o en otro proyecto.

Usualmente los scripts se comunican con el el sitio web porque el sitio web les provee de campos de texto, botones, lienzos (canvas) para graficar, escribir, etc.

Cada actividad interactiva con JavaScript tiene una introducción teórica y/o práctica e instrucciones. Luego viene el bloque de código html de la página que se comunica con el script: Este código toma el estilo de una archivo .css en la carpeta css y el escript .js "vive" en la carpeta js , como se muestra en al Figura 13.

Figura 13: Estructura del sitio web

El código .js y el estilo .css lo implementamos nosotros mismos o, por supuesto, pedimos asistencia de la IA. Podríamos solicitar traducir un program ya implementado en otro lenguaje, a un equivalente .js o modificar un programa existente o, indicar todos los detalles del programa que queremos en lenguaje natural.

Para proyectos complejos necesitamos sin duda una especificación con modelos de código y lenguaje técnico para pedir asistencia a la IA.

Si le pedimos a la IA (Copilot, chatGPT, DeepSeek, etc.) una aplicacion interactiva (no muy compleja), entonces en general, seguimos estos pasos:

1.
Pedimos el html completo de una página web con la actividad interactiva que solicitamos. Así nos aseguramos que todo funcione bien. También es útil si vamos a usar esta página web de manera independiente.
2.
Cuando todo funciona bien, pedimos o manualmente separamos el .css, el .js y lo que está en <body> ...<\body> es lo que insertamos. Adicionalmente hay que insertar en el preámbulo de nuestro archivo .tex las líneas que deben ir en el <head> </head> del html.

Con más detalle:

Ejemplo: Un script sencillo en lenguaje natural. Supongamos que queremos implementar un script para visualizar la intersección de dos intervalos. En general, lo mejor es tener una idea gráfica, algo como se muestra en la Figura 14

PIC

Figura 14: Idea gráfica del script que queremos implementar

Luego debemos pensar en una petición. La IA "sabe" cómo calcular la intersección de dos intervalos, aún así siempre hay que revisar casos especiales y la lógica general, previniendo errores. Por ejemplo, la petición en lenguaje naural podría ser:

"Crea un script que muestre dos intervalos arrastrables (azul/verde) sobre una línea numérica, con discos rellenos/vacíos según sean cerrados/abiertos. Que calcule y muestre su intersección con un segmento (magenta) un poco más arribe, con líneas punteadas hacia abajo. Incluye doble click para cambiar apertura/cierre y redondeo cercano a enteros. Importante: El css debe estar encapsulado, oo debe haber ninguna variable ni estilo que afecte afuera de ese contenedor."

También está la opción de ser mucho más específicos:

Interfaz gráfica:

Discos en extremos:

Interacción:

Detalles visuales:

Encapsulamiento: Dame un widget encapsulado bajo .intintervalos-widget, con css y js encapsulados. No debe haber ninguna variable ni estilo que afecte afuera de ese contenedor.

 

En este caso tuvimos éxito: El resultado, después de varios ajustes (peticiones adicionales) es como se muestra ya activo en la subsección 6.1

Luego, lo recomendable es revisar casos especiales y la lógica en el código del script.

En este caso la IA nos entregó los archivos .css, .js y .html, además de una petición espcial: que alistara el código \insertarhtml{...} para nuestro doc.tex.

6. Ejemplos de actividades interactivas

En esta sección aparecen varios ejemplos, expuestos de manera suscinta, con aplicaciones interactivas. En todos estas aplicaciones se usó IA (mayormente DeepSeek, también Copilot y chatGPT), para asistir en la implementación de los scripts interactivos que aparecen más adelante.

icon: exclamation-circle Este documento es acerca de cosas de implementación, por eso no se expone la parte complicada de diseñar la actividad interactiva.

6.1 Intersección de Intervalos

Recordemos que A B (A intersección B) es el conjunto de elementos comunes al conjunto A y al conjunto B.

Dado que los intervalos representan conjuntos, es posible hallar sus intersecciones y uniones. Las representaciones gráficas son útiles en este proceso.

icon: bolt Actividad Interactiva

¿Cómo hallar intersecciones y uniones de dos intervalos?

1.
Represente cada intervalo en una recta numérica.
2.
Para hallar la intersección de dos intervalos, podemos proceder así:
  • En la misma recta numérica, represento ambos intervalos
  • Toma la porción de la recta numérica que las dos representaciones tienen en común
  • ...

Actividad interactiva. En el siguiente script,

% Make4ht -> html 
% En el preámbulo se debe agregar la ruta del .css 
% \ifdefined\HCode\Configure{HEAD}{ 
% \HCode{<link rel="stylesheet" href="css/interseccionintervalos.css">} 
%    %... 
%  } 
%\fi 
% En la carpeta "css" agregar  interseccionintervalos.css 
% En la carpeta "js" agregar  interseccionintervalos.js 
\insertarhtml{ 
<div class="int-intervalos-container"> 
    <div class="int-intervalos-contenedor"> 
      <h2 style="color: \#d45500;">Intersección de Intervalos</h2> 
      <div class="int-intervalos-resultado"> 
        <input type="text" id="int-intervalos-input1" readonly /> 
        <span class="intervalos-op"></span> 
        <input type="text" id="int-intervalos-input2" readonly /> 
        <span class="intervalos-op">=</span> 
        <input type="text" id="int-intervalos-resultado" readonly /> 
      </div> 
      <canvas id="int-intervalos-canvas" width="600" height="250"></canvas> 
    </div> 
  </div> 
  <script src="js/interseccionintervalos.js"></script> 
}

Intersección de Intervalos

=

Script de ejercicios sobre intersección de intervalos.

En el script que sigue, el botón "Generar Intervalos", genera dos intervalos con extremos aleatorios. Su trabajo consiste en cálcular la intersección, si hubiera, y realizar la representación gráfica. Al final, puede ver la respuesta presionando el botón Respuesta.

Implementación: Esta basada en una petición detallada a la IA, especificando lo que contiene la primera fila y la zona gráfica.

 % En el preámbulo agregar: 
 %\ifdefined\HCode\Configure{HEAD}{%... 
 % \HCode{<link rel="stylesheet" href="css/ejerinterseccionintervalos.css">} 
%} 
%\fi 
% En la carpeta "css" agregar  ejerinterseccionintervalos.css 
% En la carpeta "js" agregar  ejerinterseccionintervalos.js 
\insertarhtml{% Make4ht -> html 
<div class="interseccion-caja" style="margin: 0 auto; max-width: 600px;"> 
    <div class="titulo" style="margin-bottom: 20px; color: \#d45500;">Script interactivo: Generar dos intervalos y  ver su intersección.</div> 
    <div class="controls"> 
        <button id="btnGenerarIntersect" style="margin-right: 15px;">Generar Intervalos</button> 
        <input type="text" id="int1Intersect" readonly style="width: 72px; margin-right: 10px; font-size: 16px; padding: 8px; text-align: center;"> 
        <span style="margin-right: 10px;">\( \cap \)</span> 
        <input type="text" id="int2Intersect" readonly style="width: 72px; margin-right: 15px; font-size: 16px; padding: 8px; text-align: center;"> 
        <button id="btnCalcularIntersect">Respuesta</button> 
    </div> 
    <div id="resultadoInterseccionIntersect" style="text-align:center; margin-bottom:5px; font-size:18px;"></div> 
    <canvas id="canvasIntersect" width="565" height="200"></canvas> 
</div> 
<script src="js/ejerinterseccionintervalos.js"></script> 
}

Script interactivo: Genere dos intervalos y visualice su intersección.
\( \cap \)

6.2 Interpretación geométrica de la derivada

Una interpretación de la derivada de una función de una variable es que mide la tasa (instántanea) de cambio de la variable dependiente respecto a la variable independiente. La derivada de la función y = f(x) en x es,

f(x) = lim Δx0 Δy Δx = lim h0 f(x + h) f(x) h

siempre y cuando este límite exista. Geométricamente, la derivada de f en x es la pendiente de la recta tangente a f en el punto (x, f(x)). Y es el límite de las pendientes de las "cuerdas" que pasan por (x, f(x)) y (x + h, f(x + h)) cuando h0.

Ecuación de la recta tangente en un punto. Si f es derivable en x = a, entonces la ecuación de la recta tangente a f en x = a es y = f(a)(x a) + f(a).

icon: bolt Actividad Interactiva

Interpretación geómetrica de la derivada En el siguientes script puede arrastrar el punto rojo para cambiar el punto de tangencia y el punto azul, para empezar el proceso de límite

% En el preámbulo agregar: 
%\ifdefined\HCode\Configure{HEAD}{ 
%  \HCode{<link rel="stylesheet" href="css/intgeomderivada.css">} 
%  \HCode{<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/11.8.0/math.js"></script>} 
%}\fi 
% En la carpeta css agregar intgeomderivada.css 
% En la carpeta "js" agregar  intgeomderivada.js 
\insertarhtml{ % Make4ht -> html 
  <div class="contenedor"> 
    <svg id="grafico" width="600" height="400"></svg> 
    <div class="tabla-valores"> 
      <table> 
        <thead><tr><th>x</th><th>x+h</th><th>(f(x+h) - f(x)) / h</th></tr></thead> 
        <tbody id="tablaDatos"></tbody> 
      </table> 
    </div> 
  </div> 
  <script src="js/intgeomderivada.js"></script> 
}

x x+h (f(x+h) - f(x)) / h

Implementación: Esta es un traducción de un archivo .nb (Wofram Mathematica) a JavaScript, con DeepSeek. El archivo está disponible: Capx-DerivadaDefi.nb. La traducción requiere algunos ajustes que se pueden hacer a través de peticiones a DeepSeek o manualmente, directamente en el código.

6.3 Un problema de optimización: Ejercicio y respuesta.

El área A del trapecio isósceles inscrito en la parte superior de una circunferencia de ecuación x2 + y2 = 16 se puede escribir en funciónn de la base menor, de longitud 2a:

A(a) = (B + b) h 2 = (8 + 2a) 16 a2 2

Si a = 0, tendríamos un triángulo de área 8ul2. Pero nos interesa el valor de a para que el trapecio tenga área máxima.

En el siguiente script podemos, con el deslizador, hacer que a tome los valores permitidos, es decir, a [0, 4]. En la tabal podemos ver como varía el área y en el gráfico de la derecha vemos que hay un valor de a en que el área es máxima. Y queremos calculor el valor exacto de a en el que el área del trapecio es máxima.

% En el preámbulo agregar: 
%\ifdefined\HCode\Configure{HEAD}{ 
%   ... 
%  \HCode{<script src="https://d3js.org/d3.v7.min.js"></script>} 
%  \HCode{<link rel="stylesheet" href="css/optimizaciontrapecio.css">} 
%} 
%\fi 
% En la carpeta css agregar optimizaciontrapecio.css 
% En la carpeta "js" agregar  optimizaciontrapecio.js 
\insertarhtml{% No dejar renglones en blanco 
   <script src="js/optimizaciontrapecio.js" defer></script> 
    <div class="trapecio-widget"> 
     ... 
    </div> 
   </div> 
}

Cargando visualización...

Problema de Optimización - Área de Trapecio

Interacción Gráfica

Valor de a: 1.00

Historial de Valores

Relación Área vs. a

Ahora usamos el script para un ejercicio, con un botón Ver/Ocultar la respuesta. Recordemos, de la subsección ??, que \hejersol{}{} es solo para html y que \ejersol{}{} lo compilan tanto PADFLatex como Mak4ht (lo convierte en \hejersol{}{}). Pero en este caso, el enunciado de los ejercicios no es igual en ambos contextos, por eso los separamos.

\hejersol{ 
   % Solo Make4ht -> html: Pregunta con botón ver/ocultar 
   Hallar las dimensiones del trapecio isósceles de mayor área que puede inscribirse en un semicírculo de radio $4$. 
... 
 }{% respuesta 
   La base mayor 8 unid, la menor 4 unid y la altura $2\sqrt{3}$ unid. 
}%-- 
\pdfomk{% PDFLatex -> pdf 
        \ejersol{ 
        Hallar las dimensiones del trapecio isósceles de mayor área que puede inscribirse en un semicírculo de radio $4$. 
        \bc 
        \includegraphics[width=0.45\linewidth]{images/fig8-appderivadas.pdf} 
        \captionof{figure}{Trapecio isósceles inscrito}\label{trapecioisosceles} 
        \ec 
        }{ 
        La base mayor 8 unid, la menor 4 unid y la altura $2\sqrt{3}$ unid. 
        }%--ejersol 
  }{} 
 %  \printsolutions % PDFLatex, soluciones  final del documento.

Ejercicio 6..1 Hallar las dimensiones del trapecio isósceles de mayor área que puede inscribirse en un semicírculo de radio 4.
La base mayor 8 unid, la menor 4 unid y la altura 23 unid.

Implementación: Esta es un traducción de un archivo .nb (Wofram Mathematica) a JavaScript, con DeepSeek. El archivo está disponible: Capx-EjemplOptimizacion.nb. La traducción requiere algunos ajustes que se pueden hacer a través de peticiones a DeepSeek.

6.4 Sumas de Riemann con particiones regulares

Históricamente, la integral de Riemann se define como un "límite" sobre todas las posibles particiones de un intervalo, pero en realidad solo necesitamos definir la integral sobre particiones regulares [3].

Como consecuencia, si f es integrable, calculamos la integral con una escogencia de los ξi fijos, sobre una familia de particiones regulares.

Teorema 3.

Sea f integrable en [a, b] y 𝒫n = {x0, x1, ..., xn} con xi = a + iba n , i = 0, 1, 2..., n. Entonces

abf(x)𝑑𝑥 = lim n i=0nf(ξ i)b a n

sin importar la escogencia (fija) de los ξi [xi, xi+1]

icon:  exclamation-circle El recíproco es falso, si lim n i=0nf(ξi)ba n existe para una escogencia de los ξi fijos, no signifca que f sea integrable.

Ejemplo 3.

f(x) = x2 4x + 5 es integrable en [1, 4] porque es continua en este intervalo. Por tanto, según el Teorema 3

14f(x)𝑑𝑥 = 6

pues, tomando ξi = 1 + 3i n,

14f(x)𝑑𝑥 = i=1nf(ξ i) 3 n = 3 n i=1n [2 6i n + 9i2 n2 ] y, usando las fórmulas para estas sumas de n términos, = 6

icon: bolt Actividad Interactiva

1.
Si f es integrable, entonces podemos tomar ξ = xi1
2.
% Make4ht -> html 
% En el preámbulo se debe agregar la ruta del riemann.css 
% \ifdefined\HCode\Configure{HEAD}{ 
% ... 
% \HCode{<link rel="stylesheet" href="css/riemann.css">} 
%  } 
%\fi 
% En la carpeta css agregar riemann.css 
% En la carpeta "js" agregar  riemann.js 
\insertarhtml{ 
  <div class="riemann-widget"> 
   <h1>Integral de Riemann</h1> 
    ... 
  </div> 
 % 
  <script src="js/riemann.js"></script> 
}

Integral de Riemann

Número de rectángulos (n): 5
abf(x)𝑑𝑥 i=0n1f(xi)Δx
Suma de Riemann: 0.00
i xi f(xi) i=0n1f(xi)Δx
Total

Implementación: Se hizo una petición detallada a DeepSeek. Se especificó que la evalución de la función se debía hacer con math.js (sino la IA trata de hacer un "parser" demasiado simple) y que no usara "charts" para los rectángulos. Finalmente, cuando el html funcionaba correctamente, se pidió a la IA que encapsulara y luego separara riemann.css, también riemann.js y el .html para extraer lo que debemos inyectar en el <header>...<header> y para extraer lo qu está en <body>...</body>, e inyectarlo con \insertarhtml{}

6.5 Plano Tangente

Plano Tengente.
Si la superficie S tiene ecuación G(x, y, z) = 0 con G diferenciable, el plano tangente en P S tiene ecuación cartesiana

Gx(P)x + Gy(P)y + Gz(P)z = G(P) P

Si S tiene ecuación z = f(x, y) con f diferenciable, entonces G(x, y, z) = z f(x, y) y G(P) = (zx(P), zy(P), 1), por tanto el plano tangente en P = (p0, p1, p2) S tiene ecuación cartesiana

Gx(P)x + Gy(P)y + Gz(P)z = G(P) P zx(P)x + zy(P)y + z = (zx(P), zy(P), 1) (p0, p1, p2)

Es decir,

zx(P)(x p0) + zy(P)(y p1) = z p2

Rectas tangentes en dirección de fx(P) y fy(P).

Si S tiene ecuación z = f(x, y) con f diferenciable, entonces una ecuación paramétrica de la recta tangente a P = (p0, p1, p2) en la dirección del eje X se obtiene tomando v = (1, 0) y una ecuación paramétrica de la recta tangente a P en la dirección del eje Y se obtiene tomando v = (0, 1)

LX(t) = P + t (1, 0, zx(P)) o LX(x) = (x, p1, p2 + (x x0)fx(p0, p1))

LY(t) = P + t (0, 1, zy(P)) o Ly(x) = (p0, y, p2 + (y p1)fy(p0, p1))

La recta tangente en P, en dirección de v 2 es

Lv(t) = P + t (v0, v1, z(P) (v0, v1))

o, en términos de la derivada direccional, Lv(t) = P+ t ( v0 ||v||, v1 ||v||, Dvz(P))

En el siguiente script tenemos la superficie z = 1 (x 1)2 + (y 1)2. Arrastrando el punto en la columna a la derecha podemos mover el punto P en la superficie y el plano tangente. Vamos a observar...

% Make4ht -> html 
% En el preámbulo se debe agregar la ruta del planotangente.css y plotly 
% \ifdefined\HCode\Configure{HEAD}{%... 
%  \HCode{<script src="https://cdn.plot.ly/plotly-2.32.0.min.js"></script>} 
%  \HCode{<link rel="stylesheet" href="css/planotangente.css">}} 
%  } 
%\fi 
% En la carpeta css agregar planotangente.css 
% En la carpeta "js" agregar  planotangente.js 
\insertarhtml{ 
<div class="planotangente-widget"> 
   <div id="plot3d"></div> 
   <div id="plot2d-container"> 
   <div id="controls"> 
   <label><input type="checkbox" id="toggleTangents" checked> Mostrar rectas tangentes</label> 
   </div> 
   <div id="coords">Coordenadas: (1.05, 0.68, 0.00)</div> 
   <div id="plot2d-wrapper"> 
  <canvas id="plot2d"></canvas> 
  </div></div></div> 
<script src="js/planotangente.js" defer></script> 
}

Coordenadas: (1.05, 0.68, 0.00)

Implementación: Se hizo una petición detallada a DeepSeek (Copilot también fue muy eficiente y en menor mediada ChatGPT), en este caso hubo que hacer ajustes manuales en el .js para habilitar y deshabilitar cosas y corregir dimensiones. La IA "conoce" las ecuaciones del plano tangente y las ecuaciones de las rectas tangentes solicitadas. Pero debemos especificar que la gráfica de la superficie se implemente con plotly.js y que sea una "constante" (usar three.js o babylon.js requiere demasiados ajustes) y, como plotly.js no ofrece muchos eventos de ratón, solicitamos que el punto P = (x, y, f(x, y)) se actualice con las coordenadas (x, y) que provee el punto de arrastre en la segunda columna, que debe ser en JavaScript normal. Es decir, las dos columnas se comunican. Solicitamos encapsulado con .planotangente-widget. Siempre hay que asegurarse que no use variables globales en el css, como name {...}, sino .planotangente-widget #name {...}. Finalmente pedimos el html, el .css y el .js separados. Observe que este script viene con un menú en la parte superior, para trasladar, imprimir, etc.

6.6 Efecto hover en tablas

Queremos aplicar un efecto hover para resaltar o iluminar filas, columnas o elementos de una tabla, cuando el ratón pasa por encima.

Estos efectos se aplican a la etiqueta <table class="...</table>, pero Make4ht no siempre convierte un entorno tabular en un entorno <table>... (esto pasa cuando tabular está en entornos, center, table, minipage, etc.). Además diseños especiales de tablas requieren un manejo especial.

1.
Tablas que Make4ht compila bien.

En este caso, usamos el diseño de la Tabla 4. El estilo definido ya esta en la carpeta css y se llama tabla-hover-filas.css. Además ya incluimos el código en el preámbulo de este documento para cargar este estilo. Luego, usamos un entorno tablahoverfilas ya definido en el preámbulo, y envolvemos las tablas con este entorno para envolver el tabular con la etiqueta <div class=’tabla-hover-filas’>. PDFLatex ignora este entorno, es solo para Make4ht.

\begin{tablahoverfilas} %  Make4ht inyecta el efecto :hover en el html 
  \begin{table}[h!!!] 
   ... 
   \begin{tabular}{cc||ccc||ccc||ccc||ccc} 
    ... 
   \end{tabular} 
   \caption{Tabla modelo}\label{tabla-modelo} 
  \end{table} 
\end{tablahoverfilas}

Negación
Conjunción
Disyunción
Implicación
Equivalencia
P ¬P P Q P Q P Q P Q P Q P Q P Q P Q
V F V V V V V V V V V V V V
V F V F F V F V V F F V F F
F V F V F F V V F V V F V F
F V F F F F F F F F V F F V
Tabla 4: Tabla modelo. En doc.html está habilitado el efecto :hover especificado.
2.
Tablas que Make4ht no traduce bien.

Para cada tabla particular, si deseamos mantener su diseño, pedimos a la IA que traduzca el código Latex a algo equivalente en html y que nos dé el archivo de estilo encapsulado .css de esta tabla. A este estilo pedimos que le agregue el efecto :hover deseado.

Seleccionamos y copiamos el bloque de código de la tabla completo, para pegarlo en la petición que vamos a hacer. \begin{table}\caption...\end{table} y luego hacemos la solicitud a la IA de esta manera:

Voy a proporcionar el código Latex de una tablay necesito lo siguiente:

(a)
Crear una versión HTML equivalente de la tabla, respetando su estructura, encabezados y rayado de filas.
(b)
Generar un archivo CSS separado, para descargar, con el nombre tablahover1.css, que contenga todos los estilos necesarios para esa tabla.
(c)
Es muy importante que los estilos estén fuertemente encapsulados para evitar interferencias con otros elementos del sitio.
(d)
Incluir un efecto hover que ilumine o resalte visualmente cada fila cuando el usuario pase el cursor por encima.
(e)
Indicar la instrucción que debo incrustar el header para cargar el archivo .css
(f)
Finalmente, entregar un archivo HTML completo listo para descargar, con nombre tablahover1.html
(g)
Pegamos el código LateX... y damos enter

Lo que hacemos ahora con la información que recibimos (después de pedir algún ajuste a al tabla si fuera necesario), es lo siguiente:

(a)
Insertamos el archivo de estilo: Lo hacemos al inicio de este documento ( lo agregamos a los existentes, sin filas en blanco)

\documentclass[fleqn,oneside]{article} 
\input{Paquetes/WebPreambuloyEntornos.tex} 
\input{Paquetes/ComandosdelUsuario.tex} 
% Make4ht-- -> html 
\ifdefined\HCode\Configure{HEAD}{ 
      \HCode{<link rel="stylesheet" href="css/tabla-hover-filas.css">} 
      \HCode{<link rel="stylesheet" href="css/tablahover1.css">} 
      %... 
     } 
\fi 
% 
\begin{document}

(b)
El archivo de estilo tablahover1.css lo guardamos en la carpeta css
(c)
Estamos listos para editar el contenido e insertar el código html de la tabla que nos dio la IA

    % html de la tabla (NO dejar filas en blanco!) 
\insertarhtml{% Make4ht -> html 
    <div class="tablahover1"> 
    % Agregamos manualmente id= para referencia 
   <table id="tablahover1"> 
  ... 
} 
 

Make4ht no incluye la referencia de la tabla, porque no la compiló en el archivo .tex, entonces hacemos referencia a esta tabla con

\insertarhtml{<a href="\#tabla-modelo">Ver Tabla modelo</a>}

6.7 Incrustar applets GeoGebra

GeoGebra [5] es un software interactivo para enseñar y aprender matemáticas mediante construcciones visuales. Aunque su implemetación y/o uso requiere práctica, permite integrar recursos ya creados en páginas web.

Incrustar un applet. Para incrustar applets de Geogebra en nuestra página html, seguimos las instrucciones que se detallan en [6]. En la página de Recursos podría ser que haya algo que nos interese, en ese caso abrimos el applet, y a la derecha del nombre del autor hacemos click en los tres puntos y, en el menú que se abre, hacemos click en "Detalles"; en la ventana que se abre, hacemos click en "Compartir" y damos click en "<\>Incrustar". Copiamos el <iframe....></iframe> con todo su contenido y eso es lo que vamos incrustar.

Para incrustar el código html del <iframe..., usamos un script toggleVentana.js (que ya está en la carpeta js y que ya se carga con este este archivo doc.tex). Produce un botón que abre u oculta la ventana en la que se despliega el applet de Geogebra. Pero debemos numerar bien la ventana en el data-tarjet="ventanak" y en el identificador id="ventanak"

<button class="toggle-ventana-btn" data-target="ventanak"> 
    Ver/Ocultar nombre </button> 
<div id="ventanak" class="ventana-container" style="display: none;">

Cambiamos ventanak por "ventana1", "ventana2", etc. porque cada applet ocupa un contenedor diferente.

6.71 Ejemplos.

Distribución Normal.

\insertarhtml{% ventana1 
    <button class="toggle-ventana-btn" data-target="ventana1">Ver/Ocultar Distribución Normal</button> 
    <div id="ventana1" class="ventana-container" style="display: none;"> 
     <div style="width:100\%; position:relative; padding-bottom:44.58\%;"> 
        <iframe scrolling="no" title="Distribución Normal" src="https://www.geogebra.org/material/iframe/id/rZ7NHCsS/width/1366/height/609/border/888888/sfsb/true/smb/false/stb/false/stbh/false/ai/false/asb/false/sri/false/rc/false/ld/false/sdz/false/ctl/false" width="900px" height="402px" style="border:0px;"></iframe> 
</div> 
</div> 
}

Las dimensiones que nos dan son de width="1366px" height="609px". Pero para nuestro sitio parece mejor (manteniendo las proporciones) width="900px" height="402px"



Tabla de Frecuencias. Este es otro ejemplo que tomamos de la página de Recursos

\insertarhtml{ % Numerar ventana!. Vamos por la "ventana2" 
    <button class="toggle-ventana-btn" data-target="ventana2">Ver/Ocultar Tabla Frecuencias</button> 
    <div id="ventana2" class="ventana-container" style="display: none;"> 
     <iframe scrolling="no" title="Tabla de frecuencias" src="https://www.geogebra.org/material/iframe/id/sxG0ihm3/width/900/height/400/border/888888/sfsb/true/smb/false/stb/false/stbh/false/ai/false/asb/false/sri/false/rc/true/ld/false/sdz/false/ctl/false" width="900px" height="400px" style="border:0px;"> </iframe> 
    </div> 
}



6.8 Incrustar videos de Youtube

De manera similar a como incrustamos applets de Geogebra, usamos un script toggleVentana.js y actualizamos la numeración de la ventana.

En el video de YouTube que nos interesa, hacemos click en "Compartir" y hacemos click en "Incrustar" y tomamos el código <iframe ...>...</iframe> y lo insertamos en nuestro html.

Ejemplo.

El determinante | Esencia del álgebra lineal, capítulo 5.

% Numerar ventana!. Vamos por la "ventana3" 
\insertarhtml{ 
<button class="toggle-ventana-btn" data-target="ventana3">Ver/Ocultar Tabla Frecuencias</button> 
<div id="ventana3" class="ventana-container" style="display: none;"> 
<iframe width="560" height="315" src="https://www.youtube.com/embed/yt3eoYvGel0?si=sq7SgYaOXnHpZU5j" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> 
</div> 
}

7. Configurar Make4ht

Tex4ht (implementado por Eitan Gurari (1947–2009)) es un conjunto de scripts que, después de la compilación con htlatex, "traduce" el archivo dvi. Este archivo dvi contiene toda la información sobre la disposición del texto, gráficos y fórmulas matemáticas en un formato compacto. Esta información se usa para generar documentos pdf, html, etc.

Make4ht es un sistema de compilación (implementado por Michal Hoftich) para Tex4ht. Make4ht es una herramienta diseñada principalmente para convertir documentos LaTeX en HTML (y otros formatos), enfocándose en la estructura del contenido (texto, tablas, imágenes, fórmulas matemáticas, etc.), pero no se encarga del diseño web avanzado. Esto significa que, por defecto, Make4ht no genera estilos css complejos ni diseños responsivos modernos.

Pero Make4ht permite controlar y configurar el diseño web. Usualmente lo que hacemos es que con un archivo de configuración config.cfg controlamos la salida html de los entornos y otros componentes del código Latex.

Esta sección es una aplicación de los elementos de configuración que se pueden leer en [2] y en respuestas a preguntas relacionadas con Make4ht en TeX Stack Exchange. Creamos una plantilla doc.tex configurada apropiadamente para que compile bien con Make4ht (parece que no tiene mucho sentido compilar con Make4ht un documento .tex sin implementar la configuración adecuada, excepto que sea un documento muy sencillo).

La IA puede ser útil para que nos ayude generando código tedioso y recomendaciones, pero en el estado actual, no parece estar muy entrenada en Make4ht, por lo que la manera práctica de usar la IA, es dándole modelos de código para que genere código Latex apropiado (sin supuestos raros, ni comandos inexistentes).

7.1 Algunos comandos de configuración

Hay muchos comandos de configuración, pero vamos a describir y ver ejemplos de aplicación de algunos comandos frecuentes en la configuración de nuestro documento doc.tex

1.
\Configure{name}{arg 1}...{arg n} Configura el comportamiento específico de un elemento en el formato de salida.

Este comando declara el código que se inserta en los hooks ("ganchos") relacionados con la configuración del "name". Es posible definir hasta nueve hooks, por lo que el número de argumentos es variable.

2.
\ConfigureEnv{<environmentname>}{before env}{after env}. Personaliza cómo se "renderiza" un entorno específico, definiendo elementos antes y después del entorno y la lista. Este comando puede ser usado para insertar código pertinente en cualquier entorno.
3.
\HCode{output format markup} se usa para insertar, en este caso html "puro"

Este comando sólo permite la "expansión de macros", antes de enviar su contenido a la salida. En él se puede introducir la instrucción \Hnewline para solicitar saltos de línea, y el comando \# para el símbolo #.

4.
\Css{...} se usa para introducir estilo css desde el archivo de configuración.

7.2 Configuración en el preámbulo

1.
La opción [spanish][babel] esta bien para PDFLatex, pero para tradución al html causa muchos problemas porque redefine muchos caracteres. Así que usamos HCode para indicar que configuración usará PDFLatex y cuál Make4ht

\ifdefined\HCode % Make4ht -> html 
    \usepackage[spanish,english]{babel} 
    \usepackage[T1]{fontenc} 
    \usepackage[utf8]{inputenc} 
\else            % PDFLatex -> pdf 
    \usepackage[english, spanish, es-noquoting]{babel} 
    \usepackage[autostyle, spanish = mexican]{csquotes} 
    \MakeOuterQuote{"} 
    \usepackage[T1]{fontenc} 
    \usepackage[utf8]{inputenc} % LaTeX clásico

2.
Comandos personalizados para Make4ht

3.
La parte interactiva de este documento requiere cargar todos los archivos .css y algunos scripts específicos. Eso lo hacemos antes de \begin{document}

\documentclass[fleqn,oneside]{article} 
\input{Paquetes/WebPreambuloyEntornos.tex} 
\input{Paquetes/ComandosdelUsuario.tex} 
%% Make4ht -> html:   Inserta en <head>...</head> 
\ifdefined\HCode\Configure{HEAD}{ 
  \HCode{<link rel="stylesheet" href="css/tabla-hover-filas.css">} 
  \HCode{<link rel="stylesheet" href="css/riemann.css">} 
  \HCode{<link rel="stylesheet" href="css/ejerinterseccionintervalos.css">} 
  \HCode{<link rel="stylesheet" href="css/interseccionintervalos.css">} 
  \HCode{<link href="css/intervalos.css" rel="stylesheet" type="text/css">} 
  \HCode{<link rel="stylesheet" href="css/intgeomderivada.css">} 
  \HCode{<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/11.8.0/math.js"></script>} 
  \HCode{<link rel="stylesheet" href="css/ejerciciosolucion.css">} 
  \HCode{<script src="https://d3js.org/d3.v7.min.js"></script>} 
  \HCode{<link rel="stylesheet" href="css/optimizaciontrapecio.css">} 
  \HCode{<script src="https://cdn.plot.ly/plotly-2.32.0.min.js"></script>} 
  \HCode{<link rel="stylesheet" href="css/planotangente.css">} 
  \HCode{<script src="js/toggleVentana.js" defer></script>} 
%\HCode{<link rel="preconnect" href="https://fonts.googleapis.com">} 
  } 
\fi 
... 
\begin{document}

7.3 Archivo (personalizado) de configuración

El archivo de configuración tiene la forma

\Preamble{xhtml} 
%...Configure, ConfigureEnv, etc. 
\begin{document} 
%...insertar en header (posiblemente no cosas de uso ocasional) 
\EndPreamble

En este documento doc.tex configuramos el comportamiento de todos los entornos. El documento doc.tex usa el paquete mdframed (tcolorbox inserta las "label" internamente y complica las cosas). Make4ht traduce los entornos mdframe de manera simplificada, con solo cosas básicas. Pero el archivo de estilo doc.css gobierna todo, entonces tenemos que anular "ese poder" y modificarlo.

Siempre que configuramos algo, hay que evitar que el html se "rompa" (evitar que el DOM se rompa) digamos por etiquetas que abren, pero no cierran como en <div><p>Contenido</div>. También el DOM se puede romper por paquetes incompatibles con Make4ht o entornos matemáticos complejos mal interpretados.

En la compilación con Make4ht, una "advertencia" del tipo

[WARNING] domfilter: DOM parsing of test.html failed: 
[WARNING] domfilter: /home/.../ ... nbalanced Tag (/p) [char=   ]

significa que la estructura del documento (DOM) se ha roto y la "advertencia" nos dice que una o varias cosas ya no van a salir bien. Lo normal es corregir el problema directamente o hacer modificaciones. El código que sigue es muy preciso, para no romper el DOM.

1.
Configurar mdframed.
% Elimina la configuración automática de mdframed que inserta Make4ht 
\Configure{mdframed}{\IgnorePar\EndP}{\IgnorePar\EndP}{}{} 
% Eliminamos los márgenes que vienen por defecto 
\Css{.mdframed { 
  margin-top: 0pt !important; 
  padding-top: 0pt !important; 
}} 
% Preparar para la configuración personalizada usando \ConfigureEnv con \Css 
\ConfigureEnv{mdframed}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="mdframed">}\par} 
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}\par}{}{}

En esta configuración de mdframed, se agregan etiquetas <div>...</div> alrededor del contenido del cuerpo del documento. Los comandos \ifvmode\IgnorePar\fi evitarán la inserción de la etiqueta <p> antes de <div> si estamos en el modo vertical de TeX. \EndP cierra el párrafo abierto, si está abierto. Los comandos \par\ShowPar inician un nuevo párrafo después de la etiqueta <div> insertada. A veces es necesario iniciar los párrafos explícitamente.

2.
Configurar el entonro \begin{definition}...\end{definition}

Podemos agregar diseño con css sin que el css original intervenga. La idea es que se parezca al diseño del entorno en el doc.tex. Para empezar bebemos definir bordes, colores, etc. Más adelante debemos definir otras cosas, como veremos. Recordar que estamos compilando con el motor Latex, por lo tanto tenemos que "escapar" caracteres especiales o comentar.

\ConfigureEnv{definicion} 
{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="definicion">}\par} 
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}\par} 
{}{} 
\Css{ 
%/* --- Estilo base para "definicion", bordes, etc. --- */ 
.definicion { 
                background-color: rgb(251, 251, 250);  %/* gris magenta */ 
                border-left: 4pt solid rgb(255, 20, 147);  %/* magenta */ 
                % top right bottom left; 
                margin: 20pt 0; 
                padding: 0pt 4pt 0 4pt; %/* padding-bottom reducido a 0 */ 
                overflow: auto; %/* Contiene floats */ 
                clear: both; %/* Evita solapamientos */ 
        } 
%/* Título de la definición */ 
.definicion-title { 
                color: rgb(255, 20, 147); 
                font-weight: bold; 
                margin-bottom: 0.5em; 
                display: block; 
        }

Este entorno se convierte en una "plantilla" para todos los otros entornos

3.
Configurar minipage. Queremos que la traducción de dos minipage sea la usual: Una al lado de la otra, respetando las dimensiones. Muchas cosas en Make4ht, se encuentran dispersas por internet. Y la configuración de minipage dichosamente la podemos encontrar en una respuesta en TeX Stack Exchange.
 %%--configura minipage y figuras---- 
\makeatletter 
% we must refer to minipage from the css file, because tags are beeing 
% written before we know dimensions 
\newcount\mini@count 
\ExplSyntaxOn 
% save original minipage 
\let\oldiimini\@iiiminipage 
% redefine minipage 
\def\@iiiminipage#1#2[#3]#4{% 
  % calculate minipage dimensions and save it to the CSS file 
  \Css{\#minipage\the\mini@count{width:\fp_eval:n{#4/\textwidth*100}\%;}}% 
  \global\advance\mini@count by 1\relax% 
  \oldiimini{#1}{#2}[#3]{#4}% 
} 
\ExplSyntaxOff 
\ConfigureEnv{minipage}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="minipage" align="center" id="minipage\the\mini@count"> }} 
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>\Hnewline}% 
  % we must write dimension here to the css file 
}{}{} 
\makeatother 
\Css{div.minipage { 
  float: left; 
 } 
} 
\Css{div.minipage:last-child { 
 clear: none; 
 float: right; 
 }} 
\Css{ div.minipage + :not(.minipage) {clear:both;overflow:auto;width:100\%;}}

Ahora esto va antes que nuestro entorno definción, por orden, y configuramos este entorno (y todos los otros) para que reciban minipage con dimensiones correctas

 \Css{ %continuación de la configuración de definición. 
 %/* --- Compatibilidad con minipages dinámicas --- */ 
 %/* Contenedor padre de minipages (simula 1.0\textwidth) */ 
        .definicion > .minipage { 
                width: 100\% !important; %/* Ancho completo */ 
                border: none !important; %/* Opcional: elimina borde si no lo quieres en el contenedor padre */ 
                margin-bottom: 0.5em; 
                padding-bottom: 0; 
        } 
 %/* Minipages internas (usan width dinámico via tu código \makeatletter) */ 
        .definicion .minipage .minipage { 
                float: left; %/* Tus reglas originales */ 
                margin-right: 2\%; %/* Espacio entre columnas (ajustable) */ 
                box-sizing: border-box; 
        } 
        %/* Última minipage (flotada a la derecha) */ 
        .definicion .minipage .minipage:last-child { 
                float: right !important; 
                margin-right: 0 !important; 
        } 
        %/* Limpiar floats después de minipages anidadas */ 
        .definicion .minipage::after { 
                content: ""; 
                display: table; 
                clear: both; 
        } 
        %/* Ajuste para párrafos y contenido interno */ 
        .definicion .minipage p { 
                margin-top: 0.3em; 
                margin-bottom: 0.3em; 
        } 
        %/* Captions centrados */ 
        .definicion .caption { 
                text-align: center; 
                margin-top: 0.5em; 
        } 
}
4.
Configura MathJax. Además de mathml, usamos mathjax. Configuramos mathjax con cosas básicas. Si el documento requiere otros paquetes (que sean soportados) y otros comandos, se pueden agregar.
% Incrustar en el <head> del html 
\Configure{@HEAD}{ 
\HCode{<script> 
 MathJax = { 
    tex: { 
        inlineMath: [[’\\(’, ’\\)’]], 
        displayMath: [[’\\[’, ’\\]’]], 
        packages: {’[+]’: [’textmacros’]}, // Permitir comandos de texto 
        processEscapes: true 
    }, 
    options: { 
        skipHtmlTags: [’script’, ’noscript’, ’style’, ’textarea’, ’pre’] 
    } 
} 
 }\HCode{</script>} 
\HCode{<script src="https://polyfill.io/v3/polyfill.min.js?features=es6">}\HCode{</script>} 
\HCode{<script id="MathJax-script" async="" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">}\HCode{</script>} 
}

En el archivo config.cfg aparecen más configuraciones figure, subfigure, etc. Pero ya después de estos ejemplos, el código es fácil de leer e interpretar.

8. Conclusión

Este artículo muestra cómo combinar LaTeX con herramientas modernas para crear contenido educativo y científico interactivo, ampliando su alcance y utilidad en entornos digitales. La integración de IA facilita la generación de código y la resolución de problemas técnicos, mientras que la modularidad y configuración detallada aseguran resultados profesionales. Este enfoque no solo optimiza el flujo de trabajo, sino que también promueve la ciencia abierta y la educación digital al hacer el contenido más accesible y dinámico. La plantilla proporcionada sirve como punto de partida para adaptaciones futuras, destacando la importancia de la flexibilidad y la innovación en la comunicación académica.

Bibliografía

[1]    BootstrapMade. (2023). BootstrapMade: Free and premium Bootstrap templates. BootstrapMade. https://bootstrapmade.com/

[2]    Hoftich, M. (2024). TeX4ht Documentation by TeX4ht Project. https://www.kodymirus.cz/tex4ht-doc/tex4ht-doc.html

[3]    Denlinger, C. G. (2010). Elements of real analysis. Jones & Bartlett Publishers.

[4]    Duckett, J. (2011). HTML and CSS: Design and Build Websites. Wiley.

[5]    GeoGebra. (s. f.). GeoGebra: Plataforma interactiva de matemáticas. https://www.geogebra.org/

[6]    GeoGebra Team. (n.d.). Incorporación de GeoGebra a páginas web. GeoGebra. https://www.geogebra.org/m/bs3cmu4a

[7]    Inkscape Project. (2025). Inkscape: Professional vector graphics editor. https://inkscape.org/

[8]    González, P. (2021). ltximg: LaTeX environments to image and standalone files (Version 2.1).
https://ftp.mpi-inf.mpg.de/pub/tex/mirror/ftp.dante.de/pub/tex/support/ltximg/ltximg-doc.pdf

[9]    LuaTeX Developers. (s.f.). LuaTeX Reference Manual. http://www.luatex.org/documentation.html

[10]    Hošovecký, M. (2023). make4ht: TeX4ht extension for build process automation. Comprehensive TeX Archive Network (CTAN). https://ctan.org/pkg/make4ht?lang=en

[11]    The MathJax Consortium. (2023). MathJax documentation. MathJax. https://docs.mathjax.org/en/latest/

[12]    Mittelbach, F., Goossens, M., Braams, J., Carlisle, D., & Rowley, C. (2004). The LaTeX Companion (2nd ed.). Addison-Wesley.

[13]    W3Schools. (s.f.). CSS Tutorial. https://www.w3schools.com/css/

[14]    W3Schools. (s.f.). HTML Tutorial. https://www.w3schools.com/html/