我一直很高兴使用该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
一种方法是使用\xapptocmd
fromxpatch
包附加之后的一些命令\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}