Listy obecności (w LaTeX-u)

Listy obecmości

Byliśmy niegrzeczni i nas pokarało. Jak już pisałem obecnosć na wykłądach dla studentów pierwszego roku jest obowiązkowa. Na całe szczęście mam ich (tym razem) niewiele. Jeżeli obecność jest obowiązkowa — trzeba przygotować sobie listę obecności. Można, co prawda, w systemie Edukacja wygenerować listę obecnosci, ale:

  • po pierwsze jest generowana bardzo „rzadko” (to znaczy zajmuje dużo miejsca);

  • pdf generowany przez system Edukacja jest, po prostu, ułomny: literki włażą na siebie, trudno cokolwiek odczytać.

Na całę szczęście, można z systemu dostać listę studentów w formacie CSV. Wykorzystam go do wygenerowania listy obecności

Potrzebne będą nam następujące pakiety:

  1. longtable,

  2. datatool,

  3. xstring,

  4. geometry.

Oraz standardowe (polski ze względu na polskie litery i inputenc ze względu na kodowanie znaków).

Najciekawszym z pakietów jest pakiet datatool pozwala on czytać dane z plików csv, i robić różne rzeczy z polami każdego rekordu. Dokumentacja jest bardzo obszerna i gwarantuję, ze zapoznanie się z nią daje ogromne szanse na zwrot z inwestycji.

Przeambułą dokumentu wyglądać będzie tak:

\documentclass{article}
\usepackage[T1]{polski}
\usepackage[cp1250]{inputenc}
\usepackage{datatool}
\usepackage{xstring}
\usepackage[a4paper,landscape,scale=0.95]{geometry}
\usepackage{longtable}

Użyłem kodowania cp1250, bo plik csv jest tak zakodowany. Zakładam, że w pliku źródłowym nie pojawią się już inne znaki z rozszerzonego zestawu ASCII (Linux standardowo wszystko koduje jako utf8 i mógłby to być jakiś problem, edytor TeXworks pozwala zdefiniować używane w pliku kodowanie i problemu nie będzie. Inne edytory nie muszą mieć tej sympatycznej właściwości.)

Lista będzie drukowana na kartkach a4, poziomo (landscape) maksymalnie wykorzystując (scale=0.95) powierzchnię kartki.

Pakiet longtable użyty jest żeby wygenerować wielostronicową tabelkę.

Dalsza część dokumentu:

\begin{document}
\DTLsetseparator{;}
\DTLloaddb[noheader,
           keys={Lp,Album,Nazwisko,Imie},
           omitlines=11]
{lista}{listaSluchaczy_K00-33f.csv}

Pierwsze polecenie \DTLseparator definiuje średnik jako znak oddzielający kolumny (to jest taki polski wariant przecinka z CSV). drugie otwiera bazę danych zapisaną w pliku (listaSluchaczy_K00-33f.csv) i nazywa ją „lista”. Zakładamy, że plik nie ma nagłówka — będziemy pomijali wszystkie informacje organizacyjne (policzyłem, jest ich jedenaście linii) zawarte w pliku razem z obecnym tam nagłówkiem). Nadajemy własne nazwy poszczególnym polom: Lp, Album, Nazwisko, Imię (i tylko z nich będziemy korzystali). Pozostałe kolumny zignorujemy.

Teraz wystarczy zbudować tablicę longtable. Wygląda to jakoś tak (jest rozliczona na osiem zajęć plus uwagi)

\noindent
\begin{longtable}{|r|r|l|l|l|l|l|l|l|l|l|l|l|l|}
\multicolumn{13}{c}{MTR, sroda TN 9:15}\\
\hline
\multicolumn{1}{|l|}{Lp.} & 
\multicolumn{1}{l|}{Nr albumu} & 
Nazwisko & 
Imiona & 
\multicolumn{1}{r|}{1} & 
\multicolumn{1}{r|}{2} & 
\multicolumn{1}{r|}{3} & 
\multicolumn{1}{r|}{4} & 
\multicolumn{1}{r|}{5} & 
\multicolumn{1}{r|}{6} & 
\multicolumn{1}{r|}{7} & 
\multicolumn{1}{r|}{8} & 
Uwagi \\ \hline
\endhead

Powyższy nagłówek będzie powtarzany na każdej stronie.

A teraz magia, czyli pakiet datatool w działaniu:

\DTLforeach{lista}{\Lp=Lp,\Nazwisko=Nazwisko,\Imie=Imie,\Album=Album}{
 \Lp& \StrGobbleLeft{\Album}{4} &  \Nazwisko & \Imie 
 &  &  &  &  &  &  &  &   &   \\ \hline
}

Dla każdego rekordu doczytujemy wartość czterech pól w takiej kolejności w jakiej są w pliku i przypisujemy ich zawartość do poleceń (\Lp, \Nazwisko,…) i budujemy kolejny wiersz tabelki wstawiając odpowiednią wartość w odpowiednią kolumnę.

Teraz pozostaje zakończyć tabelkę i dokument:

 &  &  &  & 
\rule{7.5mm}{0pt} & 
\rule{7.5mm}{0pt} & 
\rule{7.5mm}{0pt} & 
\rule{7.5mm}{0pt} & 
\rule{7.5mm}{0pt} & 
\rule{7.5mm}{0pt} & 
\rule{7.5mm}{0pt} & 
\rule{7.5mm}{0pt} &  \\ \hline
\end{longtable}
\end{document}

Na samym końcu tabeli dodałem dodatkowy wiersz (może być ich więcej, dane w systemie edukacja na początku roku nie są kompletne). W każdej komórce umieściłem obiekt o wymiarach 0pt wysokości i 7,5mm szerokości — zadba on o to, żeby było wystarczająco dużo miejsca na podpisy. Szerokość trzeba dobrać doświadczalnie, żeby wszystko mieściło się na stronie.

I tyle. Happy TeXing|

Wojciech Myszka
Wojciech Myszka
dr inż. adiunkt

Tak się tylko rozglądam…