定义一个新环境,其内容位于 TikZ 节点中

定义一个新环境,其内容位于 TikZ 节点中

我想定义一个环境,在一个框中排版内容,我想使用 TikZ(我知道 fancybox 之类的替代品)。所以我想要类似的东西

\newenvironment{abox}%
  {\begin{tikzpicture}\node(box){\begin{minipage}{0.8\textwidth}}%
  {\end{minipage}};}

但是,这不起作用,因为{...}包装 TikZ 节点的 不能在环境的开始和结束处分割。有没有办法解决这个问题?谢谢!

答案1

在这种情况下environpage 很方便。它的命令\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),这不是问题。

相关内容