![用于别名环境的命令](https://linux22.com/image/394927/%E7%94%A8%E4%BA%8E%E5%88%AB%E5%90%8D%E7%8E%AF%E5%A2%83%E7%9A%84%E5%91%BD%E4%BB%A4.png)
我想要一个命令来为现有环境定义别名。我的想法是:
\newcommand{\envalias}[2]{
\let\#1\#2
\let\end#1\end#2
}
因此例如会给我一个可以完成该任务的\envalias{eq}{equation}
环境。eq
equation
但是,我不知道如何利用\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}
:你只是省下了一些你可以指示编辑器插入而不是自己输入的键。我看到的唯一好处是混淆了你的代码。