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:
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:
1 2 3 4 5 6 7 |
\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:
1 2 3 4 5 6 |
\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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
\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:
1 2 3 4 |
\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:
1 2 3 4 5 6 7 8 9 10 11 |
& & & & \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|