Sunday, June 28, 2015

Активные ссылки в PDF документе

Меня настойчиво попросили сделать гиперссылки в создаваемом из LaTeX PDF документе: из оглавления на все разделы, а также ссылки на литературу и сноски. Заодно стали активными ссылки на рисунки и таблицы. Способ:

\usepackage{perpage}   % reset footnote counter on each page
\MakePerPage{footnote} % reset footnote counter on each page

%\usepackage{setspace} % чтобы локально менять межстрочный интервал 

\usepackage{hyperref}   % hyperlinks in ToC, references, footnotes
\usepackage[all]{hypcap} % hyperref links to figures, not their captions
\hypersetup{
    colorlinks,
    citecolor=black,
    filecolor=black,
    linkcolor=black,
    urlcolor=black,
    linktoc=all
}
\usepackage{footnotebackref} % hyperlinks from the footnotes proper back to where they're called

Пакет hypcap используется, чтобы гиперссылки на фигуры и рисунки указывали на сами объекты, а не подписи к ним. Строки 
\usepackage{perpage}   
\MakePerPage{footnote} 
организуют нумерацию ссылок с 1 на каждой странице. По умолчанию была сквозная нуерация во всем документе.

К сожалению, обработчик пакета hyperref легко ломается. (Так и напиано, "easily broken".) Если, например, гиперссылки из сносок ведут не в низ страницы, а на титульный лист, стоит перенести некоторые пакеты выше, чем hyperref. Мне пришлось перенести \usepackage{setspace} (позволяет локально менять межстрочный интервал) выше \usepackage{hyperref}. И все заработало. Сейчас в моем PDF документе гиперссылки в оглавлении, ссылках на литературу, сносках и ссылках на фигуры и рисунки.

Friday, June 19, 2015

LaTeX: как поместить все изображения в конец файла

При создании документа в LaTeX есть несколько способов поместить в конец файла все фигуры, обозначенные
\begin{figure}...\end{figure} .
Первый - вручную. Это довольно трудоемко.
Второй - использовать пакет endfloat. Об этом я сейчас расскажу.

Включаем пакет endfloat в преамбуле документа, например, так:
\usepackage[nomarkers,figuresonly]{endfloat}
При компиляции получаем множество ошибок при обработке кириллицы. Чтобы заработало, нужно учесть пару тонкостей:

1. С русским языком пакет по умолчанию не дружит. Чтобы это исправить, нужно отредактировать файл endfloat.sty:
заменить строку 
\expandafter\immediate\expandafter\write\csname efloat@post#1\endcsname
на 
\expandafter\immediate\expandafter\protected@write\csname efloat@post#1\endcsname{}
Автору пакета об этом сообщили лет 8 назад, но он так и не внес изменения.

2. В TeX-файле команда \end{figure} должна быть одна на строке, без пробелов до и после нее. Иначе пакет ее не поймет и утащит с собой весть текст до того места, где это уловие будет выполнено.

Подведем итоги:  
1. Ставим пакет endfloat и подключаем его в преамбуле документа.
2. Редактируем файл endfloat.sty.
3. Убеждаемся, что в TeX-файле команды \end{figure} всегда занимают строку целиком.
4. Компилируем... Профит! Фигуры (изображения) находятся в конце PDF файла.

Sunday, June 14, 2015

Начинаем нумерацию списка литературы с произвольного числа в BibTeX

После того как я сделал два списка литературы в LaTeX документе, по умолчанию нумерация второго списка снова начиналась с 1. Мне нужно было, чтобы нумерация библиографического списка продолжалась. Как начать нумерацию списка литературы с произвольного числа? Для BibTeX'a нашлось элегантное решение. Вот оно.

BibTeX хранит текущий номер ссылки в счетчике enumiv. Зададим его значение:

\let\oldthebibliography=\thebibliography
\let\oldendthebibliography=\endthebibliography
\renewenvironment{thebibliography}[1]{%
    \oldthebibliography{#1}%
    \setcounter{enumiv}{ <arb.value> }%
}{\oldendthebibliography}

Следующая ссылка получит номер <arb.value>+1.
Я поместил этот код после между командами первой и второй библиографии. Обе команды выглядят одинаково:

\bibliographystyle{ <мой стиль> }
\bibliography{ <имя bib файла без расширения> }{ <Название раздела> }



Как сделать несколько списков литературы в BibTeX

Я расскажу, как в LaTeX сделать несколько библиографических списков с помощью BibTeX. Например, если нужно сделать независимые списки после каждой главы в LaTeX, или разделить литературу на основную и дополнительную.

Работающее решение - использовать пакет multibbl. Вот пример tex-документа, который я нашел в сети:

\documentclass{article}
\usepackage{multibbl}
\usepackage{hyperref}

\newbibliography{main}
\newbibliography{appendix}

\title{A Document With Two Bibliographies}
\author{The Unreasonable Man}

\begin{document}
  \maketitle
  \tableofcontents
  
  \section{The Art of Computer Programming}
  You can look this up in Knuth's famous books
  \cite{main}{ArtCompProg1:2011,ArtCompProg2:1998,ArtCompProg3:2004}.
  
  \bibliographystyle{main}{plain}
  \bibliography{main}{bibfilename}{References 1}
  
  \appendix
  \section{Note on Sorting and Searching}
  Well, have a look at the book mentioned before \cite{appendix}{ArtCompProg3:2004}.
  
  \bibliographystyle{appendix}{plain}
  \bibliography{appendix}{bibfilename}{References 2}
  
\end{document
}


Подключаем пакет multibbl и объявляем служебные имена библиографических списков командой \newbibliography{ <имя списка> }. Не стоит использовать служебные имена:  \newbibliography{auxне сработало, пришлось переименовать в auxil.

В тексте документа к каждой команде ссылки на литературу добавляем имя списка, например \cite{appendix}{ArtCompProg3:2004}.

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

pdflatex multibbl
bibtex main
bibtex appendix
pdflatex multibbl
pdflatex multibbl

Кстати! Библиографическая ссылка на книгу появится во всех списках, с именами которых она была процитирована.

Вот так можно легко сделать несколько библиографических списков с BibTex'ом.




Friday, June 12, 2015

Избавляемся от переполненных строк в LaTeX

Часто бывает, что в документе появляются слишком длинные, переполненные строки (Warning: overfull \hbox). Как избавиться от overfull \hbox в LaTeX? Я расскажу несколько способов. Их можно комбинировать.

Overfull \hbox возникает, когда строка залезает на правое поле страницы. Это происходит, когда совпадают два условия:
- компилятор не может найти правило переноса слова или формулы в конце строки, 
- если он уберет это слово целиком в следующую строку, размеры пробелов в текущей строке станут чересчур большими. 
Компилятор сдается, формирует переполненную строку и пишет предупреждение в лог.

Итак, два способа:

1. Как указать LaTeX, где можно ставить переносы? Поставить в местах возможного переноса слов символы \-, например: зашифро\-ва\-ние, cipher\-text. Разбить формулу на несколько, т.к. LaTeX не переносит формулу после запятой.

2. Чтобы не расставлять переносы вручную, можно немного изменить настройки окончения строк и страниц в преамбуле документа. Не стоит использовать команду \sloppy, так как после нее текст выглядит неопрятно.
Вот, что я добавил в преамбулу своего .tex файла для аккуратной верстки:

\tolerance 1414
\hbadness 1414
\emergencystretch 1.5em
\hfuzz 0.3pt        % размер максимального переполнения без warning'a
\widowpenalty=10000 % запрещает одиночную строку абзаца в начале 
страницы 
\vfuzz \hfuzz
\raggedbottom       % если на странице мало содержимого, добавить пустое место в конце, а не в середине страницы

Источники этих настроек.  


Как добавить русский язык, правописание и переносы в LaTeX

Я расскажу, как установить, поставить русский словарь и переносы в LaTeX. Например, в редакторе TeXStudio.

1. Используем словари OpenOffice. Идет по ссылке, скачиваем словарь в виде .oxt файла.(Можно выбрать другой словарь русского языка, например с буквой Ё, пройдя по другой ссылке.)

2. На самом деле .oxt файл - это zip-архив. Редактируем название файла: добавляем расширение .zip.

3. Открываем скачанный файл архиватором. Извлекаем файлы ru_RU.aff, ru_RU.dic и hyph_ru_RU.dic в папку словарей TeXStudio. 
У меня это папка по умолчанию "C:\Program Files (x86)\TeXstudio\dictionaries\". 
В TeXStudio можно выбрать папку для словарей (Options -> Configure TexStudio, вкладка General).  

4. В TeXStudio открываем меню Options -> Configure TexStudio. Во вкладке General выбираем Default Language: ru_RU (или ru_RU_yo, если скачали словарь с буквой Ё).

5. Можно заодно настроить русский тезаурус. 
Если в скачанном .oxt файле есть .dat и .idx файлы, извлекаем их в ту же папку словарей TeXStudioВ TeXStudio открываем меню Options -> Configure TexStudio. Во вкладке General выбираем Theraurus Database: файл th_ru_RU_v2.dat.



Первый пост

Hello world!
Проверим, что блог работает...