我想定义一个显示 graphviz 图像的环境。代码应如下所示:
\begin{graph}{name}[optionalArgs]
a -> b; /* graphviz code*/
\end{graph}
我从简单的定义开始:
\newenvironment{graph}[2]%
{#1 %name
#2 %code itself
}%
{% end code
}
但是,#2
在这种情况下仅包含第一部分a
,其余输入随后显示。如何获取变量中环境的全部内容?
答案1
对于标准环境,环境主体位于执行结束代码之前,并且不是通过语法访问#<n>
。您还可以使用包裹environ
按照@AndrewStacey的建议。在这种情况下,您可以\BODY
在需要环境内容的地方使用。
下面是第一种情况下提供可选参数的示例,第二种情况下不提供可选参数(默认为foo
)。graph
环境是标准 LaTeX 环境,Graph
通过 定义\NewEnviron
。
笔记:
该
#<n>
语法用于访问参数,不能用于访问环境主体。标准做法是将可选参数放在强制参数之前。如果这不适用于您的情况,您应该考虑使用包裹
xparse
。如果您正在使用
\Collect@Body
宏,则应确保它位于 内\makeatletter ... \makeatother
。请参阅\makeatletter 和 \makeatother 起什么作用?了解更多详情。
代码:
\documentclass{article}
\usepackage{environ}% defines `NewEnviron`
\NewEnviron{Graph}[2][foo]{%
\noindent%
Using \textbf{NewEnviron:} Optional Args = #1\par\noindent%
Name=#2%
\BODY%
\medskip\hrule\medskip% end code
}
\newenvironment{graph}[2][foo]{%
\noindent%
Using \textbf{newenvironment:} Optional Args = #1\par\noindent%
Name=#2%
}{%
\medskip\hrule\medskip% end code
}
\begin{document}
\begin{graph}[optionalArgs]{name1}
$a \to b$; /* code*/
\end{graph}
\begin{graph}{name2}
$a \to b$; /* code*/
\end{graph}
\begin{Graph}[optionalArgs]{name1}
$a \to b$; /* code*/
\end{Graph}
\begin{Graph}{name2}
$a \to b$; /* code*/
\end{Graph}
\end{document}