Gezmat - generator zestawów zadań matematycznych i innych

 English 
 pionie.pl 

Gezmat - generator zestawów zadań matematycznych i innych

Wersja 2018-07-05
Automatyczna produkcja zestawów zadań, każdy zestaw w wielu wersjach różniących się wartościami liczbowymi, wykresami, rysunkami, wyborem pytań itp.
Dla każdej wersji automatyczna produkcja plików z:
  • samymi zadaniami (PDF, LaTeX)
  • zadaniami i odpowiedziami (PDF, LaTeX)
  • zadaniami i wskazówkami (PDF, LaTeX)
  • zadaniami, wskazówkami i odpowiedziami (PDF, LaTeX, txt)
Program i zadania udostępnione są za darmo, na otwartych licencjach:
  • Program: GNU GPL
  • Zadania: CC BY-SA
 Więcej informacji  znajdziesz na tej stronie oraz w katalogu LICENCE pakietu.

Przykładowe zestawy zadań (1 wersja, PDF: Z - zadania, ZO - zadania z odpowiedziami, ZWO - zadania ze wskazówkami i odpowiedziami, po 4 wersje PDF, TEX, TXT w każdym archiwum ZIP):
W każdym archiwum, w katalogu gzm znajdują się kopie użytego pliku konfiguracyjnego.

Przykłady użycia  komend gzm .
Wszystkie zadania (1 wersja):  Z  ZO  ZWO  ZIP 
Łatwe przygotowanie własnych zestawów - wymagana jest tylko umiejętność prostej edycji konfiguracyjnego pliku tekstowego (*.gzm).
Określanie dopuszczalnej liczby miejsc dziesiętnych w zadaniach na poziomie podstawowym; id tych zadań ma końcówkę -dpc.
Na razie przygotowaliśmy 192 zadania w j. polskim (fizyka, matematyka). Pracujemy nad kolejnymi.

18 nowych zadań, głównie z drgań i fal. Pliki tylko ze wskazówkami.
Niedługo Grapical User Interface do Gezmata, kolejne zadania oraz opis nowych funkcjonalności.

Start:
$ tar xf Gezmat-[...].tgz
$ cd Gezmat-[...]/
Instalowanie  potrzebnych pakietów  w systemach z APT (Ubuntu, Mint, Debian):
$ sudo ./install-pkgs-for-gezmat.bash
Wpisz hasło, potwierdzaj (Enter lub T, lub Y). Na innych systemach należy zainstalować potrzebne pakiety samodzielnie.
$ ./gezmat.bash def/pl-sprawdzian_testowy.gzm
W katalogu
Outputs/pl-sprawdzian_testowy-[...]/
pojawią się katalogi pdf, tex, txt z zestawami zadań.
W przypadku Mac OS spróbuj:
$ export CXX=clang++ ; ./gezmat.bash def/pl-sprawdzian_testowy.gzm
Na Ubuntu/Mint/Debian można również używać clang++ zamiast g++-6:
$ export CXX=clang++-3.6 ; ./gezmat.bash def/pl-sprawdzian_testowy.gzm
Zamiast kompilatora g++-6 można ustawić jako domyślny inny za pomocą skryptu:
$ unset CXX ; ./set-compiler-for-gezmat.bash
Skrypt sprawdzi dostępne kompilatory (trochę to trwa), a następnie zapisze informację o wyborze użytkownika w pliku
.gezmat.cfg
Jest to wygodniejsze od samodzielnego ustawiania zmiennej CXX na początku każdej sesji.
Wymagane oprogramowanie:
  • terminal/konsola (program nie jest "okienkowy")
  • powłoka bash
  • kompilator g++-6 lub clang++-3.6 ze standardowymi bibliotekami
  • LaTeX/TeX: latex, dvips (pakiety texlive); ghostscript z ps2pdf. Albo: pdflatex
  • Asymptote (grafika wektorowa)
Pakiet przetestowano w środowsku Linux.  Łatwe dodawanie wymaganych pakietów. 

Program działa również w ramach Windows Subsystem for Linux w Windows 10 (instalacja wg Linuxiarze.pl).

Program działa także w systemach Mac OS.

Będziemy wdzięczni za informację, jeśli uda Ci się uruchomić Gezmat w innym środowisku.
Przykład generacji zestawu określonego w pliku
def/pl-sprawdzian_testowy.gzm
Produkowane są 4 arkusze. Dla każdego arkusza pliki PDF i LaTeX z końcówką:
  • _ha zawierają zadania ze wskazówkami (hints), odpowiedziami (answers), informacje o autorach, datach ostatniej modyfikacji i identyfikator zadania
  • _h zawierają zadania ze wskazówkami
  • _a zawierają zadania z odpowiedziami
Pozostałe pliki PDF i LaTeX zawierają same zadania, a plik TXT zadania ze wskazówkami i odpowiedziami. Komendy wywołuj w terminalu, w katalogu głównym pakietu, który powstaje po rozpakowaniu archiwum tgz (np. Gezmat-2016-07-14/). Tworzony jest katalog Outputs/pl-sprawdzian..., do którego przenoszone są wygenerowane pliki z rozszerzeniami pdf, tex, txt; pozostałe pliki (m.in. dvi, ps) można znaleźć w katalogu roboczym Work_files/other (ten katalog jest nadpisywany przy każdym uruchomieniu programu).
$ ./gezmat.bash def/pl-sprawdzian_testowy.gzm 3
$ cd Outputs/pl-sprawdzian_testowy-2016-07-14-22/
$ ls -1 *
pl-sprawdzian_testowy_v01_a.pdf
pl-sprawdzian_testowy_v01_a.tex
pl-sprawdzian_testowy_v01_ha.pdf
pl-sprawdzian_testowy_v01_ha.tex
pl-sprawdzian_testowy_v01.pdf
pl-sprawdzian_testowy_v01.tex
pl-sprawdzian_testowy_v01.txt
pl-sprawdzian_testowy_v02_a.pdf
...
pl-sprawdzian_testowy_v02_ha.pdf
...
pl-sprawdzian_testowy_v02.pdf
...
pl-sprawdzian_testowy_v02.txt
...
pl-sprawdzian_testowy_v03_ha.pdf
...
W pliku  def/all_problems_pl.gzm  znajdują się identyfikatory wszystkich zadań w j. polskim, nie edytuj tego pliku. Możesz zmienić mu nazwę na np. pl-moj-test.gzm, zmienić część opisową i zostawić w nim tylko wybrane zadania, a następnie wygenerować własne zestawy - tak jak z plikiem pl-sprawdzian_testowy.gzm.

Plik konfiguracyjny nie musi znajdować się w katalogu def/. Dla wygody własne pliki definujące zestawy możesz przechowywać np. w katalogu priv-def/.

Plik konfiguracyjny musi mieć końcówkę .gzm, a jego pierwsze 7 linii musi zawierać w tej kolejności:
  1. Tytuł (dowolny łańcuch)
  2. Określenie języka, na razie tylko pl lub en
  3. Separator dziesiętny, np. kropkę lub przecinek
  4. Maksymalną liczbę miejsc dziesiętnych w przypadku zadań na poziomie podstawowym (np. 0 lub 1, lub 2)
  5. Miejsce i datę (dowolny łańcuch)
  6. Autora zestawienia (dowolny łańcuch)
  7. Opis (dowolny łańcuch)
W "dowolnych łańcuchach" można używać komend LaTeX'a.
W kolejnych niepustych liniach, które mogą być oddzielane liniami pustymi, muszą znajdować się jako pierwsze:
  • albo słowo gzm zapowiadające  komendę  rozumianą przez Gezmat
  • albo identyfikator (id) zadania
Wszystkie identyfikatory zadań znajdziesz w pliku def/all_problems_pl.gzm lub w plikach w katalogu
Outputs/all_problems_pl... z _ha w nazwie.
Istotny jest tylko pierwszy łańcuch znakowy (identyfikator), pozostawienie w linii tytułów jest pomocne dla autora, ale nie wpływa na generację zestawu. Przykład pliku definującego zestaw zadań:
Sprawdzian
pl
,
1
Warszawa, 2016-06-25
\emph{ Przygotował \textbf{ J.F.} } % LaTeX
Powodzenia!

pl-liczby-0001000 "Śliwki"

  gzm comment Wcięcia są OK
  pl-liczby-0002000 "Jabłka"

pl-prędkość-droga-czas-0005000 "Samochód"
pl-prędkość-droga-czas-0004000-dpc "Prędkość jazdy rowerem"
Dla osób potrafiących programować w dowolnym języku możliwość dodawania własnych zadań (C++, LaTeX, Asymptote). Każde zadanie jest zapisane jako wyrażenie lambda.
Prosty przykład dla autorów zadań - fragmenty plików z katalogu src/:
// Random integer in
// [min, max] for n=0
// [min*10^n, max*10^n] for n>0
// r(4,6) returns number in [4, 6]
// r(4,6,2) returns number in [400, 600]
int r(int min, int max, int n=0)

// String corresponding to real/10^n
// (move decimal mark n places to the left)
// s(102,2) --> "1.02"
// s(102) --> "102"
// s(30,3) --> "0.03"
string s(int number, int n=0)

// Śliwki - uproszczona wersja
addProblem
("pl-liczby-0001000", // ID (string)
"Śliwki", // Title (string)
"Piotr Nieżurawski", // Authors (string)
"2016-07-21", // Date of the last update (string)
1, // Difficulty (int)
[]{ // Lambda expression (returns vector<string>)

   string text = "Jaś policzył posiadane śliwki i uzyskał wynik ";
   int n=3*r(5,12);
   text += s(n);
   text += ", a następnie zjadł jedną trzecią śliwek. Ile śliwek zostało Jasiowi?";

   vector<string> pV;
   pV.push_back(text);

   // Wskazówka
   text = "Ile jest równe ";
   text += s(n) + ":3? Odpowiedź: " + s(n/3) + ".";

   pV.push_back(text);

   // Odpowiedź
   text = "Liczba śliwek, które posiada Jaś: ";
   int answer = 2*n/3;
   text += s(answer);
   text += ".";

   pV.push_back(text);

   return pV;

} // End of lambda expression
); // End of addProblem

Autorzy poszczególnych zadań są wskazani w pliku  all_problems_pl_ha.pdf 
Twórcy zadań w kolejności chronologicznej:
Piotr Nieżurawski    Piotr.Niezurawski@pionie.pl 
Joanna Drabarz    joanna.drabarz@gmail.com 
Magda Gładka    m.gladka@student.uw.edu.pl 
Małgorzata Berajter    malgorzata.berajter@gmail.com 
Andrzej Twardowski    Andrzej.Twardowski@fuw.edu.pl 
Klaudia Dec    klaudiaplodzien@gmail.com 

Kod, koordynacja, strona WWW:
Piotr Nieżurawski    Piotr.Niezurawski@pionie.pl 
Inne moje projekty:  pionie.pl 

Chcesz pomóc, zgłosić uwagę, masz pytanie - zajrzyj na
 grupę dyskusyjną Gezmat PL 
lub wyślij mail do koordynatora  Piotr.Niezurawski@pionie.pl .

W planach: kolejne zadania na poziomie nauczania początkowego (odejmowanie pisemne; mnożenie: węże, trójkąty, pisemne), wprowadzenie zadań z ułamkami, więcej zadań na poziomie gimnazjum i liceum, przykłady zadań z programowania i chemii. Niezależny zespół pracuje nad środowiskiem graficznym (okienkowym) dla użytkowników Gezmata.
GNU GPL
Program Gezmat udostępniany jest na otwartej licencji GNU General Public License opublikowanej przez Free Software Foundation, w wersji 3
https://www.gnu.org/licenses/gpl.txt

Otrzymane z programu Gezmat zadania oraz pliki z rozszerzeniem gzm, które definiują zestawy zadań, są udostępnione na otwartej licencji CC BY-SA 4.0, Creative Commons - Uznanie autorstwa - Na tych samych warunkach - 4.0 - Międzynarodowe
http://creativecommons.org/licenses/by-sa/4.0/deed.pl
Jeśli zmodyfikujesz zestawy zadań i chcesz je upublicznić, nie musisz wskazywać autora każdego z zadań, a wystarczy, że zamieścisz w widoczny sposób adres strony gezmat.pl, na której znajduje się lista autorów. Oczywiście, zgodnie z warunkami licencji, powinieneś również zamieścić oznaczenie licencji co najmniej w postaci CC BY-SA 4.0

Więcej informacji znajdziesz w katalogu LICENCE pakietu.

Jeśli wprowadzisz modyfikacje lub zamieścisz dodatkowe fragmenty w plikach pakietu Gezmat i chcesz je upublicznić, dopisz swoje nazwisko, e-mail i datę w nagłówku modyfikowanego pliku. Dodawaj tylko to, co sam stworzyłeś, lub to, co należy do domeny publicznej.

Wysłanie do koordynatora projektu lub upublicznienie zmian lub dodatków do pakietu Gezmat oznacza zgodę ich autora na włączenie tych zmian lub dodatków do oficjalnej wersji pakietu Gezmat na zasadach licencji, w ramach której pakiet Gezmat jest udostępniany.
Prosimy o poinformowanie koordynatora projektu o Twoich uzupełnieniach, dodatkach i modyfikacjach pakietu.

Instalowanie potrzebnych pakietów w systemach z APT (Ubuntu, Mint, Debian):
$ sudo ./install-pkgs-for-gezmat.bash
Należy wpisać hasło, a następnie potwierdzać (Enter lub T, lub Y).
Instalowane są:
  • g++-6 ze standardowymi bibliotekami (dodawane jest repozytorium Ubuntu)
  • wybrane pakiety TeXLive, w tym texlive-lang-polish
  • Ghostscript
  • Asymptote
  • python

Jeśli wolisz pdflatex zamiast latex:
$ ./gezmat.bash def/pl-zbiory.gzm 1 pdflatex
Pamiętaj o podaniu liczby wersji (nie można tej pozycji zostawić pustej). Więcej wersji:
$ ./gezmat.bash def/pl-zbiory.gzm 4 pdflatex

Komendy, które można zamieszczać od 8 linii w pliku definującym zestaw zadań (*.gzm)
Komendy używane tylko raz na zestaw, dotyczące całego zestawu:
gzm for-all-vspace 2cm
Wstaw pionowy odstęp po każdym zadaniu (tylko Z).  ZIP 
gzm only-number
Tylko numer zadania, bez łamania linii (tylko Z).  ZIP 
gzm only-number-and-title
Numer zadania i tytuł, bez "Zadanie -" (tylko Z).  ZIP 
gzm header-left \textbf{Imię, nazwisko:}
Wstaw tekst w nagłówku po lewej stronie.  ZIP 
gzm search-id czas
Wybierz zadania (w danym języku) z id zawierającym wyrażenie regularne.  więcej   ZIP 
gzm search-description Mars
Wybierz zadania (w danym języku) z treścią zawierającą wyrażenie regularne.  więcej   ZIP 
gzm search-author Nieżurawski
Wybierz zadania (w danym języku) z listą autorów zawierającą wyrażenie regularne.  więcej   ZIP 
gzm shuffle
Ustaw zadania w losowej kolejności.  ZIP 
Wygeneruj znacznie więcej wersji zestawu, a potem wybierz te z najlepszym rozkładem tekstu i rysunków.
Aby ustawić w losowej kolejności tylko część zadań, użyj komendy from-group-choose, żądając wybrania tylu zadań, ile jest w grupie.
gzm all-problems-config
Przygotuj zestaw z wszystkimi zadaniami w danym języku oraz plik def/all_problems_*.gzm.  ZIP 
gzm geometry letterpaper, verbose, tmargin=2cm, bmargin=2cm, lmargin=2cm, rmargin=2cm, headheight=0.7cm, headsep=2mm
Definicja parametrów strony. Domyślna wartość: a4paper, verbose, tmargin=2cm, bmargin=2cm, lmargin=2cm, rmargin=2cm, headheight=0.7cm, headsep=2mm.  ZIP 
gzm points 1.45 2
Przy każdym zadaniu wypisz liczbę punktów. Pierwsza liczba (opcjonalna, rzeczywista) jest czynnikiem, przez który zostanie pomnożona trudość zadania diff: liczba punktów za zadanie = część całkowita z [czynnik]*[wartość diff zadania]. Druga liczba (opcjonalna, całkowita) jest minimalną liczbą punktów za zadanie (każde zadanie będzie miało co najmniej tyle punktów). W przypadku użycia tylko gzm points, bez liczb, punkty za zadanie są równe jego wartości diff.

Wartości diff wypisywane są w pliku ZWO (*_ha.pdf). Dla ułatwienia, po generacji zestawu, w którym użyto polecenia points, wypisywana jest w terminalu całkowita liczba punktów za zestaw. Definiując zestaw, można modyfikować przypisaną zadaniu wartość diff poleceniem gzm difficulty [liczba całkowita]. Kombinacja tych poleceń pozwala na uzyskanie porządanej całkowitej sumy punktów za zestaw z gwarancją, że dane zadanie będzie miało taką samą liczbę punktów w każdej wersji zestawu.
  ZIP 
Komendy, które można zamieszczać w pliku definującym zestaw zadań po linii, w której znajduje się identyfikator zadania:
gzm vspace 4cm
Wstaw pionowy odstęp po zadaniu (tylko Z).  ZIP 
gzm insert ~\\ Sprawdź \textit{wynik}!
Wstaw tekst po zadaniu.  ZIP 
gzm insert-before ~\\ \textbf{Oddychaj!} \\[-1em]
Wstaw tekst przed zadaniem.  ZIP 
gzm grid 0.5cm 17cm 3cm
Wstaw kratkę po zadaniu; parametry: odstęp, szerokość, wysokość; jednostki (tutaj cm) muszą być tuż za liczbami, bez spacji (tylko Z).   ZIP 
Kratka o szerokości tekstu:
gzm grid 0.5cm \textwidth 5cm
Kratka na stronie, gdzie jest treść zadania, oraz na następnej stronie:
pl-termodynamika-0020000 "Przemiany gazowe"

gzm insert \\ \begin{tikzpicture} \draw[step=0.5cm,gray!60,thick] (0, 0) grid (\textwidth, 9.5cm); \end{tikzpicture}

gzm grid 0.5cm \textwidth \textheight
Uwaga: wszystko, co jest dodane komendą "insert", pojawi się także w plikach ze wskazówkami i odpowiedziami (ZO, ZWO).
gzm difficulty 2
Modyfikuj przypisaną zadaniu wartość diff (trudność). Parametr: nowa wartość diff zadania. Zapoznaj się z opisem komendy gzm points ZIP 
Komendy, które dotyczą grupy identyfikatorów zadań:
gzm from-group-choose 2
  pl-liczby-0001000 "Śliwki"
  pl-liczby-0002000 "Jabłka"
  pl-liczby-0003000 "Kamyki"
gzm end-group
Wybierz losowo i w losowej kolejności z grupy identyfikatorów zadaną liczbę identyfikatorów (tutaj 2 zadania z 3).  ZIP 
Wygeneruj znacznie więcej wersji zestawu, a potem wybierz te z najlepszym rozkładem tekstu i rysunków.
Komendy specjalne:
gzm comment Cokolwiek tutaj
Komentarz.

Przykłady wyszukiwania zadań pasujących do wyrażenia regularnego. Poniższe komendy można zamieszczać od 8 linii w pliku definującym zestaw zadań (*.gzm). Komenda może być użyta tylko raz. Wyrażenie regularne musi zaczynać się w odstępie dokładnie 1 spacji po komendzie. Należy zadbać, by na końcu wyrażenia nie było zbędnych spacji.

W przypadku użycia dwóch lub trzech komend spośród search-author, search-description, search-id wyszukiwane są zadania spełniające wszystkie warunki.  ZIP 
gzm search-id czas
Wybierz zadania z id zawierającym "czas".
gzm search-id czas|temperat
Wybierz zadania z id zawierającym "czas" lub "temperat".
gzm search-id (?!.*temperatur.*)(^.*$)
Wybierz zadania z id nie zawierającym "temperatur".
gzm search-description [Mm]ars
Wybierz zadania z treścią zawierającą "Mars" lub "mars".
gzm search-description [Pp]olicz|[Pp]rzelicz
Wybierz zadania z treścią zawierającą "Policz" lub "policz", lub "Przelicz", lub "przelicz".
gzm search-description (?!.*Maciek.*)(^.*Jaś.*)
Wybierz zadania z treścią nie zawierającą "Maciek" i zawierającą "Jaś".
gzm search-description (?!.*Maciek.*)(^.*)
Wybierz zadania z treścią nie zawierającą "Maciek".
gzm search-description (?!.*milimetr.*)(^.*metr.*)
Wybierz zadania z treścią nie zawierającą "milimetr" i zawierającą "metr".
gzm search-description (?=.*[Pp]roton)(?=.*[Łł]adunek)
Wybierz zadania z treścią zawierającą równocześnie, w dowolnej kolejności ["proton" lub "Proton"] oraz ["ładunek" lub "Ładunek"]
Ignorowane są identyfikatory zadań wprost wpisane w pliku konfiguracyjnym.
Identyfikatory wybranych zadań wraz z opisem wyrażenia regularnego są zapisywane w pliku z rozszerzeniem .rgx w podkatalogu katalogu Outputs. Możesz tę listę identyfikatorów wykorzystać do ułożenia swojego zestawu.
W Gezmat używane są wyrażenia regularne obsługiwane przez funkcję regex_search z biblioteki regex (C++), zgodnie ze  składnią ECMAScript , z rozróżnianiem wielkości liter.

Wskazówki dla autorów zadań - łatwy start
W katalogu src/ z pliku
pl-createProblemGeneratorMap-problems-include.cxx
skopiuj jedno zadanie do istniejącego pliku
your-problems-include.cxx
W tym pliku edytuj zadanie. W głównym katalogu pakietu:
./gezmat.bash def/pl-prepare-all-problems-config.gzm
I odszukaj swoje zadanie w wyprodukowanych plikach.
Możesz też w katalogu priv-def utworzyć plik podobny do pliku def/pl-sprawdzian_testowy_search-author.gzm, by produkować zestaw tylko z wszystkimi Twoimi zadaniami. Czyli:
cp def/pl-sprawdzian_testowy_search-author.gzm priv-def/pl-Your-Name-all_problems.gzm
Zmień "Nieżurawski" na własne nazwisko, a potem:
./gezmat.bash priv-def/pl-Your-Name-all_problems.gzm

Wskazówki dla autorów zadań - opis funkcji

r(number,...)
// Random integer in:
// [min, max] for n=0
// [min*10^n, max*10^n] for n>0
// r(4,6) returns number in [4, 6]
// r(4,6,2) returns number in [400, 600]
int r(int min, int max, int n=0)
r(vector)
// Random integer from the input vector
// r({0, 3, 7}) returns one of numbers: 0, 3, 7.
int r(vector<int> vec)
s(...)
Tylko liczby jako argumenty:
// Return string corresponding to real/10^n (move period n places to the left)
// For example:
// s(102,2) --> "1.02"
// s(1020,3) --> "1.02"
// s(102) --> "102"
// s(3,2) --> "0.03"
string s(const int number, const int n=0)
Liczba i łańcuchy znakowe jako argumenty:
// Return string depending on the number:
// s(n,"jabłko","jabłka","jabłek"): 1 jabłko, 2-4, 22-24, ... jabłka, pozostałe: n jabłek (np. miał ...)
// s(n,"jabłka","jabłek"): 1 jabłka, pozostałe: n jabłek (np. brakowało ...)
// s(n,"raz","razy"): 1 raz, pozostałe: n razy
string s(const int number, const string formA, const string formB = "", const string formC = "")
Przykład - "Kamyki".

Łańcuchy, liczba i znowu łańcuchy znakowe jako argumenty:
// Return strings depending on the number:
// s("zostało","zostały","zostało",n,"jabłko","jabłka","jabłek"): zostało 1 jabłko; zostały 2-4, 22-24, ... jabłka; pozostałe: zostało n jabłek
string s(const string wordA, const string wordB, const string wordC, const int number, const string formA, const string formB, const string formC)
Przykład - "Śliwki", "Ochładzanie sali".

o(number, numberOfSignificantDigits)
// Function returns int rounded to specified number of significant digits
// Example: o(12332, 2) -> 12000
// Example: o(-12332, 2) -> -12000
// Example: o(1252, 2) -> 1300
// Example: o(-1252, 2) -> -1300
int o(const int number, const int numberOfSignificantDigits)
shuf(vector)
// Return shuffled vector
vector<T> shuf(vector<T> vec)
powInt(k, n)
// Function "power of k to n" returns k^n, only for n>=0.
int powInt(const int k, const int n)
p10(number)
// "power of 10" returns 10^n, for n>=0.
int p10(int n)
itod(number)
// Function returns double from int
// Example: itod(11) --> 11.0
double itod(const int i)
dtoi(number)
// Function returns int from double rounded by std::round()
// Example: dtoi(10.8) --> 11
int dtoi(const double d)
writeContainerElements(Iterator, Iterator)
// Function returns a string with sequence of integers or strings from a container separated by comma, e.g.: 1, 3, 5, 6
string writeContainerElements(Iterator it, const Iterator end, const string separator = ", ", const string flag = "")
in(x, leftBracket, a, rightBracket)
// Function returns LaTeX string of the form: x \in leftbracket a rightbracket, e.g. t \in { 10, 20, ..., 100 }
string in(string x, string leftBracket, string a, string rightBracket)
in(x, leftBracket, a, b, rightBracket)
// Function returns LaTeX string of the form: x \in leftbracket a, b rightbracket, e.g. t \in [ 10, 20 [
string in(string x, string leftBracket, string a, string b, string rightBracket)
W gezmat.cxx w namespace gezmatTools znajdziesz definicje innych przydatnych funkcji i obiektów:
numberToVectorOfStrings
numberLength
tableForOperation
triangleOfNumbers
tableWithTriangleOfNumbers
NumberSnakePicture

Wskazówki dla autorów zadań - dodatkowe opcje kompilatora
By sprawdzić nowe zadanie, uruchom Gezmat z opcją check:
./gezmat.bash def/pl-zbiory.gzm 5 check
lub
./gezmat.bash def/pl-zbiory.gzm 5 pdflatex check
Niezbędne jest podanie liczby wersji zestawu. Opcja ta włącza dodatkowe opcje kompilatora:
-fsanitize=undefined
-fsanitize=integer-divide-by-zero
-fsanitize=float-divide-by-zero
-fsanitize=signed-integer-overflow
-fsanitize=float-cast-overflow
-fsanitize=bounds-strict
-fsanitize=address
-fuse-ld=gold
Kompilacja trwa niestety znacznie dłużej.

Wskazówki dla autorów zadań - skrócenie czasu kompilacji podczas testowania nowego zadania
W pliku
src/gezmat.cxx
w funkcji
void createProblemGeneratorMap ()
zakomentuj linie
#include "pl-createProblemGeneratorMap-problems-include.cxx"
#include "en-createProblemGeneratorMap-problems-include.cxx"
Wtedy kompilowane będą tylko zadania z pliku
src/your-problems-include.cxx

Wskazówki dla autorów rysunków - Asymptote w LaTeX
Zalecam najpierw przygotować oddzielny plik, w którym zdefinowany jest rysunek w języku  Asymptote . Produkcja obrazka zdefinowanego w pliku zderzenie.asy:
asy zderzenie.asy
Powstaje plik w formacie Encapsulated Postscript zderzenie.eps. Po sprawdzeniu, że rysunek jest poprawny, można wkomponować program w Asymptote w zadanie w Gezmacie.

Uwaga! Nie dołączamy gotowych rysunków (plików *.eps itp.) do Gezmata!

Jak wstawić program-rysunek w Gezmacie? Zapoznaj się z następującymi przykładami. Przyjrzyj się też zadaniom, w których znajduje się tekst
\begin{asy}
Jest to początek programu w Asymptote wstawionego w LaTeX.

A oto kilka przykładów rysunków w Asymptote. Zwróć uwagę na zmiany, które należy wprowadzić, wstawiając kod Asymptote w LaTeX - usuwamy linie z "locale", a w przypadku pojedynczych wykresów linie z "size", dopasowujemy rozmiary rysunku.

Wskazówki dla autorów rysunków - Asymptote w LaTeX
Prosty schemat - pocisk i wahadło.
 hit-pendulum.asy 
 hit-pendulum.eps 
 hit-pendulum.tex 
 hit-pendulum.pdf 

Wskazówki dla autorów rysunków - Asymptote w LaTeX
Prosty schemat - równia pochyła i cegła.
 incline-with-box.asy 
 incline-with-box.eps 
 incline-with-box.tex 
 incline-with-box.pdf 

Wskazówki dla autorów rysunków - Asymptote w LaTeX
Prosty wykres x(t).
 graph-simple.asy 
 graph-simple.eps 
 graph-simple.tex 
 graph-simple.pdf 

Wskazówki dla autorów rysunków - Asymptote w LaTeX
Wiele wykresów (wiersze i kolumny) - ilustracja powstawania fali stojącej.
 multiple-sinuses.asy 
 multiple-sinuses.eps 
 multiple-sinuses.tex 
 multiple-sinuses.pdf