假设我想定义一个环境,它本质上是对现有环境的修改。我尝试了类似这样的操作:
\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}}%
}
环境的内容保存在\cardbox
bin 中,稍后进行处理。
请参阅 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}