在环境中包装LaTeX命令

kva*_*uni 19 latex

如何在环境中包装LaTeX命令?从本质上讲,我又怎么能\ somecommand {}内容为\ {开始} somecommand内容\ {结束} somecommand?我已经尝试过创建一个新环境这样的显而易见的事情:

\newenvironment{somecommand}[0]{
  \somecommand{
}
{
  }
}
Run Code Online (Sandbox Code Playgroud)

但这会导致花括号出现问题.让我举一个更具体的例子.假设您想要创建非常重要的环境,并且您希望使用命令emph来完成此任务.一个直截了当(但不正确)的解决方案就是写一些东西

\newenvironment{very-important}[0]{
  \emph{
}
{
  }
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是该命令使用在环境中找到的信息,因此它不是环境的打开命令之一,也不是环境的关闭命令.问题是:你怎么能这样做?

Wil*_*son 20

这可以使用environ包完成,如下所示:

\usepackage{environ}
...
\NewEnviron{very-important}{\emph{\BODY}}

\BODY包含环境的主体,环境可以嵌套.有关详细信息,请参阅文档.


Ale*_*tov 11

看来我现在可以猜出问题是什么.

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

\begin{very-important}
Something
\end{very-important}
Run Code Online (Sandbox Code Playgroud)

此解决方案效果很好.但恕我直言,将所有文本包装在环境中是个坏主意.为什么?有两种方法可以对文本做些什么.例如,您想要更改字体并使用斜体.

  • 第一种方法. \textit{sentence written in italics}
  • 第二种方法. {\it sentence written in italics\/}

有什么不同?问题是第一种方法使用第二种方法. \it宏更改字体,大括号}将其更改回来. \textit宏读取完整参数,更改字体并再次插入参数: \textit大致定义如下(不完全).

\def\texit#1{{\it#1\/}}
Run Code Online (Sandbox Code Playgroud)

第一种方法总是做额外的工作.它读了两次论点.几乎总是,你可以做出改变,然后你就可以恢复一切.

最终你为什么要使用这个环境?使用宏.

\veryimportant{
   Any thought
}
Run Code Online (Sandbox Code Playgroud)


小智 6

一个更简单的方法可能是:

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

说明:\bgroup工作方式{\egroup工作方式类似}