首先,如果这是一个明显的新手问题,我很抱歉,我尝试阅读尽可能多的关于做这种事情的帖子,但无法让任何一个人发挥作用。
我正在开发一个宏,它在某些文本的侧面绘制一条垂直线,以下版本在使用时可以完美运行\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