Существуют ли среды для изменения размера шрифта?

Существуют ли среды для изменения размера шрифта?

Без сомнения, существуют переключатели размера шрифта в виде управляющих последовательностей (описанныхздесьнапример.) Но время от времени я сталкивался с примерами кода, где использовались версии среды, например \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в свой конечный код, но в данном случае это не так.

См. также обсуждение в:

Зарезервированы ли имена макросов \end.... в LaTeX2e?

решение3

На самом деле, «LaTeXbook» (правильнее «LaTeX. Система подготовки документов» Лесли Лэмпорта) одобряет использование таких сред: в конце страницы 27 мы находим:

Каждому объявлению соответствует окружение с тем же именем (без символа \).

\begin{em} ... \end{em}

эквивалентно вводу {\em ... }.

В частности, форма «окружающей среды» автоматически предоставляет группу для сохранения локальности эффектов объявления, как это всегда происходит с окружениями ( \beginвызывает \begingroup, и \endсоответствующий \endgroup). Теперь, \smallявляется объявлением, поэтому вышесказанное применимо.

Это было сделано намеренно, поэтому я не считаю правильным утверждать, что эти среды работают «случайно»; действительно, как уже было отмечено, отсутствие определения команды like \endsmallне вызывает никаких проблем, поскольку она вызывается as \csname small\endcsnameи, следовательно, эквивалентна \relaxif 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выполняется, если он определен (если он не определен, ничего не происходит, как уже объяснялось выше);

  • \endLaTeX проверяет, равен ли аргумент, \@currenvir и выдает ошибку, если нет;

  • выдается приказ \endgroupо закрытии группы.

На самом деле, когда я определяю новую среду на основе другой, стандартной, я предпочитаю избегать использования явного \beginи \end, чтобы значение \@currenvirне менялось. Например, предположим, что я хочу определить вариант среды quote, который выделяет курсивом свое содержимое; я предпочитаю, скажем,

\newenvironment{italquote}{%
  \quote
  \itshape
}{\endquote}

над

\newenvironment{italquote}{%
  \begin{quote}%
  \itshape
}{\end{quote}}

особенно если я сам не собираюсь использовать среду. Таким образом, если пользователи неправильно напишут имя среды в операторе \end, они получат ошибку о неправильно завершенной italquoteсреде, которую они на самом деле использовали, а не о неправильно завершенной quoteсреде, о которой они могли не знать.

Связанный контент