获取和存储短文本(例如文档标题)的标准方法是使用类似
\def\title#1{\def\@title{#1}}.
但是如果要存储的内容较长(例如,摘要),我想用类似的方式来指定它会更加优雅
\begin{abstract}
...
\end{abstract}
在用户端。
因此,问题是:有哪些技术可以做这样的事情?(我立即想到的一些方法是:使用\vbox
,使用分隔参数,使用environ
LaTeX 包,使用 ConTeXt \grabbufferdata
(如果我没有记错该宏的名称的话)...)
我很高兴看到各种各样的答案,针对各种引擎(Knuthian vanilla TeX、eTeX、luaTeX)和格式(plain TeX、LaTeX2e、LaTeX3、ConTeXt)。
答案1
这collect
包;一个小例子(定义一个环境来收集文本并在规则之间格式化它并使用\section
):
\documentclass{article}
\usepackage{collect}
\usepackage{lipsum}
\definecollection{test}
\makeatletter
\newenvironment{atest}[1]
{\@nameuse{collect}{test}{\par\nobreak\noindent\hrulefill}
{\par\nobreak\noindent\hrulefill\par\bigskip}
{\section{#1}}
{}%
}
{\@nameuse{endcollect}}
\makeatother
\begin{document}
\begin{atest}{example one}
\lipsum[2-3]
\end{atest}
\begin{atest}{example two}
\lipsum[2]
\end{atest}
\lipsum[1-6]
\includecollection{test}
\end{document}
答案2
直接使用 LaTeX2e:
\newsavebox{\myabstractbox}
\newenvironment{myabstract}{\lrbox{\myabstractbox}}{\endlrbox}
使用以下方式提取内容
\usebox{\myabstractbox}
答案3
乳胶
如果您只想以标记的形式存储文本,\title
那么您可以这样做environ
:
\usepackage{environ}
\NewEnviron{sabstract}{\global\let\@sabstract\BODY}
环境的内容(本地)存储在宏中\BODY
,因此全局地让其执行与的操作\@sabstract
相同。\title
\@title
\begin{sabstract}
This is it.
With two paragraphs.
\end{sabstract}
纯 TeX
\catcode`@=11
\long\def\sabstract#1\endsabstract{\def\@sabstract{#1}}
\catcode`@=12
\sabstract
This is it.
With two paragraphs.
\endsabstract
答案4
这内容包尝试模拟buffers
从 LaTeX 角度来看ConText 的概念。
\documentclass{article}
\usepackage{scontents}
\begin{document}
% If you need a environment version (like a \startbuffer ... \stopbuffer)
\begin{scontents}[store-env=main]
Something for main A.
\end{scontents}
% If you need a macro version (no verbatim)
\Scontents[store-cmd=main]{Something for main B.}
% or a macro with verbatim
\Scontents*[store-cmd=main]{Something for \verb|main C|.}
% Let's print them (like a \getbuffer)
This is first stored in main: \getstored[1]{main}\par
This is third stored in main: \getstored[3]{main}\par
% Print all of stored in main
\foreachsc[sep={\\[10pt]}]{main}
% Print source content (like a \typebuffer)
\typestored[3]{main}\par
\typestored[2]{main}\par
\typestored[1]{main}
\end{document}
环境和星号宏版本支持逐字内容,环境可以嵌套,但不能在同一行开始和结束。两个版本(环境和星号)都可以将内容写入外部文件。非星号宏版本不支持逐字内容。
(我在这里留下这个答案只是因为这篇文章对 起到了普遍的启发作用scontents
)