在新的宏定义中使用环境参数

在新的宏定义中使用环境参数

我希望能够定义一个采用单个参数的环境,并能够使用该参数重新定义现有宏,以便环境的参数自动用作宏的参数。就像这样...

\newcommand{\argmacro}[1]{<do something with #1>}

\newenvironment{myenvironment}
               {\renewcommand{\arglessmacro}{\argmacro{<the sole argument of myenvironment>}}}
               {}

我基本上想将一些文本定义为环境的“主题”,这样我就可以执行我常用的宏,而不必每次调用它时都复制文本。有没有一种干净的方法可以在 renewcommand 定义中引用 myenvironment 的参数?谢谢!

答案1

如果我理解正确的话,环境定义了一个应用于环境体的myenvironment宏,那么这可以通过以下示例实现。\arglessmacro\argmacro

  • environ用于定义抓取其主体的环境。
  • 通过令牌寄存器绕行可防止环境主体过早扩展。另一种方法是使用 eTeX 的\unexpanded
  • \arglessmacro是在全局范围内定义,以逃避环境分组级别。

示例文件:

\documentclass{article}
\usepackage{environ}

\newcommand{\argmacro}[1]{%
  \textbf{#1}%
}
\NewEnviron{myenvironment}{%
  \toks0=\expandafter{\BODY}%
  \xdef\arglessmacro{%
    \noexpand\argmacro{\the\toks0}%
  }%
}

\begin{document}
  \begin{myenvironment}
    Hello World
  \end{myenvironment}
  \arglessmacro

  \begingroup
    \renewcommand{\argmacro}[1]{\textit{[#1]}}%
    \arglessmacro
  \endgroup

  \begin{myenvironment}
    Foo bar
  \end{myenvironment}
  \arglessmacro

\end{document}

结果

答案2

我不完全清楚你想要什么:这是一般的想法:

\documentclass{article}
\newcommand{\mymacro}{default definition}
\newenvironment{myenv}[1]
    {\renewcommand{\mymacro}{#1}}
    {}
\begin{document}

\mymacro

    \begin{myenv}{hello world}
        \mymacro

        And then someother contents
    \end{myenv}

\mymacro

\end{document}

在此处输入图片描述

相关内容