Usando TeX para criar automaticamente um livro de resumos com entradas classificadas

Usando TeX para criar automaticamente um livro de resumos com entradas classificadas

Preciso processar cerca de 100 arquivos tex para uma conferência. Cada arquivo contém um resumo de uma apresentação e tem um autor. Vamos supor que as partes relevantes de cada arquivo sejam argumentos das seguintes macros TeX ou LaTeX (comandos ou ambientes):

TITLE% o título do artigo

AUTHOR% do autor (fornecido como: Sobrenome, Nome)

AFFILIATION% afiliação do autor (incluindo endereço de e-mail)

ABSTRACT% do resumo da apresentação

REFERENCES% lista curta de referências introduzidas com\bibitem

Gostaria de obter um documento que contenha os resumos das apresentações ordenados pelo Sobrenome do autor, juntamente com um índice e uma lista ordenada dos participantes que incluiria sua afiliação.

Pensei primeiro em retirar os arquivos tex que os autores submeteram e deixar apenas as informações relevantes (mencionadas acima), mas não sei como devo proceder a seguir, de forma "algorítmica" (sem qualquer classificação manual ou outro "manual " métodos).

Eu olhei para uma pergunta semelhanteaqui, mas não consegui encontrar uma solução para o problema de classificação.

Responder1

Nesse ínterim, resolvi parcialmente o problema, exceto a parte de classificação e pensei em compartilhá-lo com vocês, aguardando seus valiosos comentários e sugestões.

Optei por fazer uma classificação "externa" e colei o resultado diretamente no arquivo tex principal, pois parece a mais fácil das opções. Pensei em usar o datatoolpacote, mas a classificação levou apenas alguns segundos usando uma classificação de texto simples fora do TeX.

Os dados são coletados dos autores por meio de um arquivo de texto simples com a seguinte estrutura:

\AUTHOR{}{} %% <--- {LastName}{FirstName}
\EMAIL{}
\AFFILIATION{}
\TITLE{}
\ABSTRACT{}

O arquivo principal lê esses arquivos e produz o conteúdo do Livro de Resumos, como no exemplo mínimo a seguir (onde lemos três arquivos), onde as macros são definidas no abstractbook.styarquivo externo:

\documentclass[a4paper,12pt]{article}
\usepackage{abstractsbook}

\begin{document}

%% ++++++++++ Process submitted files ++++++++++++++++++

\begin{processfiles}
    %% ---------------------------------------
    \processfile{FirstAuthor}
    \processfile{SecondAuthor}
    \processfile{ThirdAuthor}
    %% First sorted alphabetically outside TeX
\end{processfiles}

\parindent 0pt
%% +++++++++++++++++++ List of Talks  ++++++++++++++++++

\listoftalks

%% +++++++++++++++++++ Abstracts ++++++++++++++++++++++

\abstracts

%% +++++++++++++++++++ Index of participants +++++++++++

\listofparticipants

%% +++++++++++++++++++++++++++++++++++++++++++++++++++++
\end{document}

O abstractbook.styarquivo define todas as macros acima. Ao processar arquivos, \processfile{NameOfFile}lê o conteúdo da NameOfFile.texmesma pasta do arquivo tex principal. Cada um \processfile{...}aumenta um contador local (contando o número de arquivos lidos) e define as seguintes macros:

\author-<x>-LastName

\author-<x>-FirstName

\affiliation-<x>

\email-<x>

\title-<x>

\abstract-<x>

onde <x>está o valor atual do contador.

Ao compor o documento, apenas percorremos todos os valores do contador e exibimos as informações necessárias.

Veja um exemplo mínimo abaixo para o abstractbook.sty. Espero que seja (não tão difícil) legível:

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{abstractsbook}
%% ++++++++++++++++++++++++++++++++++++++++++++++++++++
\RequirePackage{ifthen}
%% ----- some shortcuts ------
\let\ea=\expandafter
\let\cs=\csname
\let\ecs=\endcsname
%% ++++++++++++++++++++++++++++++++++++++++++++++++++++

\newenvironment{processfiles}
    {\newcount\numabs % <--- TeX local counter that counts
                      %      the number of abstracts
     \numabs=0\relax
     \newcounter{numabs} % <--- LaTeX global counter
    }
    {\setcounter{numabs}{\the\numabs}
      % < --- saving the final (local) value of \numabs
    } %       for global later use

\long\def\processfile #1{%
                         \advance\numabs by 1\relax
                         \input{#1.tex}
                        }%

\long\def\AUTHOR #1#2{%
                     \ea\long\ea\gdef\cs author-\the\numabs-LastName\ecs{#1}%
                     \ea\long\ea\gdef\cs author-\the\numabs-FirstName\ecs{#2}%
                     }

\long\def\AFFILIATION #1{%
                        \ea\long\ea\gdef\cs affiliation-\the\numabs\ecs{#1}
                       }

\long\def\EMAIL #1{%
                  \ea\long\ea\gdef\cs email-\the\numabs\ecs{#1}
                 }
%%
\long\def\TITLE #1{%
                  \ea\long\ea\gdef\cs title-\the\numabs\ecs{#1}
                 }
%%
\long\def\ABSTRACT #1{%
                     \ea\long\ea\gdef\cs abstract-\the\numabs\ecs{#1}
                    }

% ++++++++++++++  List of Talks ++++++++++++++++++++++++++++++++++++++++++++++

\def\heading #1{\cleardoublepage{\LARGE\scshape #1}\par\hrulefill\vskip 6ex}

\long\def\listoftalks
    {
     \heading{List of Talks}
     \newcount\@i
     \@i=1\relax
     \whiledo{\the\@i<\numexpr \thenumabs+1\relax}
        {\begin{minipage}{\textwidth}
             \vskip 1.5ex
             \leftskip 0em
             \textsc{\cs author-\the\@i-FirstName\ecs}~\MakeUppercase{\cs author-\the\@i-LastName\ecs}
             \par\leftskip 2.5em
             \textit{\cs title-\the\@i\ecs}\dotfill\pageref{marker-\the\@i}
        \end{minipage}
        \advance \@i by 1\relax
        }%
     }

% ++++++++++++++  List of Participants  +++++++++++++++++++++++++++++++++++++

\long\def\listofparticipants
    {\heading{List of Participants}
     \newcount\@i
     \@i=1\relax
     \whiledo{\the\@i<\numexpr \thenumabs+1\relax}
        {\begin{minipage}{\textwidth}
                \textbf{\MakeUppercase{\cs author-\the\@i-LastName\ecs}},~\textbf{\cs author-\the\@i-FirstName\ecs}
                \vskip 1ex
                \textit{\cs affiliation-\the\@i\ecs}
                \vskip 0.25ex
                \texttt{\cs email-\the\@i\ecs}
         \end{minipage}
         \vskip 4ex
         \advance \@i by 1\relax
        }%
    }

% +++++++++++++++  Abstracts of Talks +++++++++++++++++++++++++++++++++++++++++

\long\def\abstracts
    {\heading{Abstracts of Talks}
     \newcount\@i
     \@i=1\relax
     \whiledo{\the\@i<\numexpr \thenumabs+1\relax}
        {%
         \begin{minipage}{\textwidth}
            \label{marker-\the\@i} % <--- used for later referencing of the page
            \begin{center}
                \textsc{\Large \cs title-\the\@i\ecs}
                \vskip 1.5ex
                \textbf{\Large \cs author-\the\@i-FirstName\ecs~\cs author-\the\@i-LastName\ecs}
                \vskip 1ex
                \normalsize{\cs affiliation-\the\@i\ecs}
            \end{center}
            \vskip 2.5ex
            \cs abstract-\the\@i\ecs
            \end{minipage}
            \vskip 8ex
            \vfill
            \advance \@i by 1\relax
        }%
     }

Considere também os exemplos mínimos dos arquivos abstratos abaixo:

FirstAuthor.tex

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\AUTHOR{First}{Author}% <--- {LastName}{FirstName}
%%
\EMAIL{[email protected]}
%%
\AFFILIATION{First University}
%%
\TITLE{The first title}
%%
\ABSTRACT{This is the abstract of the first talk.

And some math: $1+1=2$.

}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

SecondAuthor.tex

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\AUTHOR{Second}{Author}% <--- {LastName}{FirstName}
%%
\EMAIL{[email protected]}
%%
\AFFILIATION{Second University}
%%
\TITLE{The second title}
%%
\ABSTRACT{This is the abstract of the second talk.

And some math:

\[
E=m\mathrm{c}^2.
\]}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

ThirdAuthor.tex

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\AUTHOR{Third}{Author}% <--- {LastName}{FirstName}
%%
\EMAIL{[email protected]}
%%
\AFFILIATION{Third University}
%%
\TITLE{The third title}
%%
\ABSTRACT{This is the abstract of the second talk.

And some math:

\[
\mathrm{e}^{i\pi}+1=0.
\]}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

O resultado deste exemplo mínimo é o seguinte arquivo:

Primeira página

Segunda página

Terceira página

informação relacionada