抓取和存储大量文本的方法

抓取和存储大量文本的方法

获取和存储短文本(例如文档标题)的标准方法是使用类似

\def\title#1{\def\@title{#1}}.

但是如果要存储的内容较长(例如,摘要),我想用类似的方式来指定它会更加优雅

\begin{abstract}
  ...
\end{abstract}

在用户端。

因此,问题是:有哪些技术可以做这样的事情?(我立即想到的一些方法是:使用\vbox,使用分隔参数,使用environLaTeX 包,使用 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

相关内容