定理名称、编号及注释在边栏中用 amsthm 表示

定理名称、编号及注释在边栏中用 amsthm 表示

我的问题与定理名称/页边编号定理名称和编号在页边,正文中有注释,但这些先前问题的答案并不能完全解决我的问题。

我使用包amsthm

我想实现定理名称、编号和注释出现在页边距栏中,左页的左侧参差不齐,右页的右侧参差不齐。

这是我目前的尝试。

\documentclass[fontsize=11pt, paper=a4, DIV=classic]{scrbook}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsthm}
\usepackage{ragged2e}
\usepackage{blindtext}

\KOMAoption{headinclude}{false}
\KOMAoption{footinclude}{false}
\KOMAoption{mpinclude}{true}
\recalctypearea
\setlength{\marginparsep}{2em}
\setlength{\marginparwidth}{10em}

% \RaggedOuter means
% (1) \RaggedRight in one-side mode
% (2) \RaggedLeft  on left pages in two-side mode
% (3) \RaggedRight on right pages in two-side mode
\let\RaggedOuter\RaggedRight

% Must be called immediately after opening a float environment
% in order to adjust \RaggedOuter and listing line numbers
\newcommand{\setOddEvenPageLayout}%
{%
  \if@twoside%
    \ifthispageodd{\let\RaggedOuter\RaggedRight}{\let\RaggedOuter\RaggedLeft}%
  \fi%
}

\newtheoremstyle{thmmargin}  %
  {0pt}                      % space above
  {0pt}                      % space below
  {\normalfont\normalsize}   % body font
  {0pt}                      % indent
  {\sffamily\bfseries\small} % headfont
  {}                         % punctuation
  {\parindent}               % space after head
  {                          % theorem head spec
    \setOddEvenPageLayout%
    \llap%
    {%
      \begin{minipage}[t]{\marginparwidth}%
      \RaggedOuter\hbadness=10000%
      #1~#2\\[.2ex]\normalfont{}#3%
      \end{minipage}%
      \hspace{\marginparsep}%
    }%
  }

\theoremstyle{thmmargin}

\newtheorem{definition}{Definition}[chapter]
\newtheorem{theorem}{Satz}[chapter]


\begin{document}

\chapter{Theorems with margin captions}

\blindtext

\begin{definition}[Kellerautomat (KA)\\ pushdown automaton (PDA)]
\blindtext
\end{definition}

\blindtext

\clearpage

\blindtext

\begin{theorem}[Satz von Radó]
Die Radó-Funktion ist nicht berechenbar.
\end{theorem}

\blindtext

\end{document}

这种方法存在各种问题:

  • 定理的主体并不浮动在小页面的旁边。
  • 缩进比 稍大一些\parindent
  • 如果定理主体的行数少于边注中的描述(名称、编号、注释),则会导致空行。相反,下一个段落应该继续,而不必关心超出的边注。
  • 目前尚未实施任何机制来使边注正确地放置在右侧。

我认为我需要一种完全不同的方法,但我不知道如何解决这个问题。不过,amsthm如果可能的话,我还是想坚持下去。

编辑(2017年11月02日 01:20)

我在使用 方面取得了一些进展。此包允许我在或中thmtools使用。但是,边注的垂直定位是错误的,并且定理主体没有按预期开始新的段落。此外,密钥尚未评估,但数字的格式是硬编码的。\marginpar{}preheadhookpostheadhooknumberwithin

\documentclass[fontsize=11pt, paper=a4, DIV=classic]{scrbook}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{ragged2e}
\usepackage{changepage}
\usepackage{blindtext}

\KOMAoption{mpinclude}{true}
\recalctypearea
\setlength{\marginparsep}{2em}
\setlength{\marginparwidth}{10em}

\makeatletter
\newcommand{\RaggedOuter}%
{%
  \if@twoside%
    \checkoddpage%
    \ifoddpage%
      \RaggedRight%
    \else%
      \RaggedLeft%
    \fi%
  \else%
    \RaggedRight%
  \fi%
}
\makeatother

\declaretheoremstyle[%
  spaceabove=0pt,%
  spacebelow=0pt,%
  headindent=0pt,%
  postheadspace=0pt,%
  headfont=\sffamily\bfseries\small,%
  notefont=\rmfamily\mdseries\small,%
  bodyfont=\normalfont,%
  preheadhook={},%
  headformat={},%
  headpunct={},%
  postheadhook={\marginpar{\RaggedOuter\the\thm@headfont\thmt@thmname~\thechapter.\arabic{\thmt@envname}\\\the\thm@notefont\thmt@optarg}},%
  numberwithin=chapter%
]{thmmargcapt}

\declaretheorem[style=thmmargcapt, name=Definition]{definition}
\declaretheorem[style=thmmargcapt, name=Satz]{theorem}


\begin{document}

\chapter{Theorems with margin captions}

\blindtext

\begin{definition}[Kellerautomat (KA)\\ pushdown automaton (PDA)]
Eine ganz wichtige Definition.
\end{definition}

\blindtext

\clearpage

\blindtext

\begin{theorem}[Satz von Radó]
Die Radó-Funktion ist nicht berechenbar.
\end{theorem}

\blindtext

\end{document}

答案1

谢谢史蒂文·B·塞格莱特斯,他为上述空间问题提出了一个绝妙的解决方案(见这个单独的问题),现在我可以发布一个令我满意的版本了:

\documentclass[fontsize=11pt, paper=a4, DIV=classic]{scrbook}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{xpatch}
\usepackage{ragged2e}
\usepackage{changepage}
\usepackage{blindtext}

\KOMAoption{mpinclude}{true}
\recalctypearea
\setlength{\marginparsep}{2em}
\setlength{\marginparwidth}{10em}

\makeatletter

\newcommand{\RaggedOuter}%
{%
  \if@twoside
    \checkoddpage
    \ifoddpage
      \RaggedRight
    \else
      \RaggedLeft
    \fi
  \else
    \RaggedRight
  \fi
}

\newcommand{\cl@ThmMarginCaption}%
{
  \leavevmode
  \marginpar%
  {%
    \RaggedOuter
    \hbadness=10000
    \the\thm@headfont\thmt@thmname~\thechapter.\arabic{\thmt@envname}\\%
    \the\thm@notefont\thmt@optarg
  }%
}

\declaretheoremstyle%
[%
  spaceabove={\parskip},
  spacebelow=0pt,
  headindent=0pt,
  postheadspace=0pt,
  headformat={},
  headpunct={},
  headfont=\sffamily\bfseries\small,
  notefont=\rmfamily\mdseries\small,
  bodyfont=\normalfont,
  preheadhook={},
  postheadhook={\cl@ThmMarginCaption},
]%
{thmmcaption}

\newcommand{\DeclareTheorem}[2][]%
{%
  \declaretheorem[#1]{#2}
  \expandafter\let\csname cl@orig@#2\expandafter\endcsname\csname#2\endcsname
  \expandafter\let\csname cl@orig@end#2\expandafter\endcsname\csname end#2\endcsname
  \renewenvironment{#2}[1][]%
    {\csname cl@orig@#2\endcsname[##1]\ignorespaces}%
    {\csname cl@orig@end#2\endcsname}%
}

\DeclareTheorem[name=Definition, numberwithin=chapter, style=thmmcaption]{definition}
\DeclareTheorem[name=Satz,       numberwithin=chapter, style=thmmcaption]{theorem}

\makeatother


\begin{document}

\chapter{Theorems with margin captions}

\blindtext

\begin{definition}[Kellerautomat (KA)\\pushdown automaton (PDA)]
Eine ganz wichtige Definition, die natürlich länger als eine Zeile sein sollte, um sehen zu können, ob alles funktioniert wie gewünscht.
\end{definition}

\blindtext

\clearpage

\blindtext

\begin{theorem}[Satz von Radó]
Die Radó-Funktion ist nicht berechenbar.
\end{theorem}

\blindtext

\end{document}

定理主体不会自动应用段落缩进,而是\indent需要在这种环境的主体内手动添加。但是,如果两个紧密相关的定义放在一个段落中,这甚至是需要的。

附录

这是典型的双页纸的样子。页面格式为 DIN A4。装订校正为 12 毫米。

双页带边距标题

相关内容