Automatizando la maquetación de libros de texto: LaTeX con preprocesadores CPP y M4
Para automatizar la maquetación de libros de texto o documentación técnica, se utiliza una combinación de LaTeX, el preprocesador CPP, GNU Make y utilidades como M4. Esto separa el contenido del formato, permite macros y gestiona las compilaciones a través de Makefile. Herramientas clave: pdflatex de MiKTeX, Cygwin para utilidades POSIX, Eclipse como editor, git para control de versiones.
El conjunto de software requerido incluye:
- cpp — preprocesador C para compilación condicional e includes.
- pdflatex — compilador LaTeX (ruta: C:\Program Files\MiKTeX\miktex\bin\x64\pdflatex.exe).
- make — orquestador de compilaciones.
- m4 — preprocesador alternativo con scripting.
- pandoc — convertidor a DOCX.
- Adicionalmente: realpath, sort, tree, grep, MiKTeX.
Verificar la disponibilidad de pdflatex es crítico para el manejo correcto del cirílico.
Pipeline de procesamiento de archivos
La compilación se estructura como un pipeline: .texi (fuentes) → preprocesador (cpp/m4) → .tex → pdflatex → PDF. Las fuentes (.texi, .mk, pix/) se versionan en git. Cada capítulo es una carpeta separada con .texi, .mk e imágenes.
Ejemplo de .texi para un capítulo:
sinclude(`latex_m4_preproc_utils.texi')
\graphicspath{ {PATH_CHAPTER_X_DIR/pix} }
\chapter{Name Glavy}
\section{Prolog}
khkhkhkhkhkhkhkhkhkhkhkhkh
\section{Paragraf_1}
khkhkhkhkhkhkhkhkhkh
\section{Itog}
khkhkhkhkhkhkhkhkhkhkhkh
\section{Giperssylki}
\begin{enumerate}
\item \href{wwwwwwwwwwwwwwwww}{zzzzzzzzzzzz}
\end{enumerate}
GNU Make gestiona las dependencias, generando .tex a partir de .texi usando cpp o m4.
Elementos básicos de LaTeX para textos técnicos
LaTeX automatiza la numeración, sangrías y fórmulas. Conjunto mínimo de construcciones:
- Imágenes.
- Citas.
- Listados de código.
- Tablas.
- Enumeraciones.
- Hipervínculos.
- Ecuaciones.
- Tabla de contenidos.
- Bibliografía.
Inserción de imágenes
Bloque estándar:
\begin{figure}[h]
\centering
\includegraphics[width=0.99\textwidth]{arch}
\caption{Harvard architecture }
\label{fig:mesh1}
\end{figure}
Macro CPP:
#define INSERT_PIX(FILE_NAME,HINT ) \
\begin{figure}[h] \
\centering \
\includegraphics[width=0.99\textwidth]{FILE_NAME} \
\caption{HINT } \
\label{fig:FILE_NAME} \
\end{figure}
En M4:
define(INSERT_PIX2, format(
\begin{figure}[h!]
\centering
\includegraphics[width=0.75 \textwidth]{%s}
\caption{%s }
\label{fig:%s }
\end{figure}
, $1, $2, $1
) )
Citas y listados
Cita:
\begin{quote}
"In any dele important define prioritety.
Inache vtorostepennoe, khotya and nuzhnoe, otnimet all sily
and not dasetcoyti to glavnogo."
\end{quote}
Listado (configuración en preámbulo lstset: breaklines=true, frame=single):
\begin{lstlisting}[label=some-code,caption=Ruleilnyy if]
int ret = NVRAM_Get(ID_IPv4_ROLE, tmp, 1, &tmp_len);
if (MM_RET_CODE_OK != ret) {
return ERROR_CODE_HARDWARE_FAULT;
}
\end{lstlisting}
En listados de código C, escapar # para evitar conflictos con el preprocesador.
Tablas y listas
Tabla de acrónimos:
\begin{tabular} {ll}
Akronim & Rasshifrovka \\
\hline
TUI & Text-based user interface \\
CLI & command-line interface \\
UART & universal asynchronous receiver / transmitter \\
JTAG & Joint Test Action Group \\
LED & light-emitting diode \\
CIC & Cascaded integrator–comb \\
\end{tabular}
Lista numerada:
\begin{enumerate}
\item
\item
\item
\end{enumerate}
Encabezados, referencias y preámbulo
Encabezados: \usepackage{fancyhdr}, \pagestyle{fancy}.
Referencias: \usepackage[hidelinks]{hyperref}, \usepackage{cleveref}. Etiquetas \label{} y \Cref{}.
Ejemplo:
\subsubsection{Upravlenie diskretnymi outputami}
\label{DOUTctrl}
...
\item Provide the ability to read discrete inputs; \Cref{DinRead}
Configurando CPP como preprocesador universal
Claves para LaTeX:
| Option | Description |
|--------|-------------|
| -E | UTF-8 output |
| -P | No linemarkers |
| -C | Preserve comments |
| -traditional-cpp | Preserve whitespace |
| -nostdinc | No standard includes |
| -fexec-charset=UTF-8 | UTF-8 encoding |
| -DHAS_XXX | Macros |
| -undef | No GCC macros |
CPP es aplicable para GraphViz, ASM, scripts LD.
Estructura del proyecto
Repositorio: carpetas por capítulos (chapter.mk, chapter.texi, pix/), común: preamble.texi, library.mk.
Ejemplo tree:
.
├── about_author
│ ├── about_author.mk
│ ├── about_author.texi
│ └── pix
... (12 directories, 33 files)
El .tex raíz recopila capítulos vía include.
Puntos clave
- Separación de preocupaciones: El autor se centra en el contenido, LaTeX en la maquetación.
- Preprocesamiento: CPP/M4 para macros, includes, compilación condicional.
- Automatización: GNU Make como gestor de dependencias para capítulos e imágenes.
- Multiplataforma: Cygwin + MiKTeX para Windows.
- Extensibilidad: Fácil agregar listados, fórmulas, bibliografía.
— Editorial Team
Aún no hay comentarios.