答案1
以下代码将章节编号和定理环境的标签放在边距中,方法是将它们放在零宽度(和零深度)的右对齐框中。
\documentclass{article}
\newlength{\marginlabelsep}\setlength{\marginlabelsep}{1em} %% <- change to a nice value
\usepackage{titlesec} %% <- To put the section # in the margin
\titleformat{\section}{\normalfont\Large\bfseries}
{\llap{\thesection\hskip\marginlabelsep}}{0pt}{}
\usepackage{amsthm}
\newtheoremstyle{mythmstyle} %% Name
{} %% <- Space above (empty = default = \topsep = 8.0pt plus 2.0pt minus 4.0pt)
{} %% <- Space below (empty = default = \topsep = 8.0pt plus 2.0pt minus 4.0pt)
{\itshape} %% <- Body font
{} %% <- Indent amount (empty = no indent, \parindent = just that)
{\bfseries} %% <- Thm head font
{} %% <- Punctuation after thm head
{0pt} %% <- Space after thm head (or " " or \newline) (default: 5pt plus 1pt minus 1pt)
{\vtop to 0pt{\llap{\thmname{#1}\hskip\marginlabelsep}
\llap{\thmnumber{#2}\hskip\marginlabelsep}}\thmnote{#3\\}%
} %% <- Thm head spec (empty = default ~= \thmname{#1}\thmnumber{ #2}\thmnote{ (#3)})
\theoremstyle{mythmstyle}
\newtheorem{theorem}{Theorem}[section] %% <- Numbering subordinate to sections
\newtheorem{lemma}[theorem]{Lemma} %% <- Uses same counter as theorem
\usepackage{lipsum} %% <- for \lipsum
\begin{document}
\section{My section}
\lipsum[66]
\begin{lemma}
\lipsum[66]\lipsum[75]
\end{lemma}
\begin{theorem}[A beautiful theorem]
\lipsum[66]
\end{theorem}
\lipsum[66]
\end{document}
解释:
我正在使用amsthm
包来创建自定义定理样式。该\newtheoremstyle
命令有点庞大,因为它需要很多参数,所以我保留了这些注释来提醒我每个参数的作用。对我们来说最重要的参数是最后一个参数,它描述了定理头的格式。如果将其留空,则实际上将其定义为
\thmname{#1}\thmnumber{ #2}\thmnote{ (#3)})
参数#1
、#2
和#3
将是定理名称、其编号和标题/注释,并且\thmname
、\thmnumber
和\thmnote
将打印其内容,如果没有名称、编号或标题/注释,则不打印任何内容。
为了将定理头移到页边距,我们应该用一些不占用空间的代码替换它,并在页边距的两条单独的行上打印定理名称+编号,然后是定理注释和换行符(如果有注释)。
TeX 基元\vbox
和\vcenter
可\vtop
用于将多个框打印在一起,如下所示:
\noindent
Word \vbox{\hbox{A}\hbox{B}} word \vtop{\hbox{C}\hbox{D}} word.\\
Next line \vtop to 0pt{\hbox{E}\hbox{F}},\\ %% Note: <-, ^ avoid using \\
last line.
的参数\vtop
必须是一系列框,因此我\hbox
在这里将字母 A、B、... 放在 es(简单的水平框)内。我使用了\vtop to 0pt{...}
而不是\top{...}
来创建一个深度为零的框,因为否则下一行将被向下推(如上面的第二行)。有关框的更多信息,请参见例如这个答案。
为了将定理标签放在页边距中,我使用了\llap{<contents>}
。此 LaTeX 命令打印一个包含 的框<contents>
,不占用空间,并且伸出在左边 (\rlap
作用相同,但在右边突出)。因为它生成一个框,所以可以直接在里面使用\vtop
。下面是一个例子:
ggg\llap{OOO}hhh\rlap{OOO}jjj
\thmname{#1}
我在和之后添加了一个水平空格\thmnumber{#1}
,以确保标签与正文之间有分隔\marginlabelsep
。
评论:
在这次(希望)最后一次编辑之前,最后的论点\newtheoremstyle
是
{\vtop to 0pt{\hbox to -\marginlabelsep{\hss\thmname{#1}}
\hbox to -\marginlabelsep{\hss\thmnumber{#2}}}\thmnote{#3\\}%
} %% <- Thm head spec (empty = default ~= \thmname{#1}\thmnumber{ #2}\thmnote{ (#3)})
这完全没问题。我修改了这一点,因为这样\llap
比将负宽度的框放在 a 内的效果更容易理解(和解释!)。\vbox
\hss
答案2
该amsthm
包提供了\newtheoremstyle
可用于设置定理样式的命令。在正文字体参数(这是第四个参数,参见amsthm
手动的(有关详细信息)该\hangindent
命令可用于指定悬挂缩进。在下面的示例中,手动将其设置为6em
,大约是文本的宽度定理 1。还\newline
添加了一个,以在新行上开始定理文本。
梅威瑟:
\documentclass{article}
\usepackage{amsthm}
\newtheoremstyle{indentdef}{\topsep}{\topsep}{\hangindent=6em}{}{\bfseries}{}{\newline}{}
\theoremstyle{indentdef}
\newtheorem{theorem}{Theorem}
\begin{document}
\section{Introduction}
\begin{theorem}[Theorem title]
Let $f$ be a function whose derivative exists in every point, then $f$ is a continuous function.
\end{theorem}
\end{document}
结果: