环境定义分隔匹配的括号

环境定义分隔匹配的括号

假设我想定义一个环境,它本质上是对现有环境的修改。我尝试了类似这样的操作:

\newenvironment{newenv}{%
  \formatcommand{\begin{oldenv}%
}{%
  \end{oldenv}}%
}

我希望

\begin{newenv}Foo\end{newenv}

得到与以下相同的输出

\formatcommand{\begin{oldenv}Foo\end{oldenv}}

但每当我使用时\begin{newenv}pdflatex都会说

Missing } inserted

当然,之后一切都会变得一团糟。没有\formatcommand它一切都很好,所以显然孤儿{表格\formatcommand是罪魁祸首。

我的猜测是,pdflatex尝试将环境定义部分中的内容视为语法正确的东西(我所做的显然不是),而不是“仅仅”替换文本并随后进行解析。

有没有办法解决这个问题,即从新环境的开始到结束有一个命令跨度?

用例:

\newenvironment{card}{%
  \resizebox{55mm}{85mm}{\begin{tabular*}{55mm}{| p{50.5mm} |}%
  \hline%
}{%
  \hline\end{tabular*}}%
}

如果我把相同的 resizebox围绕的使用站点card,它会进行编译和调整大小(尽管不是我想要的方式,但那是另一天的事了)。

答案1

要将某个宏/命令应用到环境主体,您可能需要将整个主体提取到宏本身中。这可以使用以下方法完成(无论在多有限的范围内):environ包裹。这是一个简短的例子:

\documentclass{article}
\usepackage{environ}% http://ctan.org/pkg/environ
\NewEnviron{itquote}{%
  \itshape% Set shape to italics
  \begin{quote}
    \BODY% regular \BODY of itquote environment
  \end{quote}
}
\begin{document}
\begin{quote}% Original quote environment
  Here is a very simple quote
\end{quote}
\begin{itquote}% New itquote environment
  Here is a very simple quote
\end{itquote}
\end{document}

在此处输入图片描述

在上面的(公认的基本)示例中,itquote将其内容(存储在宏中\BODY)用斜体表示。对于某些人来说,它提供了一种在环境中处理环境的更直观的方式。

此外,查看包文档(有时甚至是包源)总是好的.sty。例如,虽然minipage是一个环境并且通常在的上下文中使用,但\begin{minipage}{<width>} ... \end{minipage}它也可以使用“宏对形式”使用\minipage{<width} ... \endminipage。同样,对于某些人来说,这允许以更直观的方式在新的环境定义上拆分环境开始/结束。

答案2

定义中不能留下不匹配的括号。这是 TeX 语法规则所禁止的。

有一个解决方法:

\newsavebox{\cardbox}
\newenvironment{card}
  {\begin{lrbox}{\cardbox}
   \begin{tabular*}{55mm}{| p{50.5mm} |}
   \hline
  }
  {\hline
   \end{tabular}
   \end{lrbox}%
   \resizebox{55mm}{85mm}{\usebox{\cardbox}}%
  }

环境的内容保存在\cardboxbin 中,稍后进行处理。

请参阅 Werner 的回答,了解在其他情况下特别有用的另一种方法。

答案3

以下是定义新环境的示例:

\documentclass{article}
\usepackage{lipsum}
\newenvironment{MyQuote}{%
    \begin{quote}%
    % Add customization that goes after the start of the environment here
}{%
    % Add customization that goes before the end of the environment here
    \end{quote}%
}%

\begin{document}
  \begin{MyQuote}
    \lipsum[1]
  \end{MyQuote}
\end{document}

我怀疑您正在尝试使用某种形式的宏,并试图在开头和结尾环境中\macro{}添加。我认为标准不允许这样做。您可以使用\macro{}\newenvironment包裹environ,它通过 提供对环境主体的访问\BODY。以下是示例:

\documentclass{article}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage{environ}

\NewEnviron{MyQuote}{%
  \quote%
  \textcolor{red}{\BODY}%
}{%
  \endquote%
}
\begin{document}
  \begin{MyQuote}
    \lipsum[1]
  \end{MyQuote}
\end{document}

答案4

更新。我会把它留在这里不回答,请参阅下面的评论。


它看起来\bgroup可以\egroup提供帮助。我不是专家,也不确定这是否是正确的方法,但以下方法有效:

\documentclass{article}
\newenvironment{oldenv}{*}{*}
\newenvironment{newenv}{\textit\bgroup\begin{oldenv}}{\end{oldenv}\egroup}
\begin{document}
  \begin{newenv}
    Test
  \end{newenv}
\end{document}

相关内容