Опубликован: 07.02.2007 | Доступ: свободный | Студентов: 4014 / 1341 | Оценка: 4.56 / 3.95 | Длительность: 23:09:00
Специальности: Художник
Лекция 7:

Создание новых команд

Модификация оформления перечней

Начнем с {itemize}. Чтобы поменять значки, которыми помечаются элементы перечня, надо переопределить команду \labelitemi. Если, например, мы хотим, чтобы элементы перечня отмечались не черными кружками, а галочками \surd, то достаточно написать в преамбуле

\renewcommand{\labelitemi}{$\surd$}

. Если окружение {itemize} расположено внутри другого окружения {itemize}, как в примере на {itemize}, то значки для пометки элементов перечня будут уже, вообще говоря, другими: их вид задается командой \labelitemii ; вид значков для пометок элементов itemize на третьем и четвертом уровнях вложенности задается командами \labelitemiii и \labelitemiv ; их также можно переопределять.

Правильнее было бы определять заголовки для itemize чуть хитрее. Например, наше определение \labelitemi лучше дать так:

\renewcommand{\labelitemi}{$\mathsurround=0pt \surd$}

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

Теперь рассмотрим окружение {enumerate}. Коль скоро оно автоматически нумерует элементы перечня, можно предположить, что это окружение связано с LaTeX'овскими счетчиками. Так оно на самом деле и есть: это окружение использует счетчик enumi. Если одно {enumerate} вложено в другое, то используются счетчики enumii, enumiii и enumiv для нумерации элементов перечня на втором, третьем и четвертом уровнях вложенности. С другой стороны, сами значки, помечающие элементы перечня, порождаются командами \labelenumi, \labelenumii, \labelenumiii и \labelenumiv — в зависимости от уровня вложенности. Например, команда \labelenumi определена так:

\newcommand{\labelenumi}{\theenumi.}

в то время как the-команда, определяющая представление счетчика enumi на печати, определена просто как

\newcommand{\theenumi}{\arabic{enumi}}

Стало быть, если мы не меняем стандартного стиля оформления, то элементы перечня {enumerate} (не вложенного в другой {enumerate} ) будут нумероваться цифрами с точкой. Если же мы хотим, скажем, чтобы после цифры шла не точка, а скобка (как в нашей книге), то можно в преамбуле написать

\renewcommand{\labelenumi}{\theenumi)}

Если же мы к тому же хотим, чтобы элементы перечня нумеровались римскими цифрами, то можно написать еще и так:

\renewcommand{\theenumi}{\Roman{enumi}}

Аналогичным образом можно менять оформление нумерованных перечней на других уровнях вложенности.

Если вы хотите изменить оформление перечня более серьезным образом (например, установить другую величину полей, или сделать так, чтобы значки, помечающие элементы перечня, были выровнены по левому, а не по правому краю), то вам придется подождать до "лекции 9" .

Параметры со значением длины

Наряду со счетчиками — переменными с целочисленными значениями, — при создании собственных макроопределений возникает нужда и в переменных, значениями которых являются длины. Например, в предыдущем разделе мы, разрабатывая команду \razdel, в явном виде задали промежуток между заголовком раздела и остальным текстом. Если этот промежуток нам почему-либо захочется изменить, то придется снова залезать в определение команды \razdel. Было бы удобнее, если бы в нашем распоряжении был параметр под названием, скажем, \otstup, так что можно было бы в определении команды \razdel написать

\vspace{\otstup}

и потом отдельно написать, допустим,

\otstup=1cm plus 3mm minus .5mm

Правда, в богатом наборе TeX'овских и LaTeX'овских параметров требуемого нам параметра \otstup нет, но это не страшно, поскольку его можно создать. Для этого используется команда \newlength:

\newlength{\otstup}

После того, как вы (допустим, в преамбуле) дали эту команду, будет определен новый параметр со значением длины; его можно будет обычным образом использовать в аргументах команд наподобие \vspace, и ему можно будет обычным образом присваивать значения.

Теперь — точные правила. Команда \newlength имеет один обязательный аргумент — имя команды, обозначающей определяемый вами параметр. Это имя должно подчиняться обычным правилам для TeX'овских команд (backslash, после которого следует либо одна не-буква, либо последовательность букв). Если это имя уже занято, LaTeX выдаст сообщение об ошибке. Определение нового параметра, совершаемое командой \newlength, является "глобальным": даже если эта команда была дана внутри группы, TeX будет помнить о существовании этого параметра и по выходе из группы. По этой причине разумное место для команды \newlength — преамбула.

Определенный нами параметр со значением длины приобретает такой же статус, как уже существующие TeX'овские и LaTeX'овские параметры ( \parindent, \textwidth и другие). Рассмотрим, что можно делать с этими параметрами.

Во-первых, параметрам со значением длины можно присваивать значения. Делается это точно так же, как это объяснялось ранее на примере параметра \parindent: для присваивания значения надо написать имя параметра, знак равенства, а после знака равенства — величину присваиваемой длины. Пробелы после указания единицы длины TeX'ом игнорируются (скорее всего, вы будете присваивать значения параметрам в преамбуле документа или между абзацами, где лишние пробелы никого не волнуют). Длина должна быть выражена в единицах, воспринимаемых TeX'ом. Даже если вы присваиваете нулевую длину, какая-то единица длины должна быть явно указана (например, 0pt). Кроме того, можно воспользоваться LaTeX'овской командой \setlength, имеющей два обязательных аргумента: первый — имя параметра, второй — значение длины, присваиваемое этому параметру. Таким образом, команды

\parindent=1.5em

и

\setlength{\parindent}{1.5em}

равносильны. Наконец, присваивания, сделанные внутри группы, забываются по выходе из этой группы.

В предыдущем абзаце мы умолчали об одной возможной неприятности. Дело в том, что если после команды присваивания, не использующей \setlength, следует (пусть даже после пробела) слово plus или minus, то TeX, скорее всего, выдаст сообщение об ошибке, поскольку решит, что длина должна иметь, помимо " естественного размера", еще и plus - или minus -компоненту. Если вы пишете текст на русском языке, вероятность такого стечения обстоятельств ничтожна, но тем не менее забывать о такой опасности не следует, особенно если команда присваивания входит в макроопределение: вы же не знаете заранее, в какое место может попасть новый макрос. Чтобы застраховаться от этой неприятности раз и навсегда, пользуйтесь командой \setlength, хоть это и длиннее.

Параметры со значением длины можно использовать всюду, где в аргументе LaTeX'овской команды требуется указать размер. Пусть, например, в преамбуле документа написано

\newlength{\primer}

Тогда посмотрите на следующий пример:

\newlength{\primer}
\parindent=0mm

\primer=10mm
9\hspace{\primer}9

{\primer=20mm
8\hspace{\primer}8}

9\hspace{\primer}9
\primer=10mm
9\hspace{\primer}9

{\primer=20mm
8\hspace{\primer}8}

9\hspace{\primer}9

Обратите внимание, что, если присваивание параметру нового значения происходило внутри группы, то по выходе из группы новое значение забывается, а прежнее — восстанавливается.

Параметры со значением длины можно указывать с коэффициентом - положительной или отрицательной десятичной дробью (можно использовать как десятичную точку, так и десятичную запятую). Например, если значение параметра \primer равно 10 мм, то команда \hspace{2.71\primer} сделает пробел длиной 27.1\,\rm
мм.

Параметры со значением длины (возможно, с числовыми коэффициентами) могут также стоять в правой части оператора присваивания (или во втором аргументе команды \setlength ):

\primer=1.45\parindent
\setlength{\primer}{.45\tabcolsep}

Можно также прибавлять длину к значению параметра: если значение параметра \abcd равно x, то после выполнения команды

\addtolength{\abcd}{"$y$\verb"}

где y - длина, значение параметра "\abcd" станет равно x+y. В качестве y в этой команде может использоваться как явно указанная длина (например, 1.2in), так и параметр со значением длины (возможно, с числовым коэффициентом). Наконец, LaTeX предоставляет полезную команду

\settowidth{"\textit{параметр}\verb"}{"\textit{текст}\verb"}

которая присваивает параметру значение, равное ширине текста. Вот пример:

\newlength{\primer}
\parindent=0mm
\settowidth{\primer}

\settowidth{\primer}{\Large слово }
{\Large слово }слово

\hspace{\primer}слово
\settowidth{\primer}{\Large
слово }
{\Large слово }слово

\hspace{\primer}слово

(обратите внимание, что у нас получилось выравнивание без помощи {tabbing} или {tabular}).

Существуют также команды \settoheight и \settodepth, аналогичные \settowidth. Команда \settoheight присваивает параметру значение, равное максимальному расстоянию, на которое текст возвышается над строкой (точнее, над ее базисной линией). \settodepth присваивает параметру значение, равное максимальному расстоянию, на которое текст опускается ниже базисной линии.

Ранее у нас шла речь о том, что некоторые используемые в TeX'е длины могут обладать растяжимостью или сжимаемостью. Параметрам, созданным с помощью команды \newlength, также можно присваивать значения, содержащие plus и/или minus -компоненту. Если, например, мы хотим, чтобы параметр \primer имел естественный размер 2\,\text{см}, растяжимость 4\,\text{мм} и сжимаемость в один пункт, то можно написать так:

\setlength{\primer}{2cm plus 4mm minus 1pt}
Нина Казачек
Нина Казачек
Василий Майоров
Василий Майоров