有没有一种简单的方法可以让摘要的文本在宏中可用\theabstract
?我可以使用以下代码执行此操作:
\documentclass{article}
\usepackage{collect}
\title{A test document}
\author{John Smith}
\date{\today}
\begin{document}
\maketitle
\begin{abstract}
\begin{collectinmacro}{\theabstract}{}{}
This is a test.
\end{collectinmacro}
\theabstract
\end{abstract}
The abstract is: \theabstract
\end{document}
不过,我更希望抽象代码简单一点,即:
\begin{abstract}
This is a test.
\end{abstract}
我尝试过使用\AtBeginEnvironment
和\AtEndEnvironment
from etoolbox
(虽然我不太明白它们是如何工作的),并且重新定义了抽象环境,但没有成功。两者都返回错误! File ended while scanning use of \@tempa.
。最小工作示例:
\documentclass{article}
\usepackage{collect,etoolbox}
\title{A test document}
\author{John Smith}
\date{\today}
\AtBeginEnvironment{abstract}{\begin{collectinmacro}{\theabstract}{}{}}
\AtEndEnvironment{abstract}{\end{collectinmacro}\theabstract}
% ! File ended while scanning use of \@tempa.
%\renewenvironment{abstract}{%
%\begin{collectinmacro}{\theabstract}{}{}
%}{%
%\end{collectinmacro}
%\theabstract
%}
% ! File ended while scanning use of \@tempa.
\begin{document}
\maketitle
\begin{abstract}
This is a test.
\end{abstract}
The abstract is: \theabstract
\end{document}
虽然我使用的是collect
上述软件包,但我也愿意接受没有此软件包的解决方案。我通常使用 LuaLaTeX,因此 LuaTeX 解决方案会受到欢迎。
(当然也可以简单地编写\newcommand{\theabstract}{This is a test}
然后放入\theabstract
抽象环境中,但最终我希望抽象环境的代码与正常的相同。)
答案1
带environ
包裹。
\documentclass{article}
\usepackage{environ}
\title{A test document}
\author{John Smith}
\date{\today}
\let\svabstract\abstract
\let\svendabstract\endabstract
\RenewEnviron{abstract}{
\svabstract\BODY\svendabstract
\expandafter\gdef\expandafter\theabstract\expandafter{\BODY}
}
\begin{document}
\maketitle
\begin{abstract}
This is a test.
\end{abstract}
The abstract is: \theabstract
\end{document}
并不是说这种方法比上面给出的方法更好,但我想确保我可以使用tokcycle
伪环境来实现,这需要稍微不同的调用语法。这种tokcycle
方法只有在人们想要自动调整抽象内容时才有优势,例如:
\documentclass{article}
\usepackage{tokcycle}
\title{A test document}
\author{John Smith}
\date{\today}
\let\svabstract\abstract
\let\svendabstract\endabstract
\xtokcycleenvironment\abstract
{\if T\capnext\addcytoks{{\LARGE##1}}\else
\addcytoks{##1}\fi\def\capnext{F}}
{\processtoks{##1}}
{\addcytoks{##1}\ifx\par##1\def\capnext{T}\fi}
{\addcytoks{##1}}
{\tcafterenv{\expandafter\def\expandafter\theabstract
\expandafter{\the\cytoks}}\def\capnext{T}}
{\addcytoks{\svendabstract}\svabstract}
\begin{document}
\maketitle
\abstract
This is a test to see if the abstract is automatically adjusted
to my specifications.
Multi-paragraphs.
\endabstract
The abstract is: \theabstract
\end{document}
答案2
使用较新版本的 LaTeX,它整合了的功能environ
,但使管理更容易,并且具有强大的复制命令方法。
\documentclass{article}
\NewCommandCopy{\originalabstract}{\abstract}
\NewCommandCopy{\originalendabstract}{\endabstract}
\RenewDocumentEnvironment{abstract}{+b}
{% save the contents
\gdef\theabstract{#1}%
% now typeset the abstract
\originalabstract
#1%
}
{% finish
\originalendabstract
}
\begin{document}
\title{A test document}
\author{John Smith}
\date{\today}
\maketitle
\begin{abstract}
This is a test.
\end{abstract}
The abstract is: \theabstract
\end{document}