Escribiendo mi propio \documentclass de LaTeX

¡Antes de continuar! Espero que ya sepas como hacer macros aun que sean muy básicos. Pero eso si, que sepas la diferencia entre macros de $latex \LaTeX$ y de $latex \TeX$, si no tienes idea de cual es la diferencia, por favor, búscala. También espero que de menos “hojees” las siguientes referencias:

  1. LaTeX2e for class and package writers. http://www.latex-project.org/guides/clsguide.pdf
  2. Peter Flynn. Rolling your own Document Class: Using LaTeX to keep away from the Dark Side. https://www.tug.org/pracjourn/2006-4/flynn/
  3. https://en.wikibooks.org/wiki/LaTeX/Page_Layout

¡Así que manos a la obra!

La hoja de estilo mas simple que puede existe en $latex \LaTeX$ es la siguiente:

\ProvidesClass{rmf} [2013/01/11 v2.01 LaTeX document class para la Revista Mexicana de Física]

\renewcommand\normalsize{\fontsize{10pt}{12pt}\selectfont}

\setlength{\textwidth}{6.5in}
\setlength{\textheight}{8in}

En la línea 1 le pongo nombre, fecha, versión y una explicación de que es a la documentclass, y el archivo se debe guardar como rmf.cls. En la línea 3 declaro el tamaño de la fuente y en las lineas 5 y 6 declaro el ancho y alto de la caja de texto. Tambien recomiendo agregar la línea \NeedsTeXFormat{LaTeX2e}[2009/09/24] al principio, pues especifica que esta escrito para LaTeX2e y no TeX u otras cosas, también especifica la versión por fecha, en este caso la del 24 de septiembre de 2009 que es la que esta instalada en mi computadora.

Formato básico


En la línea 6 \input{size10.clo} viene definidos \small, \large, \huge, etc. para fuente de 10 puntos, ese archivo viene en todas las distros de $latex \LaTeX$, es importante ponerlos antes de modificar el formato de la página pues en ese archivo se modifican el tamaño de la caja de texto y si lo invoco después de que yo modifique mi caja de texto sobre escribirá mis cambios.

En las líneas 15 y 16 se pone el tamaño de la hoja en carta para PDF.

De las líneas 20 a 28 hago el formato de la página, es decir los margenes, echale un ojo a la https://en.wikibooks.org/wiki/LaTeX/Page_Layout. En la línea 22 de ligo a LaTeX que voy a usar un formato de impresión en doble cara así se activa \evensidemargin (se podria traducir como el margen del lado par) y le asigno un valor en la línea 23.

Luego en la línea 30 pongo la distancia entre columnas de 18 pt, y en la siguiente línea hago que la linea entre columnas sea de 0 pt, para que no se vea. Esto por que voy a usar el paquete multicol para tener un formato con el cual pueda controlar el corte de columnas.

Ahora con el archivo prueba.1.tex obtengo el siguiente resultado:
prueba.1.pdf

Poniendo el Título


En las líneas 39 a 48 defino el comando \maketitle un comando típico de $latex \LaTeX$ y que en general la gente espera que funcione. En la línea 40 le digo que siempre que se haga un titulo inicie una nueva página. Los comando \begingroup y \endgroup de las líneas 41 y 47 son comandos primitivos de $latex \TeX$ que como su nombre lo indica agrupan, con eso me aseguro que el comando \centering (línea 42) sólo afecte a lo que va dentro del título.

En la línea 43 le doy formato al título, primero le digo que sea tamaño \Large luego que sea texto en negritas \textbf y todo esto opera sobre el comando \@title que es donde se guarda lo que en el documento pongas dentro de \title{}. Tanto \@title como \title{} ya viene predefinidos en $latex \LaTeX$. Luego pongo el tamaño de la fuente en \normalfont le doy espacio vertical de 12 pt y le digo a $latex \LaTeX$ que ahí termino un párrafo con \par.

En la línea 44 pongo los autores y hago uso del comando \@author que es donde se guardan los datos que van dentro de \author{}, al igual que el par \@title y \title{} ya vienen predefinidos en $latex \LaTeX$. Luego le espacio verticual y digo que termina un párrafo.

Las líneas 45 y 46 hace uso del condicional \ifZ<test><true text>\else<false text>\fi, para una mejor explicación revisen la página What does \ifx\\#1\\ stand for?. La idea en seudo código es la siguientes:

si \@recibido == \@empty
   imprime "?? ??? ????"
sino
   imprime "\@recibido"

Y \@recibido esta definido dentro de \recibido en la línea 33 y en la 34 esta definido \@aceptado dentro de la definición de \acpetado. En las líneas 35 y 36 le pido a $latex \LaTeX$ que \@recibido sea igual a \@empty lo mismo para \@aceptado.

Ahora mi archivo de prueba es:


Y el resultado es:
prueba.2

Encabezados y pies de página


Líneas 52 y 53 defino los comando \RMF y \rmf que simplemente guardan el nombre de la Revista Mexicana de Física para después usarlos.

En las líneas 55 a 64 defino comandos y variables donde almacenar los datos de esos comandos para usarlos luego.

Ahora le digo a $latex \LaTeX$ que cargue el paquete lastpage con \RequirePackage{lastpage} en la línea 66 para poder usar el total de páginas. En la línea 67 pongo el código \AtBeginDocument{\label{FirstPage}} que me pone una referencia a la primera pagina al inició del documento para almacenar la primera hoja.

De las líneas 69 a 89 pongo las cabeceras y pies. Para $latex \LaTeX$, si declaro un comando que empiece con \ps@loquesea es por que estoy creando un nuevo estilo de pagina para usar con el comando \pagestyle{loquesea} y dentro de \ps@loquesea se redefinen los comandos \@oddhead, \@evenhead, \@oddfoot y \@evenfoot. Que cada uno modifica la cabezera de la páginas impares, pares, pies de paginas impares y pares respectivamente.

Entonces en la línea 69 defino el estilo titlepage donde la cabecera tiene a la izquierda el área del articulo; en el centro el nombre de la revista, volumen, año y primera y ultima página; y a la derecha los meses que cubre la publicación y de nuevo el año. Noten que sin importar si es hoja par o impar hace lo mismo, ese efecto lo logro haciendo que \@evenhead sea igual a \@oddhead. Por último dejo los pies vacíos. Luego en la linea 41, dentro del macro maketitle escribo \thispagestyle{titlepage} para que la página del título tenga ese formato de cabeceras.

En la línea 80 hago los pies y cabeceras para el resto del documento.

Ahora mi archivo fuente se ve como el siguiente:


Y los resultados son estos:

prueba.3

Secciones


Aquí hice pura trampa, pues copie y pegue las secciones del article.cls de $latex \LaTeX$ estándar y le borre lo que no voy a ocupar. Esta en las líneas 93 a 112.

El comando \setcounter{secnumdepth}{3} quiere decir asigna el valor 3 a la variable numérica secnumdepth para $latex \LaTeX$ esta variable indica hasta que profundidad de secciones imprimir en tablas de contenido y cosas así.

El comando \newcounter{foo}[counter] crea una nueva variable numérica llamada foo y si se indica la opción [counter] la variable foo vuelve a cero cada que el contador counter cambie. Así en las líneas 95, 96 y 97 defino los contadores que voy a ocupar.

En las líneas 98, 99 y 100 le digo a $latex \LaTeX$ como quiero que me imprima la numeración de las secciones, miren la página TeX counts and LaTeX counters.

Por último el macro \@startsection esta bien explicado en Changing the Section Headings y en Latex Sections.


prueba.4