我想定义一个环境,在一个框中排版内容,我想使用 TikZ(我知道 fancybox 之类的替代品)。所以我想要类似的东西
\newenvironment{abox}%
{\begin{tikzpicture}\node(box){\begin{minipage}{0.8\textwidth}}%
{\end{minipage}};}
但是,这不起作用,因为{...}
包装 TikZ 节点的 不能在环境的开始和结束处分割。有没有办法解决这个问题?谢谢!
答案1
在这种情况下environ
page 很方便。它的命令\NewEnviron
收集主体,可以\BODY
在您的定义中将其作为宏访问。这是一个完整的示例:
\documentclass{article}
\usepackage{tikz}
\usepackage{environ}
\NewEnviron{abox}{%
\begin{tikzpicture}
\node(box){%
\begin{minipage}{0.8\textwidth}
\BODY
\end{minipage}};
\end{tikzpicture}
}
\begin{document}
\begin{abox}
Text
\end{abox}
\end{document}
这可以毫无问题地编译并绘制测试框。
答案2
首先:我以前不知道,environ
但印象非常深刻。我的回答并不是那么好,但我是从 LaTeX 资料中学到的,所以应该算数。
尝试写作
\newenvironment{<stuff>{\iffalse}\fi}
{\iffalse{\fi}<stuff>}
<stuff>
当然, 是你写的。关键是,在这个构造中没有不匹配的括号,因为在解析宏参数时,TeX 实际上不会扩展任何东西,特别是\iffalse
。因此,“注释掉的”括号是为了读入环境命令的内容而存在的,而是为了执行它们而不存在的。
编辑:在这个以及许多其他情况下,更简单的权宜之计\bgroup...\egroup
也有效:
\newenvironment{<stuff>\bgroup}
{\egroup<stuff>}
因为\bgroup
等于\let
且{
等于\egroup
,这(理论上)与使用括号同义,不同之处在于(因为这些“隐式字符”在嵌套在被解析的参数中时不算数)它不会破坏定义\let
。}
有时你会遇到需要文字括号的情况;\def
它本身就是一个例子。你必须写
\def\cs{<def'n>}
并不是
\def\cs\bgroup<def'n>\egroup
但在许多更高级别的构造中(包括我的快速测试显示的 TikZ),这不是问题。