这就是我想要实现的目标:
\documentclass{article}
\begin{document}
\add{One}
\add{Two}
\add{Three}
\print % Only here "One Two Three" will be rendered
\end{document}
如何才能做到这一点?
答案1
例如电子工具箱(全局附加,如果您需要本地\gappto
使用则可以)。\appto
\documentclass{report}
\usepackage{etoolbox}
\begin{document}
\newcommand\print{}
\gappto\print{one}
\gappto\print{two}
\gappto\print{three}
and now \print
\end{document}
答案2
\documentclass{article}
\newcommand\myadds{}
\newcommand\add[1]{\expandafter\def\expandafter\myadds
\expandafter{\myadds#1 }}
\begin{document}
\add{One}
\add{Two}
\add{Three}
\myadds
\end{document}
如果您希望即使\add
s 成组出现也能正常工作,请更改\def
为\gdef
。
如果您希望能够添加段落作为\add
内容的一部分,请将其包含\expandafter\long
在定义的开头\add
。
这个最终的、包罗万象的定义在功能上似乎与内置系统宏等效\g@addto@macro
,例如
\documentclass{article}
\newcommand\myadds{}
\makeatletter
\newcommand\add[1]{\g@addto@macro\myadds{#1 }}
\makeatother
\begin{document}
\add{One}
\add{Two}
\add{Three}
\myadds
\end{document}
答案3
使用 L3 编程层(现在在 LaTeX 内核中)。
\documentclass{article}
\ExplSyntaxOn
\tl_new:N \myadds
\NewDocumentCommand \add { m } { \tl_put_right:Nn \myadds { #1 } }
\ExplSyntaxOff
\begin{document}
\add{One}
\add{Two}
\add{Three}
\myadds
\end{document}
答案4
我不太清楚你想要实现什么,所以我要冒险一试。我处理动态内容的方式是用另一种语言生成 LaTeX 代码 — 在我的情况下是使用 ERB 模板的 Ruby。常量元素是纯 LaTeX,而对于每个累积项,我使用 Ruby 生成适当的 LaTeX 代码。
如果可能的话,这还使您能够将数据逻辑与实际输出格式分开。但是,ERB 模板用于生成整个 LaTeX 文件,然后将其编译为 PDF — 我不确定您提出这个问题的动机是什么,因此不知道这是否适合您。
以下是示例代码逻辑:
\documentclass{article}
\begin{document}
\begin{env}
<% $data.each do |item| -%>
\strong{item}
<% end -%>
\end{env}
\end{document}