我想在我的包中提供作者可用的宏来存储稍后会出现在表中的数据,但最好允许作者随时定义该表中的数据,即使在创建和呈现表之后。
我是否可以将数据存储在文档的任何位置,并且仍然可以在任何位置检索所有数据?另一种提问方式是:是否存在某种形式的延迟处理,以便我可以这样做(有点伪代码):
\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}