> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/es/archivos-de-clase/04-writing-your-own-class.md).

# Escribir su propia clase

A veces la mejor opción para personalizar un documento es escribir una nueva clase desde cero. Este artículo explica la estructura principal y los comandos necesarios en una nueva clase.

## Introducción

La primera cosa que hay que hacer antes de programar una nueva clase es determinar si realmente necesitas una nueva clase o no. Se recomienda [buscar en CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) y ver si alguien ya creó algo similar a la clase de documento que necesitas.

Otra cosa importante que tener en cuenta es [la diferencia entre paquetes y clases](/latex/es/archivos-de-clase/01-understanding-packages-and-class-files.md). Elegir mal puede afectar la flexibilidad del producto final.

## Estructura general

La estructura de todos los archivos de clase puede describirse de forma aproximada en las cuatro partes siguientes:

* ***Identificación***. El archivo se declara a sí mismo como una clase escrita con la sintaxis de LaTeX2ε.
* ***Declaraciones preliminares***. Aquí se importan los paquetes y clases externos necesarios. Además, en esta parte del archivo se codifican los comandos y definiciones necesarios por las opciones declaradas.
* ***Opciones***. La clase declara y procesa las opciones.
* ***Más declaraciones***. El cuerpo principal de la clase. Casi todo lo que hace una clase se define aquí.

En las siguientes subsecciones se presentará una descripción más detallada de la estructura y un ejemplo funcional, *exampleclass.cls*, se presentarán.

### Identificación

Hay dos comandos simples que todas las clases deben tener:

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]
```

El comando `\NeedsTeXFormat{LaTeX2e}` establece la versión de LaTeX con la que funcionará la clase. Además, se puede añadir una fecha entre corchetes para especificar la fecha mínima de lanzamiento requerida.

El comando `ProvidesClass{exampleclass}[...]` identifica esta clase como *exampleclass* y, dentro de los corchetes, se incluye la fecha de lanzamiento y alguna información adicional. La fecha debe estar en el formato AAAA/MM/DD

[Abrir un ejemplo de cómo escribir una clase en Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Declaraciones preliminares

La mayoría de las clases amplían y personalizan otras existentes, y también necesitan algunos paquetes externos para funcionar. Abajo, se añade algo más de código a la clase de ejemplo `exampleclass.cls`.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\LoadClass[twocolumn]{article}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}
```

Los comandos de esta parte inicializan algunos parámetros que luego se usarán para gestionar las opciones, o bien importan archivos externos.

El comando `\LoadClass[twocolumn]{article}` carga la clase `artículo` con el parámetro adicional `twocolumn`. Por lo tanto, todos los comandos de la `artículo` clase estándar estarán disponibles automáticamente en la **ejemplo** clase, excepto que el documento se imprimirá en un formato de dos columnas.

`\RequirePackage` es muy similar al conocido `\usepackage`, añadir parámetros opcionales entre corchetes también funcionará. La única diferencia es que el `\usepackage` no puede usarse antes del `\documentclass` comando. Se recomienda encarecidamente usar `\RequirePackage` al escribir nuevas clases o paquetes.

[Abrir un ejemplo de cómo escribir una clase en Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Opciones

Para permitir cierta flexibilidad en las clases, unas pocas opciones adicionales resultan muy útiles. La siguiente parte del archivo `exampleclass.cls` maneja los parámetros pasados al comando de la clase de documento. También hemos movido `\LoadClass` a *después de* las opciones se procesan, para que las opciones establecidas en el archivo .tex puedan pasarse a la clase base.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}
```

Hay cuatro comandos principales aquí que manejan las opciones pasadas a la clase.

El comando `\DeclareOption{}{}` gestiona una opción dada. Toma dos parámetros: el primero es el nombre de la opción y el segundo es el código que se ejecutará si se pasa la opción.

El comando `\OptionNotUsed` mostrará un mensaje en el compilador y en los registros; la opción no se utilizará. En este caso el documento se establece en dos columnas y, si el usuario intenta cambiarlo a una columna, no funcionará; la opción se ignorará.

El comando `\Declareoption*{}` maneja cualquier opción no definida explícitamente. Solo toma un parámetro, el código a ejecutar cuando se pasa una opción desconocida. En este caso ejecutará el siguiente comando:

`\PassOptionsToClass{}{}`. Pasa la opción dentro del primer par de llaves a la clase de documento establecida dentro del segundo par de llaves. En el ejemplo, todas las opciones desconocidas se pasarán a la **artículo** clase de documento.

`\CurrentOption` almacena el nombre de la opción de clase que se está manejando en un momento determinado.

El comando `\ProcessOptions\relax` ejecuta el código para cada opción y debe insertarse después de que se hayan escrito todos los comandos de manejo de opciones. Existe una versión con asterisco de este comando que ejecutará las opciones en el orden exacto especificado por los comandos que lo llaman.

En el ejemplo, si las opciones `red` o `verde` se pasan al documento, la fuente usada para el encabezado y las secciones se establecerá con el color correspondiente. El color llamado `slcolor` se definió en el [declaraciones preliminares](#preliminary-declaration) después de importar el `xcolor` paquete.

[Abrir un ejemplo de cómo escribir una clase en Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Más declaraciones

En esta parte aparecerá la mayoría de los comandos. En "exampleclass.cls" se establecen las dimensiones de la página y el tamaño de fuente para el título, el cuerpo y las secciones. Abajo puedes ver el archivo de clase completo.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}

\renewcommand{\maketitle}{%
    \twocolumn[%
        \fontsize{50}{60}\fontfamily{phv}\fontseries{b}%
        \fontshape{sl}\selectfont\headlinecolor
        \@title
        \medskip
        ]%
}

\renewcommand{\section}{%
    \@startsection
    {section}{1}{0pt}{-1.5ex plus -1ex minus -.2ex}%
    {1ex plus .2ex}{\large\sffamily\slshape\headlinecolor}%
}

\renewcommand{\normalsize}{\fontsize{9}{10}\selectfont}
\setlength{\textwidth}{17.5cm}
\setlength{\textheight}{22cm}
\setcounter{secnumdepth}{0}
```

Para entender el resto de los comandos, consulta el [guía de referencia](#reference-guide) y los enlaces en la [sección de lectura adicional](#further-reading).

Los últimos cuatro comandos del ejemplo muestran las cuatro cosas que todas las clases deben contener:

* La definición de `normalsize`. Establece el [tamaño de fuente](/latex/es/fuentes/01-font-sizes-families-and-styles.md).
* Un valor predeterminado para [`textwidth`](/latex/es/formato/07-page-size-and-margins.md)
* Un valor predeterminado para [`textheight`](/latex/es/formato/07-page-size-and-margins.md)
* Las especificaciones para la [numeración de páginas](/latex/es/formato/03-page-numbering.md).

A continuación, un documento que usa la clase *exampleclass.cls*.

```latex
\documentclass[red]{exampleclass}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{blindtext}

\title{Example to show how classes work}
\author{Equipo Learn ShareLaTeX}
\date{August 2014}

\begin{document}

\maketitle

\noindent
Empecemos aquí con un ejemplo simple que funciona.

\blindtext

\section{Introducción}

El problema de Monty Hall...

\section{The same thing}

El Monty...
```

![WrittingClassesEx1.png](/files/ac7f5b30d6f00ab189812aa3ee1ca6862f230195)

Observa que el primer comando aquí es

```latex
\documentclass[red]{exampleclass}
```

[Abrir un ejemplo de cómo escribir una clase en Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Gestión de errores

Cuando se trata de desarrollar nuevas clases, es importante manejar posibles errores para hacer saber al usuario que algo salió mal. Hay cuatro comandos principales para informar errores en el compilador.

* `\ClassError{*class-name*}{*error-text*}{*help-text*}`. Toma tres parámetros, cada uno entre llaves: el nombre de la clase, el texto del error que se mostrará (el proceso de compilación se pausará) y el texto de ayuda que se imprimirá si el usuario presiona "h" cuando la compilación se pausa debido al error.
* `\ClassWarning{*class-name*}{*warning-text*}`. En este caso el texto se muestra pero el proceso de compilación no se detendrá. Mostrará el número de línea donde ocurrió la advertencia.
* `\ClassWarningNoLine{*class-name*}{*warning-text*}`. Funciona igual que el comando anterior, pero no mostrará la línea donde ocurrió la advertencia.
* `\ClassInfo{*class name*}{*info-text*}`. En este caso la información del segundo parámetro solo se imprimirá en el archivo de transcripción, incluido el número de línea.

[Abrir un ejemplo de cómo escribir una clase en Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Guía de referencia

**Lista de comandos usados comúnmente en clases y paquetes**

* `\newcommand{*name*}{*definition*}`. Define un [nuevo comando](/latex/es/comandos/01-commands.md#defining-a-new-command), el primer parámetro es el nombre del nuevo comando y el segundo parámetro es lo que hará el comando.
* `\renewcommand{}{}`. Igual que `\newcommand` pero sobrescribirá un comando existente.
* `\providecommand{}{}`. Funciona igual que `\newcommand` pero si el comando ya está definido, este se ignorará sin mostrar ningún mensaje.
* `\CheckCommand{}{}`. La sintaxis es la misma que `\newcommand`, pero en su lugar comprobará si el comando existe y tiene la definición esperada; LaTeX mostrará una advertencia si el comando no es lo que `\CheckCommand` se esperaba.
* `\setlength{}{}`. Establece la longitud del elemento pasado como primer parámetro al valor escrito como segundo parámetro.
* `\mbox{}`. Crea una caja que contiene los elementos escritos dentro de las llaves.
* `\fbox{}`. Igual que `\mbox`, pero en realidad se imprime una caja alrededor del contenido.

## Lectura adicional

Para más información, consulta

* [Entender los paquetes y los archivos de clase](/latex/es/archivos-de-clase/01-understanding-packages-and-class-files.md)
* [Escribir su propio paquete](/latex/es/archivos-de-clase/03-writing-your-own-package.md)
* [Comandos](/latex/es/comandos/01-commands.md) y [Entornos](/latex/es/comandos/02-environments.md)
* [Longitudes en LaTeX](/latex/es/formato/01-lengths-in-latex.md)
* [Uso de colores en LaTeX](/latex/es/formato/13-using-colors-in-latex.md)
* [Gestión en un proyecto grande](/latex/es/estructura-del-documento/07-management-in-a-large-project.md)
* [LaTeX2ε para autores de clases y paquetes](http://www.latex-project.org/guides/clsguide.pdf)
* [Notas sobre programación en TeX](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minutos en menos de horas: Uso de recursos de LaTeX](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [La compañera de LaTeX. Segunda edición](http://ptgmedia.pearsoncmg.com/images/9780201362992/samplepages/0201362996.pdf)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/es/archivos-de-clase/04-writing-your-own-class.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
