Юмор: UNIX-коаны Мастера Фу



22 коммент.
Несколько историй из замечательной книги "Искусство программирования для UNIX" Эрика Реймонда. Наверное, многие это уже читали, но всё равно - время от времени хорошо припадать к истокам и перечитывать классику.

Мастер Фу и десять тысяч строк

Однажды Мастер Фу сказал заезжему программисту: "В одной строке кода shell-сценария больше духа UNIX, чем в десяти тысячах строк кода на С!"

Программист, гордый своими познаниями в С, ответил: "Может ли быть такое? Ведь С - язык, в котором реализовано само ядро UNIX!"

На это Мастер Фу ответил: "Это так. Тем не менее, в одной строке shell-сценария больше духа UNIX, чем в десяти тысячах строк С!"

Программист выглядел удрученным. "Но ведь через язык С мы познаем просвещенность патриарха Ритчи! Мы уподобляемся человеку с операционной системой и компьютером, который получает непревзойденную производительность!"

Мастер Фу сказал: "То, что ты говоришь, правда. Однако в одной строке shell-сценария больше духа UNIX, чем в десяти тысячах строк С".

Программист усмехнулся и поднялся, чтобы удалиться. Но Мастер Фу кивнул своему ученику Ньюби, который писал строку shell-кода на стоящей рядом белой доске, и сказал: "Господин программист, посмотрите на этот конвейер! Не заняла бы его реализация на C десять тысяч строк?"

Просматривая то, что писал Ньюби, программист что-то бормотал в бороду. В конце концов, он согласился, что это так.

"И сколько часов потребовалось бы вам для реализации и отладки этой программы на языке С?"

"Много", - признал заезжий программист. "Но только безумец стал бы тратить столько времени, когда его ждет множество более достойных задач".

"Так кто лучше понимает дух UNIX?" - спросил Мастер Фу. "тот, кто пишет десять тысяч строк, или тот, кто, сознавая тщетность этих усилий, извлекает пользу, не программируя?"

Услышав это, программист достиг просветления.




Мастер Фу и Скрипт Кидди
Незнакомец из страны Вут пришел к Мастеру Фу во время его утренней трапезы.

"Я не раз слышал о вашем величии, - сказал он. - Пожалуйста, научите меня всему, что знаете".

Ученики Мастера Фу переглянулись, смущенные варварским языком пришельца. Мастер Фу только улыбнулся и ответил: "Вы хотите изучить путь UNIX?"

"Я хочу быть волшебником-хакером, - ответил незнакомец, - и владеть всеми компьютерами".

"Я не учу этому", - ответил Мастер Фу.

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

"Есть путь, который может привести тебя к мудрости", - сказал Мастер Фу. Мастер нацарапал какой-то IP-адрес на клочке бумаги. "Взлом этого сервера не составит для тебя большого труда, поскольку его хранители не компетентны. Возвращайся и расскажи мне, что ты ищешь".

Незнакомец поклонился и вышел. Мастер Фу закончил трапезу.

Прошли дни, а затем и месяцы. О незнакомце забыли.

Спустя годы незнакомец из страны Вут вернулся.

"Будь ты проклят!" - воскликнул он. - Я взломал этот сервер, это было не трудно, как ты и сказал. Но ФБР схватило меня и бросило в тюрьму".

"Хорошо", -сказал Мастер Фу. - Ты готов к следующему уроку". Он написал IP-адрес на бумаге и передал его незнакомцу.

"Вы с ума сошли?", - пронзительно вскрикнул тот. - После всего, что я прошёл, я не собираюсь снова взламывать компьютеры!"

Мастер Фу улыбнулся. "Здесь, - сказал он, - начинается мудрость".

Услышав это, странник достиг просветления.




Мастер Фу учил своих студентов

"В учении дхармы есть направление, выражаемое мантрой патриарха Макилроя - "Делай хорошо одну вещь", которая подчеркивает, что программное обеспечение движется по пути UNIX, если оно ведет себя просто и последовательно, и обладает свойствами, которые могут быть легко смоделированы в мозгу пользователя и использованы другими программами".

"Но есть и другое направление в учении Дхармы, примером которого может служить великая мантра патриарха Томпсона - "Находясь в сомнении, используй грубую силу", и различные сутры о большей ценности 90% функций прямо сейчас, чем 100% позже, что подчеркивает надежность и простоту реализации"

"Теперь скажите мне: каким программам присущ дух UNIX?"

Помолчав, Ньюби заметил: "Учитель, эти два учения могут противоречить друг другу".

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

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

Мастер Фу кивнул в знак согласия.

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

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

Мастер Фу кивнул в знак согласия.

"Каков же, в таком случае, пусть дхармы?" - спроил Ньюби.

И учитель ответил: "Когда орел летит, забывает ли он о том, что его лапы касались земли? Когда тигр после прыжка настигает свою жертву, забывает ли он о моменте, проведенном в воздухе? Три фунта VAX!"

Услышав это, Ньюби достиг просветления.



Мастер Фу и консультант по методологии
Когда Мастер Фу и его ученик Ньюби посещали святые места, по вечерам Мастер Фу имел обыкновение выступать перед неофитами UNIX тех городов и сёл, где они останавливались на ночлег.

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

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

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

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

"Но если он уронил свою сеть в озеро, - сказал консультант по методологии, - то почему он искал ее в лодке?"

"Потому, что он не умел плавать", - ответил Мастер Фу.

Услышав это, консультант достиг просветления.




Мастер Фу рассуждает о графическом пользовательском интерфейсе
Однажды вечером Мастер Фу и Ньюби посетили собрание программистов, которые встретились, чтобы поучиться друг у друга. Один из программистов спросил у Ньюби, к какой школе принадлежит он и его учитель. Когда Ньюби сказал, что он и его учитель - последователи Великого Пути UNIX, программист презрительно усмехнулся.

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

Мастер Фу не проронил ни слова, но указал на Луну. Находившийся поблизости пёс залаял на руку учителя.

"Я не понимаю вас", - сказал программист.

Мастер Фу молчал и показал на образ Будды. Потом указал на окно.

"Что вы хотите этим сказать?" - спросил программист.

Мастер Фу указал на голову программиста. Потом указал на камень.

"Почему вы не можете сказать яснее?" - потребовал программист.

Мастер Фу задумчиво нахмурился, дважды щелкнул программиста по носу и бросил его в находящийся рядом мусорный контейнер.

Пока программист пытался выбраться из горы мусора, пёс ходил рядом и лаял на него

В этот момент программист достиг просветления.



Мастер Фу и фанатик UNIX

Один фанатик UNIX, услышав, что Мастер Фу обладает мудростью Великого Пути, пришел к нему поучиться. Мастер Фу сказал ему:

Когда патриарх Томпсон изобрел UNIX, он не понял этого. Потом к нему пришло понимание, но он уже не мог ничего изобрести.

Когда патриарх Макилрой изобрел канал, он знал, что это преобразит программное обеспечение, но он не знал, что это изменит его мышление.

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

Действительно, патриархи были слепы и глупы!

Фанатик был очень рассержен словами Мастер Фу.

"Просвещенные, - запротестовал он, - открыли нам Великий путь UNIX. И если мы будем насмехаться над ними, мы потеряем добродетель и возродимся как звери или MCSE".

"Бывает ли когда-либо твой код полностью без погрешностей и ошибок?" - спросил Мастер Фу.

"Нет, - ответил фанатик, - такое недоступно человеку".

"Мудрость патриархов, - сказал Мастер Фу, - в том, что они знали, что они безумцы".

Услышав это, фанатик достиг просветления.




Мастер Фу рассуждает о природе UNIX
Один ученик сказал Мастеру Фу: "Нам говорят, что фирма SCO удерживает реальную власть над UNIX".

Мастер Фу кивнул в знак согласия.

Ученик продолжал: "Однако нам также говорят, что другая фирма, OpenGroup, также удерживает реальную власть над UNIX".

Мастер Фу кивнул в знак согласия.

"Как такое возможно?" - спросил ученик.

Мастер Фу ответил: "SCO действительно владеет кодом UNIX, но код UNIX - это не сама UNIX. OpenGroup действительно владеет маркой UNIX, но название UNIX - это не сама UNIX".

"В чем же тогда сущность UNIX?" - спросил студент.

Мастер Фу ответил: "Не в коде. Не в имени. Не в мышлении. Вообще ничего материального. Вечное изменение без перемен".

"Сущность UNIX проста и пуста. Поскольку она проста и пуста, она сильнее тайфуна"

"Повинуясь естественным законам, она непреклонно расцветает в умах программистов, ассимилируя конструкции в свою собственную природу. Всякое программное обеспечение, которое хотело бы конкурировать с UNIX, должно стать таким, как UNIX: пустым, пустым, глубоко пустым, абсолютно лишенным содержания потоком!"

Услышав это, ученик достиг просветления.




Мастер Фу и конечный пользователь

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

"Я хочу постичь тайны Великого Пути, но командная строка вводит меня в замешательство".

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

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

"Расскажи мне, - спросил он у неофита, - о коде, который ты написал, и о работе по проектированию, которую ты проделал".

Неофит начал, заикаясь, отвечать, но не мог ничего сказать.

Мастер Фу повернулся к пользователю. "Скажи мне, - осведомился он, - зачем ты ищешь Великий Путь?"

"Мне не нравится программное обеспечение, которое окружает меня, - отвечал пользователь. - Оно ненадежно работает и не радует глаз и сердце. Услышав о том, что путь UNIX, хотя и труден, но превосходен, я пытаюсь отбросить все препоны и обман".

"И чем же ты занимаешься, если так борешься с нынешним программным обеспечением?" - спросил Мастер Фу.

"Я - строитель, - ответил пользователь. - Многие дома в этом городе построены моими руками".

Мастер Фу повернулся к неофиту. "Кошка может насмехаться над тигром, - сказал он, - но это не превратит мяуканье в рев".

Услышав это, неофит достиг просветления.
Читать далее

Математические формулы в LaTeX: Math in LaTeX



47 коммент.
Этот пост является частью
большой статьи
"Как оформить диплом в LaTeX?",
которую написал virens,
ведущий блога
"Записки дебианщика"
Для того, чтобы написать диплом по физическим специальностям, трёхэтажных километровых формул набирать не надо, а надо усвоить несколько простых и понятных команд LaTeX. Потребуется освоить окружение нумерованных и ненумерованных формул, а так же набор массива формул. Ну и основные команды для обозначения математических символов.

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

Пост подвергался чистке и правке после публикации:
Автор заходил править этот пост 6 апреля 2013 года.

О формулах в целом

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

Заучивать команды для математических символов в LaTeX не нужно - вы и так большинство команд запомните за их красивые и лаконичные названия. Едва ли вы испытаете серьёзные затруднения с названиями греческих букв $\alpha$, $\gamma$ или $\delta$. Основные математические символы тоже должны быть в вашей интегрированной среде, такие как столь любимые физиками приближённые равенства $\approx$ или интегралы с суммами.

Быстрый старт - набор простых формул

Формулы можно вставлять в строке или торжественно на отдельной строке, по центру и с номером. Малозначительные формулы типа $f(x) = a\cdot x + b$ вставляются, как правило, в строчку, а что-то серьёзное, вроде разложения в ряд Фурье:

\begin{equation}\label{eq:fourierrow}
f(x) = \frac{A_0}{2} + \sum \limits_{n=1}^{\infty} A_n \cos \left( \frac{2 n \pi x}{\nu} - \alpha_n \right) 
\end{equation}

оформляется с помощью окружения \begin{equation}\label{ссылка} ... \end{equation}.

Набранная формула выглядит так:
При этом напротив неё будет помещён номер, сгенерированный автоматически. Для того, чтобы сослаться на эту формулу, в LaTeX тексте будем ставить (\ref{ссылка}) чтобы на неё сослаться. Имена ссылкам стоит давать на латиннице, во избежание проблем. Если формула приводится для пояснений и ссылаться на неё не надо, следует поставить после equation звёздочку, то есть equation* и после этого номер для данной формулы генерироваться не будет.
Смысл использования LaTeX - создание логичного, структурированного документа, а не каши из кривого оформления и потока сознания.
Ссылки должны быть осмысленными и безошибочно говорить автору текста, какая формула имеется в виду. Не стоит потворствовать лени и глупости, проявляющихся в ссылках типа \label{uravnenie6} - следует спросить себя, что означает эта формула и дать ей осмысленное имя.

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

Чтобы вставить формулу внутрь текста, используем окружение $ $, внутри которого помещаем формулу. Окружение $ $ переводит LaTeX в математический режим и будет отрисовывать формулы. Например: $\alpha_0$ даст нам греческую букву АЛЬФА с индексом 0. 

Подчёркиванием в LaTeX делается нижний индекс, и использовать подчёркивание в тексте нельзя (для подчеркивания в тексте есть пакет расширений ulem). Если хотите набирать длинные пассажи в подчёркивании - ставьте фигурные скобки $x_{i,j}$.

Кроме того, ЛаТеХ категорически против двойного нижнего индекса, и команда $x_j_k$ приведёт к ошибке. Но фигурные скобки позволят нам надурить LaTeX и сделать двойной индекс так: $x_{j_k}$. Если же вам нужен верхний индекс в формуле, используем символ ^ так: $x^2$. LaTeX возведёт в степень только первый символ после крышки, и если в степень нужно возвести сразу много символов, экранируем их фигурными скобками (они не отображаются в тексте): $x^{2x+1}$.

Если же вы хотите набрать в формуле фигурные скобки, следует заэкранировать их вот так: \{  и они будут отрисованы в формуле, например $x \{j \}$

О символах в LaTeX

Символов в LaTeX огромное количество, и большинство их собрано в справочном файле под названием symbols-a4.pdf.

Если вы обрабатываете изображения, вам пригодится команда \times, что позволяет набирать вставки типа NхM в более приглядном виде $N\times M$. А если нужно набрать в LaTeX символ градуса, можно воспользоваться таким трюком: $180^\circ$, что наберёт 180 градусов. Символ "Принадлежит" в Latex это $\in$, а символ "Любой" в это $\forall$.
Для тех, кому нужно работать с Фурье-преобразованием, будет приятно набрать букву F в более торжественном стиле для функций, над которым выполняется преобразование: $\mathcal{F} {g(x,y)}$ наберёт большую и красивую букву F для фурье-преобразования.

Набор скобок в LaTeX немного замороченный на первый взгляд. Можно просто поставить обычные скобки, но если формула большая, то можно поставить большие скобки в LaTeX командой $\Bigr($ и $\Bigl)$. Скобок можно поставить много и на любой вкус и размер с помощью команд ( \big( \Big( \bigg( \Bigg( которые превратятся в тексте вот в это:
Автор настоятельно рекомендует отличный вебсервис Detexify: в броузере вы просто рисуете символ, который хотите вставить в LaTeX, и вебсервис попытается угадать и выдать соответствующую команду для LaTeX.

 LaTeX прост!

Ещё раз подчеркну: LaTeX не сложен, он прост, как рельса. И LaTeX сделает буквально то, что вы попросите. Поэтому не бойтесь в коде документа перемежать текст вставками математического режима - такой слегка костылявый способ приведёт вас к желаемому результату быстро и просто. Несколько дней практики, и вы будете рубить формулы в LaTeX, как Чапай белогвардейцев.

... и парочка примеров формул в LaTeX

От слов к делу - сейчас мы разберём несколько примеров набора формул. С точки зрения математиков, примеры ниже кошмарны полным отсутствием смысла, но идею набора формул в LaTeX передать должны.

Набор формулы LaTeX с дробью и суммами

Пример первый: набор формулы с дробью и суммами:
LaTeX код этой формулы:   

\begin{equation} 
f(x,y,\alpha, \beta) = \frac{\sum \limits_{n=1}^{\infty} 
A_n \cos \left( \frac{2 n \pi x}{\nu} \right)} {\prod \mathcal{F} {g(x,y)} } 
\end{equation}

Здесь хочется ещё раз подчеркнуть важность структурирования своего LaTeXовского кода, без сваливания всего в одну кучу и набора в строчку длинных формул. Иначе потом не поймёте, где отец, а где кузнец.

Если посмотреть на код формулы без страха и ужаса, можно заметить много простых и понятных английских слов. Слово \sum это, видимо, суммирование, а \limits - пределы суммирования. Если немного напрячь познания английского, то можно вспомнить слово fraction и догадаться, что \frac скорее всего набирает дроби. Как видно, набор формул в LaTeX для тех, каким-то образом получивших техническое образование вместе с зачатками знаний английской языка, не такая уже сложная задача.
Дроби набираются командой \frac{числитель}{знаменатель}. Удобно набирать числитель и знаменатель в дробях на разных строчках в коде - так проще потом работать с формулой. 

Примечательная команда \limits, которая позволяет набирать верхние и нижние пределы в формулах LaTeX. Сама по себе команда \sum, \prod или \int просто отрисовывает интеграл, а если нужно над ними ставить пределы - вспоминаем по \limits_{n=1}^{\infty}. Здесь нижний предел это n=1, а верхний предел бесконечен (символ бесконечности в LaTeX это команда \infty).

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

Длинные формулы в LaTeX

Например, нужно набрать длинную формулу, а она не умещается в строчку. Вот пример такого монстра:
Код формулы: 

\begin{eqnarray} S_{\text{вых}}(x_2, y_2) = \iint dx_0 dy_0 A_0 g(x_0, y_0) \cdot h(x_2-x_0, y_2 -y_0) = \\
 = A_0 \underbrace{\iint dx_0 dy_0 \; g(x_0, y_0) 
\cdot h(x_2-x_0, y_2 -y_0)}_{\text{по определению это есть свёртка }} = A_0 g \otimes h 
\end{eqnarray}
 
Новых конструкций здесь несколько.

Во-первых, интеграл, да не простой, а двойной. Интеграл в LaTeX отрисовывается командой $\int$, двойной интеграл в LaTeX это $\iint$.

Во-вторых, внизу формулы есть подпись - её можно поставить с помощью команды \underbrace{формула}_{подпись}. Подпись под буквой можно вставить, воспользовавшись командой \text{текст}, которая на время выключит математический режим в формуле и вставит текст.

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

Так же можно отметить маленькую, но очень изящную команду \cdot, которая наберёт вам маленькую точечку умножения вместо этой страшной вордовской *. Так же в этом примере показано, как поставить пробел в формуле LaTeX, а именно командой \; то есть $dx_0 dy_0 \; g(x_0, y_0)$.

Большие и страшные формулы в несколько строк

Если формула очень длинная и в строку не помещается, используем окружение \begin{eqnarray} ... \end{eqnarray}, а переносы формулы на другую строку делаем с помощью двойного слеша \\ и в результате получаем:
\begin{eqnarray}
J_\lambda(x_2, y_2, s_2) =
\iint K_\lambda(x_2, y_2) \cdot \Bigl| m_\lambda
\left(
\frac{x_2-x_0}{\lambda \cdot s_2} , \frac{y_2-y_0}{\lambda \cdot s_2}\right)\Bigr|^2 \,dx_0\,dy_0 = \nonumber \\
= K_\lambda(x_2, y_2) \otimes \Bigl| m_\lambda \left( \frac{x_2}{\lambda \cdot s_2} , \frac{y_2}{\lambda \cdot s_2} \right) \Bigr|^2
\end{eqnarray}
 
Здесь стоит отметить команду \Bigl| для отрисовки вертикальной линии - после Bigl стоит прямая скобка | и именно она отрисовывает линию в формуле. Конструкция \Bigl ... \Bigr позволяет ставить в формулах LaTeX большие скобки, и не только скобки: в данном случае приведён пример с модулем.

Окружение eqnarray позволяет набирать длинные формулы и нумеровать перенесённые на новую строку части формулы. По умолчанию номер ставится после каждой части формулы, перенесённой на новую строку. Если нумеровать кусок не нужно - ставим директиву \nonumber перед переносом формулы \\.

Формулы в LaTeX с несколькими вариантами (формула зависит от значения переменной)

Нам нужно вставить перечисление возможных значений формулы в зависимости от значения переменной, например:

Для этого стоит использовать окружение \begin{matrix} для набора таких сложных формул:

\begin{equation}
    \begin{matrix}
    \hat{\Phi}[k,l] & =
    & \left\{
    \begin{matrix}
    0 & \mbox{if } k,l = 0 \\
    S_x[k,l]\cdot H_x[k,l] + S_y[k,l]\cdot H_y[k,l] & \mbox{otherwise }
    \end{matrix} \right.
    \end{matrix}
\end{equation}

Следует отметить, что конструкция с \left{ работать не будет.

Заключение

Разумеется, это далеко не полное руководство по набору формул, но я думаю, что прочтение это поста поможет кому-то быстро включиться (а мне - вспомнить) про набор основных формул в LaTeX.
Читать далее

Набор таблиц в ЛаТеХе: Tables in LaTeX



48 коммент.
Этот пост является частью большой статьи
"Как оформить диплом в LaTeX?",
которую написал virens,
ведущий блога "Записки дебианщика".


Этот пост написан давно, но всё ещё актуален:
Автор заходил править этот пост 6 октября 2013 года.

При наборе таблиц в LaTeX, как нигде, нужна правильная организация кода - таблицы это то, что в ТеХе делать сложнее всего. И если вы свалите в кучу все управляющие метки ЛаТеХа, то потом будете проклинать всё на свете. Здесь каждый выбирает свой стиль по своему вкусу, однако надо постараться отличать управляющие символы от собственно текста таблицы.
Кое-кто из комментаторов ниже распалялся по поводу того, что, дескать, ``всё уже давно написано, читайте книжки''. Я ещё раз уточню свою позицию по этому поводу: время тыкания людей в пудовые талмуды и дурно написанные мануалы прошло. Документация, как и программы, должны быть повёрнуты к пользователю лицом. Методические пособия типа этого помогут людям начать разбираться с предметом, подталкивая к изучению книг и делая кривую обучения более пологой.
Так как вёрстка таблиц в ЛаТеХ - дело не для слабонервных, лучше предварительно набросать на листке бумаги или графическом редакторе примерную схему таблицы. Делать наброски карандашом всегда проще, чем с воем и рыданиями переделывать код таблицы.

Небольшое введение в ЛаТеХнические таблицы

Таблица в LaTeX в идеологическом смысле очень похожа на рисунок: есть окружение \begin{table}... \end{table}, которое собственно и содержит все ``опознавательные знаки'' вроде подписи и ссылки, и собственно сама таблица \begin{tabular}{|rlc|} ... \end{tabular}.

Поэтому окружений для создания таблиц в LaTeX два: \begin{tabular}{|rlc|} ... \end{tabular}, которое управляет тем, как выглядит таблица, и \begin{table}... \end{table}, которое даёт вам возможность оформить заголовок таблицы с помощью команды \caption{} и поставить на таблицу ссылку с помощью привычной команды \label{}.


Набор простой таблицы в LaTeX

Например, если нам не требуется ссылка на таблицу или подпись под ней, тогда достаточно только окружения \begin{tabular}... \end{tabular}. Окружение tabular создаст простую таблицу, без подписи и ссылки. Вот пример кода простой таблицы в ЛаТеХе.

\begin{center}
\begin{tabular}{ccc}
Расширение краёв: & \textbf{1,0-1,4} & размер ФРТ \\
Аподизация: & \textbf{0,25-0,30} & размер ФРТ \\
Сглаживания краёв: & \textbf{0,25-0,50}& размер ФРТ \\
\end{tabular}
\end{center}
 
Колонки отделяются символом &, строки в таблице заканчиваются двойным слешем \ после крайней колонки. А вот как таблица выглядит в документе:


Здесь есть партизанская засада: если вы внутрь окружения tabular поставите метку командой \label{}, а потом сошлётесь на неё, то получите совсем не то, что ждёте. Ссылка в тексте укажет на номер раздела, а вовсе не таблицы.

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

\begin{table}[H]
\caption{Исправьте это на подпись к таблице}
\label{tabular:timesandtenses}
\begin{center}
\begin{tabular}{ccc}
Расширение краёв: & \textbf{1,0-1,4} & размер ФРТ \\
Аподизация: & \textbf{0,25-0,30} & размер ФРТ \\
Сглаживания краёв: & \textbf{0,25-0,50}& размер ФРТ \\
\end{tabular}
\end{center}
\end{table}
 
Вот как это выглядит в документе:


Вроде как то же самое, только номер теперь стал 1.1. Простановка ссылок осуществляется так же, как и всегда, то есть: поставить ссылку в LaTeX можно командой \label{tabl:Textssylki} а сослаться на неё командой \ref{tabl:Textssylki}. Не забываем ставить тильду между словом и ссылкой слово~\ref{tabl:Textssylki} чтобы ваша ссылка не уехала на другую строчку.


Управление видом таблицы в LaTeX

Сама таблица, то есть текст, набранный строго по столбцам и колонкам, делается с помощью окружения tabular. Важно помнить, что tabular есть просто текст-как-таблица и не содержит заголовка или ссылки - это делает окружение table.

Точное размещение таблиц

Окружение table позволит вам указывать LaTeX, где вы хотите видеть таблицу:
  1. оставить определение места таблицы в тексте на усмотрение ЛаТеХа - \begin{table}[h] "хотелось бы таблицу здесь";
  2. настойчиво просить разместить таблицу после текста \begin{table}[h!] "очень хочу таблицу здесь", или
  3. ударить кулаком по столу - таблицу тут \begin{table}[H], то есть "хочу таблицу именно здесь и баста"
    • с прибавлением буквы p мы заставляем поместить ЛаТеХ таблицу отдельно на страницу так: \begin{table}[pH].
    • добавление букв t или b заставляют LaTeX поместить таблицу \begin{table}[tb!] вверху или внизу, соответственно.

Размеры колонок в таблице LaTeX

Сама по себе таблица находится в окружении \begin{tabular}{|rlc|} ... \end{tabular}. Здесь вертикальная линия обозначает отделение линией столбцов, а R L и С выравнивание соответственно по правому / левому краю и по центру.

Если столбец слишком широкий, можно задать его ширину с помощью выражения p{0.7\linewidth}, которое сделает столбец шириной в 70\% от ширины линии, например так: \begin{tabular}{|p{0.4\linewidth}p{0.4\linewidth}} сделает таблицу с двумя колонками по 40\% от ширины линии и отчеркнёт вертикальными линиями по бокам.

Строки отделяются друг от друга при помощи команды \hline а каждая строка таблицы завершается двойным слешем \\ или командой \linebreak.

Подписи и ссылки на таблицы
Вставка подписи к таблице \caption{Исправьте это на подпись к таблице} и ссылки на таблицу \label{tabular:timesandtenses} делается так же, как и для рисунков. То есть сначала \caption{Исправьте это на подпись к таблице} а после этого вставляем \label{tabular:timesandtenses} для того, чтобы потом сослаться на таблицу \ref{tabular:timesandtenses} в тексте.
Важное замечание о порядке следования \label и \caption Если поставить \label{tab:some_table} до \caption{...}, то даже при использовании окружения table в ссылке будет выдаваться не номер таблицы, а номер раздела.
Напоминаю снова и снова о необходимости ставить понятные и информативные ссылки, чтобы вы сами смогли потом понять, где то место, куда вы ссылаетесь. Ставим длинные и подробные имена ссылок, чтобы потом не искать по Тайге ris21 или tabl43. Никаких оправданий таким именам ссылок нет, и дядя Кнут будет недоволен.


Объединение нескольких колонок в одну

Иногда нужно объединить несколько колонок в одну на какой-то строке и убрать вертикальные линии для этого, например, чтобы сделать пояснения. В визуальных табличных редакторах типа OpenOffice.Calc это просто, но так как ЛаТеХе - это вообще говоря язык программирования, то здесь придётся немного сложнее. Для этого нужно воспользоваться командой \multicolumn.

Синтаксис у команды простой: \multicolumn{2}{|c|}{Результаты измерений} означает, что мы объединяем 2 (два) столбца в таблице, получившаяся ячейка будет центрирована и нарисованы вертикальные линии. В объединённой колонке на той строке, где мы поместим команду \multicolumn, будет текст Результаты измерений. Вот как это выглядит в коде:

\begin{table}[H]
\caption{\label{tab:canonsummary}Измерительные характеристики цифровой камеры Canon EOS 400D.}
\begin{center}
\begin{tabular}{|c|c|}
\hline
Параметр & Значение \\
\hline
Разрешение & $3888 \times 2592$ \\
Размер сенсора & $22.2 \times 14.8$ мм \\
АЦП & 12~bit\\
\hline
\multicolumn{2}{|c|}{Результаты измерений} \\
\hline
Темновое смещение (BLO) & 256 \\
Максимальный линейный сигнал & 3070~DN \\
Значение насыщения & 3470~DN \\
\hline
\end{tabular}
\end{center}
\end{table} 
 
А вот как эта таблица будет выглядеть в документе:


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


Многостраничные таблицы

Время от времени таблицы становятся длинными до неприличия и не влезают в одну страницу. Чтобы сделать многостраничную таблицу в LaTeX, используем пакет расширений \usepackage{longtable}, который подключаем в преамбуле документа (там, где остальные команды типа \usepackage). В остальном всё то же самое, как и раньше, только используем окружение longtable вместо table. Вот пример:

\begin{longtable}[H]{lp{0.7\linewidth}}
$A$ & area of the (geometrical) pixel [m\textsuperscript2] \\
$c$ & Speed of light $\approx 3 \cdot 10^8$ m/s \\
$DYN_{in}$ & Input dynamic range [1] \\
$DYN_{out}$ & Output dynamic range~[1] \\
$E$ & irradiance on the sensor surface~[W/m\textsuperscript2] \\
$F$ & Non-whiteness coefficient \\
$h$ & Planck's constant h $\approx6.63 \cdot 10^{-34} Js$ \\
$K$ & overall system gain~[DN/e-] \\
$k_d$ & Doubling temperature of the dark current~[$^\circ$C] \\
$N_d$ & dark current~[e-/s] \\
$N_{d30}$ & dark current for a housing temperature of $30^\circ C$~[e-/s]\textsuperscript2 \\
$S_g^2$ & variance coefficient of the spatial gain noise~[\%] \\
\end{longtable} 
 
Вот как это выглядит в документе:



Стоит упомянуть, что если столбец слишком широкий, можно задать его ширину вот так: \begin{longtable}[h]{lp{0.7\linewidth}} с помощью выражения p{0.7\linewidth}, которое сделает столбец шириной в 70% от ширины линии.



Поворот таблицы в LaTeX

Ну и под занавес приведу пример достаточно сложной таблицы, которая повёрнута на 90 градусов (таблица в ландшафтной ориентации в ЛаТеХе). Поворот сделан при помощи команды \rotatebox{90}{я - объект} что обеспечивает поворот любого объекта на 90 градусов. Так как данные структурированы и код организован достаточно логично, редактировать таблицу относительно просто. 

\rotatebox{90}{ %это обеспечивает поворот любого объекта
\begin{minipage}{1.5\linewidth}
\begin{table}[H]
\caption{Сравнение количественных данных по влиянию искажений на результат декодирования}
\begin{center}
\begin{tabular}{|p{5cm}c|c|}
\hline
\multicolumn{3}{|c|}{\textbf{Графические изображения}}\\
\hline
\textbf{Характеристика} & \textbf{8-битные} & \textbf{16-битные}\\
\hline
\multicolumn{3}{|c|}{Влияние шумов квантования}\\
\hline
Шумы квантования
& $6.3 \div 22.6\%$
& $0.2 \div 0.5\%$ \\
\hline
\multicolumn{3}{|c|}{Влияние шумов фотоприёмника}\\
\hline
Шумы фотоприёмника
& $8.8 \div 87.5\%$
& $7.1 \div 87.6\%$ \\
\hline
\multicolumn{3}{|c|}{Влияние особенностей ФРТ}\\
\hline
декодирование ФРТ той же реализацией шума
& $6 \div 13\%$
& $0.5 \div 15\%$ \\
\hline
декодирование ФРТ с другой реализацией шума
& $6 \div 14\%$
& $0.3 \div 12\%$ \\
\hline
декодирование идеальным ФРТ
& $6 \div 6.5\%$
& $0.2 \div 6.4\%$ \\
\hline
\end{tabular}
\end{center}
\end{table}
\end{minipage}} 
 
Вот как таблица выглядит в документе:


Есть и другие команды для поворота объектов в LaTeX, например turn из пакета rotating. Преимущество команды \rotatebox в том, что она содержится в пакете \usepackage{rotating} и обычно graphicx уже подключён для отображения иллюстраций в LaTeX.

Заключение

В этом разделе я собрал все примеры таблиц, которые использовал в реальных документах. Этого должно хватить для того, чтобы оформить простые таблицы в LaTeX. Более сложные таблицы описаны в постах:
Главное - не лениться структурировать код таблицы, и тогда таблицы в ЛаТеХе не превратятся для вас в камеру пыток.

Читать далее