Latex шаблон для диплома

Время на прочтение
11 мин

Количество просмотров 6K

Изначально я хотел рассказать в данной статье про свой шаблон дипломной работы, но таких статей полно, зачем мне делать еще одну? За 3 года работы научным сотрудником в лаборатории МГТУ им. Баумана я много чему научился, в том числе и оформлению своих результатов, как графически, так и в Latex. Поэтому эта статья будет посвящена работе со своим шаблоном дипломной работы, а также будет содержать некоторые полезные советы по оформлению презентации и диплома. Я думаю, что смогу дать некоторые полезные советы, так как много раз представлял результаты своей научной работы на конференциях и имею несколько публикаций в иностранных научных журналах Q1.

Для кого эта статья?

В первую очередь, для студентов, которые решили писать свой диплом в Latex, хотят сделать это хорошо и потратить минимум времени на настройку шаблона под свои требования. Автор подразумевает, что вы уже владеете Latex на минимальном уровне и не будет разбирать всякие мелочи, таких как создание таблиц, добавление новых абзацев и вставка рисунков в Latex. На эти темы существует множество других статей и хороших книг.

Свой шаблон дипломной работы в LaTex

Где-то в феврале я начал задумываться о том, что пора бы уже начать писать диплом. За 3 года работы научным сотрудником у меня накопилось достаточно материала, но необходимо было это все красиво оформить. Так как на протяжении 6 лет обучения я все писал в Latex, вопрос, где же писать свою работу у меня не стоял. Однако такой способ имеет ряд своих сложностей, таких, как правильный шрифт, зачастую это Times New Roman, правильное оформление в соответствии с требованиями нормоконтроля, автоматическое составление списка использованных источников по ГОСТ и много мелких проблем. Естественно, я начал искать шаблоны в интернете, ведь кто-то наверняка все эти вопросы уже решал.

Требования к шаблону у меня были следующие:

  1. Шрифт Times New Roman. Такие требования к оформлению работы были раньше, когда я еще писал бакалаврский диплом.

  2. Автоматическое составление списка литературы по ГОСТ. Это ооочень удобно, при написании работы с большим количеством источников без этого не обойтись.

  3. Использование компилятора pdflatex. Это самый популярный компилятор, для которого уже есть куча работающих пакетов, для него легче всего найти примеры. В нем у меня уже была сделана бакалаврская работа.

  4. Простота в использовании шаблона. Без танцев с бубнами по установке и приведением к требованиям нормоконтроля. В идеале в нем не надо разбираться несколько дней и читать форумы, чтобы начать работать.

Когда я начал искать информацию, с удивлением обнаружил, что шаблонов, которые удовлетворяли бы всем приведенным выше пунктам, просто нет (или я плохо искал). В некоторых не хватало одного из этих пунктов, какие-то были слишком избыточными для написания простой бакалаврской работы. От безысходности мне пришлось начать разработку своего шаблона с нуля, основываясь на своей старой бакалаврской работе.

Собственно, вот на него ссылка.

Фишки моего LaTex шаблона диплома

К плюсам своего шаблона я мог бы отнести следующее:

  1. Шрифт Times New Roman

  2. Автоматическая библиография по ГОСТ (bibtex)

  3. Автоматизированная сборка в Linux и Windows

  4. Автоматическое создание релизов на GitHub

  5. Любое количество собираемых файлов (диплом, презентация и что-либо еще)

  6. Собираемые файлы .tex могут иметь любое имя без пробелов

  7. Автоматическая очистка временных файлов Latex до и после сборки

  8. На компьютере не нужен установленный Latex, вся сборка происходит в контейнере docker

  9. Работа проходит нормоконтроль в программе нормоконтроля TestVKR МГТУ им. Н.Э.Баумана

  10. Используется самый популярный компилятор — pdflatex

И все это без танцев с бубнами. Достаточно установить себе на компьютер docker, и нажать на одну кнопку (Windows) или ввести команду make (Linux). Даже LaTex устанавливать не надо!

Редактировать исходники диплома можно из Visual Studio Code. Рекомендую следующие плагины для него:

  1. streetsidesoftware.code-spell-checker-russian — проверка русского языка

  2. James-Yu.latex-workshop — поддержка LaTex

Все остальные плагины можно поставить на ваше усмотрение.

Подробную инструкцию по установке и структуру шаблона можно найти в README.

Разбор реализации и советы по использованию

Это основной раздел статьи, в котором я подробно разберу, как пользоваться шаблоном, расскажу про реализацию, про проблемы, с которыми мне пришлось столкнуться, а также попутно дам полезные советы по написанию дипломной работы и составлению презентации.

Расчетно-пояснительная записка

Главный файл расчетно-пояснительной записки имеет следующую структуру:

documentclass[
candidate, % тип документа
subf, % подключить и настроить пакет subfig для вложенной нумерации рисунков
times % шрифт Times как основной
]{disser}

renewcommand{rmdefault}{ftm} % Основная строчка, которая позволяет получить шрифт Times New Roman

usepackage[T2A]{fontenc}
usepackage[utf8]{inputenc}
usepackage[english,russian]{babel}
.
.

begin{document}

% Титульник (первая страница файла Title.pdf)
includepdf[pages={1-1}]{additional/Title.pdf}

% Аннотация, Содержание, Введение
input{chapters/introduction.tex}

% Главы
input{chapters/chapter_1.tex}
input{chapters/chapter_2.tex}
.
.

% Библиография
input{chapters/biblio.tex}

% Приложение (у меня пустое)
input{chapters/appendix.tex}

end{document}

Тут находятся все настройки форматирования будущего документа, подключение глав и списка литературы. Пробежимся кратко по тому, на что важно обратить внимание.

Я использую documentclass{disser}, потому что он является одним из самых популярных для такого типа работ, по нему легко найти документацию, и он поддерживается pdflatex.

Следующая строка непосредственно отвечает за то, чтобы после компиляции появился шрифт Times New Roman.

renewcommand{rmdefault}{ftm}

Однако это не будет работать без docker контейнера, в котором установлены шрифты.

Далее, после подключения пакетов, следует подключение глав в проект.

input{chapters/chapter_1.tex}
input{chapters/chapter_2.tex}

Хорошей практикой является разбиение вашего Latex-документа на множество разных файлов. Это улучшает читаемость основного файла с настройками и позволяет легче проводить дебаг, попеременно подключая или отключая главу от проекта. Очень рекомендую делать именно так.

Внутри главы я использую следующие команды:

newpage
begin{center} % центрирование посередине страницы
    textbf{large 1. РОЛЬ ДАЛЬНОДЕЙСТВИЯ ПРИТЯЖЕНИЯ В ПРОСТЫХ ЖИДКОСТЯХ} % Название главы, какое оно будет в тексте
end{center}
refstepcounter{chapter}
addcontentsline{toc}{chapter}{1. РОЛЬ ДАЛЬНОДЕЙСТВИЯ ПРИТЯЖЕНИЯ В ПРОСТЫХ ЖИДКОСТЯХ} % Название главы, какое оно будет в содержании

Тут я дважды пишу название главы, зачем? Одно будет отображено непосредственно в самом тексте, другое — в содержании. Это может быть удобно, если я, например, хочу использовать другой размер шрифта в тексте, в то время, как в содержании шрифт остается тот же. Это увеличивает вариативность написания текста в работе, тем самым помогая соблюсти требования по оформлению.

Что касается написания собственно самого текста, то тут главный совет состоит в том, что каждое предложение должно быть написано на новой строчке в tex файле.

...
Для решения поставленной задачи методом молекулярной динамики были смоделированы системы.
Пост обработка проводилась с использованием MATLAB и python.
...

Какие проблемы это решает? Да очень многие. Во-первых, это позволяет сделать текст более читаемым, во-вторых, если была допущена в какой-то строке ошибка, можно получить номер этой строки, и когда там всего одно предложение, вместо огромного абзаца, это во много раз ускоряет поиск ошибок и их устранение. А еще это играет немаловажную роль в контроле версий. Таким образом, поменяв предложения и применив git diff, вы получите конкретные измененные строки.

Подключение литературы в проект выглядит следующим образом (input{chapters/biblio.tex}):

addcontentsline{toc}{chapter}{СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ} % это будет отображаться в содержании
renewcommand{bibsection}{centeringtextbf{large СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ}} % смена названия библиографии по умолчанию
bibliographystyle{biblio/gost2008n} % файл, задающий формат ссылок по ГОСТ
bibliography{biblio/biblio} % файл с библиографией

Самой полезной строчкой тут является следующая:

renewcommand{bibsection}{centeringtextbf{large СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ}}

Она позволяет заменить стандартное название «Список литературы» на «Список использованных источников», если вдруг ваши требования по оформлению тоже предписывают использовать специальное название, отличное от стандартного. При таком написании не появлялось несколько «списков использованных источников» в содержании, и в содержании размер шрифта этой строки не отличался от всех остальных.

Что касается добавления нового источника литературы и его использования в тексте, тут можно дать несколько хороших советов:

Алгоритм добавления нового источника литературы следующий:

  1. Ищем DOI статьи, которую хотим добавить в список литературы. Это удобно сделать через сайт Google Scholar. Зачастую DOI является частью URL ссылки на работу.

  2. Вставляем DOI на сайте doi2bib.

  3. Полученное содержимое вставляем в файл biblio.bib, заменяя автоматически сгенерированное название на DOI статьи!

Последнее уточнение крайне важное. DOI индивидуальное для каждой статьи, и использование его в качестве имени источника дает уверенность, что вы не добавите дубликат ни в работу, ни в файл с библиографией. Это распространенная практика в научной сфере, которой я рекомендую придерживаться.

В тексте работы сослаться на данный источник можно будет так:

... в работе~cite{DOI} % ~ нужна для того, чтобы номер источника не переносился на следующую строку

Если у работы нет DOI, то все необходимые поля придется заполнить самостоятельно. Тогда вам стоит задуматься, достойна ли эта статья оказаться в вашем списке литературы. Как правило, если у работы нет DOI, она опубликована в журнале «не очень». Если же вы уверены, что ваш источник из хорошего журнала, то вы либо ошибаетесь, либо плохо искали DOI, третьего не дано. Желательно использовать в качестве источников только статьи из англоязычных журналов с рейтингом Q1, Q2, все остальное, как правило, не цитируется в качественных научных работах.

Презентация

С презентацией все проще и сложнее одновременно. С одной стороны, для нее намного скромнее требования в плане оформления, с другой — именно по ней комиссия судит о качестве вашей дипломной работы (никто же не читает дипломы, кроме, дай бог, вашего научного руководителя), поэтому стоит уделить ей особое внимание.

В процессе создания данного шаблона мне не приходилось сталкиваться с какими-то трудностями в создании презентации в Latex, поэтому я не буду вставлять эту часть работы. Презентацию можно найти в самом репозитории. Она интуитивно понятна, скомпилированный пример находится в релизах. Однако я бы хотел дать советы, которые позволят вам составить хорошую презентацию.

Первый совет состоит в следующем: сделать как можно больше красивых и содержательных картинок на каждом слайде вашей презентации. Если вы не знаете какую картинку на данный слайд можно поставить, будьте уверены: он вам не нужен. Лучше мало слайдов, но отточенных до идеала, чем много «сырых».

И самое главное: никогда, НИКОГДА, не вставлять на слайд текст. Единственные слайды, где у вас может быть текст — это постановка задачи и заключение. Исключение — краткие, буквально пару слов, комментарии к формулам или важный небольшой список. Я участвовал на нескольких научных конференциях и замечал, когда на слайде появляется текст, все мгновенно засыпают и перестают слушать. Такую же проблему я наблюдал у множества своих одногруппников на защите.

Помимо этого, хорошим тоном является указание ссылки на источник на слайде, откуда взята информация или картинка. Это будет высоко оценено комиссией.

Вот пример хорошего слайда в презентации:

Если вы раньше не имели опыта создания презентаций, я рекомендую ориентироваться на мою презентацию, которая была представлена на многих научных конференциях.

Сборка

Вся основная магия простоты использования данного шаблона происходит здесь. Одновременно это и самая сложная техническая часть, но в этой сборке ничего не придется менять, она максимально универсальная.

Для сборки диплома и презентации я написал следующий Makefile:

LATEX_COMPILER = pdflatex
LATEX_COMPILER_FLAGS = -interaction=nonstopmode
BIBLIO_COMPILER = bibtex
BIBLIO_COMPILER_FLAGS = 

RM = rm -f
TEMPORARY_FILES = *.out *.aux *.blg *.bbl *.toc *.nav *.snm
LOG_FILES = *.log

DOCKER_RUN = docker run
DOCKER_FLAGS = --rm -i -v "${PWD}":/diplom:Z
DOCKER_IMAGE = 2109199812/docker-latex
DOCKER_COMMAND = bash -c "make release"

FILES_TO_BUILD := $(shell find "${PWD}" -maxdepth 1 -name '*.tex' -printf "%fn" | sed -r "s/(.*).tex/1.pdf/g")

.PHONY: all release clean_before_build clean_after_build

all:
	$(DOCKER_RUN) $(DOCKER_FLAGS) $(DOCKER_IMAGE) $(DOCKER_COMMAND)

release: clean_before_build $(FILES_TO_BUILD) clean_after_build

%.pdf: %.tex
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*
	@if grep -r "citation{.*}" $*.aux; then 
		$(BIBLIO_COMPILER) $(BIBLIO_COMPILER_FLAGS) $*; 
	fi
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*

clean_before_build:
	$(RM) $(FILES_TO_BUILD) $(LOG_FILES) $(TEMPORARY_FILES)

clean_after_build:
	$(RM) $(TEMPORARY_FILES)

Давайте разберемся, что он делает. С объявлением переменных все понятно, начнем со следующих строк:

all:
	$(DOCKER_RUN) $(DOCKER_FLAGS) $(DOCKER_IMAGE) $(DOCKER_COMMAND)

Аналогичная точка входа на Windows в файле makewin.bat выглядит так:

@echo off
SETLOCAL
docker run --rm -i -v "%cd%":/diplom:Z 2109199812/docker-latex bash -c "make release"
pause
ENDLOCAL

Это точка входа в мою сборку диплома и презентации, тут запускается docker контейнер, в котором происходит вся компиляция проекта.

Зачем мне вообще был нужен docker? Не является ли это лишним? Все дело в том, что в нем и происходит выбор шрифта Times New Roman. Получить этот шрифт с помощью компилятора pdflatex в своем дипломе было самой большой проблемой, решение которой заняло у меня около месяца. Он довольно тяжело устанавливается, даже если знать, что для этого нужно делать. Например на Windows у меня вообще не получилось это сделать (без docker). Поэтому я считаю, что было просто необходимо сделать из этого контейнер, чтобы зафиксировать рабочую настройку системы. Кроме этого, у такого подхода есть множество других плюсов: вам не нужно ничего настраивать, чтобы у вас появился этот шрифт, как на Linux, так и на Windows (кроме установки docker, но это не сравнится с теми танцами с бубнами, через которые я прошел, когда делал шрифт).

Следующие строки Makefile выполняются уже непосредственно в docker:

release: clean_before_build $(FILES_TO_BUILD) clean_after_build

Тут выполняется 3 этапа:

  1. Очистка до сборки. Из основной директории удаляются файлы pdf (а также их log файлы), которые имеют такое же название как файлы .tex. На случай, если вы допустили ошибку, и у вас не скомпилировались до конца ваши файлы, но остались временные, предусмотрена и их очистка тоже, потому что зачастую бывает так, что в новой итерации сборки используются старые сгенерированные файлы, в которых есть ошибка, и пока вы их не удалите, вы будете получать ошибки компиляции совершенно правильного документа!

  2. Далее происходит сборка самих файлов, о ней я подробнее расскажу далее.

  3. Еще раз очистка временных файлов.

Как происходит, собственно, сама сборка документов:

%.pdf: %.tex
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*
	@if grep -r "citation{.*}" $*.aux; then 
		$(BIBLIO_COMPILER) $(BIBLIO_COMPILER_FLAGS) $*; 
	fi
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*
	$(LATEX_COMPILER) $(LATEX_COMPILER_FLAGS) $*

Над этой частью тоже пришлось немного помучиться. Вся сложность в условной компиляции списка литературы. Дело в том, что я хотел сделать универсальный Makefile, который будет компилировать файлы с любым именем .tex в основной директории. Однако сложность возникает, если в одном из файлов есть список литературы, а в другом нет. Если вызывать компилятор bibtex для файла, в котором нет цитирований, то он будет выдавать ошибки, и, к сожалению, у него даже нет ключа, который позволил бы этого избежать. Поэтому пришлось провести некоторую исследовательскую работу по поиску отличий временных файлов для диплома и презентации (в которой нет цитирований), и мне удалось найти, что в aux файлах для документа с цитированием присутствуют записи в таком формате "citation{DOI}". Использование grep идеально подходит для решения данной проблемы с условной компиляцией.

Создание релизов

При работе с данным шаблоном я рекомендую активно использовать git и GitHub (но это не является обязательным). Во-первых, вы можете эффективно отслеживать свои изменения и работать в команде со своим научным руководителем, которому можно отправлять на ревью свою работу, а во-вторых, в данном шаблоне предусмотрено создание релизов по пушу тега вида v*. Что это дает? Вы можете не индексировать свои скомпилированные файлы, а хранить их в релизах, это очень удобно, особенно, если они большие. По этой причине вы не найдете в моем репозитории скомпилированные файлы, они добавляются только в релиз, когда я считаю, что изменений в них достаточно, чтобы сделать новую версию.

Как этим пользоваться?

Оставлю тут краткую инструкцию для тех, кто не работал с git:

git add .
git commit -m "your comment"
git push
git tag -a v0.1 -m "your comment"
git push --tags

Вам не нужно ничего предварительно настраивать (разве что token GitHub, который должен иметь разрешение actions), необходимый скрипт уже лежит в скрытой папке github/workflows/main.yml.

Скрипт для GitHub Actions выглядит следующим образом:

name: Create_Thesis

on:
  push:
    tags:
      - 'v*'

jobs:
  build:
    runs-on: ubuntu-latest
    container:
        image: docker.io/2109199812/docker-latex:latest
    steps:
      - uses: actions/checkout@v3

      - name: Compile Thesis
        shell: bash
        run: make release

      - name: Rename release file
        shell: bash
        run: |
          for filename in $(find "$(pwd)" -maxdepth 1 -name '*.tex' -printf "%fn" | sed -r "s/(.*).tex/1/g"); do mv ${filename}.pdf ${filename}-${GITHUB_REF#refs/*/}.pdf; done
      
      - name: Release
        uses: softprops/action-gh-release@v1
        with:
          files: |
            *-v*.pdf

Можно заметить, что он довольно простой. Здесь происходит скачивание моего docker контейнера, который опубликован на DockerHub, запуск make release, переименование сгенерированных pdf файлов, которые имеют такое же название как файлы .tex в основной директории (к ним добавляется номер версии), и добавление их в релиз.

Заключение

Соответствует ли этот шаблон ГОСТ?

Он соотвествует требованиям моего вуза и программы TestVKR, которую используют в МГТУ им. Баумана для проверки правильности оформления работы. Однако, так как здесь используется самый популярный компилятор pdflatex, подключить нужные пакеты и настроить свой шаблон под ваши требования не составит труда.

Я надеюсь, что данный шаблон поможет большому количеству людей, кто решил писать свой диплом в Latex.

build
downloads
release

Latex шаблон диплома и презентации МГТУ им. Баумана (Latex BMSTU diploma and presentation template)

Выпускная квалификационная работа магистра, оформленная в Latex. Ее можно использовать как шаблон.
Она включает в себя шрифт Times New Roman и автоматическое создание библиографии по ГОСТ 2008.
Проходит Бауманскую программу нормоконтроля TestVKR. Подходит для бакалаврских работ.

! Пример скомпилированных файлов можно найти в релизах !

Статья про написание диплома и использование данного шаблона

Достоинства шаблона

  1. Шрифт Times New Roman
  2. Автоматическая библиография по ГОСТ (bibtex)
  3. Автоматизированная сборка в Linux и Windows
  4. Автоматическое создание релизов на GitHub
  5. Любое количество собираемых файлов (диплом, презентация и что либо еще)
  6. Собираемые файлы .tex могут иметь любое имя без пробелов
  7. Автоматическая очистка временных файлов Latex до и после сборки
  8. На компьютере не нужен установленный Latex, вся сборка происходит в контейнере docker
  9. Диплом проходит нормоконтроль в Бауманской программе TestVKR
  10. Используется самый популярный компилятор — pdflatex

Использование как шаблон

Клонировать данный репозиторий в свой GitHub можно используя кнопку Fork, после чего данный репозиорий появится в ваших репозиториях и его можно будет менять.

Структура шаблона

.
├── extra
│   └── ваши дополнительные файлы
│
├── biblio
│   └── библиография
│
├── chapters
│   └── подключаемые главы
│
├── settings
│   └── преамбула с настройками
│
├── images
│   └── используемые картинки
│
├── install
│   └── скрипт установшик для linux
│
├── diploma.tex
│   └── главный файл диплома
│
├── presentation.tex
│   └── презентация
│
└── makewin.bat
    └── скрипт компиляции для Windows

Сборка в Arch Linux

Рекомендуется собирать этот шаблон в Arch Linux, однако без особых проблем получится собрать его и в Windows.

Для установки и настройки всего необходимого надо запустить скрипт install.sh в папке install.
Возможно понадобится перезагрузить компьютер, или отдельно выполнить команды в этом скрипте еще раз.

После чего можно собирать диплом и презентацию командой

Собрать что то одно можно так:

make diploma
make presentation

Сборка под Windows

  • Установить Docker

После установки Docker надо перезапустить компьютер (он предложит сам).
Затем, если он сразу не заработает, следовать его инструкциям, он предложить выполнить следующие шаги.
При выборе дистрибутива Linux выбрать Ubuntu 22.04 LTS.
Далее следовать иструкциям установки Ubuntu.
После этих шагов Docker должен заработать.

Теперь можно собирать полный диплом и презентацию как они задуманы, для этого необходимо запустить скрипт makewin.bat.
Это можно сделать в консоли или просто два раза нажать на makewin мышкой.

Первый запуск будет довольно долгий, потому что будет скачиваться контейнер весом около 4гб.

Если вы хотите собирать что-то одно (диплом или презентацию), вы можете временно переместить другой tex файл в папку extra или раскомментировать нужные строки в makewin.bat.

Создание релиза

Создание релиза происходит на Github в специальном контейнере Docker по пушу тега вида v*.

Пример создания релиза:

git add .
git commit -m "your comment"
git push
git tag -a v0.1 -m "your comment"
git push --tags

Автоматически запустится процесс GitHub Actions, который закончится примерно через 2-3 минуты. Его можно наблюдать во вкладке Actions в репозитории.
После этого справа в рпозитории появится релиз содержащий диплом со шрифтом times new roman и презентация.

Для запуска GitHub actions и автоматического создания релиза необходимы дополниетльные разрешения для токена и репозитория, смотрите документацию на этот проект.

Работа с библиографией

Для автоматической компиляции библиографии используется специальный файл .bib (biblio/biblio.bib), в который необходимо добавлять свои источники в нужном формате.

Рекомендую удалить все содержимое файла biblio.bib и добавлять по одному свои источники, так как при случайном добавлении дубликата bibtex будет выдавать ошибки.

Добавлена утилита на python для очистки списка литературы от неиспользуемых источников. Она находится в папке biblio.

Для ее запуска воспользуйтей следующей командой в терминале, отрытом в папке с библиографией:

python rm_extra_bib_items.py

Программа ищет цитирования во всех файлах .tex в папке chapters, и нужные источники из файла bibliography.bib сохраняет в новый файл с названием bibliography.bib.new.

Программа не убирает дубликаты источников. Для избежания дубликатов для ID источника нужно использовать DOI. Как это делать написано далее.

Алгоритм добавления нового литературного источника

DOI — цифровой идентификатор объекта (digital object identifier). Используется для однозначного идентифицирования статьи. Кроме того, статья может находится на сайтах с разными именами, но ссылка https://doi.org/{DOI} будет всегда указывать на нее.

  1. Ищем DOI статьи, которую хотим добавить в список литературы. Удобно делать это через сайт Google Scholar. Зачастую это бывает часть URL ссылки на работу.
  2. Вставляем DOI на сайте doi2bib.
  3. Полученое содержимое вставляем в файл biblio.bib, заменяя автоматически сгенерированное название на DOI статьи (это распространенная практика в научной сфере, так вы не добавите случайно дубликат в вашу работу под разными именами).

В тексте работы сослаться на данный источник можно будет так:

Если у работы нету DOI, то все необходимые поля придется заполнить самостоятельно (если у работы нету DOI, лучше ее вообще не использовать, это, как правило, плохие работы, которые не публикуются в нормальных местах).

Возможные проблемы

Странные, непонятно откуда взявшиеся символы могут появиться перед списком литературы.
Это может случится, если картинка будет последней в главе, а за ней не будет никакого текста (или картинка слишком большая, просто уменьшите ее).
Пофиксить это скорее всего не представляется возможным, стоит этого просто избегать.

От автора

По возможностям улучшениям шаблона пишите на почту или создавайте pull request.

Почта: dmitryuk.nikita@gmail.com

Шаблон LaTeX для текста ВКР — это набор файлов для подготовки текста ВКР с использованием системы верстки документов TeX и пакета LaTeX. В шаблоне настроены основные параметры страницы, абзаца, заголовков в соответствии с требованиями, предъявляемыми к оформлению текста ВКР. Для каждого раздела ВКР (титульный лист, введение, главы, заключение) созданы отдельные файлы. Для того чтобы была возможность использовать шрифт с гарнитурой Times New Roman необходимо установить дополнительный пакет pscyr. Его работа протестирована с компилятором MikTeX.

В данный момент в шаблоне отсутствует пример подготовки списка литературы. Пример будет добавлен в ближайшее время.

  Скачать файл шаблона — latex-template.zip

  Скачать пакет pscyr

18.03.2011

Настал момент, когда мне потребовалось писать дипломный проект в университете. Естественным требованием было соблюдение ГОСТ при оформлении. Word был отметён сразу, т.к. я обычно работаю в Linux. OpenOffice.org/LibreOffice несмотря на то, что были удобнее, тоже не совсем устраивали. Для написания диплома выбрал LaTeX. Опыта работы с ним было довольно мало (делал всего одну контрольную в нём). Но не смотря на сжатые сроки я всё-таки решился набирать диплом именно в нём. Для всех желающих приведу сборник рецептов для написания диплома.

Шаблон документа ЕСКД

Первое, что пришлось найти — шаблон, соответствующий ГОСТам. Был выбран eskdx, имеющийся в составе TeX-Live. Создаём шаблон нашего будущего документа:

documentclass[russian,utf8,floatsection,equationsection]{eskdtext}
% Объявляем документ класса eskdtext (подробнее можно узнать из описания пакета eskdx)
% russian - текст на русском языке, utf8 - кодировка документа UTF-8
% floatsection - нумерация таблиц и рисунков с учётом номера главы, equationsection - то же для формул
usepackage{longtable} % В документе используем пакет longtable для создания таблиц
usepackage{graphicx} % Используем графику в документе

usepackage{mathtext} % Русские буквы в формулах
usepackage[T2A]{fontenc}

ESKDdocName{Проект сети широкополосного доступа на базе FTTH в г. Тавда}
ESKDsignature{ДИПЛОМНЫЙ ПРОЕКТ}

ESKDdepartment{
Государственное образовательное учреждение высшего профессионального образования
}
ESKDcompany{
<<Сибирский государственный университет телекоммуникаций и информатики>>

(ГОУ ВПО <<СибГУТИ>>)
}
ESKDauthor{Федотов~С.,А.} % "Разраб." в штампе на листе содержания
ESKDchecker{Иванов И.И.} % "Пров."  в штампе на листе содержания
ESKDnormContr{Петров П.П.} % "Н. контр." в штампе на листе содержания
ESKDapprovedBy{Сидоров С.С.}% "Увт." в штампе на листе содержания
ESKDdate{2011/01/17} % Дата (Год отображается на титульной странице)
ESKDsignature{ФЗО 210406.052 ПЗ} % Шифр
ESKDletter{}{У}{} % Литеры

renewcommand{ESKDtheTitleFieldX}{
Новосибирск

ESKDtheYear~г.} % Шаблон для отображения в нижней части титульного листа города и года

ESKDtitleApprovedBy{Зав. Кафедрой}{Лебедянцев В.В.} % Утверждаю
ESKDtitleDesignedBy{Дипломник}{Федотов С.А.} % Подпись и дата под заголовком документа

renewcommand{baselinestretch}{1} % Задаём единичный межстрочный интервал

ESKDsectStyle{section}{normalsize} % Заголовки глав обычным шрифтом
ESKDsectStyle{subsection}{normalsize} % Заголовки разделов обычным шрифтом
ESKDsectStyle{subsubsection}{normalsize} % Заголовки подразделов обычным шрифтом

begin{document} % Маркер начала документа
maketitle % Создать титульный лист на основе данных в заголовке документа
tableofcontents % Создать содержание документа (потребуется дважды сформировать документ для того,
% чтобы номера страниц сформировались правильно)
newpage % Начать следующий раздел с новой страницы
section{Введение} % Первая глава - "Введение"
% Содержание документа
Это демонстрационный документ. Чтобы начать следующий абзац необходимо
вставить пустую строку.

Этот текст будет уже в следующем абзаце.
end{document} % Маркер завершения документа

После сборки документа мы получаем готовый документ, содержащий 3 страницы: титульный лист, содержание и лист с заголовком “Введение”. Следует обратить внимание на то, чтобы все ссылки в документе и страницы в содержании были правильными документ нужно собирать дважды. При первом проходе в служебные файлы записываются все необходимые данные для ссылок. После второго прохода имеем готовый документ.

Создание списков

Приведу пример маркированного списка:

begin{itemize}
item микро сеть SDH (Micro SDH);
item активные сети Ethernet (Active Ethernet, AE);
item пассивные оптические сети (Passeve Optical Network, PON).
end{itemize}

Нумерованные списки делаются так же просто

begin{enumerate}
item уровень --- сплиттеры 1x2, оконеченные разъемами SC в проектируемом оптическом кроссе ODF ТТ-120 на ОПТС-5.
item уровень --- сплиттеры 1x32, в проектируемых оптических шкафах типа ШКОН, устанавливаемых в подъездах жилых домов.
end{enumerate}

Вставка рисунков

Вставить рисунки в текст можно следующим образом:

begin{figure}[h!]
center{includegraphics[width=0.8linewidth]{mini-breacout}}
caption{Кабель MINI-BREACOUT}
label{ris:mini-breacout}
end{figure}

Вставка рисунка

Рисунок должен находиться в папке с документом tex и назваться так, как указано в строке 1: mini-breacout.png или mini-breacout.jpg. Размер рисунка можно изменять с помощью параметра width, в данном случае его ширина будет равна 0,8 от ширины строки документа. Рисунок будет размещён по центру и ему будет присвоен номер (в соответствии с заданным в заголовке документа параметром он будет содержать номер главы и номер рисунка в главе). Название рисунка задаётся в параметре caption. Ссылаться на номер документа можно по имени ris:mini-breacout, который задан в параметре label.

TeX-Live пытается разместить рисунки сверху страницы. Иногда может оказаться неудобным, что рисунок будет размещён на следующей странице. Изменить это можно перемещая данный код вверх по абзацам.

Если вы желаете разместить рисунок на отдельном листе, то достаточно убрать параметр [h!].

Иногда рисунки могут быть очень широкими и их выгодно будет размещать с поворотом на 90 градусов относительно листа. Сделать это можно следующим образом:

begin{sidewaysfigure}
center{includegraphics[width=0.8linewidth]{vnutridom}}
caption{Внутридомовая разводка ВОК}
label{ris:vnutridom}
end{sidewaysfigure}

Рисунок в поворотом на 90 градусов

Параметры рисунка остаются теми же самыми. Рисунок в данном случае будет размещён на отдельном листе.

Вставка формул

Вставить в текст нумерованную формулу с расшифровкой входящих в неё параметров можно следующим образом:

begin{equation}label{eq:Pobsh}
P_{общ}=P_{затух} + P_S + P_C + P_З + P_P
end{equation}
% Далее идёт расшифровка параметров, входящих в формулу
begin{ESKDexplanation}
item где $P_{общ}$ --- общие потери в линиях связи;
item $P_{затух}$ --- полное затухание в оптическом волокне;
item $P_S$ --- полные потери в сростках;
item $P_C$ --- полные потери в соединителях;
item $P_З$ --- потери в разветвителях волокон;
item $P_P$ --- потери на эксплуатационный запас.
end{ESKDexplanation}

Формула с нумерацией

Блок “ESKDexplanation” представляет из себя простой список без маркеров и нумерации. Как вы наверно обратили внимание, вставить формулу в текст можно просто выделив знаками $ с обоих сторон.

Для того, чтобы вставить в текст расчёты (формулы без нумерации) их необходимо оформить следующим образом:

$$
I_{сумм} = I_{пр} + I_{сущ} + I_{зб} = 3,15 + 10 + 18 = 31,15 А
$$

Формула без нумерации

Вставка таблиц

Таблицы в LaTeX наверное одни из самых сложных вещей. Для таблиц существует несколько готовых пакетов: tabular, tabularx, longtable. Я остановил свой выбор на longtable, т.к. он позволяет создавать многостраничные таблицы.

begin{longtable}{|p{8,5cm}|p{4cm}|p{4cm}|} % описываем 3 столбца таблицы с выравниванием по ширине и указанной ширины
% Вертикальная черта означает, что между полями должна быть вертикальная черта - разделитель
% Заголовок таблицы на первой странице:
caption{Исходные данные по работе <<Проект сети широкополосного доступа на базе FTTH>>label{tab:econ_effect}}\
hline % Вставляем горизонтальную линию
Наименование показателей & Единица измерения & Значение показателей \
hline
endfirsthead % Всё, что расположено выше считается заголовком таблицы и отображается на первой странице
% Для второй и последующих страниц подменяем наименование таблицы в соответствии с требованиями:
caption*{Продолжение таблицы ref{tab:econ_effect}}\
hline
Наименование показателей & Единица измерения & Значение показателей \
endhead % Всё что выше будет вставляться как заголовок на 2 и последующих страницах
hline
1 Объем услуг & & \ % Содержимое ячеек разделяется знаком &, завершение строки таблицы \
hline
Сеть доступа: & абонентов & 384 \
hline
В том числе: & & \
hline
юридические лица & абонентов & 38 \
hline
физические лица & абонентов & 346 \
hline
Доля физических лиц & & \
hline
Пакет №1 (высокоскоростной Интернет) & % & 65 \
hline
Пакет №2 (Интернет + IP TV) & % & 22 \
hline
Пакет №3 (Интернет + IP TV + VoD) & % & 13 \
hline
Доля юридических лиц & & \
hline
Пакет №1 (Интернет) & % & 69 \
hline
Пакет №2 (IP VPN) & % & 31 \
hline
end{longtable}

Таблицы

Приложения

Для вставки приложений в документ шаблон eskdx имеет специальное ключевое слово ESKDappendix.

ESKDappendix{справочное}{Шкаф ТТ-120label{app:tt120}}

Приложения

Параметры указывают на тип приложения (в данном случае это справочное приложение) и его название. Кроме этого можно добавить метку для того, чтобы можно было в тексте сделать ссылку на приложение.

При использовании ESKDappendix вместо стандартного для LaTeX appendix ссылки на приложения в содержании создаются корректно:

Приложение в содержании

Создание списка литературы

Для создания списка литературы используется окружение thebibliography:

begin{thebibliography}{00} % 00 влияет на выравнивание номеров записей в списке литературы.
bibitem{bashilov} Башилов Г. Пассивные оптические сети: возможности и перспективы// GIO. - 2004. - № 12. - с. 2
bibitem{bykov} Быков Ю.П., Егунов М.М., Ромашова Т.И. Справочные материалы по курсовому и дипломному проектированию. Справочное пособие. Новосибирск: СибГУТИ, 2001 г
bibitem{eskd} Вайспапир В.Я., Катунин Г.П., Мефодьева Г.Д. Единая система конструкторской документации в студенческих работах
bibitem{nec-neva} Описание оборудования фирмы «NEC-Нева»
bibitem{optic} Оптические сети доступа. Teletekno, 2006 № 2.- с. 25; № 3.- с. 21
bibitem{petrenko} Петренко И.И., Убайдуллаев Р.Р. Пассивные оптические сети PON// Lightwave Russian Edition.- 2004.- № 1.- с. 22;
bibitem{connect_ru} www.connect.ru PON:многообещающая пассивность
bibitem{deps_ua} http://www.deps.ua/
bibitem{gbk_ru} http://www.gbk.ru/
bibitem{pon_cnews} http://retail.cnews.ru/reviews/free/telecom2004/part2/topology.shtml
end{thebibliography}

Список литературы


Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.


Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово на сервисе Boosty или любой суммой через сервис QIWI.


Хотел бы создать такую тему, чтобы в будущем студентам, верстающим диплом в TeX было проще с этим делом. Предлагаю такой формат (не знаю, насколько он будет поддержан модераторами) — в первом сообщении темы я буду держать (и постоянно обновлять с учетом поступающих замечаний) преамбулу + описание основных особенностей оформления, а далее будет идти обсуждение и ответы на вопросы.

Есть в интернете серия статей на этот счет — от Сурового Челябинского Программиста и в Записках Дебианщика, но уж какие-то они сумбурные и суровые. Мне не хочется повторять их труд, поэтому скажем так — с введением в LaTeX знакомимся по соответствующей литературе, а готовый шаблон для адаптации под себя можно будет взять тут.

Итак, код комментирован, поэтому всё итак должно быть более ли менее понятно. Специфика:

% $Id: diploma.tex 90 2009-06-11 12:51:46Z zyv $

% The extsizes classes and class options provide support for sizes eight, nine,
% ten, eleven, twelve, fourteen, seventeen and twenty points.
% http://www.ctan.org/tex-archive/macros/ … /extsizes/
documentclass[a4paper,14pt]{extarticle}

% PDF search & cut’n’paste
usepackage{cmap}

% Better sans-serif fonts
usepackage{pscyr}
renewcommand{rmdefault}{cmr}
renewcommand{sfdefault}{ftx}
renewcommand{ttdefault}{cmtt}

% Cyrillic support
usepackage{mathtext}
usepackage[T2A]{fontenc}
DeclareSymbolFont{T2Aletters}{T2A}{cmr}{m}{it}
usepackage[utf8]{inputenc}

% Also be sure to add
%
% english hyphen
% ruseng ruenhyph
% =russian
%
% to ~/.texlive2008/texmf-var/tex/generic/config/language.dat

usepackage[english,russian]{babel}

% AMS font faces
usepackage{amsmath, amsfonts, amssymb}

% Support for the upright and bold greek letters
usepackage{bm}
usepackage[Symbolsmallscale]{upgreek}
makeatletter
        newcommand{bfgreek}[1]{bm{@nameuse{up#1}}}
makeatother

% Detect whether PDFLaTeX is in use
usepackage{ifpdf}

% Graphics
ifpdf
        usepackage[pdftex]{graphicx}
else
        usepackage{graphicx}
fi

graphicspath{{images/}}

% Indent the first paragraph as well
usepackage{indentfirst}

% According to GOST, sections should be called chapters in diploma
usepackage{titlesec}

setcounter{tocdepth}{2}

titleformat{section}[block]{bfserieslargesffamilyraggedright}
        {Глава~Roman{section}.}{1ex}{}
titleformat{subsection}[block]{bfseriesnormalsizesffamilyraggedright}
        {arabic{section}.arabic{subsection}.}{1ex}{}
titleformat{subsubsection}[block]{normalsizesffamilyraggedright}
        {arabic{section}.arabic{subsection}.arabic{subsubsection}.}{1ex}{}

titlespacing*{section}      {0pt}{3.50ex plus 1ex minus .2ex}{2.3ex plus .2ex}
titlespacing*{subsection}   {0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
titlespacing*{subsubsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}

usepackage[titles]{tocloft}

renewcommand{cftsecpresnum}{Глава~}
renewcommand{cftsecleader}{bfseriescftdotfill{cftdotsep}}
renewcommand{cftsecaftersnum}{.}
renewcommand{cftsubsecaftersnum}{.}

newlength{zyvseclen}
settowidth{zyvseclen}{bfseriescftsecpresnumcftsecaftersnum}
addtolength{zyvseclen}{2mm}
addtolength{cftsecnumwidth}{zyvseclen}

renewcommand{thesection}{Roman{section}}
renewcommand{thesubsection}{arabic{section}.arabic{subsection}}
renewcommand{thesubsubsection}
        {arabic{section}.arabic{subsection}.arabic{subsubsection}}

% Page numbering at the right topmost part of the page
pagestyle{myheadings}

% Provides support for setting the spacing between lines in a document. Package
% options include singlespacing, onehalfspacing, and doublespacing.
% http://www.ctan.org/tex-archive/macros/ … /setspace/
usepackage{setspace}

% Alternative geometry
usepackage[top=2cm, bottom=2cm, left=3cm, right=1cm]{geometry}

% Hyperlinks
ifpdf
        usepackage[pdftex]{hyperref}
else
        usepackage{hyperref}
fi

hypersetup{
        unicode=true,
        pdftitle={
        },
        pdfauthor={},
        pdfkeywords={
        },
        colorlinks,
        citecolor=black,
        filecolor=black,
        linkcolor=black,
        urlcolor=blue
}

% Fix links to floats
usepackage[all]{hypcap}

% Nice citations [1,2,3,4] -> [1-4]
usepackage[numbers,sort&compress]{natbib}

% [1] -> 1. in the bibliography
makeatletter
renewcommand@biblabel[1]{#1.}
makeatother

% Russian-styled figure and table captions
usepackage[labelsep=period]{caption}

% Here we define the relationships for the counters: normaly we should
% reset the eq, figure & table counters every chapter
makeatletter
@addtoreset{equation}{section} % Equation counter
@addtoreset{figure}{section} % Figure counter
@addtoreset{table}{section} % Table counter
makeatother

renewcommand{theequation}{arabic{section}.arabic{equation}}
renewcommand{thefigure}{arabic{section}.arabic{figure}}
renewcommand{thetable}{arabic{section}.arabic{table}}

% Keeps floats `in their place’, preventing them from floating past a
% «FloatBarrier» command into another section.  The floats should not move
% past every «section».
usepackage[section]{placeins}

% Compressed lists: compactitem etc.
usepackage{paralist}

% Useful for individually placing figures on a separate page with
% afterpage{clearpage begin{figure}[p] … }
usepackage{afterpage}

% Allow landscape pages for graphics, call like:
%
%       afterpage{clearpage
%       begin{landscape}
%       begin{figure}[p]
%       …
%       end{figure}
%       end{landscape}
%       }
ifpdf
        usepackage{pdflscape}
else
        usepackage{lscape}
fi

% This declaration makes TeX less fussy about line breaking. This can
% prevent overfull boxes, but may leave too much space between words.
% As this really isn’t a fine art typography, we’ll turn it on, so
% we won’t have paragraphs which spans on the margins…
sloppy

begin{document}

% ——————————————————————————
% Обложка
include{diploma-title}

% ——————————————————————————
% Оглавление
tableofcontents

% ——————————————————————————
% Текст работы
begin{onehalfspacing}
        include{diploma-intro}
        include{diploma-ch01}
        include{diploma-ch02}
        include{diploma-ch03}
        include{diploma-conclusion}
        include{diploma-safety}
end{onehalfspacing}

% ——————————————————————————
% Список литературы
phantomsection
renewcommand{refname}{Список литературы}
addcontentsline{toc}{section}{Список литературы}

bibliographystyle{gost780u}
bibliography{biblio/diploma}

end{document}

% $Id: diploma-title.tex 52 2009-06-04 09:46:14Z zyv $

thispagestyle{empty}

begin{center}

        textsc{Федеральное агентство по образованию}\[0.2cm]

        textsc{Государственное образовательное учреждение высшего
профессионального образования \ <<Иракский государственный университет
им.~Д.В.~Буша>>}\[0.7cm]

        Арбузолитейный факультет\[0.5cm]

        Специальность <<Фундаментальный исламизм и физическая
софистика>>\[0.7cm]

        Кафедра общей демократии\[0.7cm]

        textsc{Дипломная работа}\[0.7cm]

        begin{large}
                textsc{textbf{Восстановление архитектуры разрушенных
городов по многобахчевым дынным полям методом всеобщего голосования}}
        end{large}

end{center}

vspace{0.7cm}

textit{<<К защите допущен>>:}

begin{center}
        begin{tabular}{ll}
                Зав. кафедрой общей демократии, \
                профессор, д.ф.-м.н. &
                        begin{tabular}{ll}
                                underline{phantom{Четкая подпись}} &
                                Иванов И.И.
                        end{tabular}
        \[0.7cm]
                Научный руководитель, \
                профессор, в.н.с. ЁКЛ ЭМЭН,\
                д.ф.-м.н. &
                        begin{tabular}{ll}
                                underline{phantom{Четкая подпись}} &
                                Петров П.П.
                        end{tabular}
        \[0.7cm]
                Рецензент, \
                зав. лаб. ЖЗ ИКЛ,\
                д.ф.-м.н. &
                        begin{tabular}{ll}
                                underline{phantom{Четкая подпись}} &
                                Сидоров С.С.
                        end{tabular}
        \[0.7cm]
                Консультант по технике\
                безопасности, ассистент\
                каф. софистики &
                        begin{tabular}{ll}
                                underline{phantom{Четкая подпись}} &
                                Рейсфейдер Р.Р.
                        end{tabular}
        \[0.7cm]
        Дипломник &
                        begin{tabular}{ll}
                                underline{phantom{Четкая подпись}} &
                                Ватманн В.В.
                        end{tabular}
        end{tabular}

        vspace{1.5cm}

        г. Анкара, 2009

end{center}

Для тех, кто хочет примерно представлять как оформляется титульный лист диплома в LaTeX

Мой подробный самоучитель по верстке в LaTeX находится
здесь

Пример 1

begin{titlepage}
newpage
begin{center}
{bfseries Министерство образования и науки Российской Федерации \
Санкт-Петербургский государственный университет}
vspace{1cm}
%САНКТ-ПЕТЕРБУРГСКИЙ \*
%ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ \*
%hrulefill
%end{center}

%{КАФЕДРА ЯДЕРНОЙ ФИЗИКИ }
Кафедра ядерной физики
vspace{6em}



%vspace{2.0em}

%begin{center}
AndreyOlegovich.ru \
end{center}

vspace{1.2em}

begin{center}
%textsc{textbf{}}
Large Подробное описание сайта linebreak
AndreyOlegovich.ru
end{center}

vspace{5em}

begin{center}
%Large
магистерская диссертация
end{center}
vspace{6em}

%begin{center}
%begin{tabbing}
%begin{center}
%quad=Научный руководитель \
%>д.ф.м.н., Andrey В.А.\
%vspace{1.2em}
%>Рецензент \
%>к.ф.-м.н. Olegovich В.И.\
%end{tabbing}
%end{center}

begin{alltt}
Научный руководитель
д.ф.м.н., Andrey В.А.
Рецензент
к.ф.-м.н. Olegovich В.И.
end{alltt}


vspace{fill}

begin{center}
Санкт-Петербург 2010
end{center}

end{titlepage}

Пример 2

Титульный лист LaTeX изображение с сайта www.andreyolegovich.ru

Код для примера 2

documentclass[12pt]{article}
usepackage[utf8]{inputenc}
usepackage{graphicx}
usepackage{setspace}
setstretch{1.5}
usepackage{geometry}
geometry{a4paper, portrait, margin=30mm, bmargin=30mm, tmargin=30mm}
begin{document}
begin{center}
thispagestyle{empty}
LARGE{University of Innsbruck}\[-0.9ex]
LARGE{Faculty of Business and Management}\[2ex]
large{Department of Banking and Finance}\
vspace{0.3cm}
begin{center}
includegraphics[width=7cm]{universitaet-innsbruck-logo-cmyk-farbe.jpg}\
vspace{0.9cm}
textbf{LARGE{Master Thesis}}
medskippar
textbf{normalsize{submitted for the degree of}} \[2ex]
textbf{Large{Master of Science}}\
vspace{1.2cm}
Large{textbf{Lorem ipsum}}\[-0.5ex]
large{Lorem ipsum dolor sit amet, consectetur adipiscing elit}\[-1.5ex]
large{Praesent fermentum}
bigskippar
by par
large{Anton Wahrstätter, BSc LLB }\[-1ex]
large{Matriculation Nr.: 01515804}\ [-1ex]
large{ULG Digital Business}\[-1ex]
vspace{0.6cm}
end{center}
medskip
end{center}
begin{tabular}{ll}
Submission Date: & today \[-1ex]
Supervisors: & Satoshi Nakamoto \
end{tabular}

end{document}

Пример 3

Титульный лист LaTeX изображение с сайта www.andreyolegovich.ru

Код для примера 3

%* This is an unofficial template for a title page for thesis dissertation at SLU
%* and was created by Theodorik Leao, 2020. It uses the SLU thesis template v3, available for word at:
%* https://www.slu.se/site/bibliotek/publicera-och-analysera/registrera-och-publicera/dokumentmallar/


documentclass[a4]{article}

% Standard margins for SLU is 3.5 cm on each side. Add this code if desired:
usepackage[a4paper, left=3.5cm,right=3.5cm]{geometry}

% Necessary packages for the titlepage:
usepackage{tikz}
usetikzlibrary{calc}
usepackage{graphicx}
usepackage{newtxtext}
usepackage{float}
usepackage{comment}
% This command changes the font style where SLU promotes Arial
newenvironment{myfont}{fontfamily{phv}selectfont}{par}


% Begin document:
begin{document}

% Add title page:
include{titlePageSLU}



end{document}

image
Всем привет. Недавно меня тоже настигла переломная веха студенческой жизни — бакалаврская дипломная работа. Среди многих формальных деталей этого замечательного явления особо заметным стоит нормоконтроль. Нет, я понимаю и всячески поддерживаю, что стандарты необходимы, в том числе стандарты на оформление академического текста. Просто наши стандарты, в отличие от западных, достаточно идиотичны. Они не экономят ни чернила, ни бумагу, они не упрощают поиск литературы по номенклатуре, а усложняют чтение названия. Не говоря уже о том, что текст стандарта спроектирован и описан людьми, работающими в редакторе Microsoft Word. Опять-таки, я не имею ничего против Word, это мощнейшая система. Но технический текст в нем набирать неудобно, и по гибкости он во много раз проигрывает бессмертному творению Дональда Кнута — LaTeX.

Итак, мое написание диплома началось с того, что я потратил 4 часа на настройку преамбулы под нормы украинского стандарта оформления ДСТУ 3008-95. Насколько мне известно, он почти полностью соответствует русскому ГОСТу. Я знал, что существуют готовые решения (например, disser), но после пары проб предпочел настроить каждую деталь самостоятельно. Для тренировки. Тренировка удалась — я узнал бездну новых вещей о LaTeX, этого монстра невозможно выучить полностью 🙂

Под катом я полностью опишу процесс настройки каждой конкретной детали и использование их при написании, а также разные мелочи, упрощающие написание диплома еще больше. Сразу предупреждаю: где-то мои решения могут показаться костылями. Где-то они не слишком универсальны. Я это знаю, понимаю, принимаю и приветствую критику и предложения в комментариях 😉

Заготовка

Начнем с заготовки. Я предполагаю, что у вас устанавлен дистрибутив (MiKTeX на Windows или любой аналогичный на Linux/Mac) и настроены кириллические шрифты PsCyr по инструкции. Не забудьте включить установку дополнительных пакетов «на лету» — вам их понадобится много 🙂

Стандарт предполагает написание всего текста 14 шрифтом Times New Roman с полуторным интервалом. Последнее — терминология Microsoft Word 🙂 Чтобы составить её аналог в LaTeX, подключим пакет extsizes, который добавляет в параметры класса документа 14pt, и настроим все остальное, как написано ниже:

documentclass[a4paper,14pt,russian]{extreport}

usepackage{extsizes}
usepackage{cmap} % для кодировки шрифтов в pdf
usepackage[T2A]{fontenc}
usepackage[utf8]{inputenc}
usepackage[russian]{babel}
usepackage{pscyr}

usepackage{graphicx} % для вставки картинок
usepackage{amssymb,amsfonts,amsmath,amsthm} % математические дополнения от АМС
usepackage{indentfirst} % отделять первую строку раздела абзацным отступом тоже
usepackage[usenames,dvipsnames]{color} % названия цветов
usepackage{makecell}
usepackage{multirow} % улучшенное форматирование таблиц
usepackage{ulem} % подчеркивания

linespread{1.3} % полуторный интервал
renewcommand{rmdefault}{ftm} % Times New Roman
frenchspacing

begin{document}

end{document}

Установка linespread{1.3} (увеличить межстрочный интервал в 1.3 раза) примерно соответствует тому, что в мире Word называют «полуторный интервал». Пакет cmap включает в полученный PDF (я пользуюсь pdfLaTeX) таблицу символов, так что кириллический текст в PDF становится возможно копировать и искать без искажения кодировок. Что касается исходных файлов, то их я храню в кодировке UTF-8, для ваших привычных настроек измените значение параметра при inputenc. Предназначение остальных пакетов прокомментирую чуть позже, когда буду обсуждать непосредственно написание диплома, а не преамбулу с оформлением.

Нумерация страниц

Нумерация страниц должна быть проставлена в верхнем правом углу. В моем случае она начинается с №5, так как первые 4 страницы занимают титульная, лист задания, календарный план и прочая бюрократия. Формы для них были присланы в doc/docx, и их гораздо проще распечатать как есть, нежели тратить время на имитирование этого оформления в LaTeX 😉

Подключим пакет fancyhdr, предназначенный для оформления верхних и нижних колонтитулов страницы, и поотключаем в нем всякие умолчания. Страница становится абсолютно чистой, за исключением номера (thepage) в правом углу верхнего колонтитула.

usepackage{fancyhdr}
pagestyle{fancy}
fancyhf{}
fancyhead[R]{thepage}
fancyheadoffset{0mm}
fancyfootoffset{0mm}
setlength{headheight}{17pt}
renewcommand{headrulewidth}{0pt}
renewcommand{footrulewidth}{0pt}
fancypagestyle{plain}{ 
    
fancyhf{}
    rhead{thepage}}
setcounter{page}{5} % начать нумерацию страниц с №5

Стоит отметить, что первая страница главы (chapter) по умолчанию использует стиль страницы plain. Его приходится тоже переопределить в терминах fancyhdr, чтобы номера проставлялись и на первых страницах глав (см. команду fancypagestyle).

Подписи под изображениями и таблицами

Настроим формат подписей, для чего прежде всего подключим пакет caption. Поскольку я люблю детальные иллюстрации с несколькими взаимосвязанными подчастями, подключим также и пакет subcaption. По стандарту название рисунка располагается под рисунком, а название таблицы — над таблицы. Следить за этими расположениями вам придется самостоятельно (см. ниже), но пакету можно подсказать об этом законе, чтобы он оптимизировал выделение пустого места соответствующим образом.

usepackage[tableposition=top]{caption}
usepackage{subcaption}
DeclareCaptionLabelFormat{gostfigure}{Рисунок #2}
DeclareCaptionLabelFormat{gosttable}{Таблица #2}
DeclareCaptionLabelSeparator{gost}{~---~}
captionsetup{labelsep=gost}
captionsetup[figure]{labelformat=gostfigure}
captionsetup[table]{labelformat=gosttable}
renewcommand{thesubfigure}{asbuk{subfigure}}

Здесь с помощью команды DeclareCaptionLabelFormat настраивается новый пользовательский формат оформления подписи, который потом назначается для всех рисунков и таблиц документа. Его первый параметр #1 — это стандартный текст метки (я предпочел не настраивать его отдельной строкой, а написать явно, не используя #1), второй параметр #2 — номер рисунка/таблицы.
DeclareCaptionLabelSeparator настраивает разделитель между меткой подписи (caption label) и непосредственно её текстом, который задаете вы. В нашем случае это среднее тире.

Отдельно стоит прокомментировать последнюю строку. Так как я разделяю иногда иллюстрации на подчасти, что позволяет делать пакет subfigure, эти подчасти нужно нумеровать. Принято нумеровать их маленькими буквами по порядку — однако в нашем случае это должны быть буквы кириллицы, а не латиницы! Кириллическое представление счетчиков (по аналогии с известными представлениями arabic, roman, latin и др.) уже реализовано в пакете babel. Называется оно соответственно asbuk для маленьких кириллических букв, и Asbuk для больших.

Приведу пример типичного оформления рисунка:

begin{figure}[ht]
centering
    begin{subfigure}[b]{0.3textwidth}    
    centering
        $$begin{array}{l}
        F to x ;|; y ;|; (S) 
        T to F ;|; T ast F 
        S to T ;|; S + T     
        end{array}$$
        caption{}
    end{subfigure} %    
    begin{subfigure}[b]{0.6textwidth}
    centering
        includegraphics[scale=0.7]{parseTree.png}
        caption{}
    end{subfigure}

caption{(a) Продукции грамматики $G$ для порождения арифметических выражений; 
             (б) Дерево разбора строки $x+yast y$ в грамматике $G$.}
    label{fig_parsetree}
end{figure}

И таблицы:

begin{table}[ht]
caption{Расчет весомости параметров ПП}
label{tab_weight}
centering
    begin{tabular}{|c|c|c|c|c|c|c|c|c|}
    hline multirow{2}{*}{Параметр $x_i$} & multicolumn{4}{c|}{Параметр $x_j$} & 
        multicolumn{2}{c|}{Первый шаг} & multicolumn{2}{c|}{Второй шаг} 
    cline{2-9} & $X_1$ & $X_2$ & $X_3$ & $X_4$ & $w_i$ & 
        ${K_text{в}}_i$ & $w_i$ & ${K_text{в}}_i$ 
    hline $X_1$ & 1 & 1 & 1.5 & 1.5 & 5 & 0.31 & 19 & 0.32 
    hline $X_2$ & 1 & 1 & 1.5 & 1.5 & 5 & 0.31 & 19 & 0.32 
    hline $X_3$ & 0.5 & 0.5 & 1 & 0.5 & 2.5 & 0.16 & 9.25 & 0.16 
    hline $X_4$ & 0.5 & 0.5 & 1.5 & 1 & 3.5 & 0.22 & 12.25 & 0.20 
    hline multicolumn{5}{|c|}{Итого:} & 16 & 1 & 59.5 & 1 
    hline
    end{tabular}
end{table}

Стоит отметить использование команд multirow и multicolumn для создания красивых таблиц. Они соответствуют параметрам HTML <table>: rowspan и colspan, соответственно. Правда, первый требует подключения пакета multirow.

Результат оформления показан ниже.
Для рисунка:
Диплом бакалавра в LaTeX, или ДСТУ 3008 95 в 150 строк

Для таблицы:
Диплом бакалавра в LaTeX, или ДСТУ 3008 95 в 150 строк

Заголовки

Заголовки по стандарту ДСТУ 3008-95 — это просто песня. Или, скорее, скорбная дума. Все требования по выравниваю заголовков были оформлены некой творческой душой в терминах Word: пропуск тут одна строка, тут две строки, а там полуторный интервал, а здесь двойной… В итоге после некоторого времени, проведенного в попытках придумать красивое решение, мне пришлось подобрать все константы отступов и интервалов вручную и захардкодить их в пикселях пунктах. Считаю, что это самый отвратительный стиль программирования, к которому я прибегнул за всю свою «карьеру». Хотя в данном случае LaTeX никакого отношения к программированию и не имеет 🙂

Для форматирования заголовков используем пакет titlesec. По стандарту главы (они же разделы) пишутся по центру, предваряются строкой «Глава N», а подразделы и пункты нумеруются в пределах главы, и выравниваются по абзацному отступу. Все набирается полужирным начертанием, при этом заголовки глав — еще и в верхнем регистре.

Оформление заголовка настраивается командой titleformat. У нее есть следующие параметры:

  • первый — уровень настраиваемого заголовка (например, chapter или section);
  • второй необязательный — форма заголовка. Описывает глобальный стиль его размещения — будет ли он «висеть» по центру, печататься обычной жирной строкой перед текстом, входить в текст, располагаться на полях, или еще как-то иначе. Полный список форм приведен в мануале по пакету, я здесь пользуюсь только формой display для оформления chapter;
  • третий параметр — команды, вызывающиеся перед печатью всего заголовка;
  • четвертый параметр — оформление метки;
  • пятый параметр — расстояние между меткой и текстом заголовка (горизонтальное или вертикальное в зависимости от формы);
  • шестой параметр — команды, вызывающиеся перед печатью текста заголовка;
  • седьмой необязательный — команды, вызывающиеся после печати текста заголовка.

Эти команды позволяют достичь всего необходимого оформления, за исключением обязательной капитализации текста заголовка главы. Команда MakeUppercase работает исключительно с одним параметром, и её нельзя применять наподобие bffamily, чтобы переключить формат печати «отныне и навеки до конца группы». Таким образом, я смог применить её для капитализации метки заголовка (слова «Глава» или «Приложение»), но текст заголовка пришлось печатать капсом самостоятельно. Ну ничего, нажать Запретную Кнопку несколько раз оказалось не так уж и страшно 🙂

usepackage{titlesec}

titleformat{chapter}[display]
    {filcenter}
    {MakeUppercase{chaptertitlename} thechapter}
    {8pt}
    {bfseries}{}

titleformat{section}
    {normalsizebfseries}
    {thesection}
    {1em}{}

titleformat{subsection}
    {normalsizebfseries}
    {thesubsection}
    {1em}{}

% Настройка вертикальных и горизонтальных отступов
titlespacing*{chapter}{0pt}{-30pt}{8pt}
titlespacing*{section}{parindent}{*4}{*4}
titlespacing*{subsection}{parindent}{*4}{*4}

Обратите внимание на parindent в настройке отступов для подразделов, заставляющий их выравниваться по абзацному отступу.

И вот как все это теперь выглядит при печати обыкновенными chapter и section:
Диплом бакалавра в LaTeX, или ДСТУ 3008 95 в 150 строк

Поля

Настроить поля страницы — самая простая из сегодняшних задач:

usepackage{geometry}
geometry{left=3cm}
geometry{right=1.5cm}
geometry{top=2.4cm}
geometry{bottom=2.4cm}

Списки

Требования на списки в стандарте следующие:

  • нумерованные списки на первом уровне помечаются как «а)», «б)», «в)»… На втором — как «1)», «2)», «3)». Да-да, я тоже не вижу тут ни капли логики.
  • ненумерованные списки помечаются дефисами.

К сожалению, LaTeX обожает окружать окружения itemize и enumerate огромным количеством пространства, порождая для них специальный межабзацный отступ. Чтобы побороть эту порочную привычку, можно воспользоваться пакетом enumitem и задать ему опцию nolistsep, отключающую все дополнительные отступы. Правда, enumitem не знает ничего про новенькое представление счетчиков asbuk, о котором я рассказывал выше, так что необходимо указать на него командой AddEnumerateCounter. Её третий параметр — пример самого широкого представления (пакет будет ориентироваться на эту ширину при печати). Мне почему-то (безосновательно) кажется, что самая широкая буква кириллического алфавита в Times New Roman — это именно «м». В любом случае, человек, который создает нумерованный список длиной от «а» до «м» или ниже, заслуживает пристального внимания здравоохранительных органов, как по мне 🙂

usepackage{enumitem}
makeatletter
    AddEnumerateCounter{asbuk}{@asbuk}{м)}
makeatother
setlist{nolistsep}
renewcommand{labelitemi}{-}
renewcommand{labelenumi}{asbuk{enumi})}
renewcommand{labelenumii}{arabic{enumii})}

Оглавление

Оглавление — вторая по болезненности стадия процесса настройки преамбулы. Его приходится настраивать по образцу, стандарт не слишком-то многословен на этот счет. Последствием настройки по образцу является еще одна куча «магических констант» среди интервалов.

Список разнообразных мелочей, которые надо учесть, включает:

  • слово «Стр.» над колонкой с номерами страниц;
  • выделение глав жирным шрифтом и верхнем регистром (и предварительным «Глава N»);
  • включение в оглавление специальных разделов («Вступление», «Список сокращений», «Выводы», «Список литературы»…) на уровне обычных глав, но без слова «Глава» и нумерации;
  • включение в оглавление подразделов и пунктов, но не подпунктов и ниже;
  • и разнообразные красивые выравнивания.

К счастью, существует пакет tocloft. Копировать его документацию в текст данной заметки я не собираюсь, он включает бесчисленное множество команд, которые настраивают буквально каждый пиксель в оглавлении. Все эти команды — подстановки в стиле «а вот это напечатай между текстом названия подраздела и началом пунктирной линии». Я использую в преамбуле 9 таких команд, которые в общем и целом настраивают внешний вид оглавления:

usepackage{tocloft}
renewcommand{cfttoctitlefont}{hspace{0.38textwidth} bfseriesMakeUppercase}
renewcommand{cftbeforetoctitleskip}{-1em}
renewcommand{cftaftertoctitle}{mbox{}hfill  mbox{}hfill{footnotesize Стр.}vspace{-2.5em}}
renewcommand{cftchapfont}{normalsizebfseries MakeUppercase{chaptername} }
renewcommand{cftsecfont}{hspace{31pt}}
renewcommand{cftsubsecfont}{hspace{11pt}}
renewcommand{cftbeforechapskip}{1em}
renewcommand{cftparskip}{-1mm}
renewcommand{cftdotsep}{1}
setcounter{tocdepth}{2} % задать глубину оглавления — до subsection включительно

Эти команды настраивают все необходимые мелочи из вышеприведенного списка, кроме одной. Со специальными разделами придется обходиться особым образом.

Специальные разделы (аннотация, вступление, список сокращений, выводы, список литературы)

Перечисленные разделы оформляются особенно. Во-первых, каждый из них начинается с новой страницы. Это не проблема — команду newpage знает каждый. Во-вторых, их заголовок оформляется по центру страницы полужирным шрифтом верхнего регистра… и отделяется от текста двумя строками. И наконец, в довершение этой ахинеи, специальные разделы находятся в оглавлении на уровне глав, но не нумеруются, и главами не являются. Чувствуете, как кому-то было нечего делать?

Команда chapter* по очевидным причинам не подходит: начатые ею главы не включаются в оглавление. Кроме того, нужно как-то оформить двойной перенос строки перед текстом — ну не писать же newline вручную каждый раз?

Мы не ищем легких путей. Я решил создать свой собственный вид секции. Как оказалось, это не так-то и сложно.
Чтобы определить секцию (я назвал его likechapter), для начала стоит определить соответствующую оформляющую команду. Оформить центрирование и капитализацию названия секции — раз плюнуть. Что я и сделал — команда likechapterheading печатает как надо переданное ей название секции.

newcommand{empline}{mbox{}newline}
newcommand{likechapterheading}[1]{ 
    
begin{center}
    textbf{MakeUppercase{#1}}
    end{center}
    empline}

Однако секцию нужно еще и включить в оглавление и выровнять по уровню главы. И вот здесь уже нужно чуть извернуться.

Теоретически добавление новой строки в оглавление делается командой addcontentsline. У нее три параметра:

  1. Тип перечня, в который добавить строку. В нашем случае это toc — оглавление (table of contents).
  2. Уровень, на котором разместить строку.
  3. Добавляемый текст строки.

С первым и третьим все понятно. Но в качестве второго нельзя написать просто «chapter», так как услужливый tocloft, настроенный нами же чуть выше, напечатает перед строкой слово «Глава». Выход один — идти до конца и определять собственный уровень секции.

Когда LaTeX печатает определенный уровень в оглавлении, он вызывает внутреннюю команду l@XXX, где XXX — название уровня (chapter, section и т.д.). У этой команды два параметра — текст заголовка и номер страницы. Цель команды — напечатать непосредственно строку оглавления с пунктирной линией, отступами и всем полагающимся. Если мы желаем определить собственный вид уровня, нам достаточно определить такую команду для своего названия уровня. Тогда LaTeX в процессе обработки команды addcontentsline посмотрит на её второй параметр, найдет среди своих определений соответствующую l@XXX, где XXX — подставленный этот самый второй параметр, и тем самым закончит печать строки в оглавлении.

Осталось определить команду l@likechapter (попутно настроив для нее период между точками в пунктирной линии, как в tocloft), и закончить определение заголовка likechapter:

makeatletter
    renewcommand{@dotsep}{2}
    newcommand{l@likechapter}[2]{{bfseries@dottedtocline{0}{0pt}{0pt}{#1}{#2}}}
makeatother
newcommand{likechapter}[1]{    
    
likechapterheading{#1}    
    addcontentsline{toc}{likechapter}{MakeUppercase{#1}}}


Теперь можно и посмотреть на результат трудов. Вот так выглядит начало оглавления:
Диплом бакалавра в LaTeX, или ДСТУ 3008 95 в 150 строк

Специальный раздел показывать смысла нет, полагаю. Это просто жирный капитализированный текст по центру страницы, напечатанный с помощью likechapter{Вступление}.

Список литературы

При верстке ссылок на источники я решил не пользоваться BibTeX, о чем потом тысячу раз пожалел. Необходимость аккуратно вручную расставлять все эти слеши, точки, запятые и тире при описании очередного номера журнала просто убивает. Но, к сожалению, BibTeX я до того не пользовался, и разбираться с настройкой его оформления желание к концу преамбулы уже иссякло. А жаль.

Кстати, уверен, что уже настроенные BibTeX-файлы в уже упоминавшемся проекте disser почти полностью решают эту задачу.

Но пока здесь мы рассматриваем конкретно мою преамбулу. Для верстки списка литературы я пользовался старым добрым окружением thebibliography и командами bibitem в чистом виде. Для их небольшой настройки необходимо было проделать следующее:

usepackage[square,numbers,sort&compress]{natbib}
renewcommand{bibnumfmt}[1]{#1.hfill} % нумерация источников в самом списке — через точку
renewcommand{bibsection}{likechapter{Список литературы}} % заголовок специального раздела
setlength{bibsep}{0pt}

Теперь заголовок «Список литературы» оформляется как likechapter, и соответствующим образом помещается в оглавление. Пакет natbib красиво сжимает числа при ссылке в нечто вроде «[2, 6-9]».

Счетчик страниц, рисунков, таблиц, источников

Стандарт требует, чтобы аннотация к работе начиналась со строки «Дипломная работа: 107 с., 14 рис., 19 табл., 2 приложения, 28 источников». Естественно, LaTeX не был бы лучшей системой верстки современности, если бы в нем не было средств автоматического подсчета всех этих величин и вставки нужного числа в текст командой.

Начнем со страниц. Здесь дела обстоят проще всего: подключаем пакет lastpage, а в тексте просто ссылаемся на новую определяемую им метку LastPage с помощью pageref*:

usepackage{lastpage}
% ...
Дипломная работа: pageref*{LastPage}~с., ...


С рисунками и таблицами мог бы помочь пакет totcount, который и был написан для таких целей — подсчитывать количество разнообразных объектов в документе. К сожалению, по состоянию на настоящий момент у него есть серьезный недостаток: счетчики обычно сбрасываются в конце каждой главы при несквозной нумерации, так что на выходе в случае документа типа report, а не article мы получаем не общее количество рисунков, а лишь количество рисунков в последней главе. Автор уведомлен о баге, а пока он работает, необходимо было найти workaround.

Рецепт был найден на просторах StackOverflow. Мы определим для каждого типа объектов собственный счетчик, а потом значение этого счетчика запишем в aux-файл (в конце компиляции, командой AtEndDocument). При следующей компиляции оно возьмется из файла, и определенная нами команда подставит в текст необходимое число. Таким образом, после двух запусков pdfLaTeX мы получим текст с корректным значением счетчика.

newcounter{totfigures}
newcounter{tottables}
makeatletter
    AtEndDocument{%
      addtocounter{totfigures}{value{figure}}%
      addtocounter{tottables}{value{table}}%
      immediatewrite@mainaux{%
        stringgdefstringtotfig{numbervalue{totfigures}}%
        stringgdefstringtottab{numbervalue{tottables}}%    
      }%
    }
makeatother
% ...
Дипломная работа: pageref*{LastPage}~с., totfig~рис., tottab~табл...


У этого решения есть фатальный недостаток: увеличивать значение счетчика приходится вручную на каждом рисунке или таблице. Можно чуть упростить жизнь, добавляя к счетчику количество рисунков/таблиц лишь в конце каждой главы (из соответствующего системного счетчика), но все равно копипаст по коду будет присутствовать. Этот процесс, тем не менее, можно автоматизировать.

Автоматизацией занимается пакет etoolbox. В нем (помимо всего прочего) есть замечательная команда pretocmd, которая позволяет приписать к определению любой команды спереди какой-то дополнительный код. В данном случае мы желаем, чтобы перед любым вызовом chapter изменялось значение счетчика.

usepackage{etoolbox}
pretocmd{chapter}{addtocounter{totfigures}{value{figure}}}{}{}
pretocmd{chapter}{addtocounter{tottables}{value{table}}}{}{}

Отмечу, что вручную команды изменения счетчиков все же приходится вызвать еще дважды. Один раз в самом конце документа (см. выше AtEndDocument). И один раз перед началом приложений, которые классифицируются как главы, но не вызываются с помощью chapter (см. ниже).

Наконец, с источниками можно поступить точно так же: определить счетчик, автоматически увеличивать его и сбросить в aux-файл в конце компиляции. Только на этот раз хачить придется команду bibitem:

newcounter{totreferences}
pretocmd{bibitem}{addtocounter{totreferences}{1}}{}{}


Теперь не забыть добавить в команду AtEndDocument (см. выше) аналогичную строчку:

stringgdefstringtotref{numbervalue{totreferences}}%

и можно писать в тексте «totref~источников…»

Приложения

С приложениями пришлось повозиться. В первую очередь из-за оглавления: никак не получалось настроить tocloft так, чтобы он печатал для главы слово «Глава», а для приложения — слово «Приложение», несмотря на то, что оно заявлено как chapter. При этом печатать необходимое слово в самом заголовке получается без проблем, благодаря команде chaptertitlename, определенной в пакете titlesec.

Не мудрствуя лукаво, я соорудил костыль. Я решил оформлять приложения как… параграфы. Все равно настоящие параграфы в тексте я нигде не использовал. Дело было за малым — настроить отображение paragraph в заголовке идентично chapter, и добавить соответствующую строку в оглавление на уровне likechapter.

usepackage[title,titletoc]{appendix}

titleformat{paragraph}[display]
    {filcenter}
    {MakeUppercase{chaptertitlename} thechapter}
    {8pt}
    {bfseries}{}
titlespacing*{paragraph}{0pt}{-30pt}{8pt}

newcommand{append}[1]{ 
    
clearpage
    stepcounter{chapter}    
    paragraph{MakeUppercase{#1}}
    empline
    addcontentsline{toc}{likechapter}{MakeUppercase{chaptertitlename~Asbuk{chapter};#1}}}


Теперь это можно использовать так:

begin{appendices}
renewcommandthechapter{Asbuk{chapter}}
setcounter{chapter}{0}

append{Код программного продукта}
...
end{appendices}


Обратите внимание на невыносимую легкость бытия: приложения по сути представляют собой paragraph-ы, оформляются в оглавление как likechapter-ы, но при этом для их подсчета я использую счетчик chapter, потому что по сути-то приложения являются главами 🙂 В качестве представления счетчика взят Asbuk, так как приложения принято нумеровать заглавными кириллическими буквами.

Теперь поподробнее о том, как оформить каждое из двух обязательных приложений, указанных в дипломной работе бакалавра.

Приложение А: Иллюстративный материал доклада

Первым обязательным приложением являются слайды презентации. Презентацию я создавал в Microsoft Power Point, здесь против отличного продукта у меня никаких претензий не возникает пока. Возможно, наступит скоро в жизни переломный момент, когда я и презентации буду делать в LaTeX, но пока что я еще не на той стадии. Основным доводом является то, что большое количество формул в презентации я набираю на LaTeX-подобном языке разметки, встроенном в Microsoft Office версий 2007 и выше 😉

Итак, презентация готова, сохранена в pptx-файл рядом с исходниками диплома. Как бы теперь ее автоматически вставлять в PDF диплома прямо при компиляции? Способ был найден, и очень простой. Сконвертируем презентацию в PDF и вставим этот PDF внутрь генерируемого с помощью замечательного пакета pdfpages.

Я решил отображать по два слайда на страницу, окруженные рамками. В процессе работы пришлось учесть два момента. Во-первых, страницы с приложением тоже нужно нумеровать — так что надо не забыть давать команды пакету fancyhdr, чтобы он отработал и на включаемых страницах. Во-вторых, на первой странице приложения находятся не только два первых слайда презентации, но и заголовок «Приложение А». Как первую, так и вторую трудность решает параметр pagecommand, присутствующий в списке опций нашей основной команды includepdf. Готовый исходный код:

usepackage{pdfpages}
% ...
includepdfset{nup=1x2,frame=true,delta=10mm 10mm,noautoscale=true}
includepdf[pages=1-2,scale=0.55,offset=10mm -20mm,pagecommand={append{Иллюстративный материал доклада}}]{defence.pdf}
includepdf[pages=3-,scale=0.55,offset=10mm 0mm,pagecommand={fancyhead[R]{thepage}}]{defence.pdf}
 


И результат:
Диплом бакалавра в LaTeX, или ДСТУ 3008 95 в 150 строк

Приложение Б: Код программного продукта

Вставляемый исходный код хочется подсветить и напечатать мелким моноширинным шрифтом, чтобы он не занимал добрую половину диплома и не тратил на себя зря бумагу. В приложениях это дозволяется.

С подсветкой исходного кода прекрасно справляется пакет listings. Ему только надо немного помочь: указать каким шрифтом печатать код (опция basicstyle), попросить переносить слова в строках (опция breaklines), и подкорректировать набор ключевых слов языка программирования (опция morekeywords) — в нем реализовано распознавание C# 2.0, а я писал на C# 4.0. Со всем остальным пакет справится сам, даже подгрузить текст исходника из лежащего рядом файла.

usepackage{listings}
%...
append{Код программного продукта}
lstset{language=[Sharp]C,
   morekeywords={yield,var,get,set,from,select,partial},
   breaklines=true,
   basicstyle=footnotesizettfamily}
linespread{1} % вернем временно единичный межстрочный интервал
lstinputlisting{MyCoolProjectClass.cs}

Организация рабочего пространства

На этом перевод стандарта ДСТУ 3008-95 на LaTeX закончился. Последние несколько строк в моей преамбуле касаются того, как удобнее всего оказалось организовать работу с многочисленными разделами и подразделами в дипломной работе.

Весь документ, конечно же, разобьем на множество файликов — по одному tex-файлу на подраздел (section). Каждую главу будем хранить в отдельной подпапке, с названием вроде chapter_ProgramSynthesis. В этой папке будет лежать файл chapter_ProgramSynthesis.tex, содержащий в себе сборку подразделов главы, собственно файлы sec_XXX.tex с конкретными подразделами и все нужные дополнительные материалы (например, картинки).

Чтобы включить в тело основного документа файл главы и разрешить ему, в свою очередь, включать в себя подфайлы и искать путь к материалам в своей подпапке, воспользуемся пакетом import. В нем есть прекрасная команда subimport, которая принимает два параметра — папку, которая временно становится путем поиска файлов, и непосредственно включаемый файл. Для включения глав в диплом определим вспомогательную команду, и можем теперь легко ссылаться на главы по имени.

В основном файле diploma.tex:

usepackage{import}
newcommand{includechapter}[1]{subimport{chapter_#1/}{chapter_#1}}
newcommand{inputintro}{input{sec_Intro} newpage}
% ...
includechapter{ProgramSynthesis}

В файле chapter_ProgramSynthesis/chapter_ProgramSynthesis.tex:

chapter{ТЕХНОЛОГИЯ PROGRAM SYNTHESIS}

inputintro
input{sec_Basics}
input{sec_Stages}
input{sec_Example}
input{sec_Conclusions}


Файлы sec_Basics.tex и прочие лежат в той же подпапке chapter_ProgramSynthesis. Ссылка на картинки из той же подпапки происходит непосредственно — см. пример определения иллюстрации в начале статьи.

Команду inputintro я определил из чистого перфекционизма: раз я подраздел «Вступление» всегда называю sec_Intro.tex и начинаю после него новую страницу, зачем писать дублирующийся код? 🙂

Заключение

На этом титаническое описание 150-строчной преамбулы можно считать законченным. Еще раз: не предполагаю, что всю эту работу стоит использовать в «чистом» виде как эталон для соблюдения стандарта — гораздо проще воспользоваться готовыми решениями. Зато надеюсь, что по мере чтения данной статьи многие энтузиасты LaTeX почерпнут для себя много новых интересных средств и возможностей, обогатят копилку инструментов полезными пакетами, и, возможно, возьмут на заметку прием-другой.

В конце концов, мы и любим LaTeX именно за эту безграничную мощь, не так ли? 😉 Удачной вам верстки!

Автор: Skiminok

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *