Обернуть команду 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{ } { } }
У вас очевидно есть проблема с закрытием команд.