
Без сомнения, существуют переключатели размера шрифта в виде управляющих последовательностей (описанныхздесьнапример.) Но время от времени я сталкивался с примерами кода, где использовались версии среды, например \begin{small}...\end{small}
. После успешного тестирования я начал включать их в свой словарь TeX.
Несколько дней назад @GonzaloMedina прокомментировал один из моих ответов, что эти среды не существуют, а конструкции, полагающиеся на них, работают по чистой случайности. Затем я попытался узнать больше об этих зловещих средах. Зловещих, потому что они, похоже, не были как-то задокументированы. (Единственное, что я нашел, что пыталось объяснить их каким-то систематическим образом, был какой-то ресурс Wikibooks.)
Реальны ли эти среды или нет?
решение1
Вы можете использовать любую LaTeX
команду, определенную с помощью , \newcommand
и заключить \begin{}...\end{}
ее в пару, однако это не рекомендуется, поскольку это не среда.
Интересно, однако, что группировка работает в любом случае, но это следствие \begin...\end
.
Нет никаких сред для изменения размера шрифта \begin{small}
, таких как etc, поскольку их просто нет \begin{chapter}
.
См. например:
\documentclass{article}
\newcommand{\foo}{This does nothing}
\begin{document}
\begin{foo}
\end{foo}
\end{document}
РедактироватьНекоторые пояснения
Этот код можно найти в latex.ltx
, см. строки 4058f.
\def\begin#1{%
\@ifundefined{#1}%
{\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
{\def\reserved@a{\def\@currenvir{#1}%
\edef\@currenvline{\on@line}%
\csname #1\endcsname}}%
\@ignorefalse
\begingroup\@endpefalse\reserved@a}
Видно, что @ifundefined{foo}
будет вызвано, что ложно, так как оно \foo
определено, поэтому environment
имя foo
задано и \csname #1\endcsname
(т.е. \foo
) вызывается.
Теперь \end{foo}
часть :
\def\end#1{%
\csname end#1\endcsname\@checkend{#1}%
\expandafter\endgroup\if@endpe\@doendpe\fi
\if@ignore\@ignorefalse\ignorespaces\fi}
Окружения ищут \end...
код, здесь \endfoo
, который не определен, но \csname endfoo\endcsname
расширяется до \relax
и ничего плохого не происходит.
Следует отметить, что многие известные среды не определены с помощью \newenvironment
. Достаточно использовать \foo
команду и , например \def\endfoo
, см. \endequation
или и т. д.\endenumerate
решение2
Любая команда может быть использована в качестве окружения, и если окружать большие блоки текста, это часто бывает удобно, поэтому
{\small zzz\par}
и
\begin{small}%
zzzz
\end{small}
более или менее эквивалентны.
Однако следует отметить, что в отличие от \small
, пробелы после \begin{small}
не удаляются из-за обычных правил токенизации TeX. Также вам почти всегда нужна \par
или пустая строка перед , \end
что также верно в форме команды, но легче забыть в форме среды, поскольку большинство пользовательских сред, таких как , center
включают неявный \par
в свой конечный код, но в данном случае это не так.
См. также обсуждение в:
решение3
На самом деле, «LaTeXbook» (правильнее «LaTeX. Система подготовки документов» Лесли Лэмпорта) одобряет использование таких сред: в конце страницы 27 мы находим:
Каждому объявлению соответствует окружение с тем же именем (без символа
\
).\begin{em} ... \end{em}
эквивалентно вводу
{\em ... }
.
В частности, форма «окружающей среды» автоматически предоставляет группу для сохранения локальности эффектов объявления, как это всегда происходит с окружениями ( \begin
вызывает \begingroup
, и \end
соответствующий \endgroup
). Теперь, \small
является объявлением, поэтому вышесказанное применимо.
Это было сделано намеренно, поэтому я не считаю правильным утверждать, что эти среды работают «случайно»; действительно, как уже было отмечено, отсутствие определения команды like \endsmall
не вызывает никаких проблем, поскольку она вызывается as \csname small\endcsname
и, следовательно, эквивалентна \relax
if undefined.
Итак, в конечном итоге мой ответ таков: «Да, эти среды «реальны»» (что бы это ни значило).
Добавление
После просмотра некоторых комментариев я подумал, что было бы полезно добавить некоторые подробности о том, как среды реализованы в LaTeX2e (я не буду говорить о LaTeX3, поскольку у меня недостаточно опыта). Кристиан Хапфер уже представил точные фрагменты кода из latex.ltx
, но, возможно, кто-то найдет полезными и следующие дополнительные замечания.
Когда вы определяете environment FOO
, LaTeX просто определяет две новые команды, \FOO
и \endFOO
: последняя всегда без аргументов, в то время как первая имеет те же аргументы, если таковые имеются, которые были указаны для environment FOO
. Когда \begin{FOO}
встречается , происходят следующие вещи (среди прочего):
группа начинается с
\begingroup
;аргумент
\begin
(FOO
в данном случае) сохраняется (локально) в макросе\@currenvir
, чтобы впоследствии можно было проверить, что каждый из них\end
сопоставлен с правильным\begin
;команда
\FOO
выполняется в последнюю очередь; таким образом, она поглотит последующие аргументы\begin{fOO}
, если они присутствуют.
С другой стороны, когда LaTeX доходит до \end{FOO}
, происходит следующее (помимо прочего):
\endFOO
выполняется, если он определен (если он не определен, ничего не происходит, как уже объяснялось выше);\end
LaTeX проверяет, равен ли аргумент,\@currenvir
и выдает ошибку, если нет;выдается приказ
\endgroup
о закрытии группы.
На самом деле, когда я определяю новую среду на основе другой, стандартной, я предпочитаю избегать использования явного \begin
и \end
, чтобы значение \@currenvir
не менялось. Например, предположим, что я хочу определить вариант среды quote
, который выделяет курсивом свое содержимое; я предпочитаю, скажем,
\newenvironment{italquote}{%
\quote
\itshape
}{\endquote}
над
\newenvironment{italquote}{%
\begin{quote}%
\itshape
}{\end{quote}}
особенно если я сам не собираюсь использовать среду. Таким образом, если пользователи неправильно напишут имя среды в операторе \end
, они получат ошибку о неправильно завершенной italquote
среде, которую они на самом деле использовали, а не о неправильно завершенной quote
среде, о которой они могли не знать.