为什么双列模式会破坏 \AtBeginDocument{} 的使用?

为什么双列模式会破坏 \AtBeginDocument{} 的使用?

我一直很高兴使用该multicol包来布局一组从同一源为多种输出格式生成的文档。这必然会将相同的代码从文档源移动到样式文件。例如,我需要能够选择是否从样式包中添加标题。而不是:

\begin{document}
\maketitle

我需要能够运行相当于:

\AtBeginDocument{\maketitle}
\begin{document}

这看起来很简单,但是multicol会破坏mdframed箱子和显然没有办法解决这个问题。因此,我一直在尝试改用twocolumn布局模式。这解决了框破坏问题,但又引入了新的问题。首先,我尝试将选项添加到geometry我已经使用的包中。这产生了奇怪的效果,将我的标题放在一列中,这不是我想要的:

\documentclass{scrartcl}
\usepackage[twocolumn]{geometry}
\usepackage{lipsum}
\title{Title}
\author{Me}
\AtBeginDocument{\maketitle}
\begin{document}
\lipsum[1-3]
\end{document}

几何列

因此我尝试使用文档类的选项。

\documentclass[twocolumn]{scrartcl}
\usepackage{geometry}
\usepackage{lipsum}
\title{Title}
\author{Me}
\AtBeginDocument{\maketitle}
\begin{document}
\lipsum[1-3]
\end{document}

这会产生一个错误:

! LaTeX 错误:缺少 \begin{document}。请参阅 LaTeX 手册或 LaTeX Companion 了解解释。输入 H 可立即获得帮助.... \begin{document}

奇怪的是,手动运行\maketitle解决了这个错误:

\documentclass[twocolumn]{scrartcl}
\usepackage{geometry}
\usepackage{lipsum}
\title{Title}
\author{Me}
\AtBeginDocument{}
\begin{document}
\maketitle
\lipsum[1-3]
\end{document}

文档类列

在这个版本中,我的标题像我想要的那样跨越了列,但是当然我无法正确控制在哪个版本中应该有一个标题,这对我来说毫无用处。

我怎样才能 ① 设置列geometry但让标题跨越两列或 ② 使用文档类选项进行设置但仍然能够使用\AtBeginDocument

答案1

\AtBeginDocument对于排版材料来说,这是错误的钩子。此钩子仍在序言中执行。包etoolbox提供了\AfterEndPreamble,它在最后执行\begin{document},因此这里允许使用文档材料:

\documentclass[twocolumn]{scrartcl}
\usepackage{geometry}
\usepackage{etoolbox}
\usepackage{lipsum}
\title{Title}
\author{Me}
\AfterEndPreamble{\maketitle}
\begin{document}
\lipsum[1-3]
\end{document}

答案2

一种方法是使用\xapptocmdfromxpatch附加之后的一些命令\begin{document}(缩写形式\document

\AtBeginDocument不适用于排版材料,因为它会扩展代码 \begin{document}进入行动

Heiko Oberdiek 在回答中展示了另一种方法。

\documentclass[twocolumn]{scrartcl}
\usepackage{geometry}
\usepackage{xpatch}
\usepackage{lipsum}
\title{Title}
\author{Me}
%\AtBeginDocument{\maketitle}
\xapptocmd{\document}{\maketitle}{}{}
\begin{document}
\lipsum[1-3]
\end{document}

相关内容