Ich möchte eine Punktetabelle erstellen, die mir aus einer kommaseparierten Liste erstellt wird, wobei die Anzahl der Einträge in dieser Liste variabel sind.

Folgendes nicht-lauffähiges Grundgerüst stelle ich mir vor:

Öffne in Overleaf
\documentclass[12pt,a4paper]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}

\newcommand{\punkte}{2,4,5,1,10}

\newcommand{\anzahl}{% Soll berechnet werden: 5% }
\newcommand{\summe}{% Soll berechnet werden: 2+4+5+1+10 =22 %}
\newcommand{\aufgabennummern}{% Soll die Aufgabennummern enthalten: 1 & 2 & 3 & 4 & 5 %}
\newcommand{\leerzeile}{% Soll die leere Tabellenzeile erzeugen & & & & & % }

\begin{document}
  \renewcommand{\arraystretch}{1.8}
  \newcolumntype{C}{>{\centering\arraybackslash}X}
  \begin{tabularx}{\textwidth}{|l*{\anzahl}{|C}|C|}
    \hline
    Aufgabe & \aufgabennummern & $\Sigma$\\
    \hline
    maximale Punktzahl & \punkte & \summe\\
    \hline
    erreichte Punkte & \leerzeile & \\
    \hline
  \end{tabularx}
\end{document}

Es sollen idealerweise nur die Punkte in \punkte eingegeben werden, der Rest soll "berechnet" werden. Ich habe mit l3regex experimentiert, aber nicht zum gewünschten Ergebnis gekommen.

Der erste Versuch war

Öffne in Overleaf
\documentclass[12pt,a4paper]{scrartcl}
\usepackage[utf8]{inputenc}

\usepackage{tabularx}

\usepackage{l3regex}
\ExplSyntaxOn
\tl_new:N \l_my_tl
\cs_new:Npn \punkteZeile #1 {
    \tl_set:Nx \l_my_tl {#1}
    \regex_replace_all:nnN { , } { & } \l_my_tl
    \tl_use:N \l_my_tl
}
\ExplSyntaxOff

\newcommand{\punkte}{2,4,5,1,10}
\begin{document}
  \renewcommand{\arraystretch}{1.8}
  \newcolumntype{C}{>{\centering\arraybackslash}X}
  \begin{tabularx}{\textwidth}{|l*{5}{|C}|C|}
    \hline
    Aufgabe & 1 & 2 & 3 & 4 & 5 & $\Sigma$\\
    \hline
    maximale Punktzahl & \punkteZeile{\punkte} & 22\\
    \hline
    erreichte Punkte & & & & & & \\
    \hline
  \end{tabularx}

\end{document}

Dies klappt aber nicht. Ich hab dann weiterhin mit \regex_count experimentiert, um die Anzahl der Einträge in der Liste zu ermitteln. Hier bin ich überhaupt nicht weitergekommen.

gefragt 07 Jan, 12:59

tom75's gravatar image

tom75
2.1k2253
Akzeptiert: 86%

bearbeitet 07 Jan, 13:27

Sieht für mich so aus, als wolltest Du irgendwelche Aufgaben und dazu einen Punkte/Notenspiegel setzen. Für so etwas gibt es fertige Pakete wie exsheets.

(07 Jan, 14:41) saputello

@saputello Nein, das ist nur für das Minimalbeispiel so gewählt, ich brauch es für einen anderen Zweck, bei dem es aber auch um Zahlen geht. Nur ist das Originalbeispiel sehr umfangreich und ich habe es auf die Punkte verkürzt.

(07 Jan, 15:14) tom75

Schonmal pgfplotstable versucht?

(08 Jan, 08:08) cis

Da die Punkte eine durch Komma separierte Liste darstellen, kann man diese einfach mit Hilfe von \@for abarbeiten. Die Anweisung ist im LaTeX-Kern definiert und in source2e.pdf dokumentiert:

Öffne in Overleaf
\documentclass[12pt,a4paper]{scrartcl}
\usepackage[utf8]{inputenc}

\newcounter{anzahl}
\newcounter{summe}
\makeatletter
\newcommand*{\processpunkteliste}[1]{%
  \setcounter{anzahl}{0}%
  \setcounter{summe}{0}%
  \let\aufgabennummern\@empty
  \let\leerzeile\@empty
  \let\punkte\@empty
  \@for \reserved@a:=#1\do{
    \stepcounter{anzahl}%
    \addtocounter{summe}{\reserved@a}%
    \edef\aufgabennummern{\aufgabennummern & \theanzahl}%
    \edef\leerzeile{\leerzeile &}%
    \edef\punkte{\punkte & \reserved@a}%
  }%
}
\makeatother
\processpunkteliste{2,4,5,1,10}

\begin{document}
  \renewcommand{\arraystretch}{1.8}
  \begin{tabular}{|l*{\value{anzahl}}{|r}|r|}
    \hline
    Aufgabe \aufgabennummern & $\Sigma$\\
    \hline
    maximale Punktzahl \punkte & \thesumme\\
    \hline
    erreichte Punkte \leerzeile & \\
    \hline
  \end{tabular}
\end{document}

Punktetabelle

Sollte es auch gebrochene Punktezahlen geben, kann natürlich nicht mehr einfach ein Zähler für die Punkte verwendet werden. In diesem Fall muss man dann auf andere Mittel wie das Paket fp oder dessen l3-Pedant zurückgreifen.

Natürlich könnte man auch einen Datensatz mit datatool verwenden, um die Tabelle anzulegen. Wenn die Aufgabe aber wirklich so einfach ist, wäre das mit Kanonen auf Spatzen geschossen. Daher werde ich es vorerst auch nicht zeigen.

Permanenter link

beantwortet 08 Jan, 07:36

saputello's gravatar image

saputello
19.2k22455

bearbeitet 08 Jan, 07:39

@saputello Danke!

(10 Jan, 05:11) tom75

In ConTeXt MKIV kann man mit dem database-Modul direkt CSV verwenden.

Öffne in Overleaf
\usemodule[database]

\defineseparatedlist
  [points]
  [separator=comma,
   left=\NC,last=\NC\NR,
   before=\startTABLE,after=\stopTABLE]

\starttext

\startseparatedlist[points]
  Aufgabe, 1, 2, 3, 4, 5, $\Sigma$
  maximale Punktzahl, 2, 4, 5, 1, 10, 22
  erreichte Punkte
\stopseparatedlist

\stoptext

alt text

Zusammen mit dem spreadsheet-Modul kann man dann auch gleich die Punkte zusammenrechnen.

Öffne in Overleaf
\usemodule[database,spreadsheet]

\defineseparatedlist
  [points]
  [separator=comma,
   left=\NC,last=\NC\NR,
   before=\startTABLE,after=\stopTABLE]

\starttext

\startspreadsheet

  \startseparatedlist[points]
    Aufgabe, 1, 2, 3, 4, 5, $\Sigma$
    maximale Punktzahl, 2, 4, 5, 1, 10, 22
    erreichte Punkte, \getspr{1}, \getspr{3}, \getspr{2}, \getspr{0}, \getspr{9}, \getspr{B[3] + C[3] + D[3] + E[3] + F[3]}
  \stopseparatedlist

\stopspreadsheet

\stoptext

alt text

Permanenter link

beantwortet 08 Jan, 05:32

Henri's gravatar image

Henri
10.7k42030

bearbeitet 08 Jan, 05:39

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×191
×1
×1

Frage gestellt: 07 Jan, 12:59

Frage wurde angeschaut: 310 Mal

Zuletzt aktualisiert: 10 Jan, 05:11