我想重命名抽象环境的标题,但不丢失原始环境。我正在考虑将环境复制到名为 abstract2 的新环境,然后在其中重命名标题。
目前我只是使用
\begin{abstract}
...
\end{abstract}
这怎么可能?
编辑:
\expandafter\let\csname abstract2\endcsname\abstract
\expandafter\let\csname endabstract2\endcsname\endabstract
将环境复制到 abstract2。我该如何重命名新环境的标题?以下方法通常有效,但它会重命名两者。
\renewcommand{\abstractname}{New Title}
编辑:我解决了这个问题,没有复制环境,而是在每个环境之前使用上面的命令,就像这样
\renewcommand{\abstractname}{New Title}
\begin{abstract}
...
\end{abstract}
答案1
细节取决于原始环境的定义方式,您没有提供任何信息,但这可能是可行的
\expandafter\let\csname abstract2\endcsname\abstract
\expandafter\let\csname endabstract2\endcsname\endabstract
\renewenvironment{abstract}{zz}{zzz}
答案2
需要有关正在使用的文档类和包的信息,以确保抽象环境不会以复制形成环境的底层定义的方式重新定义,从而产生问题和陷阱。
只需使用 LaTeX 2ε 中的文章类,无需额外的包,您就可以根据需要重复抽象环境多次。
如果愿意,您可以\abstractname
在该环境的单个实例之间重新定义宏:
\documentclass{article}
\begin{document}
\begin{abstract}
This is an abstract.
\end{abstract}
\renewcommand\abstractname{Another abstract}
\begin{abstract}
This is another abstract.
\end{abstract}
\section{\dots}
\end{document}
仅使用 LaTeX 2ε 中的 article-class 而无需额外的软件包,您可以通过\let
和\csname..\endcsname
将宏\abstract
和的含义分配\endabstract
给宏\abstract2
和\endabstract2
。然后您有两个环境。但它们共享相同的占位符宏,即类似的东西\abstractname
。
由于abstract
article 类的环境不接受参数,您可以使用此 documentclass 轻松破解\abstractname
以检查周围抽象环境的名称并相应地提供名称短语:
\documentclass{article}
\makeatletter
%\show\abstract
\newcommand\@currabs[2]{#2#1}%
\expandafter\renewcommand\expandafter\abstract\expandafter{%
\romannumeral0\expandafter
\@currabs\expandafter{\abstract}{ \let\@currabs=\@currenvir}%
}%
%\show\abstract
\renewcommand\abstractname{%
\csname abstract\ifx\@currabs\abstractthreeenvname three\else
\ifx\@currabs\abstracttwoenvname two\else
one%
\fi
\fi
name\endcsname
}
\makeatother
\expandafter\newcommand\csname abstract2\endcsname{}%
\expandafter\let\csname abstract2\endcsname=\abstract
\expandafter\let\csname endabstract2\endcsname=\endabstract
\expandafter\newcommand\csname abstract3\endcsname{}%
\expandafter\let\csname abstract3\endcsname=\abstract
\expandafter\let\csname endabstract3\endcsname=\endabstract
\newcommand*\abstracttwoenvname{abstract2}
\newcommand*\abstractthreeenvname{abstract3}
\newcommand*\abstractonename{Abstract}
\newcommand*\abstracttwoname{Abstract Two}
\newcommand*\abstractthreename{Abstract Three}
\begin{document}
\begin{abstract}
This is an abstract.
\end{abstract}
\begin{abstract2}
This is another abstract.
\end{abstract2}
\begin{abstract3}
This is yet another abstract.
\end{abstract3}
\section{\dots}
\end{document}
我不保证这也适用于除文章之外的文档类和/或任何附加加载的包。
答案3
这是针对该类article
的,其他类可能需要不同的补丁。
\documentclass{article}
\usepackage{etoolbox}
\let\abstracttwo\abstract
\let\endabstracttwo\endabstract
\patchcmd{\abstracttwo}{\abstractname}{\abstracttwoname}{}{}
\patchcmd{\abstracttwo}{\abstractname}{\abstracttwoname}{}{}
\newcommand{\abstracttwoname}{Abstract Two}
\begin{document}
\begin{abstract}
This is the first abstract.
\end{abstract}
\begin{abstracttwo}
This is the second abstract.
\end{abstracttwo}
\end{document}
然而,您可能只是想要不同语言的几篇摘要:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french,italian,english]{babel}
\begin{document}
\begin{abstract}
This is the English abstract.
\end{abstract}
\begin{otherlanguage}{french}
\begin{abstract}
Voici le résumé en français.
\end{abstract}
\end{otherlanguage}
\begin{otherlanguage}{italian}
\begin{abstract}
Questo è il sommario in italiano.
\end{abstract}
\end{otherlanguage}
\end{document}
具有更友好的语法:没有可选参数,则使用主语言。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french,italian,english]{babel}
\usepackage{xparse}
\let\latexabstract\abstract
\let\latexendabstract\endabstract
\RenewDocumentEnvironment{abstract}{o}
{\IfValueT{#1}{\otherlanguage{#1}}\latexabstract}
{\latexendabstract\IfValueT{#1}{\endotherlanguage}}
\begin{document}
\begin{abstract}
This is the English abstract.
\end{abstract}
\begin{abstract}[french]
Voici le résumé en français.
\end{abstract}
\begin{abstract}[italian]
Questo è il sommario in italiano.
\end{abstract}
\end{document}