24 Январь 2009

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

Несколько историй из замечательной книги "Искусство программирования для 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, хотя и труден, но превосходен, я пытаюсь отбросить все препоны и обман".

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

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

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

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

читать далее...

а если копируете статью - поставьте ссылку на оригинал!

19 Январь 2009

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

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

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

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


О формулах в целом
Первое и главное - пользуйтесь тем, что предоставляет вам интегрированная среда. В её вкладках должны быть таблицы греческих символов, основных математических операторов и прочего. Самое главное, что их в таком виде гораздо проще найти и быстренько вставить, не перелистывая талмуд со специальными символами. Специально учить это не нужно, вы и так большинство команд запомните за их красивые и лаконичные названия. Едва ли вы испытаете серьёзные затруднения с названиями греческих букв $\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}. При этом напротив неё будет помещён номер, а в тексте будем ставить (\ref{ссылка}) чтобы на неё сослаться. Если формула приводится для пояснений и ссылаться на неё не надо, следует поставить после equation звёздочку, то есть equation*

Внутрь можно вставить метку с помощью команды \label{ссылка}. Как уже отмечалось, ставить нужно осмысленные ссылки и выбивать из своей головы лень и глупость, проявляющуюся в ссылках типа \label{uravnenie6}.

Если в математическом режиме нужно поставить верхний индекс в LaTeX, набираем символ возведения в степень $x^2$. Тут есть хитрая партизанская засада: LaTeX возведёт в степень только первый символ после крышки. Для того, чтобы набирать длинные формулы в степенях, используем фигурные скобки $x^{2a + b}$. Полезно оставлять между символами пробелы, а не лепить всё в одну кучу. Нижний индекс в LaTeX набирается символом подчёркивания $x_1$, и партизанская засада тут та же самая: хотите набирать длинные пассажи в подчёркивании - ставьте фигурные скобки $x_{i,j}$. Пару дней практики, и вы будете рубить формулы в LaTeX, как Чапай белогвардейцев.

Если вы обрабатываете изображения, вам пригодится команда \times, что позволяет набирать вставки типа NхM в более приглядном виде $N\times M$. А если нужно набрать в LaTeX символ градуса, можно воспользоваться таким трюком: $180^\circ$, что наберёт 180 градусов.

Короче говоря, чтобы вставить формулу внутрь текста, используем ненумеруемое окружение $ $, внутри которого помещаем формулу, например: $\alpha_0$ это даст нам букву АЛЬФА с индексом 0. Если же вам нужен верхний индекс в формуле, используем символ ^ так: $x^2$, а если в степень нужно возвести сразу много символов, экранируем их фигурными скобками (они не отображаются в тексте): $x^{2x+1}$.

Ещё раз подчеркну: 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 немного замороченный на первый взгляд. Можно просто поставить обычные скобки, но если формула большая, то можно поставить большие скобки в LaTeX командой $\Bigr($ и $\Bigl)$.

Для тех, кому нужно работать с Фурье-преобразованием, будет приятно набрать букву F в более торжественном стиле для функций, над которым выполняется преобразование: $\mathcal{F} \{g(x,y)\}$ наберёт большую и красивую букву F для фурье-преобразования.

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

Этот материал написал Михаил Конник aka virens и опубликовал на своём блоге Записки дебианщика.


\subsection{Длинные формулы в 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)$.

Этот материал написал Михаил Конник aka virens и опубликовал на своём блоге Записки дебианщика.




Большие и страшные формулы в несколько строк Если формула очень длинная и в строку не помещается, используем окружение \begin{eqnarray} ... \end{eqnarray}, а переносы формулы на другую строку делаем с помощью \\
В результате получаем:


Код формулы:

\begin{eqnarray}
J_\lambda(x_2, y_2, s_2) =
\iint I_\lambda(x_2, y_2) \cdot \Biglm_\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 \\
= I_\lambda(x_2, y_2) \otimes \Biglm_\lambda \left( \frac{x_2}{\lambda \cdot s_2} , \frac{y_2}{\lambda \cdot s_2} \right) \Bigr^2
\end{eqnarray}


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

В коде формулы я так же хочу отметить конструкцию \Bigl ... \Bigr. Это позволит вам ставить в формулах LaTeX большие скобки, и не только скобки: в данном случае приведён пример с модулем.


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

читать далее...

а если копируете статью - поставьте ссылку на оригинал!

05 Январь 2009

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

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

При наборе таблиц в LaTeX, как нигде, нужна правильная организация кода. Откровенно говоря, таблицы - это то, что в ТеХе делать сложнее всего. И если вы свалите в кучу все управляющие метки ЛаТеХа, то проклянете потом всё на свете. Однако если делать всё грамотно и не лениться, то сделать таблицу в LaTeX не так трудно. Ещё раз подчеркну, что в деле набора таблиц в ЛаТеХе как нигде важно структурирование кода. Здесь каждый выбирает свой стиль по своему вкусу, однако надо постараться отличать управляющие символы от собственно текста таблицы. Например, символ & можно помещать на новую строку.

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

Есть одна вещь, которую почему-то не освещают в книжках, и совершенно напрасно. Дело в том, что есть для таблиц два окружения - \begin{table}... \end{table} и \begin{tabular}{|rlc|} ... \end{tabular}+. Так вот, окружение table, как ни странно, вам таблицу не создаст, и вы будете тщетно биться лбом о стену. Окружение table даёт вам возможность оформить заголовок таблицы с помощью \caption{} и поставить на таблицу ссылку с помощью привычного \label{}.

Кое-кто из комментаторов распалялся по поводу того, что, дескать, ``всё уже давно написано, читайте книжки''. Я ещё раз уточню свою позицию по этому поводу: время тыкания людей в пудовые талмуды и дурно написанные маны прошло. Документация, как и программы, должны быть повёрнуты к пользователю лицом, а не задницей. Специализированные методические пособия типа этого помогут людям начать разбираться с предметом, подталкивая к изучению книг и делая кривую обучения более пологой. Но это лирика и я не буду на ней задерживаться.

Сама таблица, то есть текст, набранный строго по столбцам и колонкам, делается с помощью окружения tabular. Важно помнить, что tabular есть просто текст-как-таблица и не содержит заголовка или ссылки. Сама по себе таблица находится в окружении \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. В общем, это всё, что нужно для набора таблиц. Ну и немного удачи, конечно :-)

Этот материал написал Михаил Конник aka virens и опубликовал на своём блоге Записки дебианщика.


И немного вещей, которые помогут вам в дальнейшем. Набросайте на листке бумаги или графическом редакторе примерную схему таблицы - это всегда проще, а заодно есть возможность подумать о том, а нужна ли таблица вообще. Если решили, что она всё-таки нужна, то это торжественное дело нужно скорее всего оформить по центру, для чего вам пригодится окружение \begin{center} \end{center}. Простановка ссылок осуществляется так же, как и всегда, то есть: поставить ссылку в LaTeX можно командой \label{tabl:Textssylki} а сослаться на неё командой \ref{tabl:Textssylki}. Не забываем ставить тильду между словом и ссылкой слово~\ref{tabl:Textssylki} чтобы ваша ссылка не уехала на другую строчку.

Напоминаю снова и снова о необходимости ставить понятные и информативные ссылки, чтобы вы сами смогли потом понять, где то место, куда вы ссылаетесь. Ставим длинные и подробные имена ссылок, чтобы потом не искать по Тайге ris21 или tabl43. Никаких оправданий таким именам ссылок нет, и дядя Кнут будет недоволен :-)

Итак, прочтите ещё разок этот текст сначала для лучшего запоминания и давайте разберём пару примерчиков.



Набор простой таблицы в LaTeX
Например, нам не требуется ссылка на таблицу или подпись под ней - тогда достаточно только окружения \begin{tabular}... \end{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}



Расширение краёв: 1,0-1,4 размер ФРТ
Аподизация: 0,25-0,30 размер ФРТ
Сглаживания краёв: 0,25-0,50 размер ФРТ



Здесь есть та самая партизанская засада, про которую я говорил выше: если вы внутрь окружения 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:
Исправьте это на подпись к таблице
Расширение краёв:1,0-1,4размер ФРТ
Аподизация:0,25-0,30размер ФРТ
Сглаживания краёв:0,25-0,50размер ФРТ


Вроде как то же самое, только номер теперь стал 1.1. А кроме того, окружение table позволит вам указывать LaTeX, где вы хотите видеть таблицу:

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

Вставка подписи к таблице \caption{Исправьте это на подпись к таблице} и ссылки на таблицу \label{tabular:timesandtenses} делается так же, как и для рисунков.



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

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

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

Таблица 2: Измерительные характеристики цифровой камеры Canon EOS 400D.
Параметр Значение
Разрешение 3888х2592
Размер сенсора 22.2х14.8 мм
АЦП 12 bit
Результаты измерений
Темновое смещение (BLO) 256
Максимальный линейный сигнал 3070 DN
Значение насыщения 3470 DN




\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}

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


Многостраничные таблицы
Время от времени таблицы становятся длинными до неприличия и не влезают в одну страницу. Чтобы сделать многостраничную таблицу в ЛаТеХе, используем пакет расширений \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\% от ширины линии.

Этот материал написал Михаил Конник aka virens и опубликовал на своём блоге Записки дебианщика.


Таблицы с объединением столбцов
Для того, чтобы несколько столбцов объединить в один (особенно в начале таблицы, для заголовков), применяется хитрый приём, сочетающий в себе несколько трюков. Я в начале не зря говорил, что таблицы в ЛаТеХе часто - занятие не для слабонервных :-) И тем не менее, выход есть всегда, вот например:

Таблица: Нестандартные болты для левой резьбы.

Диаметр
Нестандартные болты Норма Разброс
Размеры 10 мм 1 мм


Разбор полётов: для этой таблицы использован трюк с \multicolumn для объединения двух ячеек в одну, \cline{2-3} для прочерчивания горизонтальной линии в таблице от второй колонки до третьей, и \raisebox для вставки надписи Нестандартные болты. А вот и код:

\begin{table}[H]
\caption{\label{tab:bolts} Нестандартные болты для левой резьбы.}
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
& \multicolumn{2}{c|}{Диаметр} \\
\cline{2-3}
\raisebox{1.5ex}[0cm][0cm]{Нестандартные болты}
& Норма & Разброс \\
\hline
Размеры & 10 мм & 1 мм \\
\hline
\end{tabular}
\end{center}
\end{table}

Надеюсь, что с такими таблицами вы будете встречаться так же редко, как и с такими экзотическими болтами.


Поворот таблицы в LaTeX
Ну и под занавес приведу пример достаточно сложной таблицы, которая повёрнута на 90 градусов (таблица в ландшафтной ориентации в ЛаТеХе). Поворот сделан при помощи команды \rotatebox{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}}


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

читать далее...

а если копируете статью - поставьте ссылку на оригинал!

Поиск по сайту

Архивы блога

Новостная лента


Читать новости блога удобнее с помощью подписки на
-ленту. RSS-анонс Twitter
Получать на E-mail Записки дебианщика rss2email.ru

Последние новости

Все записки дебианщика

Скачать локальную версию блога "Записки дебианщика" для offline-просмотра можно здесь. Архив 7z занимает ~120Мб, в распакованном виде ~2Гб.

Постоянные читатели

Экипаж

Автор
My Photo
Михаил Конник
Инженер-физик, занимаюсь оптикой и цифровой обработкой изображений. Профиль
Главный редактор
Моя фотография
Programmaster, в полный рост

Кнопки