Some HAT...

= Анабар.ru => TeX-форумы => Система TeX => сообщение 128
| Вход | Регистрация
нет
фото
Автор:  Женя
Дата:  27-Feb-2004 16:41 (gmt = -3.0)
E-mail:  emin@mccme.ru

Окружение chapter или "руки оторву"

Здравствуйте. Я верстаю в LaTeX'е в издательстве МЦНМО. Нам в издательство приносятмакеты авторы, это люди плохо разбирающиеся в системе LaTeX. Черт бы с ними, хорошо если они в своëм предмете разбираются. Тем не менее порой хочется кому-нибудь руки оторвать. Месяца не проходит без того, чтобы кто-нибудь не принëс макет в котором переобределëн какой-нибудь примитив TeX'а (\char, \box, \skip — излюбленные мишени макрописцев). Хочется прокомментировать одну интересную новую тенденцию. Получаю намедни примерно такой код:

1  \begin{chapter}{О кроликах}
2  
3  Кролики --- это не только ценный мех, но и три--четыре килограмма
4  свежего и легко усвояемого мяса.
5  
6  \end{chapter}

Да, действительно, окружения chapter в LaTeX нет. Откуда в светлой голове автора оно взялось, сказать трудно. Но данный код действительно будет работать. Посмотрим, что делает LaTeX в этом месте.

Встретив команду \begin{chapter} LaTeX делает проверку на существование команды chapter:

1  \def\begin#1{%
2    \@ifundefined{#1}%
3      {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
4      {\def\reserved@a{\def\@currenvir{#1}%
5       \edef\@currenvline{\on@line}%
6       \csname #1\endcsname}}%
7    \@ignorefalse
8    \begingroup\@endpefalse\reserved@a}

убедившись, что команда \chapter существует, LaTeX не выдаëт никаких ошибок и в 6-й строке приведëнного кода успешно вызывает команду \chapter передавая ей все параметры окружения chapter. Таким образом, команды \chapter{О кроликах} и \begin{chapter}{О кроликах} почти эквивалентны! Когда же мы встречаем закрывающую команду \end{chapter}, LaTeX ведëт себя так:

1  \def\end#1{%
2    \csname end#1\endcsname\@checkend{#1}%
3    \expandafter\endgroup\if@endpe\@doendpe\fi
4    \if@ignore\@ignorefalse\ignorespaces\fi}

Таким образом, команда \end{chapter} превращается в \endchapter. Такая команда неопределена. Но если на явное употребление неопеделëнной команды TeX ругается, то если неопределëнная команда собрана неявно конструкциями типа \csname...\endcsname, то вместо ругани TeX подставляет команду \relax.

Итак, команда \chapter оказываетяся в некотором смысле эквивалентна окружению \begin{chapter}...\end{chapter}. Теперь спрашивается, чего пыхтит этот чëртов вестальщик, ну пусть заменит \begin{chapter} на \chapter что он регулярных выражений никогда не видел?

Так вот, такой замены делать нельзя, потому что окружение chapter вставляет главу в группу. И если внутри неë употреблена какая-нибудь декларация или сделано какое-нибудь переопределение, то они будут локальны для главы. А это дело ещë отследить надо. Проще так и жить с кривизной.

Женя


все сообщения ветви:
  • 128 Окружение chapter или "руки оторву"  Женя  | 27-Feb-2004, 16:41 | просмотров: 7166    ⇐ ◄

О том как (правильно) написать сообщение...

Написать ответ

* Ник    
E-mail   Получать ответы  
Ссылка (URL)   мин. уровень чтения  
Картинка (URL)   мин. уровень ответа  
* Тема ответа  
Текст сообщения (можно не заполнять)

Время генерации страницы в секундах: 0.132