如何在 LaTeX 中定义环境来替换其内容?

如何在 LaTeX 中定义环境来替换其内容?

我想定义一个显示 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}

相关内容