Reducción al Absurdo

De LaTeX a EPUB. Parte 1.

En relación a la composición de textos con notación matemática, mi objetivo en el pasado ha sido que los documentos creados cumplieran de forma estricta los estándares disponibles, MathML y EPUB; dejando a los usuarios, la responsabilidad de hacerse con las herramientas de software adecuadas para su visualización y lectura.

Como ya he comentado en alguna otra entrada, se trata de un objetivo harto infructuoso, puesto que apenas existen herramientas de software que permitan leer correctamente los documentos así creados.

Va ser necesario cambiar de estrategia y abordar la creación de documentos científicos de forma más flexible respecto de los estándares.

  1. Por un lado, no exigiremos que el contenido matemático esté expresado en MathML (el estándar WEB), bastará que esté formulado en cualquier formato admitido por la especificación EPUB: imágenes de las fórmulas, formulas en LaTeX junto con MathJax, etc.
  2. No vamos a exigir que el documento esté diseñado estrictamente conforme a la especificación: vamos a permitirnos ciertas licencias, siempre que, a la hora de verificarlo, éstas se traduzcan sólo en Warnings; con que no haya errores de validación será suficiente.
  3. Puesto que LaTeX es el estándar (aunque no reconocido oficialmente) para la escritura de documentos científicos, es preferible que el documento original de partida esté redactado en formato LaTeX, o, que al menos, las fórmulas matemáticas estén escritas en dicho formato.

Introducción

Para ser lo más coherente posible con esta nueva metodología, creo que es conveniente adoptar el enfoque más conservador: el objetivo va a ser que los documentos creados sean prácticamente compatibles con cualquier ebook reader que soporte mínimamente los formatos EPUB 2 Y EPUB 3. Para ello se utilizarán las herramientas más comunes y accesibles para la transformación de los documentos LaTeX, y los formatos con mayor soporte para la representación del contenido matemático.

Las aplicaciones empleadas para realizar la transformación van a ser Tex4ht, Make4ht y Tex4ebook. Los formatos para las fórmulas matemáticas serán imágenes SVG, plantillas CSS y librerías javascript (como MathJax o KaTeX).

En esta primera parte, vamos a presentar el comando principal de Tex4ht, sus opciones y algunos ejemplos típicos para transformar los documentos LaTeX a HTML. La segunda parte se centrará en los archivos de configuración y el comando \Configure para Tex4ht. La parte tres estará dedicada a la herramienta Make4ht, un sistema de compilación para Tex4ht, que proporciona una mayor capacidad y flexibilidad. Y, por último, en la cuarta parte se describirá el uso de Tex4ebook para construir, finalmente, el documento EPUB.

Las principales distribuciones LaTeX, MikTeX para Windows y TexLive para Linux, incluyen el paquete Tex4ht para la conversión a formatos basados en SGML (como HTML, XHTML o DocBook, ...).

Por desgracia, la documentación que se puede encontrar sobre éste paquete no es muy amigable ni lo suficientemente exhaustiva. Como introducción, recomiendo el tutorial sobre Tex4ht elaborado por Michal Hoftich (en el que yo me voy a basar para esta introducción) en lugar documentación oficial, que resulta un tanto áspera y anacrónica. Voy a intentar describir brevemente el funcionamiento del comando.

Tex4ht consiste en tres bloques de construcción básicos, junto con una serie de scripts que los enlazan conjuntamente. Los bloques son

Si se desea información más pormenorizada acerca de las diferentes etapas en el proceso de conversión, puede consultarse la documentación oficial.

Comando

Para no tener que ejecutar dichos comandos manualmente, y facilitarle la vida al usuario, existen una serie de scripts que agrupan todas estas tareas. El más destacado de tales scripts es el comando htlatex, que por defecto convierte los archivos LaTeX a HTML y se aplica de la siguiente forma:

$ htlatex <nombre-de-archivo.tex> "ops-1" "ops-2" "ops-3" "ops-4"

Cómo se puede ver, htlatex admite cinco parámetros de entrada; el único obligatorio es el primero, el que corresponde al nombre del archivo. Generalmente las opciones son encerradas entre comillas para que puedan ser pasadas literalmente a los comandos subyacentes (t4ht, pdflatex, ...).

El conjunto de opciones "ops-1" son para las plantillas de estilos tex4ht.sty y *.4ht (como ooffice.4ht, html-mml.4ht o article.4ht, por ejemplo) que se emplean en la primera etapa durante la creación del archivo DVI; cada uno de los campos de "ops-1" se deben separar con comas.

Con las "ops-2" y "ops-3" se especifican las opciones para los postprocesadores tex4ht, y t4ht respectivamente; finalmente el conjunto "ops-4" son opciones para LaTeX (para el comando pdflatex); cada campo de estos conjuntos de opciones se deberá separar mediante espacios, en lugar de mediante comas. Además, todas estas opciones son menos diversas y menos habituales que las correspondientes a "ops-1", por lo que no les vamos a dedicar ningún apartado independiente.

En la sección siguiente, listaré algunas de las opciones "ops-1" que considero más relevantes, o que podrían serlo si funcionaran correctamente; no pretende ser una relación exhaustiva, puesto que prefiero haber experimentado suficientemente con cada una de las opciones que describo, antes que limitarme a copiar la escueta explicación que se ofrece por parte del autor. Es posible especificar las opciones de "ops-1" cuando se carga (si se hace) el paquete Tex4ht en el preámbulo, mediante la instrucción \usepackage[ops-1]{tex4ht}. Hay que tener en cuenta que algunas opciones sólo funcionan con un determinado formato de salida del documento (xhtml, html, doc ...); otras simplemente no funcionan porque no quieren o se comportan de manera anómala; por último existen opciones para las que no he conseguido averiguar o entender cual es (o era) su objetivo, como hidden-ref, refcaption o index.

Para que se puedan ilustrar este tipo de dificultades, vamos a exponer un caso particular: por ejemplo, si se utilizan conjuntamente las opciones svg y html en el comando

$ htlatex prueba.tex "html,svg"

se producirá el siguiente error

(/usr/share/texlive/texmf-dist/tex/generic/tex4ht/tex4ht.sty
--- needs --- tex4ht prueba ---
(./prueba.tmp) (./prueba.xref)
(/usr/share/texlive/texmf-dist/tex/generic/tex4ht/html4.4ht)
(/usr/share/texlive/texmf-dist/tex/generic/tex4ht/html4-math.4ht)
(/usr/share/texlive/texmf-dist/tex/generic/tex4ht/svg.4ht)
(/usr/share/texlive/texmf-dist/tex/generic/tex4ht/html4-svg.4ht)
(/usr/share/texlive/texmf-dist/tex/generic/tex4ht/html4.4ht)
(/usr/share/texlive/texmf-dist/tex/generic/tex4ht/html4-math.4ht)
(/usr/share/texlive/texmf-dist/tex/generic/tex4ht/svg.4ht
l.47 --- TeX4ht warning --- \Configure{@DOCTYPE}? ---
! LaTeX Error: Missing \begin{document} in `'.
See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.       
l.48   {<

Esto es debido a que las opciones html (HTML4) y svg son incompatibles; debe utilizarse svg con xhtml. No obstante, incluso haciéndolo de forma correcta, los resultados no solían ser los esperados: en versiones anteriores del software (hace ya unos cuantos años) el resultado no era muy convincente; en realidad la imagen no estaba diseñada en formato .svg, sino que (como se puede apreciar en la siguiente imagen) se trataba de una imagen PNG, embebida en un contenedor SVG, mediante una etiqueta <image>.

PNG embebido en SVG

Por tanto, se mantenía el mismo problema con la resolución y el dimensionado de las imágenes de las expresiones matemáticas. Para colmo, en versiones algo más recientes (texlive 2015-2016), esta característica no funcionaba debido a un bug con el paquete pstoedit que era el encargado de realizar la conversión a svg. Actualmente (versiones de texlive 2017 y posteriores), parece que han solventado el problema (como se puede ver en las imágenes siguientes), habiendo implementado otro sistema para crear las imágenes SVG mediante el paquete dvisvg.

Prueba SVG 1

Prueba SVG 2

Opciones para Tex4ht.sty

Aunque no existe una relación completa de dichas opciones, ni en la documentación oficial ni en la ayuda del comando, algunas de éstas son listadas en el archivo .log que se genera al ejecutar htlatex. Cómo se ha indicado más arriba el único parámetro requerido por el comando, es el nombre del archivo; y de esta forma, el formato de salida será HTML. Sin embargo si se va a especificar alguna opción para ops-1, entonces es obligado indicar, como primer parámetro dentro de las opciones, el tipo de documento de salida que se va a generar; de lo contrario, si por ejemplo se introduce el comando

$ htlatex prueba.tex "NoFonts,charset=utf-8,xhtml" " -cunihtf -utf8" \
"-d./tmp/"

producirá un error como el siguiente:

(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty)
(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty)
(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty)))
! I can't find file `NoFonts.cfg'.
<to be read again> 
\relax
l.16 \begin{document}
(Press Enter to retry, or Control-D to exit)
Please type another input file name:

Opciones para el tipo de documento de salida:

Opciones para la composición y estructura del documento

Opciones para el formato de salida de las fórmulas matemáticas

Uso y Ejemplos

En primer lugar, Tex4ht registra un error cuando se utiliza el paquete babel con documentos configurados en español (¡y como no!, recuerdo que LaTeXML también tenía problemas con el paquete Babel para español). Se puede subsanar este error mediante la inserción del siguiente código (que obtuve de la página de Emilio Torres-Manzanera) en el preámbulo del documento .tex:

\makeatletter
\let\ifes@LaTeXe\iftrue
\makeatother

Referencias