Использование TeX для автоматического создания книги рефератов с отсортированными записями

Использование TeX для автоматического создания книги рефератов с отсортированными записями

Мне нужно обработать около 100 tex-файлов для конференции. Каждый файл содержит аннотацию презентации и имеет одного автора. Предположим, что соответствующие части каждого файла являются аргументами следующих макросов TeX или LaTeX (команд или окружений):

TITLE% название статьи

AUTHOR% автор (указывается как: Фамилия, Имя)

AFFILIATION% принадлежность автора (включая адрес электронной почты)

ABSTRACT% аннотация презентации

REFERENCES% краткий список литературы представлен с\bibitem

Я хотел бы получить документ, содержащий тезисы докладов, отсортированные по фамилии автора, а также оглавление и отсортированный список участников, включающий их принадлежность к какой-либо организации.

Я думал сначала удалить tex-файлы, предоставленные авторами, и оставить только соответствующую информацию (упомянутую выше), но я не знаю, как мне действовать дальше, «алгоритмическим» способом (без какой-либо ручной сортировки или других «ручных» методов).

Я просмотрел похожий вопросздесь, но я не смог найти решение проблемы сортировки.

решение1

Тем временем я частично решил проблему, за исключением части сортировки, и решил поделиться этим с вами, ожидая ваших ценных комментариев и предложений.

Я решил сделать "внешнюю" сортировку и вставил результат прямо в основной файл tex, так как это кажется самым простым из вариантов. Я думал использовать пакет datatool, но сортировка заняла у меня всего несколько секунд, используя простую сортировку текста вне TeX.

Данные собираются у авторов с помощью простого текстового файла со следующей структурой:

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

Основной файл считывает эти файлы и создает содержимое Abstract Book, как в следующем минимальном примере (где мы считываем три файла), где макросы определены во внешнем abstractbook.styфайле:

\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}

Файл abstractbook.styопределяет все вышеперечисленные макросы. При обработке файлов \processfile{NameOfFile}считывает содержимое NameOfFile.texиз той же папки, что и основной tex-файл. Каждый \processfile{...}увеличивает локальный счетчик (подсчитывая количество прочитанных файлов) и определяет следующие макросы:

\author-<x>-LastName

\author-<x>-FirstName

\affiliation-<x>

\email-<x>

\title-<x>

\abstract-<x>

где <x>- текущее значение счетчика.

При верстке документа мы просто циклически перебираем все значения счетчика и выводим необходимую информацию.

Ниже приведен минимальный пример для abstractbook.sty. Надеюсь, он (не так уж и сложно) читаем:

\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
        }%
     }

Рассмотрим также минимальные примеры абстрактных файлов ниже:

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.
\]}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Результатом этого минимального примера является следующий файл:

Первая страница

Вторая страница

Третья страница

Связанный контент