将 LaTeX 环境的内容传递给宏时出错

将 LaTeX 环境的内容传递给宏时出错

首先,如果这是一个明显的新手问题,我很抱歉,我尝试阅读尽可能多的关于做这种事情的帖子,但无法让任何一个人发挥作用。

我正在开发一个宏,它在某些文本的侧面绘制一条垂直线,以下版本在使用时可以完美运行\sbshort{Foo Bar}

\long\def\sbshort #1 {\par{\bigbreak\vbox{\hbox{\vrule\kern3.5pt\everypar{\leftskip 5pt\rightskip 2.75pt}\vbox{\noindent {#1}}}}\par}}

但是当我尝试按如下方式使用 environ 包时:

\NewEnviron{TestEnviron}{\sbshort{\BODY}}
\begin{TestEnviron}
Foo Bar
\end{TestEnviron}

我收到错误Argument of \env@ignore has an extra }.

答案1

您的定义中有一个虚假的空间,可以通过多种方式简化:例如

\newcommand{\sbshort}[1]{%
  \par\bigbreak
  \vbox{
    \hbox{\vrule\kern5.5pt
      \vbox{\advance\hsize-5.9pt \noindent#1\par}%
    }}\par}

但是,高级包可以执行相同操作,并且还允许在您的环境内进行分页:

\usepackage{mdframed}
\newmdenv[
  skipabove=\bigskipamount,
  skipbelow=\bigskipamount,
  innerleftmargin=5pt,
  innerrightmargin=0pt,
  innertopmargin=0pt,
  innerbottommargin=0pt,
  rightmargin=0pt,
  topline=false,
  bottomline=false,
  rightline=false]
  {TestEnviron}

答案2

我在使用environ包时遇到了一些问题,但我通过以下方式解决了它们:假设我们想要一个相当于的环境\foobar{lorem impsum or anything},比如说\begin{FOOBAR}lorem ipsum or anything\end{FOOBAR}

% \makeatletter because we use at-signs in the macros
\makeatletter

% The environment foobar@env only stores the \BODY in \foobar@BODY
\NewEnviron{FOOBAR@env}{\global\let\FOOBAR@BODY\BODY\relax}

% Now we define our foobar environment
\newenvironment{FOOBAR}{%
  \FOOBAR@env% at \begin{FOOBAR} we just begin FOOBAR@env
}{%
  \endFOOBAR@env% at \end{FOOBAR}, firstly end FOOBAR@env
  \foobar{\FOOBAR@BODY}% perform the command on the stored material
  \global\let\FOOBAR@BODY\@undefined% free the resources
}%

% \makeatother as the counterpart of \makeatletter
\makeatother

相关内容