Clases de documentos
La clase general del documento se define con este comando, que normalmente es el primer comando en un archivo fuente LaTeX.

\documentclass[options]{class}

Los siguientes nombres de class de documento están integrados en LaTeX. (Muchas otras clases de documentos están disponibles como paquetes separados; véase Descripción).
article 	Para un artículo de revista, una presentación y varios usos generales.
book 	Libros completos, incluidos capítulos y posiblemente una contra portada en el anverso, como un prefacio, y asunto posterior, como un apéndice (véase Material de portada/contraportada).
letter 	Correo, opcionalmente incluyendo etiquetas postales (véase Cartas).
report 	Para documentos de longitud entre un article y un book, como informes técnicos o tesis, que pueden contener varios capítulos.
slides 	Para presentación de diapositivas—rara vez utilizado hoy día. El paquete beamer es quizás el más frecuentemente utilizado (https://ctan.org/pkg/beamer). Véase Plantilla beamer, para una pequeña plantilla para un documento beamer.
Las options estándar se describen en la siguiente sección.

Opciones de la clase documento
Puedes especificar opciones globales u opciones de clase al comando \documentclass encerrándolas entre corchetes. Para especificar más de una opción, sepáralas con una coma.

\documentclass[option1,option2,...]{class}

Aquí está la lista de las opciones de clase estándar.
Todas las clases estándar excepto slides aceptan las siguientes opciones para seleccionar el tamaño del tipo de letra (el valor predeterminado es 10pt):

10pt  11pt  12pt

Todas las clases estándar aceptan estas opciones para seleccionar el tamaño del papel (estos muestran alto por ancho):
a4paper 	210 por 297mm (alrededor de 8.25 por 11.75 pulgadas)
a5paper 	148 por 210mm (alrededor de 5.8 por 8.3 pulgadas)
b5paper 	176 por 250mm (alrededor de 6.9 ​​por 9.8 pulgadas)
executivepaper 	7.25 por 10.5 pulgadas
legalpaper 	8.5 por 14 pulgadas
letterpaper 	8.5 por 11 pulgadas (el predeterminado)
Al usar uno de los motores pdfLaTeX, LuaLaTeX o XeLaTeX (véase Motores TeX), otras opciones a que letterpaper configura el área de impresión, pero también debes establecer el tamaño físico del papel. Una manera de hacer eso es poner \pdfpagewidth=\paperwidth y \pdfpageheight=\paperheight en el preámbulo de tu documento. El paquete geometry proporciona formas flexibles de configurar el área de impresión y tamaño de página física.
Varias otras opciones:
draft 	final 	 Marca cajas (draft) o no marcar (final) cajas demasiado llenas con un recuadro negro al margen; el valor predeterminado es final.
fleqn 	 Coloca las fórmulas mostradas alineadas a la izquierda; de manera predeterminada están centradas.
landscape 	 Selecciona el formato apaisado; el valor predeterminado es retrato.
leqno 	 Poner números de ecuación en el lado izquierdo de las ecuaciones; de manera predeterminada es el lado derecho.
openbib 	 Utiliza el formato de bibliografía “abierta”.
titlepage 	notitlepage 	 Especifica si hay una página separada para la información del título y para el resumen también, si lo hay. El valor predeterminado para la clase report es titlepage, para las otras clases es notitlepage.
Las siguientes opciones no están disponibles con la clase slides.
onecolumn 	twocolumn 	Composición tipográfica en una o dos columnas; el valor predeterminado es onecolumn.
oneside 	twoside 	 Selecciona el diseño de uno o dos lados; el valor predeterminado es oneside, excepto que en la clase book el valor predeterminado es twoside.
Para la impresión a una cara, el texto se centra en la página. Para impresión a dos caras, el parámetro \evensidemargin (\oddsidemargin) determina la distancia en páginas pares (impares) entre el lado izquierdo de la página y el margen izquierdo del texto, con \oddsidemargin siendo el 40% de la diferencia entre \paperwidth y \textwidth y \evensidemargin es el resto.
openright 	openany 	Determina si un capítulo debe comenzar en una página de la derecha; el valor predeterminado es openright para book y openany para report.
La clase slides ofrece la opción clock para imprimir lo hora en la parte inferior de cada nota.

Paquetes adicionales
Carga un paquete pkg, con las opciones de paquete dadas en la lista options separada por comas, como aquí.

\usepackage[options]{pkg}.

Para especificar más de un paquete, lo puedes separar con una coma, como en \usepackage{pkg1,pkg2,...}, o usa múltiples comandos \usepackage.
Cualquier opción dada en el comando \documentclass que sea desconocida para la clase document seleccionada se pasa a los paquetes cargados con \usepackage.

Construcción de clase y paquete
Puedes crear nuevas clases de documentos y nuevos paquetes. Por ejemplo, si tus memorandos deben cumplir con algunos requisitos locales, como un encabezado estándar para cada página, entonces podrías crear una nueva clase smcmemo.cls y comienza tus documentos con \documentclass{smcmemo}.
Lo que separa a un paquete de una clase de documento es que los comandos en un paquete son útiles en todas las clases, mientras que los de una clase de documento son específicos de esa clase. Por lo tanto, un comando para establecer encabezados de página es para un paquete mientras que un comando para hacer que los encabezados de página digan Memo desde el departamento de matemáticas SMC es para una clase.
Dentro de un archivo de clase o paquete, puedes usar el signo @ como carácter en nombres de comandos sin tener que rodear el código que contiene ese comando con \makeatletter y \makeatother. Véase \makeatletter y \makeatother. Esto te permite crear comandos que los usuarios no redefinirán accidentalmente. Otra técnica es prefijar comandos específicos de clase o paquete con alguna cadena para evitar que tu clase o paquete interfiera con otros. Por ejemplo, la clase smcmemo podría tener comandos \smc@tolist, \smc@fromlist, etc.

Estructura de clase y paquete
Un archivo de clase o un archivo de paquete normalmente consta de cuatro partes.
En la parte de identificación, el archivo dice que es un paquete o clase LaTeX y se describe a sí mismo, usando \NeedsTeXFormat y los comandos \ProvidesClass o \ProvidesPackage.
La parte de declaraciones preliminares declara algunos comandos y también puede cargar otros archivos. Generalmente, estos comandos serán los necesarios para el código utilizado en la siguiente parte. Por ejemplo, una clase smcmemo se puede llamar con una opción para leer un archivo con una lista de personas para el encabezado, como \documentclass[mathto]{smcmemo}, y por lo tanto necesitas definir un comando \newcommand{\setto}[1]{\def\@tolist{#1}} usado en ese archivo.
En manejar la parte de opciones la clase o paquete declara y procesa sus opciones. Las opciones de clase permiten que un usuario comience su documento como \documentclass[lista de opciones]{nombre de clase}, para modificar el comportamiento de la clase. Un ejemplo es cuando declaras \documentclass[11pt]{article} para establecer el valor predeterminado para el tamaño del tipo de letra del documento.
Finalmente, en la parte de más declaraciones la clase o paquete suele hacer la mayor parte de su trabajo: declarar nuevas variables, comandos y tipos de letra y cargar otros archivos.
Aquí hay un archivo de clase inicial, que se debe guardar como stub.cls donde LaTeX lo pueda encontrar, por ejemplo en el mismo directorio que el archivo .tex.

\NeedsTeXFormat{LaTeX2e}  \ProvidesClass{stub}[2017/07/06 auxiliar
para        comenzar        a        crear        clases        desde]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax \LoadClass{article}

Se identifica a sí mismo, maneja las opciones de clase a través del valor predeterminado pasándolos todos a la clase article, y luego carga la clase article para proporcionar la base para el código de esta clase.
Para obtener más información, consulta la guía oficial para escritores de clases y paquetes, la clase Guide, en https://www.latex-project.org/help/documentation/clsguide.pdf (muchas de las descripciones aquí se derivan de este documento), o el tutorial https://www.tug.org/TUGboat/tb26-3/tb84heff.pdf.

Comandos class y package
Estos son los comandos diseñados para ayudar a los escritores de clases o paquetes.
\AtBeginDvi{especiales} 	 Guarda en un cuadro de registro las cosas que se escriben en el archivo .dvi al comienzo del envío de la primera página del documento.
\AtEndOfClass{code} 	\AtEndOfPackage{code} 	 Gancho para insertar code para que se ejecute cuando LaTeX termine procesando la clase o paquete actual. Puedes usar estos ganchos varias veces; el código se ejecutará en el orden en que lo llames. Consulta también \AtBeginDocument.
\CheckCommand{cmd}[num][default]{definition} 	\CheckCommand*{cmd}[num][default]{definition} 	 Similar a \newcommand (véase \newcommand y \renewcommand) pero no define cmd; en su lugar, comprueba que la definición actual de cmd es o no es exactamente como la definition long como se esperaba. Un comando largo es un comando que acepta \par dentro de un argumento. Se espera que el comando cmd sea largo con la versión sin estrella de \CheckCommand. Levanta un error cuando la comprobación falla. Esto te permite comprobar antes de empezar a redefinir cmd tú mismo que ningún otro paquete ya haya redefinido este comando.
\ClassError{class name}{error text}{help text} 	\ClassWarning{class name}{warning text} 	\ClassWarningNoLine{class name}{warning text} 	\ClassInfo{class name}{info text} 	\ClassInfoNoLine{class name}{info text} 	\PackageError{package name}{error text}{help text} 	\PackageWarning{package name}{warning text} 	\PackageWarningNoLine{package name}{warning text} 	\PackageInfo{package name}{info text} 	\PackageInfoNoLine{package name}{info text} 	 Produce un mensaje de error, o mensajes de advertencia o informativo.
Para \ClassError y \PackageError el mensaje es texto de error, seguido del indicador de error ? de TeX. Si el usuario luego, pide ayuda escribiendo h, ve el mensaje texto de ayuda.
Los cuatro comandos de advertencia son similares excepto que escriben texto de advertencia en la pantalla sin mensaje de error. Los cuatro comandos escriben texto info solo en el archivo de transcripción. Las versiones de NoLine no muestran el número de la línea que genera el mensaje, mientras que las otras versiones muestran ese número.
Para dar formato a los mensajes, incluido el texto de ayuda: usa \protect para evitar que un comando se expanda, obtén un salto de línea con \MessageBreak, y obtén un espacio con \space cuando un carácter de espacio no lo permite, como después de un comando. Ten en cuenta que LaTeX añade un punto a los mensajes.
\CurrentOption 	 Expande al nombre de la opción que se está procesando actualmente. Sólo se pueden usar dentro del argumento code de \DeclareOption o \DeclareOption*.
\DeclareOption{option}{code} 	\DeclareOption*{code} 	 Hace que una opción esté disponible para que un usuario la invoque en su comando \documentclass. Por ejemplo, la clase smcmemo podría tener una opción \documentclass[logo]{smcmemo} que permita a los usuarios colocar el logo institucional en la primera página. El archivo de clase debe contener \DeclareOption{logo}{code} (y ​​más tarde, \ProcessOptions).
Si solicitas una opción que no ha sido declarada, de manera predeterminada esta producirá una advertencia como Opciones globales no utilizadas: [badoption]. Cambia este comportamiento con la versión destacada \DeclareOption*{code}. Por ejemplo, muchas clases extienden una clase existente, usando un comando como \LoadClass{article}, y para pasar opciones adicionales al código de uso de clase subyacente como este.

\DeclareOption*{%   \PassOptionsToClass{\CurrentOption}{article}%
}

Otro ejemplo es que la clase smcmemo puede permitir a los usuarios mantener listas de destinatarios de notas en archivos externos. Entonces el usuario podría invocar \documentclass[math]{smcmemo} y leerá el archivo math.memo. Este código maneja el archivo si existe y de lo contrario pasa la opción a la clase article.

\DeclareOption*{\InputIfFileExists{\CurrentOption.memo}{}{%
    \PassOptionsToClass{\CurrentOption}{article}}}

\DeclareRobustCommand{cmd}[num][default]{definition}
* \DeclareRobustCommand*{cmd}[num][default]{definition} 	 Como \newcommand y \newcommand* (véase \newcommand y \renewcommand) pero estos declaran un comando robusto, incluso si algún código dentro de la definición es frágil. (Para una discusión de comandos robustos y frágiles véase \protect). Usa este comando para definir nuevos comandos robustos o para redefinir comandos existentes y hacerlos robustos. A diferencia de \newcommand, estos no dan un error si la macro cmd ya existe; en su lugar, se coloca un mensaje de registro en el archivo de transcripción si se redefine un comando.
Los comandos definidos de esta manera son un poco menos eficientes que los definidos usando \newcommand así que, a menos que los datos del comando sean frágiles y el comando se use dentro de un argumento en movimiento, usa \newcommand.
El paquete etoolbox ofrece los comandos \newrobustcmd, \newrobustcmd*, así como los comandos \renewrobustcmd, \renewrobustcmd* y los comandos \providerobustcmd y \providerobustcmd*. Estos son similares a \newcommand, \newcommand*, \renewcommand, \renewcommand*, \providecommand y \providecommand*, pero define un cmd robusto con dos ventajas en comparación con \DeclareRobustCommand:
Utilizan el mecanismo de protección de bajo nivel e-TeX en lugar del mecanismo \protect LaTeX de nivel superior, por lo que no incurren la ligera pérdida de rendimiento mencionada anteriormente, y
Hacen la misma distinción entre \new…, \renew… y \provide…, como comandos estándar, por lo que no solo hacen un mensaje de registro cuando redefines cmd que ya existe, en ese caso necesitas usar \renew… o \provide… o recibes un error.
\IfFileExists{filename}{true code}{false code} 	\InputIfFileExists{filename}{true code}{false code} 	 Ejecuta código verdadero si LaTeX encuentra el archivo nombre de archivo o código falso de lo contrario. En el primer caso se ejecuta código verdadero y entonces ingresa el archivo. Así el comando

\IfFileExists{img.pdf}{%
  \includegraphics{img.pdf}}{\typeout{!! img.pdf no encontrado}

incluirá el gráfico img.pdf si se encuentra y de lo contrario dará un aviso.
Este comando busca el archivo en todas las rutas de búsqueda que usa LaTeX, no solo en el directorio actual. Mirar solo en el directorio actual hace algo como \IfFileExists{./filename}{código verdadero}{código falso}. Si solicitas un nombre de archivo sin una extensión .tex entonces LaTeX primero buscará el archivo agregando la extensión .tex; para obtener más información sobre cómo LaTeX maneja las extensiones de archivo \input.
\LoadClass[options list]{class name}[release date] 	\LoadClassWithOptions{class name}[release date] 	 Carga una clase, como con \documentclass[lista de opciones]{nombre de clase}[información de publicación]. Un ejemplo es \LoadClass[twoside]{article}.
La options list, si está presente, es una lista separada por comas. La fecha de lanzamiento es opcional. Si está presente debe tener la forma AAAA/MM/DD.
Si solicitas una fecha de lanzamiento y la fecha del paquete instalado en tu sistema es anterior, recibes una advertencia en la pantalla y en el registro como esta.

Has solicitado, en  la línea de entrada 4, la  versión `2038/01/19' de
la clase  de documento ``article'',  pero solo la  versión `2014/09/29
v1.4h La clase de documento LaTeX estándar' está disponible.

La versión del comando \LoadClassWithOptions usa la lista de opciones para la clase actual. Esto significa que ignora cualquier opción pasada a través de \PassOptionsToClass. Este es un comando de conveniencia que te permite construir clases sobre las existentes, como la clase article estándar, sin tener que rastrear qué opciones se pasaron.
\ExecuteOptions{options-list} 	 Para cada opción option en la lista de opciones, en orden, este comando ejecuta el comando \ds@option. Si este comando no está definido, entonces esa opción se ignora silenciosamente.
Se puede utilizar para proporcionar una lista de opciones predeterminada antes \ProcessOptions. Por ejemplo, si en un archivo de clase deseas que el predeterminado sea el tipo de letra de 11 puntos, entonces podrías especificar \ExecuteOptions{11pt}\ProcessOptions\relax.
\NeedsTeXFormat{format}[formato de fecha] 	 Especifica el formato con el que se debe ejecutar esta clase. A menudo emitido como la primera línea de un archivo de clase, y se usa con mayor frecuencia como: \NeedsTeXFormat{LaTeX2e}. Cuando un documento que usa esa clase es procesado, el nombre de formato proporcionado aquí debe coincidir con el formato que en realidad se está ejecutando (incluyendo que la cadena format es sensible a mayúsculas y minúsculas). Si no coincide, la ejecución se detiene con un error como ‘Este archivo necesita formato `LaTeX2e' pero es `xxx'.’
Para especificar una versión del formato que sabes que tiene ciertas características, incluye el formato de fecha opcional en el que esas características fueron implementadas. Si está presente, debe tener el formato YYYY/MM/DD. Si la versión del formato instalada en tu sistema es anterior al formato de fecha, entonces recibes una advertencia como esta.

Has  solicitado la  liberación  `2038/01/20' de  LaTeX,  pero solo  la
versión `2016/02/01' está disponible.

\OptionNotUsed 	 Agrega la opción actual a la lista de opciones no utilizadas. Solo se puede usar dentro del argumento code de \DeclareOption o \DeclareOption*.
\PassOptionsToClass{options list}{class name} 	\PassOptionsToPackage{options list}{package name} 	 Agrega las opciones en la lista separada por comas lista de opciones a las opciones utilizadas por cualquier futuro comando \RequirePackage o \usepackage para el paquete nombre del paquete o la clase nombre de clase.
El motivo de estos comandos es: puedes cargar un paquete cualquier cantidad de veces sin opciones, pero, si deseas opciones, solo las puedes proporcionar cuando cargues el paquete por primera vez. Al cargar un paquete con opciones más de una vez obtendrás un error como Conflicto de opción para el paquete Foo. (LaTeX arroja un error incluso si no hay conflicto entre opciones).
Si tu propio código trae un paquete dos veces, entonces puedes colapsar eso a una vez, por ejemplo reemplazando los dos \RequirePackage[landscape]{geometry} y \RequirePackage[margins=1in]{geometry} con el comando único \RequirePackage[landscape,margins=1in]{geometry}.
Sin embargo, imagina que estás cargando firstpkg y dentro de ese paquete que carga secondpkg, y necesitas que el segundo paquete sea cargado con la opción draft. Entonces antes de hacer el primer paquete debes poner en cola las opciones para el segundo paquete, así.

\PassOptionsToPackage{draft}{secondpkg}
\RequirePackage{firstpkg}

(Si firstpkg.sty carga una opción en conflicto con lo que deseas entonces posiblemente tengas que alterar tu fuente).
Estos comandos son útiles para usuarios generales, así como para clases y paquetes. Por ejemplo, supongamos que un usuario quiere cargar el paquete graphicx con la opción draft y también quieres usar una clase foo que carga el paquete graphicx, pero sin esa opción. El usuario podría iniciar su archivo LaTeX con \PassOptionsToPackage{draft}{graphicx}\documentclass{foo}.
\ProcessOptions 	\ProcessOptions*\@options 	 Ejecuta el código para cada opción que el usuario haya invocado. Incluirlo en el archivo de clase como \ProcessOptions\relax (debido a la existencia del comando con asterisco).
Las opciones vienen en dos tipos. Opciones locales se han especificado para este paquete particular en el argumento options de \PassOptionsToPackage{options}, \usepackage[options], o \RequirePackage[options]. Opciones globales son las dadas por el usuario de la clase en \documentclass[options] (si una opción se especifica tanto local como globalmente, entonces es local).
Cuando se llama a \ProcessOptions para un paquete pkg.sty, lo siguiente sucede:
Para cada opción option declarada hasta ahora con \DeclareOption, busca si esa opción es una opción global o local para pkg. Si es así, ejecuta el código declarado. Esto se hace en el orden en que estas opciones fueron dadas en pkg.sty.
Para cada opción local restante, ejecuta el comando \ds@option si se ha definido en algún lugar (que no sea por una \DeclareOption); de lo contrario, ejecuta el código de opción predeterminada dada en \DeclareOption*. Si no se ha introducido ningún código de opción predeterminado declarado entonces da un mensaje de error. Esto se hace en el orden en que se especificaron estas opciones.
Cuando se llama a \ProcessOptions para una clase, funciona en la misma manera salvo que todas las opciones son locales y el code predeterminado para \DeclareOption* es \OptionNotUsed en lugar de un error.
La versión destacada \ProcessOptions* ejecuta las opciones en el orden especificado en las llamadas a comandos, en lugar de en el orden de declaración en la clase o paquete. Para un paquete esto significa que las opciones globales se procesan primero.
\ProvidesClass{class name}[release date brief additional information] 	\ProvidesClass{class name}[release date] 	\ProvidesPackage{package name}[release date brief additional information] 	\ProvidesPackage{package name}[release date] 	 Identifica la clase o paquete, imprimiendo un mensaje en pantalla y en el archivo de registro.
Cuando cargas una clase o paquete, por ejemplo con \documentclass{smcmemo} o \usepackage{test}, LaTeX ingresa un archivo. Si el nombre del archivo no coincide con la clase o nombre del paquete declarado en él, entonces recibes una advertencia. Así, si invocas \documentclass{smcmemo}, y el archivo smcmemo.cls tiene la instrucción \ProvidesClass{xxx} luego recibes una advertencia como Has solicitado la clase de documento `smcmemo', pero la clase del documento proporciona 'xxx'. Esta advertencia no evita que LaTeX procese el resto del archivo de clase normalmente.
Si incluyes el argumento opcional, debes incluir una fecha, antes de cualquier espacio, en la forma AAAA/MM/DD. El resto del argumento opcional es de forma libre, aunque tradicionalmente identifica la clase, y se escribe en la pantalla durante la compilación y en el archivo de registro. Por lo tanto, si tu archivo smcmemo.cls contiene la línea \ProvidesClass{smcmemo}[2008/06/01 v1.0 SMC clase memo] y la primera línea de tu documento es \documentclass{smcmemo} entonces verás Clase de documento: smcmemo 2008/06/01 v1.0 SMC clase memo.
La fecha en el argumento opcional permite a los usuarios de clases y paquetes preguntar para ser advertido si la versión de la clase o paquete es anterior a la fecha de lanzamiento. Por ejemplo, un usuario puede ingresar \documentclass{smcmemo}[2018/10/12] o \usepackage{foo}[[2017/07/07]] para requerir una clase o paquete con ciertas características especificando que no se debe lanzar antes que la fecha dada. (Aunque, en la práctica, los usuarios de paquetes rara vez incluyen una fecha, y los usuarios de clases casi nunca lo hacen).
\ProvidesFile{filename}[additional information] 	 Declara un archivo que no sea la clase principal y los archivos del paquete, como archivos de configuración o archivos de definición del tipo de letra. Pon este comando en ese archivo y obtienes en el registro una cadena como File: test.config 2017/10/12 archivo de configuración para test.cls para filename igual a ‘test.config’ e información adicional igual a ‘2017/10/12 archivo de configuración para test.cls’.
\RequirePackage[options list]{package name}[release date] 	\RequirePackageWithOptions{package name}[release date] 	 Carga un paquete, como el comando \usepackage (véase Paquetes adicionales). El equipo de desarrollo de LaTeX recomienda encarecidamente el uso de estos comandos sobre el \input de TeX estándar; ve la Guía de clase. Un ejemplo es \RequirePackage[landscape,margin=1in]{geometry}.
La lista de opciones, si está presente, es una lista separada por comas. La fecha de lanzamiento, si está presente, debe tener el formato AAAA/MM/DD. Si la fecha de lanzamiento del paquete instalado en tu sistema es anterior que la fecha de lanzamiento, recibes una advertencia como Has solicitado, en la línea de entrada 9, la versión `2017/07/03' del paquete jhtest, pero solo está disponible la versión `2000/01/01'.
La versión \RequirePackageWithOptions usa la lista de opciones para la clase actual. Esto significa que ignoras cualquier opción que se le pase a través de \PassOptionsToClass. Este es un comando de conveniencia para facilitar la construcción de clases sobre las existentes sin tener que rastrear cuáles opciones se pasaron.
La diferencia entre \usepackage y \RequirePackage es pequeña. El comando \usepackage está diseñado para el archivo del documento mientras que \RequirePackage está diseñado para paquetes y archivos de clase. Por lo tanto, usar \usepackage antes del comando \documentclass hace que LaTeX dé un error como \usepackage antes de \documentclass, pero allí puedes usar \RequirePackage.