воскресенье, 1 мая 2011 г.

LaTeX, Tabular и костыли...

Сегодня я покажу как решить ещё одну проблему с tabular. У всех наверное возникало желание сделать таблицу со столбцами необходимого размера. Обычно это делается вводной строкой по виду:

\begin{tabular}{|p{0.15\textheight}|p{0.2\textheight}|p{0.2\textheight}|}\hline
Я хочу быть в центре & $1$ & $м^2$  \\
Я тоже хочу быть в центре & $2$ & $см^2$ \\
А я буду в центре & $3$ & $дм^2$ \\\hline
\end{tabular}

 И получаем мы что-то типо:
Но как быть, если мне надо, чтобы цифры из второго столбца были в центре? Ну и вообще, если я хочу сделать более красиво?

Нам понадобиться пакет \usepackage{array}. Почитав к нему документацию я нарыл полезных вещей. Начнемс.
При импорте пакета у нас появляется возможность использовать структуру:
>{decl.} и <{post decl.}
Первая команда помогает нам декларировать прямо перед надписью в строке, а вторая соответственно после, любой текст и команды. Теперь на живом примере покажу как и что можно сделать.
Исправляем код, на вот такой:

\begin{tabular}{|p{0.15\textheight}|>{$}p{0.2\textheight}<{$}|>{$}p{0.2\textheight}<{$}|}\hline
Я хочу быть в центре & 1 & м^2  \\
Я тоже хочу быть в центре & 2 & см^2 \\
А я буду в центре & 3 & дм^2 \\\hline
\end{tabular}

Компилируем и видим, что ничего не изменилось. Однако, LaTeX не вывалил ошибки по поводу того, что у нас стоит ^2 без соответствующих $...$. Теперь рассмотрим почему. Как говорилось ранее, команды >{decl.} и <{post decl.} добавляют чепуху в нашей строке. В нашем случае происходит добавление необходимых знаков $...$ до и после командами:
>{$} и <{$}
Мы избавились от ненужного копипаста, дальше больше, непосредственное центрование. Кто знает чутка как ковырять LaTeX, уже знает команду \centering. Так как у нас создаётся в каждой ячейке таблицы \parbox{width}{}, то внутри него можно объявлять команду \centering и мы не получим никаких лишних сюрпризов. Но не будем же мы каждый раз писать в каждой ячейке эту команду? Правильно, добавляем её подобным макаром, но с одним небольшим НО:

\begin{tabular}{|p{0.15\textheight}|>{\centering\arraybackslash$}p{0.2\textheight}<{$}|>{$}p{0.2\textheight}<{$}|}\hline
Я хочу быть в центре & 1 & м^2  \\
Я тоже хочу быть в центре & 2 & см^2 \\
А я буду в центре & 3 & дм^2 \\\hline
\end{tabular}

На выходе получаем следующее:
Теперь о этом самом НО. Если не написать после \centering \arraybackslash, то в случае таблицы у нас будут матюки и вся программа вывалиться. \arraybackslash означает что-то типо \\, но вдаваться в подробности не буду, если надо, то почитаете сами.

А теперь чертовски хитрый ход конём. Чтобы не писать каждый раз эту длинную фразу к каждому столбцу умные люди придумали следующее:
\newcolumntype{X}[1]{>{\centering\arraybackslash}p{#1}} 
Да, да, это функция, но только специфическая. Она создаёт новый тип колонки, который вызывается через X{width}, и делает колонку по центру. Соответственно можно модифицировать как хочется.
Ну а теперь полный мастеркласс:
\usepackage{array}
\newcolumntype{X}[1]{>{\centering\arraybackslash}p{#1}}
\usepackage{rotating} 
\begin{tabular}{|X{0.1\textheight}@{\hspace{0.1\textheight}--->}>{\begin{sideways}$}X{0.1\textheight}<{$\end{sideways}}||>{$}X{0.1\textheight}<{$}|}\hline
Я хочу быть в центре & 1 & м^2  \\ \cline{3-3}
Я тоже хочу быть в центре & 2 & см^2 \\ \cline{3-3}
А я буду в центре & 3 & дм^2 \\\hline
\end{tabular} 

На выходе получаем следующее:

Помимо сказанного я применил фишку с добавлением отступа и разделителя командой
@{\hspace{0.1\textheight}--->}
Заметим, что цифры повернулись слево, это делается командой \begin{sideways}...\end{sideways} из пакета \usepackage{rotating}, которую мы тоже забабахали в объявление таблицы.

+ ко всему прочему, я заюзал команду \cline, о которой не знает только ленивый.
На этом пожалуй всё, удачи Вам в ваших LaTeX'ованиях!

Комментариев нет:

Отправить комментарий