在 \end{...} 内排版完整文档

在 \end{...} 内排版完整文档

待解决的任务:用户提供字段/变量的值(这些值可以是任意的 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}

相关内容