5. Prólogo
A
El presente manual de introducción a programación en L TEX está basado en la experiencia del
A
autor como usuario de L TEX, por ello los errores que se puedan encontrar a lo largo de este documento
es de total responsabilidad del autor.
A
En el primer capítulo se describe los comandos L TEX que son usados para la creación de entornos
y nuevos comandos. La utilidad de este capítulo es realizar un primer acercamiento a programación
y notar que los comandos aquí descritos no siempre satisfacen las necesidades del usuario, por lo que
se precisa de otros recursos para extender dichas funciones.
En el segundo capítulo se presentan 3 comandos TEX muy útiles para la creación de archivos de
clase y estilo, se describen también algunas extensiones de dichos comandos y otros recursos complementarios. Desde aquí se indica que los comandos presentados son apenas una pequeña parte del
total, por ello en este capítulo se indica la literatura adecuada para que el usuario pueda incrementar
sus conocimientos y así poseer mayores herramientas para crear características mas completas para
su documento.
En el tercer capítulo se describe la estructura de un archivo de clase, así también se proporciona
un ejemplo de aplicación. El usuario puede crear estructuras mas completas para su documento
A
L TEX, todo ello dependerá de su experiencia y sobre todo paciencia.
En el cuarto capítulo se describe la diferencia entre un archivo de clase y estilo, así como los casos
en que este último resulta mas útil.
Atendiendo a lo indicado en las primeras líneas del presente prólogo, se pide informar al autor
sobre los errores y/o comentarios que se tengan sobre lo indicado en este manual al e-mail:
i.numeri@gmail.com
También se puede dejar comentarios en las páginas
https://www.facebook.com/pages/LaTeX-OnLiNe/108938102529090
http://latexonline.wordpress.com/
Lima, 30 de enero del 2013.
v
6.
7. Capítulo
1
A
Definiendo comandos L TEX
1.1
1.2
Pág.
Definición de comandos nuevos 1
Definición de entornos nuevos
2
Una de las principales ventajas de TEX es su flexibilidad y versatilidad. Estas cualidades se suelen
concretar, fundamentalmente, en que TEX no es un programa cerrado con un número grande de
comandos y entornos predefinidos, sino que es programable, permitiendo al usuario desarrollar sus
propios comandos y entornos, adaptándolos completamente a sus necesidades.
En este capítulo se explica la manera en que se definen nuevos comandos y entornos, haciendo uso
A
de la sintaxis de L TEX, dejando el uso de elementos nativos de TEX para el siguiente capítulo.
1.1.
Definición de comandos nuevos
A
En L TEX podemos definir comandos, de acorde a nuestras necesidades. Así cada una de ellas
tendrá que ver con:
a) Abreviar nombres de comandos ya existentes.
b) Comandos nuevos, con o sin argumentos.
c) Redefiniciones de comandos ya existentes.
En las dos primeros casos usamos la instrucción newcommand y en el tercero renewcommand,
cada uno de los cuales posee la misma sintaxis. Así para los dos primeros casos:
newcommand{nombre}[n][defecto]{definicion}
donde:
n: cantidad de argumentos, usado cuando se desea que nombre tenga “n” argumentos (el primero
de ellos define un argumento opcional), aquí n = 1, 2, . . . , 9.
defecto: definición del argumento opcional, se indica el valor por defecto para el argumento opcional
de nombre.
Ejemplo 1.1
Se desea definir un “estilo de letra” para resaltar un texto con perfil sanserif e itálica. Dando
la opción de establecer el tamaño de letra. Para ello se define el comando estiloespecial
(cuyo argumento opcional esta definido en tamaño large), de la siguiente forma:
newcommand{estiloespecial}[2][large]{{#1itshapesffamily#2}}
1
8. 2
A
CAPÍTULO 1. COMANDOS L TEX
Lo usamos como: estiloespecial{mi texto} si deseamos usar la opción por defecto, y para
modificar la opción por defecto a otro tamaño estiloespecial[footnotesize]{mi texto}.
Ejemplo 1.2
Para abreviar entornos que son de uso frecuente, como begin{itemize}, el cual podemos
simplificarlo como bi y end{itemize} como ei, las instrucciones serían:
newcommand{bi}{begin{itemize}}
newcommand{ei}{end{itemize}}
Tengamos en cuenta que:
i) El nombre del nuevo comando puede contener una o mas letras (mayúsculas o minúsculas) pero
no dígitos ni otros símbolos del teclado (como por ejemplo el símbolo @).
A
ii) Si el comando nombre ya existe, entonces L TEX emitirá un mensaje de error, en cuyo caso
debemos sustituir newcommand por providecommand.
iii) Se sugiere escribir las instrucciones (de definición de comandos) en el preámbulo del documento,
esto facilita las labores de revisión y sirve de modelo para futuros documentos.
Ejemplo 1.3
Podemos modificar el estilo de numeración de un determinado contador, por ejemplo para hacer
que los capítulos aparezcan numerados en romanos:
renewcommand{thechapter}{Roman{Chapter}}
1.2.
Definición de entornos nuevos
Para definir nuevos entornos o redefinir los existentes, disponemos de los siguientes comandos:
newenvironment{NombreEntorno}[NumArg][ArgDef]{DefEntrada}{DefSalida}
renewenvironment{NombreEntorno}[NumArg][ArgDef]{DefEntrada}{DefSalida}
donde:
NombreEntorno: es el nombre del entorno.
NumArg: es el número de argumentos (comprendido entre 1 y 9).
ArgDef: es el valor asignado por defecto al argumento optativo (si en caso se desea obtener un
entorno con un argumento opcional), que será el primero de los argumentos.
DefEntrada: es el conjunto de ordenes que se ejecutan antes de entrar en el entorno.
DefSalida: es el conjunto de ordenes que se ejecutan al salir del entorno.
9. 1.2. DEFINICIÓN DE ENTORNOS NUEVOS
3
Ejemplo 1.4
Crearemos un entorno para escribir citas, de tal forma que el nombre del autor sea un argumento:
newenvironment{cita}[1]{newcommand{autor}{#1}begin{quote}%
itshape}{end{quote}centerline{autor}}
Resultado 1.1
La raíz de todas las pasiones es
el amor. De él nace la tristeza,
el gozo, la alegría y la desesperación.
begin{cita}{Lope de Vega}
La raíz de...
end{cita}
Lope de Vega
Ejemplo 1.5
Ahora daremos un ejemplo en el que se hace uso de renewenvironment. Antes de ello se
definirá un entorno al cual denominaremos comenta. Aquí el código y el efecto:
newcounter{contin}
newenvironment{comenta}
{noindentslshape Comentario:
begin{quote}smallitshape}
{stepcounter{contin}hfill
(arabic{contin})end{quote}}
begin{comenta}
El comando ...
end{comenta}
Comentario:
El comando newcounter define un nuevo contador, en tanto que el comando
stepcounter incrementa en una unidad
al contador definido anteriormente. Notemos que al final el comando arabic realiza la tarea de imprimir el contador en
formato numérico (usar alph si se quiere letras).
(1)
Se desea redefinir el entorno comenta de modo que permita imprimir (junto al encabezado) el nombre
del autor del comentario. El código de redefinición y su uso se da a continuación
Resultado 1.2
renewenvironment{comenta}[1]{begin{sloppypar}noindentslshape Comentario:
#1begin{quote}smallitshape}{stepcounter{contin}hspace*{fill}
(arabic{contin})end{quote}end{sloppypar}}
begin{comenta}{El comentarista del manual}
Texto del entorno redefinido ...
end{comenta}
Note que se adicionó (en la definición de entrada y salida del entorno) a begin{sloppypar} y
end{sloppypar} respectivamente, para obtener textos con particiones silábicas mas tolerantes (da
mayor espaciado entre palabras). También notese el cambio de hfill por hspace*{fill}, para
este caso los efectos requeridos son los mismos pero el código es ligeramente distinto.
10.
11. Capítulo
2
Comandos básicos de programación TEX
2.1 Comando DEF . . . . .
Comando def sin argumentos
Comando def con argumentos
2.2 Comando LET . . . . .
2.3 Comando IF . . . . . . .
Algunas acciones de IF . . . .
NEWIF: extensión de IF . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Pág.
5
5
6
7
8
8
8
Aquí definiremos algunos comandos básicos TEX los cuales permitirán crear un documento de clase
A
(cls) y estilo (sty). La idea es realizar una primera aproximación a programación en L TEX, por lo
cual no se explicaran todos los comandos TEX en este capítulo (mas aun, alguno de los comandos
que se presentan se complementan con otros no indicados aquí).
2.1.
Comando DEF
Una manera TEX de definir nuevos comandos es haciendo uso del comando def1 , su sintaxis
queda establecida
def{nuevo_comando}{definicion}
Si el comando a definir, eventualmente se usará en modo matemático entonces se debe agregar
en su definición el comando ensuremath, quedando
def{nuevo_comando}{ensuremath{definicion}}
DEF sin argumentos
Ejemplo 2.6
Se define un comando para insertar un operador lógico matemático (la implicación) cuya sintaxis
A
L TEX es rightarrow, la cual cambiaremos a imp
defimp{rightarrow}
1
Escribir en el preámbulo o fuera de el (esto incluye el caso de escribir fuera de un documento .tex como por
ejemplo un documento de estilo, el cual posee extensión .sty) no hace diferencia, mas es recomendable escribir estas
sentencias dentro del preámbulo, puesto que así se lleva mas control sobre todos los comandos creados, lo cual da mas
orden al documento.
5
12. 6
CAPÍTULO 2. COMANDOS TEX
Resultado 2.3
$p imp q$
p→q
Ahora adaptamos el comando imp para que pueda ser aplicado tanto en modo matemático como
fuera de él
defimp{ensuremath{rightarrow}}
Resultado 2.4
El símbolo de implicación es imp
$p imp q$
El símbolo de implicación es →
p→q
DEF con argumentos
El comando def admite (así como otros comandos) hasta 9 argumentos, de los cuales el primero
es opcional (esto es, si el usuario no proporciona dicho argumento el comando trabajará con un valor
por defecto). Para hacer referencia a los argumentos se hace uso de #n (n = 1, 2, . . . , 9) quedando
defnuevo_comando#1#2...#9{definicion}
Ejemplo 2.7
Se define un comando (válido tanto en modo matemático como fuera de el) para la ecuación
de la esfera n-dimensional de radio r, este comando será denominado esfera y poseerá tres
argumentos, en las cuales se indica la variable, dimensión y radio (respectivamente)
defesfera#1#2#3{ensuremath{#1_1^2+#1_2^2+cdots+#1_#2^2=#3^2}}
Resultado 2.5
La ecuación de la esfera
$4$-dimensional de radio $2$
es esfera{x}{4}{2}
La ecuación de la esfera 4-dimensional de radio 2 es x2 + x2 + · · · + x2 = 22
1
2
4
13. 2.2. COMANDO LET
2.2.
7
Comando LET
Si deseamos transferir la definición de un comando preestablecido (incluyendo sus argumentos) a
un nuevo comando, entonces debemos usar let, así
letnuevo_comando=comando_anterior
Ejemplo 2.8
Vamos a definir un comando para crear un nuevo párrafo cuyo texto sea en negrita y cursiva.
Para ello
creamos un comando temporal (lo llamaremos temp) que haga dicha función
deftemp{parbfseriesitshape}
luego pasamos la definición del comando temporal a un nuevo comando
letnewpar=temp
Resultado 2.6
Un maestro de la Ley, que quería
ponerlo a prueba, se levantó y le
dijo: ‘‘Maestro, ¿qué debo hacer para
conseguir la vida eterna?’’newpar
Jesús le dijo: ‘‘¿Qué está escrito en
la Escritura? ¿Qué lees en ella?’’ El
hombre contestó: ‘‘Amarás al Señor tu
Dios con todo tu corazón, con toda tu
alma, con todas tus fuerzas y con toda
tu mente; y amarás a tu prójimo como a
ti mismo.’’ Jesús le dijo:
‘‘¡Excelente respuesta! Haz eso
y vivirás.’’
Un maestro de la Ley, que quería ponerlo a
prueba, se levantó y le dijo: “Maestro, ¿qué
debo hacer para conseguir la vida eterna?”
Jesús le dijo: “¿Qué está escrito en
la Escritura? ¿Qué lees en ella?” El
hombre contestó: “Amarás al Señor
tu Dios con todo tu corazón, con toda
tu alma, con todas tus fuerzas y con
toda tu mente; y amarás a tu prójimo como a ti mismo.” Jesús le dijo:
“¡Excelente respuesta! Haz eso y vivirás.”
Cabe indicar que
al usar el código letnewpar=parbfseriesitshape no se obtendría el resultado deseado
(puede usted comprobarlo!), por ello la necesidad de crear un comando temporal.
aunque posteriormente se modifique algo de la definición de temp el comando newpar no
cambiará, puesto que let saca una copia del comando temp en su definición inicial.
14. 8
CAPÍTULO 2. COMANDOS TEX
2.3.
Comando IF
Para producir diferentes resultados (o acciones) dependiente del valor de una variable, se debe
usar el comando if, este genera una estructura de control (condicional). Su sintaxis es
if<test> [parte a] else [parte b] fi
Acciones de IF
• Si el resultado de <test> es verdadero, entonces se procesa las órdenes contenidas en [parte a]
y si es falso se procesa [parte b].
• los comandos que no deben de faltar son if y fi los cuales inician y acaban la sentencia
respectivamente.
• dentro de [parte a] o [parte b] pueden aparecer otros condicionales (a esto se le denomina
anidamiento), donde cada if debe estar asociado a su respectivo fi. Una posible estructura
de condicionales anidados seria
if<test1>
if<test2> [parte a] else [parte b] fi
else
if<test3> [parte c] else [parte d] fi
fi
Comando NEWIF
Para crear un condicional con estados 2 preestablecidos, se usa el comando newif. Su sintaxis
queda definido por
newififNuevoCondional
Al usar newif se tiene a disposición tres nuevos comandos: if<test>, NuevoCondicionaltrue y
su correspondiente NuevoCondicionalFalse. Así se obtienen tres estructuras distintas
newififNuevoCondional
NuevoCondionaltrue
obtenemos que NuevoCondicional se
inicia en verdadero (modo habilitado).
newififNuevoCondional
NuevoCondionalfalse
obtenemos que NuevoCondicional se
inicia en falso (modo deshabilitado).
newififNuevoCondional
if<test> [parte a] else [parte b] fi
el NuevoCondicional queda anidado.
2
Esto es: iniciar como habilitado o deshabilitado el comando creado.
15. 2.3. COMANDO IF
9
Ejemplo 2.9
Se define un comando (de nombre grafico) el cual permita incorporar leyendas al pie de un
gráfico, con el siguiente criterio
a) si la longitud de la leyenda es menor a la anchura del gráfico, entonces la leyenda se imprime
centrada con respecto al gráfico.
b) si la longitud es superior a la anchura del gráfico, entonces la leyenda se imprime con una
anchura igual a la del gráfico.
c) debe permitir elegir entre colocar o no un recuadro al gráfico.
Resultado 2.7
newlength{ancho}
newififrecuadro
recuadrofalse
defgrafico#1#2#3#4#5{%
ifx#5Rrecuadrotrueelseifx#5N%
recuadrofalsefifi
vbox{ifrecuadroelsefboxrule0pt%
fifboxsep0pt
hbox{fboxrule2ptfboxsep2pt%
fbox{includegraphics[width=#2,%
height=#3]{#1}}}vspace{abovecaptionskip}%
settowidth{ancho}{#4}%
ifdimancho<#2hbox to#2{hss#4hss}else
hbox{parbox{#2}{#4}}fi}}
en donde para la opción de recuadro,
podemos usar R o N para recuadrar
o no la gráfica respectivamente.
Ahora imprimimos la imagen con los criterios dados
grafico{nombre-imagen}{ancho}{alto}%
{leyenda}{opcion-de-recuadro}
Esta es mi leyenda
Unos comentarios adicionales con respecto a este código:
• el comando newlength define una nueva longitud, el cual facilita la comparación de la anchura
del argumento #4 con respecto a la imagen.
• el comando ifx compara dos argumentos entre sí, dando verdadero si son iguales y falso en
caso contrario. Su sintaxis general es: ifxArg1Arg2.
• el comando settowidth iguala las dimensiones del comando ancho al argumento #4.
• el comando ifdim es usado para comparar dos longitudes mediante la relación <, > o =. Su
sintaxis general es: ifdim Dim1 Relacion Dim2.
• el comando hss es usado para centrar el contenido de la leyenda (argumento #4) con respecto
al ancho de la imagen (argumento #2).
16.
17. Capítulo
3
Archivos de clase
3.1 Finalidad . . . . . . . . . .
3.2 Estructura . . . . . . . . . .
Identificando un archivo de clase
Declarando opciones de clase . . .
Ejecutando las opciones de clase .
Cargando la clase base y otros . .
3.3 Ejemplo . . . . . . . . . . .
Pág.
. 11
. 11
. 12
. 12
. 12
. 13
. 13
Los archivos de clase poseen la extensión .cls, así un archivo de clase se distingue del archivo
principal (el cual posee extensión .tex) no solamente por su extensión, sino también por su uso
subordinado al archivo .tex.
Un archivo de clase debe ser invocado en el documento principal mediante la instrucción:
documentclass{nombre-archivo-de-clase}
3.1.
Finalidad
Cuando se requiere uniformizar el aspecto de todos los documentos que se vayan a producir (por
ejemplo para un revista, boletín, exámenes, notas personales, etc) disponer de un archivo de clase es
muy útil. Para poder usar un archivo de clase es preciso (mas no estrictamente necesario) colocar el
archivo cls en la misma carpeta que el documento tex.
Ahora, no siempre es útil crear un archivo de clase. En ocasiones resulta mas cómodo crear un
archivo de estilo (de extensión .sty) o varios de ellos. Por ejemplo si se desea dotar de características
diversas (estilo de fuente, encabezados, entornos personalizados, etc) al documento, sería una buena
opción crear una serie de archivos .sty, puesto que así se obtendría una librería de archivos de
estilo los cuales pueden ser usados en otros documentos tex. Para un usuario experimentado puede
resultarle práctico colocar todo ello en un archivo de clase, sin embargo cuando se desea usar alguna
de las características en otro documento puede resultar laborioso seleccionar determinadas secciones
del archivo cls para añadirlas al nuevo documento.
3.2.
Estructura
A
Los comandos TEX y L TEX presentados hasta aquí permiten implementar ciertas características
al documento. Quedan muchos comandos por describir los cuales proporcionarían mayor libertad en
la dotación de características, mas en lo que respecta a este manual procuramos mostrar que: unos
pocos comandos proporcionan resultados interesantes.
Por tanto se recomienda hacer uso de los siguientes libros para afianzar los conceptos aquí mostrados y conocer de nuevos comandos
a) TEX By Topic, de Victor Eijkhout.
A
b) L TEX Companion, de Frank Mittelbach y Michel Goossens.
11
18. 12
CAPÍTULO 3. CREANDO UN ARCHIVO DE CLASE CLS
Identificación
En esta parte se define el nombre que se usará cuando se invoque el archivo cls, así como algunas
anotaciones extras. Por lo general estos datos brindan información descriptiva sobre el archivo de
clase, lo cual facilita la lectura del conjunto de instrucciones ahí contenidas.
ProvidesFile{nombre-archivo.cls}[año/mes/dia]
typeout{anotaciones-extras}
Adicional a la información que se pueda establecer en este punto, sería favorable para el usuario
realizar comentarios (haciendo uso del símbolo %) para indicar la estructura general del archivo
de clase. A su vez, ir señalando (independiente de los comentarios dados al inicio) las líneas que
conforman un grupo de instrucciones y realizan una tarea específica (los cuales al final conforman el
conjunto de características que se desea brindar al documento).
Declaración de opciones
Existen diversas maneras de declarar opciones, más es recomendable usar DeclareOption por
ser más eficiente (sobre todo consume menos memoria).
Antes se deben definir las variables que se irán a usar en el archivo de clase, para ello se definen
nuevos condicionales con el comando newif, así
newififargumento
Usaremos argumentotrue o argumentofalse para cargar una opción por defecto. Así, por ejemplo,
si no se desea cargar la opción argumento en modo habilitado entonces usamos
newififargumento
argumentofalse
posteriormente se debe declarar argumento como opción a habilitar en el documento tex1 , complementándose así el código anterior
DeclareOption{argumento}{argumentotrue}
Ejecución de opciones
Para leer las opciones que serán activadas al ser declaradas en la opción de clase del archivo tex,
se debe escribir
ProcessOptions
ifargumento%
argumentotrue%
fi
1
Indicado en la primera línea de código con: documentclass[argumento]{nombre-archivo-cls}.
19. 3.3. EJEMPLO
13
Carga de la clase
A.- Clase base: aquí se especifica si el archivo de clase está basado en una clase estándar
A
preestablecida como (article, book, report, etc) de L TEX. Así debemos usar
LoadClass{clase-estandar}
en caso se desee cargar algunas opciones (de la clase estándar), se debe escribir
LoadClass[opciones]{clase-estandar}
Se sugiere revisar los archivos de clase correspondientes a book y article, puesto que en ella se
encuentran códigos relevantes que pueden ser de ayuda en la creación de archivos de clase a futuro.
Por ejemplo, ver
• para book http://www.tex.ac.uk/ctan/macros/latex/unpacked/book.cls
• para article http://www.tex.ac.uk/ctan/macros/latex/unpacked/article.cls
B.- Paquetes: aquí se indican los paquetes que se harán uso (por defecto) en el documento clase
a crear. Para ello usamos
RequirePackage{nombre-paquete}
C.- Definiciones: aquí se pueden incluir algunas definiciones las cuales pueden ser reutilizados
a lo largo del archivo cls o directamente (invocado) en el documento tex, así
defargumento#1#2...#n{instrucciones}
3.3.
Ejemplo
Los ejemplos que se dan en esta sección son adaptaciones del código creado por Luis Varona2
(universidad de la Rioja en España) a quien agradezco su amable disposición al autorizar el libre uso
del código.
Ejemplo 3.10
Se desea imprimir los datos de los autores de un documento al final del mismo, para ello se
creará un archivo de clase de nombre clase0.cls, así como el comando contact bajo el
formato
contact{dirección autor 1}{email 1}{pagina web 1}
se habilitará el uso de este comando mediante una opción de clase, el cual llamaremos
autocontact. Se explicará la estructura del archivo cls de acuerdo a lo establecido en este
capítulo.
2
Juan Luis Varona Malumbres, e-mail jvarona@unirioja.es, website http://www.unirioja.es/cu/jvarona
20. 14
CAPÍTULO 3. CREANDO UN ARCHIVO DE CLASE CLS
Identificación
Codigo de clase para contact 3.8
ProvidesFile{clase0.cls}[2013/01/01]
typeout{Ejemplo de archivo de clase}
% ---------------------- CODIGO INICIAL --------------------------------%
% Creando la opcion autocontact
newififautocontact
autocontactfalse % Se inicia en modo desactivado (false) por defecto
Declaración de opciones
Codigo de clase para contact 3.9
DeclareOption{autocontact}{autocontacttrue}
Ejecución de opciones
Codigo de clase para contact 3.10
ProcessOptions
ifautocontact%
autocontacttrue%
fi
Carga de la clase
A.- Clase base
Codigo de clase para contact 3.11
LoadClass{article}
B.- Paquetes
Indicamos que no precisa especificar todos los paquetes aquí, por lo general se suele cargar los
mas comunes. Cada documento se va particularizando según los atributos que se quiera obtener, por
ello es aconsejable optar por una de las siguientes opciones
revisar el archivo de clase antes de escribir el archivo tex para verificar que paquetes están pre
cargados.
crear un comentario (usando %) al inicio del archivo cls (o del archivo tex) indicando los
paquetes pre cargados.
21. 3.3. EJEMPLO
15
Codigo de clase para contact 3.12
% --------- TEXTO EN ESPAÑOL Y SILABEO -------------------%
RequirePackage[spanish]{babel}
hyphenation{au-tor}
% --------- OTROS PAQUETES QUE SE DESEA PRECARGAR --------%
RequirePackage{graphicx}
RequirePackage{url}% Permite usar diversos caracteres que no se
% pueden escribir de forma directa
RequirePackage{amsmath,amsthm}
RequirePackage{amssymb}
date{} % no pone la fecha
C.- Definiciones
Iniciamos creando el entorno trivlist cuya función es poder ordenar los datos (en bloque) que
se ingresen en los campos del comando contact, lo cual da un efecto de lista no numerada (o
sin viñetas). Notar el uso del comando let el cual transfiere las propiedades del comando url a
contacturl. Posteriormente se define la estructura del bloque que se irá a imprimir al final de la
página del documento, así también se aprovecha estos comandos para enlazarlos posteriormente a la
orden last page y así ser invocados al final.
Codigo de clase para contact 3.13
% ---- Se define un entorno corto para trivlist --------------%
{block}{begin{trivlist}item{}}{end{trivlist}}
defemailname{Correo electronico}
defwebname{Pagina web}
letcontacturlurl
% ------ Se define comandos para el last page -----------------%
let@contact=empty
newcommand{contact}[3]{%
expandaftergdefexpandafter@contactexpandafter{%
@contact vskip 2.00pt plus 0.75 pt minus 0.25ptrelax
begin{block}
footnotesizescshape % tamaño y tipo de letra
begin{minipage}{textwidth}%
noindent
#1ifxempty #2else[1.5pt]normalfontemailname: contacturl{#2}fi
ifxempty #3else[1.5pt]normalfontwebname: contacturl{#3}fi
end{minipage}
end{block}}}
defcontactalert{Se debe usar contact{Autor}%
{autor@email}{Pagina web} antes de begin{document}}
22. 16
CAPÍTULO 3. CREANDO UN ARCHIVO DE CLASE CLS
Codigo de clase para contact 3.14
% Se imprime el contacto:
newcommand{printcontact}{
medskip
ifxempty@contactnoindent
{footnotesize % tamaño y tipo de letra
contactalert
par}%
else@contactfi
let@contactempty}
ifautocontact%
newcommand{makelastpage}{printcontact}
else
newcommand{makelastpage}{relax}
fi
% ------- redefinicion de end{document} mediante enddocument ------%
%
se usa para cargar la orden last page
letendorigdocumentenddocument
defenddocument{enlargethispage{2mm}makelastpagelabel{LastPage}
endorigdocument}
endinput
Para acabar este ejemplo, haremos una breve explicación sobre el uso del símbolo @ en algunos
comandos TEX:
• el usuario tiene libertad para crear comandos con los nombres que crea mas convenientes, mas
sin embargo existen nombres que ya están pre establecidos, sobre todo si los nombres son dados
en ingles.
• al crear un documento cls se definen comandos cuyos nombres pueden caer dentro de la lista
de nombres que un usuario podría asignar a otro comando en la escritura de un documento tex
(subordinados al archivo cls).
• debido a ello se hace necesario proteger el nombre de un comando creado en un archivo de clase
(incluso dentro de un archivo tex) haciendo uso del símbolo @. Esta practica se extiende (de
algún modo) cuando se quiere limitar la acción de un comando mediante el uso de un comando
no existente.
A
• algunos de los comandos internos 3 de L TEX poseen el símbolo @, en general varios de los
comandos TEX lo poseen. De modo que para no crear un comando que ya esté pre definido por
A
algún archivo de clase en la instalación L TEX que se tenga, sería conveniente no abusar del uso
de @.
3
A
Los ladrillos bajo el cual esta diseñado L TEX.
23. Capítulo
4
Archivos de estilo
4.1
4.2
4.3
Finalidad . . .
Diferencia entre
STY . . . . . .
Ejemplo . . . .
Pág.
. . . . . . . . 17
un CLS y un
. . . . . . . . 18
. . . . . . . . 18
Los archivos de estilo poseen extensión .sty, un archivo de estilo debe ser invocado en el documento
principal mediante la instrucción:
usepackage{nombre-archivo-de-estilo}
4.1.
Finalidad
Los archivos de estilo son usados en
a) la implementación de características especiales
b) implementación de comandos creados por el usuario
en el primer caso se recomienda revisar otros archivos de estilo que posean un comportamiento
similar a la característica que se desea implementar, para luego a partir de los comandos TEX y
A
L TEX proporcionados aquí y en los libros de referencia, realizar las modificaciones correspondientes.
A
En la siguiente dirección web se encontraran las contribuciones realizadas por usuarios de L TEX.
En ella figuran diversos archivos de estilo los cuales pueden ser aprovechados de forma directa o ser
modificados según la necesidad
http://www.ctan.org/tex-archive/macros/latex/contrib/
Existen otras contribuciones que no se encuentran alojadas en la web anterior, por ejemplo se
recomienda recurrir a la siguiente web para encontrar diversas instrucciones (según el tema de discusión) que en su conjunto constituirían un archivo de estilo, naturalmente dichas instrucciones tienen
que estar relacionadas según la(s) característica(s) que se desee obtener
http://tex.stackexchange.com/
Una advertencia importante
Algunos documentos de estilo que se puedan encontrar en la web hacen uso de paquetes y/o
A
comandos de L TEX31 . Motivo por el cual es preciso instalar dichos paquetes o tener los archivos en
la misma carpeta donde se esta trabajando.
1
Esta versión está en preparación, la actual versión de MiKTEX (distribución para Windows) es 2.9.4757.
17
24. 18
CAPÍTULO 4. CREANDO UN ARCHIVO DE ESTILO STY
4.2.
Diferencia entre un CLS y un STY
La diferencia entre los archivos de clase y estilo radica en que los archivos de estilo son elaborados
teniendo en cuenta la implementación y/o modificación de una característica específica del documento
en tanto que los archivos de clase poseen un efecto mayor ya que dota de mayores características a
un documento.
En cuando a escritura de código, la única diferencia esencial para que un archivo de clase sea
un archivo de estilo viene dada por la instrucción
LoadClass{article}
de esta manera, en vez de usar documentclass{mi-archivo-de-clase} se usa
documentclass{article}% book, report, beamer, etc
usepackage{mi-archivo-de-estilo}
cuando se realiza la adaptación de un archivo de clase a un archivo de estilo quizá sea necesario
añadir y/o modificar algunos comandos del archivo de clase, puesto ambos tipos de archivo poseen
un comportamiento global y local respectivamente.
4.3.
Ejemplo
Se dará un ejemplo en la que se añade una cabecera descriptiva al inicio de un artículo. Este
es una adaptación del código creado por Luis Varona2 (universidad de la Rioja en España) para la
Revista de la Real Sociedad Matemática Española (RSME).
Ejemplo 4.11
Se desea imprimir a modo de encabezado (al inicio del documento) los datos correspondientes
a la publicación periódica que realiza un grupo de investigación. Entre los datos que se desea
imprimir se tiene: nombre del grupo de investigación, volumen, año, número de publicación
y las páginas que abarca el artículo publicado (este último es cargado de forma automática).
Para ello se creará el archivo de estilo: cabecera.sty, la impresión de los datos se realizara
escribiendo las siguientes instrucciones en el archivo tex
grupname{Nombre del grupo de investigación}
volume{XX}
yearofpublication{XXXX}
issuenumber{X}
se habilitará el uso de estos comandos mediante la declaración usepackage{cabecera}.
Primero se define los comandos a usar para la impresión de datos. Se añade el comando, que
permite colocar en la cabecera del documento (a partir de la segunda página) un nombre corto
para el grupo de investigación, shortgrupname. Así el código inicial para el documento de estilo
cabecera.sty es
2
Juan Luis Varona Malumbres, e-mail jvarona@unirioja.es, website http://www.unirioja.es/cu/jvarona
25. 4.3. EJEMPLO
19
Codigo de estilo para cabecera 4.15
defyearofpublication#1{deftheyearofpublication{#1}}
defvolume#1{defthevolume{#1}}
defissuenumber#1{deftheissuenumber{#1}}
defgrupname#1{defthegrupname{#1}}
grupname{nnnnnnnnnnn}
yearofpublication{xxxx}
volume{xx}
issuenumber{x}
defshortgrupname#1{deftheshortgrupname{#1}}
shortgrupname{Nombre corto del grupo}
A continuación se indica la estructura que tendrá el encabezado. Se añade el comando, que
imprime el texto provisional indicando que el texto esta en revisión, provisional
Codigo de estilo para cabecera 4.16
% Por si queremos indicar que la paginacion es provisional:
deftheprovisional{}
defprovisional{%
deftheprovisional{ (provisional)}%
}
% Para la cabecera de la primera pagina de cada articulo:
newcommand{makefirstpageofarticle}{markright{footnotesizescshape%
thegrupname,Vol.~thevolume (theyearofpublication), N’um.~theissuenumber,
P’ags.~thepage--pageref{LastPage}theprovisional}
}
deftheleftheading{theshortgrupname}
defleftheading#1{deftheleftheading{#1}makestandardpage}
newcommand{makestandardpage}{%
markboth{{footnotesizescshape theleftheading}}%
{{footnotesizescshape theshortgrupname}}%
}
Ahora se define el estilo para cabecera.sty, los textos de la cabecera se imprimen a tamaño
footnotesize, y los números de página en small.
Codigo de estilo para cabecera 4.17
defps@headingscabecera{%
let@oddfoot@emptylet@evenfoot@empty
% def@evenhead{thepagehfilslshapeleftmark}%ORIGINAL DE ps@myheadings
def@evenhead{smallthepagehfilslshapeleftmark}
% def@oddhead{{slshaperightmark}hfilthepage}% ORIGINAL DE ps@myheadings
def@oddhead{{slshaperightmark}hfilsmallthepage}
let@mkboth@gobbletwo
letsectionmark@gobble
letsubsectionmark@gobble
}
26. 20
CAPÍTULO 4. CREANDO UN ARCHIVO DE ESTILO STY
Las siguientes instrucciones permite incluir en la primera página del documento los datos de la
cabecera
Codigo de estilo para cabecera 4.18
letps@firstpageps@headingscabecera
def@fb@botlist{@botlist}
def@fb@topbarrier{suppressfloats[t]}
defFloatBarrier{parbegingroup let@eltrelax
edef@tempa{@fb@botlist@deferlist@dbldeferlist}%
ifx@tempa@empty
else
ifx@fltovfrelax % indicator of recursion
if@firstcolumn
clearpage
else
nullnewpageFloatBarrier
fi
else
newpage let@fltovfrelax
FloatBarrier % recurse once only
fifi endgroup
@fb@topbarrier }
% Se activa el tipo de pagina por defecto:
pagestyle{headingscabecera}
Se complementa el código anterior (poner atención a los comentarios incluidos en el código),
motivo por el cual no esta enmarcado
newififexistsfixedsectiontitle
existsfixedsectiontitlefalse
newififalreadyonetitle
alreadyonetitlefalse
defgoodbreaksecondsemititle{nullvskip 0em plus 3.5empagebreak[3]}
let@author@empty % inicializado para usarlo en los "if"
% Para poder añadir un espacio previo (positivo o negativo)
% antes de los titulos
newdimen{thepreviousvspace}
setlength{thepreviousvspace}{0pt}
defpreviousvspace#1{setlength{thepreviousvspace}{#1}}
renewcommandmaketitle
{FloatBarrierpar
begingroup
renewcommandthefootnote{@fnsymbolc@footnote}%
def@makefnmark{rlap{@textsuperscript{normalfont@thefnmark}}}%
longdef@makefntext##1{parindent 1emnoindent
hb@xt@1.8em{%
hss@textsuperscript{normalfont@thefnmark}}##1}%
if@twocolumn
ifnum col@number=@ne
27. 4.3. EJEMPLO
21
@maketitle
else
twocolumn[@maketitle]%
fi
else
ifoddthepageelsecleardoublepagefi % Empezar en pagina impar
global@topnumz@
% Previene a las figuras ir a la parte superior
@maketitle
fi
makefirstpageofarticle
thispagestyle{firstpage}@thanks
endgroup
globallet@thanks@empty
globallet@author@empty
globallet@date@empty
globallet@title@empty
makestandardpage % Para que, a partir de ahora, use la cabecera estandar
alreadyonetitletrue
}
def@maketitle{%
ifoddthepageelsecleardoublepagefi %Para que empiece en pagina impar
null
vskip 0.333em%
vspace*{thepreviousvspace}%
begin{center}%
let footnote thanks
{largebfseries @title par}%
vskip 1.25em%
if@empty@authorelse % Por si no hay autor
{par}vskip .5em
{bfseries
lineskip .5em%
begin{tabular}[t]{c}%
@author
end{tabular}par}%
fi
{large @date}%
end{center}%
par
vskip 2em}
Por ultimo se imprime la cantidad de páginas que abarca el artículo que se escribe:
Codigo de estilo para cabecera 4.19
letendorigdocumentenddocument
defenddocument{enlargethispage{2mm}label{LastPage}endorigdocument}
NOTA: El comando provisional en caso de ser usado debe ser colocado en el preámbulo del
documento tex.