我希望能够定义一个采用单个参数的环境,并能够使用该参数重新定义现有宏,以便环境的参数自动用作宏的参数。就像这样...
\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}