Aktionslisten nach Personen sortiert

Aktionslisten nach Personen sortiert

Ich erstelle eine Klasse für Sitzungsprotokolle, da ich einige recht spezielle Anforderungen habe – minutes.stydiese scheint jedoch nicht alle meine Anforderungen zu erfüllen.

Es gibt einige gute Fortschritte, aber bei Folgendem stecke ich völlig fest: Ich möchte Aktionspunkte definieren können, wenn ich ihnen in den Besprechungen begegne, und sie automatisch nach Personen sortieren lassen.

Es wäre toll, wenn ich so etwas schreiben könnte:

\action{Peter}{next week}{Take out the garbage}

\action{Mike}{tomorrow}{Prepare a presentation for the thing}

\action{Peter}{2015-02-28}{Clean the kitchen}

\action{Peter}{tomorrow}{Water the plants}

\action{Mike}{yesterday}{Cleanse the bathroom}

descriptionUnd lassen Sie alles in einer Umgebung wie dieser anzeigen :

\begin{description}
  \item[Peter] \hfill \\
     Water the plants     \hfill \textbf{tomorrow} \\
     Take out the garbage \hfill \textbf{next week} \\
     Clean the kitchen    \hfill \textbf{2015-02-28} \\
  \item[Mike] \hfill \\
     Prepare a presentation for the thing \hfill \textbf{tomorrow} \\
     Cleanse the bathroom                 \hfill \textbf{yesterday} \\
\end{description}

Die Aufgaben müssen nicht zusätzlich nach Fälligkeitsdatum pro Person sortiert werden, obwohl ich auch dafür gerne Hinweise hätte. Die Gruppierung nach Personen ist wichtiger.

Ich brauche offensichtlich eine Datenstruktur, aber ich habe keine Ahnung, wo ich anfangen soll oder wie diese funktionieren würde. Gibt es so etwas wie ein Array, eine Liste, eine Hash-Map oder irgendetwas, das eine recht einfache Sortierung ermöglicht?

Ich bin auch nicht an einen bestimmten Compiler gebunden. Wenn es beispielsweise Funktionen gibt, luatexdie diesen Weg einfacher machen, dann wäre das kein Problem.

Kann mir jemand den richtigen Weg weisen? Ist das überhaupt möglich?

Antwort1

Hier ist ein Ausgangspunkt:

Bildbeschreibung hier eingeben

\documentclass{article}

\usepackage{multido}
\newcounter{personcntr}% Keep track of number of persons
\makeatletter
\newcommand{\action}[3]{% \action{<name>}{<time>}{<duty>}
  \@ifundefined{person@#1}{% If person doesn't exist
    \stepcounter{personcntr}% Next person
    \expandafter\xdef\csname person@#1\endcsname{1}% One time/duty
    \expandafter\xdef\csname person@bynumber@\thepersoncntr\endcsname{#1}% Number person

  }{% Person already exists
    \expandafter\xdef\csname person@#1\endcsname{%
      \number\numexpr\csname person@#1\endcsname+1}% Step number of time/duty
  }%
  \expandafter\xdef\csname person@#1@\csname person@#1\endcsname @time\endcsname{#2}% Store time
  \expandafter\xdef\csname person@#1@\csname person@#1\endcsname @duty\endcsname{#3}% Store duty
  \ignorespaces
}
\gdef\newpar{\par}% \multido doesn't enjoy \par

\newcommand\printactions{% Print actions
  \def\descriptionBODY{}% Empty descriptionBODY
  {\let\item\relax% Prevent expansion of \item
   \let\newpar\relax% Prevent expansion of \newpar
    \multido{\iPerson=1+1}{\value{personcntr}}{% Step through all persons
      % Extract person name
      \expandafter\xdef\expandafter\thisperson\expandafter{\csname person@bynumber@\iPerson\endcsname}%
      \protected@xdef\descriptionBODY{%
        \descriptionBODY%
        \item[\thisperson] \leavevmode\newpar}% Add person name to descriptionBODY
      % Extract person number
      \expandafter\xdef\expandafter\thispersonnum\expandafter{\csname person@\thisperson\endcsname}%
      \multido{\iDuty=1+1}{\thispersonnum}{%
        \protected@xdef\descriptionBODY{%
          \descriptionBODY%
          \csname person@\thisperson @\iDuty @duty\endcsname% Add person duty to descriptionBODY
          \hfill
          {\bfseries\csname person@\thisperson @\iDuty @time\endcsname}% Add person time to descriptionBODY
          \newpar
        }%
      }%
    }%
  }%
  % Print person time/duty
  \begin{description}
    \descriptionBODY
  \end{description}
}
\makeatother

\begin{document}

\action{Peter}{next week}{Take out the garbage}

\action{Mike}{tomorrow}{Prepare a presentation for the thing}

\action{Peter}{2015-02-28}{Clean the kitchen}

\action{Peter}{tomorrow}{Water the plants}

\action{Mike}{yesterday}{Cleanse the bathroom}

\printactions

\end{document}

verwandte Informationen