待解决的任务:用户提供字段/变量的值(这些值可以是任意的 LaTeX 代码),最后文档无需用户干预即可排版。我的想法是
\documentclass{myclass}
\begin{form}
... Specification of values in any order
\end{form}
LaTeX 应该保持在前导模式,直到\end{form}
保证没有用户输入产生输出(没有错误)。\end{form}
然后加载一些使用来自用户的值以及(La)TeX 的常用元素的模板。
说明此方法的代码:
\documentclass{article}
\newcommand\A[1]{\gdef\useA{#1}}
\usepackage{environ}
\NewEnviron{B}{\expandafter\gdef\expandafter\useB\expandafter{\BODY}}
\newenvironment{form}%
{}%
{\document
A: \useA
B: \useB
\enddocument
}
\begin{form}
\A{aaa}
\begin{B}
bbb
\end{B}
\end{form}
这段代码可以工作,但至少有一个问题:\document
以 开始,以\endgroup
来抵消\begingroup
的定义中的a \begin
(不存在)。这会产生不太好的效果,即之前的局部定义\document
会被遗忘,所有内容都必须全局定义。我不清楚这是否是唯一的问题,或者是否还有更多陷阱。
使用\begin{document}
或\begingroup\document
代替会导致以 结尾的\document
错误,所以这似乎也不是正确的方法。\begin{form}
\end{document}
我可能会开始只挑选\document
和的相关部分\enddocument
,省略\begin
-\end
部分。这引发了...
问题:开始和完成 LaTeX 文档的实际排版的最不具黑客性/最不具侵入性/最少的方法是什么?
答案1
您可以在环境document
结束后立即form
使用额外的命令执行环境\aftergroup
:
\documentclass{article}
\newcommand\A[1]{\gdef\useA{#1}}
\usepackage{environ}
\NewEnviron{B}{\expandafter\gdef\expandafter\useB\expandafter{\BODY}}
\newenvironment{form}{}{%
\aftergroup\setdocument
}
\newcommand*{\setdocument}{%
\begin{document}
A: \useA
B: \useB
\end{document}
}
\begin{form}
\A{aaa}
\begin{B}
bbb
\end{B}
\end{form}