Обернуть команду LaTeX в среду

Как я могу обернуть команду LaTeX в среде? По сути, как я могу превратить \somecommand{contents} в \begin{somecommand} content \end{somecommand}? Я пробовал очевидное при создании новой среды как таковой:

\newenvironment{somecommand}[0]{
  \somecommand{
}
{
  }
}

но это вызывает проблемы с фигурными скобками. Позвольте мне привести более конкретный пример. Скажем, вы хотите создать очень важную среду, и вы хотите использовать команду emph для этого. Простое (но неверное) решение было бы написать что-то как

\newenvironment{very-important}[0]{
  \emph{
}
{
  }
}

Проблема здесь в том, что команда работает с информацией, которая находится внутри среды, поэтому она не является одной из команд открытия среды и не является командой закрытия среды. Тогда возникает вопрос: как вы можете это сделать?

5 ответов

Решение

Кажется, теперь я могу догадаться, в чем вопрос.

\newenvironment{very-important}{\startimportant}{}
\def\startimportant#1\end{\emph{#1}\end}

\begin{very-important}
Something
\end{very-important}

Это решение хорошо работает. Но имхо это плохая идея заворачивать весь текст в окружение. Зачем? Есть два способа сделать что-то с текстом. Например, вы хотите изменить шрифт и использовать курсив.

  • Первый способ \textit{sentence written in italics}
  • Второй способ {\it sentence written in italics\/}

В чем разница? Дело в том, что первый метод использует второй.\it макрос меняет шрифт и скобку } меняет обратно. \textit макрос читает полный аргумент, меняет шрифт и снова вставляет аргумент:\textit определяется примерно следующим образом (не совсем).

\def\texit#1{{\it#1\/}}

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

В конце концов, почему вы используете среду? Используйте макросы.

\veryimportant{
   Any thought
}

Это можно сделать с помощью пакета Environment следующим образом:

\ Usepackage{} окружать...
\NewEnviron{очень важные} {\ EMPH {\BODY}}

\BODY содержит тело среды, и среды могут быть вложенными. Смотрите документацию для более подробной информации.

Более простой способ может быть:

\newenvironment{somecommand}[0]{ \somecommand\bgroup } { \egroup }

Объяснение: \bgroup работает как { а также \egroup работает как },

Определить команду

\newcommnad{eqn}{1}{\begin{equation}#1\end{equation}}

изменится

\eqn{x^2=y}

в

\begin{equation}
  x^2=y
\end{equation}

Я думаю

Новая среда somecommand определяет макрос \somecommand, Вы не можете использовать макрос с тем же именем \somecommand внутри.

Кроме того, вы должны написать

\newenvironment{name}{openning command}{closing commands}

скорее, чем

\newenvironment{somecommand}[0]{ \somecommand{ } { } }

У вас очевидно есть проблема с закрытием команд.

Другие вопросы по тегам