用于别名环境的命令

用于别名环境的命令

我想要一个命令来为现有环境定义别名。我的想法是:

\newcommand{\envalias}[2]{
    \let\#1\#2
    \let\end#1\end#2
}

因此例如会给我一个可以完成该任务的\envalias{eq}{equation}环境。eqequation

但是,我不知道如何利用\csname\expandafter来实现这一点。

理想情况下,\envalias可以有一个可选参数来决定是否应该覆盖现有环境,但是这是。

我很乐意听取任何建议:)


更新

感谢您提供的答案和宝贵的反馈!我会考虑是否真的会使用它。

仅供参考:我的特定用例实际上是简化协作:我的同事对环境的命名有不同约定,我不想进行冗长的复制粘贴来提供两种变体中的所有定理。但是,教我的编辑器自动完成是值得考虑的。

答案1

就这样。

\documentclass{article}
\newcommand{\envalias}[2]{\newenvironment{#1}{\begin{#2}}{\end{#2}}}
\begin{document}
\envalias{eq}{equation}
\begin{eq}
 E=mc^2
\end{eq}
\end{document}

不过,我同意jackfrost 说这不是一个好主意,说得委婉些。让我试着说服你。你可能不会排除在某个时候与他人合作的可能性。我可以从我自己的经验告诉你,如果一个人开始处理其他人的文件,而这些文件定义了各种晦涩难懂的环境和宏,他不会感到兴奋。更妙的是,合作中的不同人的定义相互不兼容。

答案2

仅在既不检查是否\@currenvir产生特定字符串也不搜索序列的环境中执行此操作\end{<environment>},这会结束环境,从字面上讲 - 后者就是这种情况,例如,使用-environment verbatim

\documentclass{article}
\usepackage{amssymb} %<- only needed for the nice \mathbb-command below. ;-)

\makeatletter
\newcommand\bracestripexchange[2]{#2#1}%
\@ifdefinable{\name}{\long\def\name#1#{\romannumeral0\innername{#1}}}%
\newcommand\innername[2]{%
  \expandafter\bracestripexchange\expandafter{\csname#2\endcsname}{ #1}%
}%
\newcommand{\envalias}[2]{%
  \name\@ifdefinable{#1}{%
    \name\name\let{#1}={#2}%
    \name\name\let{end#1}={end#2}%
  }%
}%
\makeatother

\envalias{eq}{equation}

\begin{document}

\begin{equation}
\{x\in\mathbb{N}\}\land\{y\in\mathbb{N}\}\land\{z\in\mathbb{N}\}\to x^3 + y^3 \neq z^3
\end{equation}

\begin{eq}
\{x\in\mathbb{N}\}\land\{y\in\mathbb{N}\}\land\{z\in\mathbb{N}\}\to x^4 + y^4 \neq z^4
\end{eq}

\end{document}

我关于检查产生特定字符串的评论的含义\@currenvir如下所示:

\documentclass{article}
\usepackage{amssymb} %<- only needed for the nice \mathbb-command below. ;-)

\makeatletter
\newcommand\bracestripexchange[2]{#2#1}%
\@ifdefinable{\name}{\long\def\name#1#{\romannumeral0\innername{#1}}}%
\newcommand\innername[2]{%
  \expandafter\bracestripexchange\expandafter{\csname#2\endcsname}{ #1}%
}%
\newcommand{\envalias}[2]{%
  \name\@ifdefinable{#1}{%
    \name\name\let{#1}={#2}%
    \name\name\let{end#1}={end#2}%
  }%
}%

\def\someenvironmentstring{someenvironment}
\newenvironment{someenvironment}
               {\ifx\someenvironmentstring\@currenvir Case A\else Case B\fi:}
               {}

\makeatother

\envalias{otherenvironment}{someenvironment}

\begin{document}

\begin{someenvironment}
Body of Environment
\end{someenvironment}

\begin{otherenvironment}
Body of Environment
\end{otherenvironment}

\end{document}

答案3

这不是个好主意。不管怎样,如果你喜欢冒险,

\newcommand{\envalias}[2]{%
  \expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname
  \expandafter\let\csname end#1\expandafter\endcsname\csname end#2\endcsname
}

谨防环境通常根据其他环境进行定义。例如,\endquote定义为\endlist,如果您这样做\renewenvironment{list}(仅举一个简单的例子),您最终会搞砸您的环境别名为quote

你这样做几乎没有什么好处\envalias{eq}{equation}:你只是省下了一些你可以指示编辑器插入而不是自己输入的键。我看到的唯一好处是混淆了你的代码。

相关内容