Этот репозиторий содержит готовый к использованию шаблон для автоматической генерации экзаменационных билетов в формате PDF на основе данных из CSV-файла.
Шаблон полностью настраивается и поддерживает как двух-, так и трёхвопросные билеты с возможностью указания баллов за каждый вопрос.
Полный PDF-файл: Скачать exam_cards.pdf
Настройки дисциплины (курс, преподаватель, протокол, число вопросов, баллы, файл вопросов) — в tex_form/course.tex; общие настройки (университет, кафедра, заведующий, оформление) — в tex_form/config.tex. Вопросы — в exam_cards/questions.csv (число столбцов = \NumberOfQuestions).
# Установка TeX (macOS)
brew install --cask mactex-no-gui
echo 'export PATH="/Library/TeX/texbin:$PATH"' >> ~/.zshrc
source ~/.zshrc
pdflatex --version
# Сборка (latexmk сам делает нужное число проходов, результат — exam_cards/exam_cards.pdf)
make build
# Очистка промежуточных файлов / полная очистка
make clean
make distcleanБез make (вручную, -halt-on-error останавливает сборку при ошибке валидации из course.tex):
cd tex_form
latexmk -pdf -halt-on-error -interaction=nonstopmode -output-directory=../exam_cards main.tex
mv ../exam_cards/main.pdf ../exam_cards/exam_cards.pdfВопросы берутся из exam_cards/questions.csv (столбцы OneQuestion, TwoQuestion, ThreeQuestion). В тексте вопроса доступны:
- Формулы — встроенная математика:
Найдите \(x^2 = 4\). - Изображения —
\protect\includegraphics[width=3cm]{case1.png}; файлы кладите в каталогimages/(ищутся по имени). - Переносы строк —
\\внутри вопроса (авто-перенос по ширине колонки сохраняется). - Переменное число вопросов — оставьте ячейку пустой (но с запятой), чтобы в билете было меньше вопросов:
"Вопрос 1","Вопрос 2",→ 2 вопроса в билете.
\NumberOfQuestions в course.tex задаёт число столбцов (= максимум вопросов в билете, 1–3); баллы — \OneQuestionMark / \TwoQuestionMark / \ThreeQuestionMark по позиции.
Релизы создаются автоматически по тегу vX.Y.Z (workflow release-from-notes.yml):
# 1. Добавьте секцию ## vX.Y.Z в RELEASE_NOTES.md и закоммитьте
git add RELEASE_NOTES.md && git commit -m "Release notes for v1.3.0"
# 2. Поставьте тег и запушьте
git tag -a v1.3.0 -m "v1.3.0"
git push origin v1.3.0CI соберёт PDF, возьмёт описание из секции ## vX.Y.Z в RELEASE_NOTES.md и создаст GitHub Release с приложенным exam_cards.pdf.
# Удалить ошибочный тег
git tag -d v1.3.0 # локально
git push origin :refs/tags/v1.3.0 # на GitHubДля успешной компиляции шаблона необходимо наличие следующих LaTeX-пакетов:
fontenc,inputenc,babel— поддержка русского языка и кодировокamsmath,amssymb— математические символыgraphicx,tikz— графика и линии оформленияtabularray,makecell,array— расширенные таблицыdatatool— работа с CSV-файламиifthen— условные конструкцииgeometry— настройка полей страницы
├── Makefile # make build / clean / distclean
├── exam_cards
│ ├── exam_cards.pdf
│ └── questions.csv
├── images # картинки для вопросов (\includegraphics)
├── exmpl
│ ├── example.png
│ └── exmpl_exam_cards.pdf
├── LICENSE
├── README.md
├── RELEASE_NOTES.md
└── tex_form
├── config.tex # глобальные настройки + пакеты
├── course.tex # настройки дисциплины + загрузка/валидация CSV
├── main.tex # точка входа (config → course → titlepage → tickets)
├── tickets.tex # генерация билетов из CSV
└── titlepage.tex # титульный лист
| Workflow | Триггер | Действие |
|---|---|---|
ci.yml |
push/PR в develop/main (tex_form/**, questions.csv) |
Сборка PDF; на push — авто-коммит обновлённого exam_cards.pdf обратно в репозиторий |
release-from-notes.yml |
тег vX.Y.Z |
Сборка PDF + GitHub Release с описанием из RELEASE_NOTES.md |
Сборка идёт в TeXLive-образе через xu-cheng/latex-action — отдельная установка LaTeX-пакетов не нужна.
\NumberOfQuestions= максимум вопросов в билете (1, 2 или 3) и должен совпадать с числом столбцов CSV. В конкретном билете вопросов может быть меньше — пустая ячейка пропускается (см. «Содержимое вопросов»). Недопустимое значение или рассинхрон с числом столбцов отлавливаются на этапе компиляции (валидация вcourse.tex).- Все строки CSV — одинаковое число полей: для пустого вопроса оставляйте ячейку пустой, но с запятой (
"Вопрос","",), иначеdatatoolвыдаст ошибку «no element». - CSV без кавычек: если вопросы содержат запятые, используйте другой разделитель (например, точку с запятой) и скорректируйте
\DTLloaddb(требует знания синтаксисаdatatool).
Этот шаблон распространяется по лицензии CC0 1.0 Universal (CC0 1.0) — вы можете свободно использовать, изменять и распространять его в любых целях, включая коммерческие, без необходимости указания авторства.
Примечание: Лицензия не распространяется на имена, названия и другие элементы, заимствованные из произведения братьев Стругацких «Понедельник начинается в субботу». Использование таких элементов допускается исключительно в некоммерческих, образовательных или иллюстративных целях в рамках добросовестного использования (fair use) и с соблюдением авторских прав правообладателей оригинального произведения.