Этот репозиторий содержит список инструментов, лучших практик, советов и других рекомендаций, которые мы считаем полезными/важными при написании научных статей. Некоторые из них зависят от стиля (мы склонны следовать рекомендациям Чикагского руководства по стилю), и мы хорошо понимаем, что другие люди предпочитают делать что-то по-другому, но мы все равно перечисляем их, чтобы иметь единое руководство. Не стесняйтесь адаптировать, изменять, игнорировать или даже бросать вызов всему, что мы пишем!
Набор текста — это составление текста посредством расположения шрифтов, т. е. букв и символов. В основном это вопрос эстетики, но красивая типографика делает документы более легкими и приятными для чтения, помогая читателю дойти до сообщения.
Ниже мы перечисляем некоторые советы и инструменты по верстке, которые помогут вам при составлении документов. Некоторые советы относятся только к LaTeX, но другие применимы независимо от того, что вы используете.
При написании документов LaTeX помещайте в исходный файл по одному предложению в каждой строке. Писать:
This is my first sentence.
This is the second one.
и не:
This is my first sentence. This is the second one.
Основная причина этого — контроль версий и совместная работа: просматривая изменения коммита, гораздо легче определить, какое предложение было изменено, если каждое из них находится на отдельной строке. Таким образом, вашим коллегам будет легче увидеть изменения.
Еще одним преимуществом является то, что вы сможете лучше идентифицировать ошибки, если наш компилятор LaTeX укажет только номер строки.
Ниже мы будем говорить о двух типах капитализации:
Используйте формат заголовка для всех заголовков разделов, подразделов и т. д. Чтобы помочь вам использовать правильные слова с заглавной буквы, есть удобный сайт: Capitalizemytitle.com.
Иногда имя объекта (например, «Рисунок», «Таблица», «График» или «Алгоритм») и его ссылочный номер разбиваются на две строки. Например, имя объекта может находиться в одной строке, а ссылочный номер — в следующей строке.
Чтобы гарантировать, что LaTeX сохранит имя объекта и его ссылку в одной строке, вы можете использовать символ ~
между объектом и ссылкой. Используя символ тильды ~
таким образом, вы можете избежать неудобных разрывов строк и поддерживать единообразное форматирование имен объектов и ссылочных номеров в документах LaTeX.
Figure~ ref { fig:example } displays that the project ...
Чтобы не забыть использовать символ тильды, вы можете упростить процесс, создав собственные команды для автоматизации. Вот пример:
newcommand { refalg }[1]{Algorithm~ ref {# 1 }}
newcommand { refapp }[1]{Appendix~ ref {# 1 }}
newcommand { refchap }[1]{Chapter~ ref {# 1 }}
newcommand { refeq }[1]{Equation~ ref {# 1 }}
newcommand { reffig }[1]{Figure~ ref {# 1 }}
newcommand { refsec }[1]{Section~ ref {# 1 }}
newcommand { reftab }[1]{Table~ ref {# 1 }}
Как только эти команды определены, вместо написания:
Figure~ ref { fig:example }
просто введите:
reffig {fig:example}
(полный пример)
booktabs поможет вам создавать чистые и красивые таблицы.
usepackage { booktabs }
% --
begin { table }
centering
begin { tabular }{lcc}
toprule
& multicolumn {2}{c}{Data} \ cmidrule (lr){2-3}
Name & Column 1 & Another column \
midrule
Some data & 10 & 95 \
Other data & 30 & 49 \
addlinespace
Different stuff & 99 & 12 \
bottomrule
end { tabular }
caption {My caption.}
label { tab-label }
end { table }
В общем, избегайте использования вертикальных линий в таблицах. Вместо этого, если вы хотите сгруппировать столбцы, сделайте это в заголовках, используя cmidrule
. Вы также можете заменить горизонтальные линии пробелами, используя addlinespace
.
В заголовках столбцов следует использовать заглавные буквы в формате предложений (см. http://www.chicagomanualofstyle.org/15/ch13/ch13_sec019.html).
Дополнительные советы по форматированию таблиц можно найти здесь: http://www.inf.ethz.ch/personal/markusp/teaching/guides/guide-tables.pdf. Вот хороший GIF-файл, иллюстрирующий некоторые из этих правил:
(полный пример)
Используйте пакет siunitx для форматирования всех чисел, валют, единиц измерения и т. д.:
usepackage { siunitx }
% ---
This thing costs SI {123456}{ $ }.
There are num {987654} people in this room, SI {38}{ percent } of which are male.
Вы также можете использовать его для округления чисел:
usepackage { siunitx }
% ---
sisetup {
round-mode = places,
round-precision = 3
} %
You can also round numbers, for example num {1.23456}.
Наконец, это может помочь вам лучше выравнивать числа в таблице:
usepackage { booktabs }
usepackage { siunitx }
% ---
begin { table }
centering
begin { tabular }{lS}
toprule
Name & {Value} \ % headers of S columns have to be in {}
midrule
Test & 2.3456 \
Blah & 34.2345 \
Foo & -6.7835 \
Bar & 5642.5 \
bottomrule
end { tabular }
caption {Numbers alignment with texttt { siunitx }.}
end { table }
(полный пример)
При написании уравнений полезно иметь последовательный и последовательный способ записи переменных, векторов, матриц и т. д. Это помогает читателю понять, о чем вы говорите, и запомнить семантику каждого символа.
Мы предлагаем следующие правила написания математики:
$x$
)$mathbold{x}$
)$mathbold{X}$
)$X$
) Команда mathbold
входит в состав пакета fixmath
и аналогична команде boldmath
или bm
, за исключением того, что все символы, даже греческие буквы, выделены курсивом (в других пакетах греческие буквы не выделяются курсивом).
При добавлении индексов или экспонент к переменным убедитесь, что вы добавляете их вне стиля переменной, т. е. пишете $mathbold{x}_i$
, а не $mathbold{x_i}$
.
Поскольку мы часто ссылаемся на переменные, мы предлагаем определить следующие две команды:
renewcommand { vec }[1]{ mathbold {#1}}
newcommand { mat }[1]{ mathbold {#1}}
Затем вы можете использовать $vec{x}$
и $mat{X}$
в своем документе. Если вы решите изменить способ форматирования матриц, вам просто нужно изменить команду mat
, и она обновит весь документ.
Мы также предлагаем определить команды для переменных, которые вы используете чаще всего. Например, если вы часто используете vec{x}
и mat{X}
, рассмотрите возможность определения следующих команд:
newcommand { vx }{ vec {x}}
newcommand { vX }{ mat {X}}
Затем вы можете написать более компактные уравнения: $vx^T vy = vZ$
.
Обратите внимание, что вы всегда должны стилизовать переменные в соответствии с их типом. Например, $i$-й элемент вектора vx
— это x_i
, а не vx_i
(это число). Аналогично, если у вас есть матрица vX
, вы можете назвать ее i- й столбец vx_i
(это вектор, выделенный жирным шрифтом) и один, если ее элемент x_{ij}
, а не vX_i
и vX_{ij}
.
Используйте (...)
для записи встроенных уравнений. Вы также можете использовать $...$
, но это команда TeX и выдает более неясные сообщения об ошибках.
Чтобы написать центрированные уравнения в отдельной строке, не используйте $$...$$
(это один из смертных грехов использования LaTeX). Это работает, но дает неправильный интервал. Вместо этого используйте begin{equation*}
или begin{align*}
.
(полный пример)
Для более длинных документов, таких как магистерская или докторская диссертация, может быть полезно иметь обратные ссылки в библиографии, чтобы показать, где ссылка была процитирована. Для этого просто добавьте опцию backref=page
в пакет hyperref
:
usepackage [ backref=page ]{ hyperref }
Вы можете настроить способ отображения обратных ссылок с помощью следующих команд:
renewcommand *{ backref }[1]{}
renewcommand *{ backrefalt }[4]{{ footnotesize [ %
ifcase #1 Not cited. %
or Cited on page~#2 %
else Cited on pages #2 %
fi %
]}}
Цифры являются важным компонентом любой статьи, поскольку они могут сообщить читателю ваши результаты. Вы должны учитывать, что информация на каждом рисунке говорит вашему читателю, и что информации достаточно, чтобы поддержать ваше сообщение, не более того. Например, если вы хотите показать закономерности в 2d точках (есть два хорошо разделенных кластера), то нет необходимости ставить галочки и значения на осях (масштаб не имеет особого значения)? Фигуры не должны быть слишком сложными. Лучше иметь несколько фигур, передающих одно или два сообщения (метод А лучше, чем Б, но сходится медленнее), чем одну большую беспорядочную фигуру.
Некоторые рисунки создаются вручную, например, для объяснения системы или представления глобальной картины, тогда как другие основаны на данных, т. е. иллюстрируют некоторые данные. Эти фигуры, управляемые данными, должны быть максимально прописаны в скриптах: в идеале, если ваши данные изменяются, вам нужно будет запустить скрипт только один раз, чтобы обновить фигуру, без какого-либо другого вмешательства (настройка вида, масштабирование, сохранение/обрезание фигуры). , и т. д). Аналогично, если на создание данных, необходимых для создания рисунка, уходит более нескольких секунд, у вас должен быть первый сценарий, который вычисляет и сохраняет данные, и второй сценарий, который их отображает. Таким образом, вы сэкономите много времени при работе над сюжетом: вам не придется после каждого небольшого изменения фигуры ждать, чтобы увидеть его эффект.
Мы также рекомендуем сохранить команду, используемую для генерации рисунка, в файле LaTeX, например, как комментарий над рисунком, особенно если скрипт требует аргументов.
documentclass { article }
usepackage { graphicx }
begin { document }
% python figure_example.py --save ../../examples/figure/figure.eps
begin { figure }
centering
includegraphics {figure.eps}
caption {Example of a sigmoid function}
end { figure }
end { document }
Если возможно, на всех рисунках должны использоваться одни и те же шрифты для меток, осей и т. д. В частности, не следует иметь одну фигуру с большими метками/отметками, а другую — с меньшими. Одним из решений для достижения этой цели является определение размера вашей фигуры в скрипте, который ее генерирует, а не масштабирование ее в вашем документе (например, не меняйте ширину фигуры, задав значение textwidth
в вашем документе LaTeX).
Чтобы получить согласованные цифры, мы рекомендуем использовать вспомогательный скрипт, аналогичный plot_utils.py
. Используя этот скрипт, вам просто нужно вызвать figure_setup()
, чтобы определить все размеры, затем создать фигуру нужного размера и сохранить ее.
import argparse
import matplotlib . pyplot as plt
import numpy as np
import plot_utils as pu
def main ( args ):
x = np . linspace ( - 6 , 6 , 200 )
y = 1 / ( 1 + np . exp ( - x ))
pu . figure_setup ()
fig_size = pu . get_fig_size ( 10 , 5 )
fig = plt . figure ( figsize = fig_size )
ax = fig . add_subplot ( 111 )
ax . plot ( x , y , c = 'b' , lw = pu . plot_lw ())
ax . set_xlabel ( '$x$' )
ax . set_ylabel ( '$ \ sigma(x)$' )
ax . set_axisbelow ( True )
plt . grid ()
plt . tight_layout ()
if args . save :
pu . save_fig ( fig , args . save )
else :
plt . show ()
if __name__ == '__main__' :
parser = argparse . ArgumentParser ()
parser . add_argument ( '-s' , '--save' )
args = parser . parse_args ()
main ( args )
Мы рекомендуем сохранять все рисунки в формате EPS
. Таким образом, вы можете использовать как latex
, так и pdflatex
для создания документов и наслаждаться красивой векторной графикой и текстами.
По состоянию на сентябрь 2015 года в Mac OS X и последних версиях Python, Matplotlib и TeX Live наблюдается потеря качества при печати рисунков, которые были непосредственно сохранены в PDF
из Matplotlib. Это становится ясно при печати на настоящей бумаге; попробуйте сами. Это еще одна причина предпочитать сохранять изображения, созданные с помощью Matplotlib, в EPS
. Если вы действительно хотите сохранить только PDF-версию рисунка, используйте инструмент командной строки epspdf
— полученный PDF-файл будет лучше, чем тот, который был создан непосредственно Matplotlib.
Для полноты картины обратите внимание, что существует еще один бэкэнд Matplotlib, PGF, который дает немного лучшие результаты. Однако по состоянию на сентябрь 2015 года полученные PDF-файлы в два раза тяжелее, чем те, которые получены с помощью серверной части по умолчанию и epspdf
.
Matplotlib, даже при использовании функций жесткой компоновки, иногда добавляет слишком много пустого пространства на полях. Отличный инструмент командной строки для обрезки PDF-файла до максимально узкой рамки pdfcrop
.
Если на графике много точек данных, результирующий файл EPS может быть очень большим. Вы можете сохранить свою фигуру в формате PNG, но это приведет к размытию текста. Решение состоит в том, чтобы растрировать части вашей фигуры, т. е. сообщить matplotlib
, что точки данных должны отображаться в виде растрового изображения в файле EPS, а остальная часть — в векторном формате.
Вы можете передать ключевое слово rasterized=True
большинству функций построения графиков в matplotlib
. Вы также можете использовать разные слои, используя zorder
, и указать matplotlib
растрировать все слои ниже заданного zorder
используя метод оси set_rasterization_zorder()
. Примеры растеризации см. в файлеfigure_rasterized_example.py и http://matplotlib.org/examples/misc/rasterization_demo.html.