是否可以推迟对象内容的扩展,直到所有内容都已创建?

是否可以推迟对象内容的扩展,直到所有内容都已创建?

我想在我的包中提供作者可用的宏来存储稍后会出现在表中的数据,但最好允许作者随时定义该表中的数据,即使在创建和呈现表之后。

我是否可以将数据存储在文档的任何位置,并且仍然可以在任何位置检索所有数据?另一种提问方式是:是否存在某种形式的延迟处理,以便我可以这样做(有点伪代码):

\adddata{some data}
\adddata{more data}

\maketable

\adddata{even more data}
\adddata{additional data}

这样表格全部数据(不仅仅是在\adddata调用之前通过调用存储的数据\maketable)将正确包含所有这些数据,无论在文档中的什么位置\maketable被调用?

我知道通过巧妙使用命令更新等,这在一定程度上是可能的,但是一旦 TeX 找到并呈现表格,更改其内容是否为时已晚?我应该再次澄清,表格必须出现在\maketable调用的文档中。

笔记:假设\adddata\maketable定义在一个类或包中,该类或包负责处理存储数据和在表中格式化数据的所有内部工作。

答案1

已经排版的内容是无法改变的。

但是,您可以使用两遍方法:在运行 LaTeX 期间,\adddata在辅助文件上写入并\maketable使用上次运行中收集的数据。

以下是概念验证。当\adddata重新插入或修改数据时,会出现类似以下警告:

LaTeX Warning: Rerun for \maketable on input line 51.

出现在控制台上。

\documentclass{article}
\usepackage{atveryend}

\makeatletter
\newcommand{\maketable}{%
  \begin{center}
  \begin{tabular}{cc}
  \maketable@body
  \end{tabular}
  \end{center}
}
\newcommand{\adddata}[1]{%
  \@bsphack
  \protected@write\@auxout{}{\string\maketable@data{#1}}%
  \@esphack
}
\newcommand{\maketable@data}[1]{%
  \g@addto@macro\maketable@body{#1\\}%
}
\def\maketable@body{}% initialize
\AtBeginDocument{\global\let\maketable@body@startup\maketable@body}
\AtEndDocument{%
  \global\let\maketable@body@end\@empty
  \def\maketable@data#1{\g@addto@macro\maketable@body@end{#1\\}}%
}
\AtVeryEndDocument{%
  \ifx\maketable@body@startup\maketable@body@end\else
    \@latex@warning{Rerun for \string\maketable}%
  \fi
}
\makeatother

\begin{document}

Start accumulating data

\adddata{a & b}
\adddata{c & d}

Here we print the table

\maketable

And we have new data later

\adddata{1 & 2}
\adddata{3 & 4}
\adddata{5 & 6}
\adddata{7 & 8}

\end{document}

在此处输入图片描述

相关内容