miércoles, 17 de septiembre de 2014

Cómo hacer un reporte sin capítulos en LaTeX

En esta entrada, voy a explicar cómo hacer un reporte, informe o resumen, con LaTeX. Si alguna vez lo has intentando, habrás notado que hay unas pequeñas sutilezas y problemas que hay que resolver.

Cuando digo informe, me refiero a un documento corto, con un título, índice, secciones y quizás, referencias. Si quieres hacer un documento con capítulos, es mejor que sigas las instrucciones que ya comenté para una tesis (click aquí). En este caso, busco un documento sin capítulos.

Al no tener capítulos, la primero que uno podría pensar es usar el formato {article}. Ya que otros formatos, como {book} o {report}, trabajan con ellos. Pero esa opción tiene un problema. Con {article} podemos editar los encabezados y pies de página, pero han de ser iguales en todas las páginas. Pero en este caso, quiero que los encabezados cambien dependiendo de si la hoja es par o impar. Por ejemplo, que el número de página vaya arriba a la derecha en las páginas impares, y arriba a la izquierda en las páginas pares. Teniendo esto en cuenta, tampoco puedo usar {report}, porque tampoco este formato trabaja bien con esta diferenciación entre páginas pares e impares. Por lo voy a tener que usar el formato {book}. (Pero repito, si te da igual que los encabezados y pies de página sean iguales en todas las hojas, no lo dudes, y usa {article}.)

Sin embargo, el trabajar con {book} (y debido a que está pensado para tener capítulos), me van a aparecer una serie de problemas. Que voy a tratar de ir solucionando a continuación.



En primer lugar, muestro el esqueleto del informe que voy a usar como ejemplo. Primero añado la página de título, con \{titlepage}, luego inserto el índice de contenidos, luego definio tres secciones (introducción, nudo y desenlace), y finalmente añado la lista bibliográfica. En este caso, "biblio.bib" es el fichero que contiene la bibliografía. Puedes consultar la siguiente entrada para leer más sobre cómo trabajar con la bibliografía (click aquí). Solo mencionar además, que con "\setcounter" defino hasta qué nivel queremos que aparezca en el índice y se numere (3 = subsubsección); y que la numeración de las páginas comienza después del índice de tablas (sin contar la página de título), gracias a "\pagenumbering".

\documentclass[a4paper,openright,12pt]{book}
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}

\setcounter{secnumdepth}{3}
\setcounter{tocdepth}{3}

\begin{document}

\begin{titlepage}
\vspace*{4cm}
\centering
\Huge
\textbf{Cómo hacer un Reporte o Informe con LaTeX} \\
\vspace*{0.8cm}
\rule{80mm}{0.1mm} \\
\vspace*{0.2cm}
\Large
Ariel Marina \\
\vspace*{0.1cm}
\large
\today
\normalsize
\end{titlepage}

\tableofcontents
\pagenumbering{arabic}

\section{Introducción}\label{se:intro}

\section{Nudo}\label{se:nudo}

\section{Desenlace}\label{se:des}

\bibliographystyle{acm}
\bibliography{biblio}


\end{document}



El siguiente paso, consiste en definir los encabezados y pies de página. El cómo hacerlo es algo que ya describí en otra entrada (click aquí), y no voy a entrar en más detalles aquí. Sencillamente, defino primero los encabezados y pies de página con \lhead, \chead, \rhead, etc. En los encabezados, pongo el nombre de la sección en la parte superior interna de la página. Como el nombre cambia en cada sección, los redefino en cada sección con \lhead y \rhead. (No vuelvo a usar \chead, \lfoot, \cfoot, \rfoot, en cada sección, por que en mi caso, son siempre iguales, y basta con la vez que los definí al inicio.)

Otra cosa más. La numeración de las páginas la pongo en la parte superior externa de cada hoja, siguiendo el formato "página / número total de páginas". El número de página se indica con "\thepage", mientras que para el número total de páginas, necesito cargar el paquete "{lastpage}". A continuación, cuando quiero insertar el número total de páginas, uso "\pageref{LastPage}".

\documentclass[a4paper,openright,12pt]{book}
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}
\usepackage{fancyhdr}
\usepackage{lastpage}


\setcounter{secnumdepth}{3}
\setcounter{tocdepth}{3}

% aqui definimos el encabezado
\lhead[\thepage/\pageref{LastPage}]{}
\chead[Informe]{Informe}
\rhead[]{\thepage/\pageref{LastPage}}
\renewcommand{\headrulewidth}{0.5pt}

% aqui definimos el pie de pagina
\lfoot[Océano]{Ariel Marina}
\cfoot[\today]{\today}
\rfoot[Ariel Marina]{Océano}
\renewcommand{\footrulewidth}{0.5pt}

\pagestyle{fancy}


\begin{document}

\begin{titlepage}
\vspace*{4cm}
\centering
\Huge
\textbf{Cómo hacer un Reporte o Informe con LaTeX} \\
\vspace*{0.8cm}
\rule{80mm}{0.1mm} \\
\vspace*{0.2cm}
\Large
Ariel Marina \\
\vspace*{0.1cm}
\large
\today
\normalsize
\end{titlepage}

\tableofcontents
\pagenumbering{arabic}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Tabla de contenidos}
\rhead[\thesection. Tabla de contenidos]{\thepage/\pageref{LastPage}}


\section{Introducción}\label{se:intro}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Introduccion}
\rhead[\thesection. Introduccion]{\thepage/\pageref{LastPage}}


\section{Nudo}\label{se:nudo}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Nudo}
\rhead[\thesection. Nudo]{\thepage/\pageref{LastPage}}


\section{Desenlace}\label{se:des}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Desenlace}
\rhead[\thesection. Desenlace]{\thepage/\pageref{LastPage}}


\bibliographystyle{acm}
\bibliography{biblio}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Bibliografía}
\rhead[\thesection. Bibliografía]{\thepage/\pageref{LastPage}}


\end{document}




Aquí ya nos aparecen varios problemas. El primero, es que, claro, como {book} está pensado para trabajar con capítulos, y aquí no hemos definido ninguno, en la numeración de las secciones, nos aparece 0.1, 0.2... lo que es horrible. Pero la solución es muy fácil. Basta con añadir la siguiente línea de código:

\renewcommand\thesection{\arabic{section}}




Ahora, una cosa más complicada. El formato del índice y de la bibliografía (tamaño de letra, sangría, etc.) sigue el formato utilizado para los capítulos. (Más exactamente, como \chapter*, ya que no los numera.) Pero ahora, ya que no tenemos capítulos, sería mejor editar este formato para hacerlo igual que una sección. Para poder hacerlo, hay que añadir las siguientes líneas:

\makeatletter
\renewcommand\tableofcontents{
    \section{{\contentsname}
        \@mkboth{
           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}
    \@starttoc{toc}
   }
\makeatother

La línea importante es la que he puesto en rojo. Ahora el formato va a ser como una sección. Y como cualquier otra sección la va a numerar. Si no quieres que la numere, pon \section*. También aquí se puede definir el título de la tabla de contenidos. En español, el índice se titula por defecto como "Índice general". Si quieres otro nombre, basta con cambies "\contentsname" por lo que quieras. Por ejemplo:

\makeatletter
\renewcommand\tableofcontents{
    \section{{Tabla de contenidos}
        \@mkboth{
           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}
    \@starttoc{toc}
   }
\makeatother



En el caso de la bibliografía, habría que hacer algo similar. En este caso, el código que hay que añadir, es:

\makeatletter
\renewenvironment{thebibliography}[1]{
     \section{\bibname}
      \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}
      \list{\@biblabel{\@arabic\c@enumiv}}
           {\settowidth\labelwidth{\@biblabel{#1}}
            \leftmargin\labelwidth
            \advance\leftmargin\labelsep
            \@openbib@code
            \usecounter{enumiv}
            \let\p@enumiv\@empty
            \renewcommand\theenumiv{\@arabic\c@enumiv}}
      \sloppy
      \clubpenalty4000
      \@clubpenalty \clubpenalty
      \widowpenalty4000
      \sfcode`\.\@m}
     {\def\@noitemerr
       {\@latex@warning{Empty `thebibliography' environment}}
      \endlist}
\makeatother

Como en el caso anterior. La línea importante es la línea roja. Si quieres que la bibliografía no se numere, pon \section*. Y si quieres editar el título de la bibliografía, sustituye "\bibname" por lo que quieras.



 
Una cosa que ha cambiado, es que ahora no hay una página en blanco, después de la página del título. Esto se debe a que ahora el índice ya no es un capítulo. Para añadir una página en blanco, añade las siguientes líneas, después de \end{titlepage}.

$\ $
\thispagestyle{empty}
\newpage



Por cierto, en el formato {book}, el margen interior y exterior de las hojas no es igual. Como verás, el texto de cada página se moverá hacia la derecha o la izquierda, dependiendo de si la página es par o impar. Si quieres mantener el mismo margen en todas las páginas, puedes añadir las siguientes líneas. Tienes más sobre la edición de los márgenes en esta otra entrada (click aquí)

\setlength{\oddsidemargin}{10mm}
\setlength{\evensidemargin}{10mm}



Por último, escribo todo el código, que he ido describiendo y explicando en el ejemplo:
 
\documentclass[a4paper,openright,12pt]{book}
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}
\usepackage{fancyhdr}
\usepackage{lastpage}

% nivel que se numera y aparece en el indice
\setcounter{secnumdepth}{3}
\setcounter{tocdepth}{3}

% quitar el 0.
\renewcommand\thesection{\arabic{section}}

% tabla de contenidos como seccion
\makeatletter
\renewcommand\tableofcontents{
    \section{{Tabla de contenidos} %linea importante
        \@mkboth{
           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}
    \@starttoc{toc}
    }
\makeatother

% bibliografia como seccion
\makeatletter
\renewenvironment{thebibliography}[1]{
     \section{Bibliografía} %linea importante
      \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}
      \list{\@biblabel{\@arabic\c@enumiv}}
           {\settowidth\labelwidth{\@biblabel{#1}}
            \leftmargin\labelwidth
            \advance\leftmargin\labelsep
            \@openbib@code
            \usecounter{enumiv}
            \let\p@enumiv\@empty
            \renewcommand\theenumiv{\@arabic\c@enumiv}}
      \sloppy
      \clubpenalty4000
      \@clubpenalty \clubpenalty
      \widowpenalty4000
      \sfcode`\.\@m}
     {\def\@noitemerr
       {\@latex@warning{Empty `thebibliography' environment}}
      \endlist}
\makeatother

% aqui definimos el encabezado
\lhead[\thepage/\pageref{LastPage}]{}
\chead[Informe]{Informe}
\rhead[]{\thepage/\pageref{LastPage}}
\renewcommand{\headrulewidth}{0.5pt}

% aqui definimos el pie de pagina
\lfoot[Océano]{Ariel Marina}
\cfoot[\today]{\today}
\rfoot[Ariel Marina]{Océano}
\renewcommand{\footrulewidth}{0.5pt}

\pagestyle{fancy}

% margenes
\setlength{\oddsidemargin}{10mm}
\setlength{\evensidemargin}{10mm}

\begin{document}

\begin{titlepage}
\vspace*{4cm}
\centering
\Huge
\textbf{Cómo hacer un Reporte o Informe con LaTeX} \\
\vspace*{0.8cm}
\rule{80mm}{0.1mm} \\
\vspace*{0.2cm}
\Large
Ariel Marina \\
\vspace*{0.1cm}
\large
\today
\normalsize
\end{titlepage}

\tableofcontents
\pagenumbering{arabic}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Tabla de contenidos}
\rhead[\thesection. Tabla de contenidos]{\thepage/\pageref{LastPage}}

\section{Introducción}\label{se:intro}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Introduccion}
\rhead[\thesection. Introduccion]{\thepage/\pageref{LastPage}}

\section{Nudo}\label{se:nudo}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Nudo}
\rhead[\thesection. Nudo]{\thepage/\pageref{LastPage}}

\section{Desenlace}\label{se:des}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Desenlace}
\rhead[\thesection. Desenlace]{\thepage/\pageref{LastPage}}

\bibliographystyle{acm}
\bibliography{biblio}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Bibliografía}
\rhead[\thesection. Bibliografía]{\thepage/\pageref{LastPage}}

\end{document}


A continuación, el mismo código. Pero haciendo que el índice de contenidos y las referencias no estén numeradas (como \section*). Por defecto, las \section* no aparecen en el índice de contenidos. Así que, si quieres que aparezcan, tienes que añadir "\addcontentsline{toc}", como indico en rojo. Por último, si después de alguna sección quieres añadir un salto de página, se puede hacer escribiendo "\newpage", en el sitio correspondiente.

\documentclass[a4paper,openright,12pt]{book}
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}
\usepackage{fancyhdr}
\usepackage{lastpage}

% nivel que se numera y aparece en el indice
\setcounter{secnumdepth}{3}
\setcounter{tocdepth}{3}

% quitar el 0.
\renewcommand\thesection{\arabic{section}}

% tabla de contenidos como seccion
\makeatletter
\renewcommand\tableofcontents{
    \section*{{Tabla de contenidos} %linea importante
        \@mkboth{
           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}
    \@starttoc{toc}
    }
\makeatother

% bibliografia como seccion
\makeatletter
\renewenvironment{thebibliography}[1]{
     \section*{Bibliografía} %linea importante
      \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}
      \list{\@biblabel{\@arabic\c@enumiv}}
           {\settowidth\labelwidth{\@biblabel{#1}}
            \leftmargin\labelwidth
            \advance\leftmargin\labelsep
            \@openbib@code
            \usecounter{enumiv}
            \let\p@enumiv\@empty
            \renewcommand\theenumiv{\@arabic\c@enumiv}}
      \sloppy
      \clubpenalty4000
      \@clubpenalty \clubpenalty
      \widowpenalty4000
      \sfcode`\.\@m}
     {\def\@noitemerr
       {\@latex@warning{Empty `thebibliography' environment}}
      \endlist}
\makeatother

% aqui definimos el encabezado
\lhead[\thepage/\pageref{LastPage}]{}
\chead[Informe]{Informe}
\rhead[]{\thepage/\pageref{LastPage}}
\renewcommand{\headrulewidth}{0.5pt}

% aqui definimos el pie de pagina
\lfoot[Océano]{Ariel Marina}
\cfoot[\today]{\today}
\rfoot[Ariel Marina]{Océano}
\renewcommand{\footrulewidth}{0.5pt}

\pagestyle{fancy}

% margenes
\setlength{\oddsidemargin}{10mm}
\setlength{\evensidemargin}{10mm}

\begin{document}

\begin{titlepage}
\vspace*{4cm}
\centering
\Huge
\textbf{Cómo hacer un Reporte o Informe con LaTeX} \\
\vspace*{0.8cm}
\rule{80mm}{0.1mm} \\
\vspace*{0.2cm}
\Large
Ariel Marina \\
\vspace*{0.1cm}
\large
\today
\normalsize
\end{titlepage}

\tableofcontents
\pagenumbering{arabic}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Tabla de contenidos}
\rhead[\thesection. Tabla de contenidos]{\thepage/\pageref{LastPage}}
\newpage

\section{Introducción}\label{se:intro}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Introduccion}
\rhead[\thesection. Introduccion]{\thepage/\pageref{LastPage}}

\section{Nudo}\label{se:nudo}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Nudo}
\rhead[\thesection. Nudo]{\thepage/\pageref{LastPage}}

\section{Desenlace}\label{se:des}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Desenlace}
\rhead[\thesection. Desenlace]{\thepage/\pageref{LastPage}}

\bibliographystyle{acm}
\bibliography{biblio}
\addcontentsline{toc}{section}{Bibliografía}
\lhead[\thepage/\pageref{LastPage}]{\thesection. Bibliografía}
\rhead[\thesection. Bibliografía]{\thepage/\pageref{LastPage}}

\end{document}