具有不同名称的相同环境

具有不同名称的相同环境

可以使用以下方式创建新环境:

\newenvironment{name}[1]{stuff at the beginning}{stuff at the end}

在文档中可以使用以下命令创建环境:

\begin{name} different stuff \end{name}

现在我想用不同的名字调用同一个环境。我的解决方案是:

\newenvironment{name1}[1]{stuff1}{stuff2}
\newenvironment{name2}[1]{stuff1}{stuff2}
...
\newenvironment{nameN}[1]{stuff1}{stuff2}

这太脏了,让我的代码很混乱。你知道更好的解决方案吗?像这样的东西会很棒:

\newenvironment{name1, name2,  ... , nameN}[1]{stuff1}{stuff2}

答案1

更新答案

以下代码定义了一个新命令\NewEnvironments,该命令将使用逗号分隔的环境名称列表定义环境的多个副本。语法如下:

\NewEnvironments[#args]{comma separated list of names}{env beginning}{env end}

因此语法类似于,\newenvironment只是参数数量的可选参数必须放在第一个。例如,你可以使用以下命令定义一系列接受一个参数的环境name1,,,,, :name2name3name4

\NewEnvironments[1]{name1,name2,name3,name4}
  {\textbf{Environment with one arg: ##1}\newline\itshape}% begin
  {\newline\textbf{End of 1 environment}\par}             % end

请注意,在环境定义中,参数使用##1而不是#1。当然,由于所有这些环境都是名称,因此您只能使用name1。另一方面,代码支持定义依赖于其名称的环境,例如:

\NewEnvironments[1]{name1,name2,name3,name4}
  {\textbf{Environment #1 with one arg: ##1}\newline\itshape}% begin
  {\newline\textbf{End of 1 environment}\par}                % end

以下是展示如何使用代码的 MWE:

\documentclass{article}
\usepackage{etoolbox,xparse}

% usage: \NewEnvironments[#args]{comma separated list of names}{env beginning}{env end}
\newcommand\NewEnvironments[4][0]{%
    \renewcommand*\do[1]{\newenvironment{##1}[#1]{#3}{#4}}
    \docsvlist{#2}
}

% examples

% environments with no arguments
\NewEnvironments{none1,none2,none3,none4}
    {\textbf{Environment with no args}\newline\itshape}% begin
    {\newline\textbf{End of 0 environment}\par}        % end

% environments with one arguments
\NewEnvironments[1]{name1,name2,name3,name4}
    {\textbf{Environment with one arg: ##1}\newline\itshape} %  begin
    {\newline\textbf{End of 1 environment}\par}              % end

\begin{document}

  \begin{none1}stuff\end{none1}
  \begin{none2}stuff\end{none2}
  \begin{none1}stuff\end{none1}
  \begin{none3}stuff\end{none3}
  \begin{none4}stuff\end{none4}
  \begin{none1}stuff\end{none1}

  \begin{name1}{one}stuff\end{name1}
  \begin{name2}{two}stuff\end{name2}
  \begin{name1}{three}stuff\end{name1}
  \begin{name3}{four}stuff\end{name3}
  \begin{name4}{five}stuff\end{name4}
  \begin{name1}{six}stuff\end{name1}

\end{document}

原始答案

名称环境完全相同对我来说似乎很不寻常,但我承认这可能有充分的理由。在不重复代码的情况下执行所需操作的一种方法是拥有一个包含主代码的“模板”环境,然后让其他环境使用它。也就是说,结构如下:

\newenvironment{nametemplate}[1]{stuff1}{stuff2}
\newenvironment{name1}[1]{\nametemplate{#1}...}{...\endnametemplate}
\newenvironment{name2}[1]{\nametemplate{#1}...}{...\endnametemplate}
...

...定义内的点\newenvironment允许您根据需要包含额外的代码,但是,如 OP 中所述,这些点应该被省略。

相关内容