ToC 类似定义列表(使用定理环境)

ToC 类似定义列表(使用定理环境)

对于我的一个文档,我使用以下命令来设置我的定理环境amsthm

\usepackage{xcolor}
\usepackage{framed}
\colorlet{shadecolor}{lightgray!25}

\newtheoremstyle{definitionsty}{3pt}{3pt}{\slshape}{}{\bfseries}{.}{.5em}{}
\theoremstyle{definitionsty}
\newtheorem{tdefn}{Definition}[chapter]
\newenvironment{defn}
  {\begin{shaded}\begin{tdefn}}
  {\end{tdefn}\end{shaded}}

然后我能够通过定义某些内容\begin{defn}[My Hilarious Definition] blabla\end{defn},我想在附录末尾或目录和第一章之间包含一个列表,其中包含基于与其页面对应的章节的定义名称和编号,即

Chapter 1 (Kapitel 1 because this is a german document)
    Definition 1.1    - My Hilarious Thing ..........  2
    Definition 1.2    - Another Super Duper Thingy ..  4
...
Chapter 2 (aka. Kapitel 2)
    Definition 2.1    - Math on Crack ............... 27

然而我只想要定义,因为我真的无法说出所有常用的定理,所以我不得不在这个列表中省略它们。

有人能建议一个关于如何创建此类列表的好代码吗?

答案1

thmtools包提供了“定理列表”。但是它默认不提供打印“第 n 章”的功能,而且还有一个问题,即只应显示设置了定义的章节。

thmtools所以情况是这样的:我必须修补用于注释文件中章节分隔符的命令.loe。而不是\addvspace{10pt}让它添加更多内容。

这样,.loe文件中的每个章节都被

\thmlopatch@chapter
...
\thmlopatch@endchapter

因此可以将 表示的部分排版到...框中,以查看是否有结果。因为我们将调用

\listoftheorems[ignoreall,show={tdefn}]

只有定义会保留下来。如果框中有内容,则内容会重新排版,并在前面加上“第 n 章”。

可选名称的排版方式也发生了改变(\thmformatoptarg)。

\documentclass[a4paper]{book}
\usepackage{amsthm,thmtools}
\usepackage{xcolor}
\usepackage{framed}
\colorlet{shadecolor}{lightgray!25}

\newtheorem{thm}{Theorem}[chapter]

\newtheoremstyle{definitionsty}{3pt}{3pt}{\slshape}{}{\bfseries}{.}{.5em}{}
\theoremstyle{definitionsty}
\newtheorem{tdefn}{Definition}[chapter]
\newenvironment{defn}
  {\begin{shaded}\begin{tdefn}}
  {\end{tdefn}\end{shaded}}

\usepackage{etoolbox}
\makeatletter
\patchcmd\thmtlo@chaptervspacehack
  {\addtocontents{loe}{\protect\addvspace{10\p@}}}
  {\addtocontents{loe}{\protect\thmlopatch@endchapter\protect\thmlopatch@chapter{\thechapter}}}
  {}{}
\AtEndDocument{\addtocontents{loe}{\protect\thmlopatch@endchapter}}
\long\def\thmlopatch@chapter#1#2\thmlopatch@endchapter{%
  \setbox\z@=\vbox{#2}%
  \ifdim\ht\z@>\z@
    \hbox{\bfseries\chaptername\ #1}\nobreak
    #2
    \addvspace{10\p@}
  \fi
}
\def\thmlopatch@endchapter{}

\makeatother
\renewcommand{\thmtformatoptarg}[1]{ -- #1}
\renewcommand{\listtheoremname}{List of definitions}


\begin{document}

\frontmatter
\listoftheorems[ignoreall,show={tdefn}]

\mainmatter
\chapter{X}

\begin{defn}[My hilarious definition]
bla bla
\end{defn}

\chapter{Y}

\begin{thm}
b
\end{thm}

\chapter{Z}

\begin{defn}[My hilarious definition 2]
bla bla
\end{defn}

\begin{thm}
a
\end{thm}

\end{document}

在此处输入图片描述

请注意,第 2 章中有一个定理,但没有定义,因此它不会列在“定义列表”中。


如果要自定义列表中条目的外观,请添加

\def\ll@tdefn{%
   \protect\thmtopatch@numbernametext
     \ifx\@empty\thmt@shortoptarg\else[\thmt@shortoptarg]\fi
     {\csname the\thmt@envname\endcsname}%
     {\thmt@thmname}%
}

\newcommand\thmtopatch@numbernametext[3][]{%
    #3 #2%
  \if\relax\detokenize{#1}\relax\else\space -- #1\fi
}

\makeatother上面的代码中。这将打印

定义 1.1 – 我的搞笑定义...... 1

在 的定义中\thmtopatch@numbernametext#1代表(可选)名称(“我的搞笑定义”)、#2环境名称(“定义”)和#3数字。

对于表单的输出

1.1 – 我的搞笑定义............ 1

你可能会定义

\newcommand\thmtopatch@numbernametext[3][]{%
    #2 -- %
  \if\relax\detokenize{#1}\relax #3\else #1\fi
}

因此,没有可选名称参数的定义将被打印为

3.1 – 定义 ................. 42

答案2

amsthm这是一个使用定理类结构的原始定义和 LaTeX 内核\@starttoc命令的解决方案;该etoolbox包用于包含新定义列表中包含定义的章节的信息;只有包含定义的章节才会包含在此新列表中。

带有注释的定义条目将使用以下格式列出

Definition <Number> Note ......<page number>

通用定义(不使用可选参数作为注释)将列为:

Definition <Number> ...........<page number>

代码如下:

\documentclass{book}
\usepackage{amsthm}
\usepackage{etoolbox}
\usepackage{xcolor}
\usepackage{framed}

\colorlet{shadecolor}{lightgray!25}

\newtheoremstyle{definitionsty}{3pt}{3pt}{\slshape}{}{\bfseries}{.}{.5em}{\addcontentsline{lod}{section}{#1~\protect\numberline{#2}{#3}}}
\theoremstyle{definitionsty}
\newtheorem{tdefn}{Definition}[chapter]
\newenvironment{defn}
  {\begin{shaded}\begin{tdefn}}
  {\end{tdefn}\end{shaded}}

\makeatletter
% A command to create the new List of Definitions
\newcommand\listofdefinitions{%
  \chapter*{List Of Definitions}\@starttoc{lod}}

% initial definitions to save the chapter info (name and number)
\def\thischaptertitle{}
\def\thischapternumber{}
\newtoggle{noDefs}

\apptocmd{\@chapter}%
  {\gdef\thischaptertitle{#1}\gdef\thischapternumber{\thechapter}%
    \global\toggletrue{noDefs}}{}{}

% the defn environment does the job: the first time it is used after a \chapter command, 
% it writes the information of the chapter to the LoD
\AtBeginDocument{%
  \AtBeginEnvironment{defn}{%
    \iftoggle{noDefs}{
      \addcontentsline{lod}{chapter}{\chaptername~\thischapternumber\hspace{1em}\thischaptertitle}{}
      \global\togglefalse{noDefs}
    }{}
  }%
}

\makeatother

\begin{document}

\listofdefinitions
\chapter{Test Chapter With Definitions}
\begin{defn}[My Hilarious Thing]
    Definition 1.2    - Another Super Duper Thingy
Test
\end{defn}
\begin{defn}[A Super Duper Thingy]
Test
\end{defn}
\chapter{Test Chapter Without Definitions}
\chapter{Another Test Chapter With Definitions}
\begin{defn}[Another Super Duper Thingy]
Test
\end{defn}
\begin{defn}
Test
\end{defn}

\end{document}

在此处输入图片描述

答案3

ntheorem这是使用包及其命令的解决方案\listtheorems。格式不是最佳的,但您可以自行修复。

\documentclass{book}
\usepackage{amsmath}
\usepackage[standard,amsmath]{ntheorem}
\numberwithin{Theorem}{chapter}
\numberwithin{Definition}{chapter}

\let\oldchapter\chapter
\def\chapter#1{\oldchapter{#1}\addtotheoremfile[Definition]{\newline
\textbf{Chapter \thechapter \qquad #1}}}

\begin{document}
\chapter{Test}
\begin{Theorem}[False Theorem]
This is not a theorem
\end{Theorem}

\begin{Definition}[A definition]
Something
\end{Definition}

List of theorems:
\listtheorems{Theorem}

List of definitions:
\listtheorems{Definition}
\end{document}

示例输出:

在此处输入图片描述

诀窍是

  1. 用于\listtheorems{Definition}仅列出定义,而不列出其他定理环境
  2. 修改的定义\chapter,以便每个新章节都会在定义列表中写入适当的标题。

您应该查阅文档的第 2.4 节ntheorem以了解有关用法的更多信息,并使用新的\chapter定义来根据您的喜好格式化章节标题。

相关内容