自定义定理列表

自定义定理列表

我经常使用定理,并列出定理列表。下面是一个最小定理示例thmtools

\documentclass[a4paper]{report}
\usepackage{amsthm,thmtools,amsmath,amssymb,amsfonts}
\newtheorem{teor}{Theorem}[section]

\begin{document}
\chapter{Measures}
\begin{teor}[name=$\sigma$-subadditivity of a measure]
If $(X,\mathcal{E},\mu)$ is a measure space, then for any countable collection of measurable sets $\{A_n\}_{n\in\mathbb{N}}$ we have:
\[\mu\!\left(\bigcup_{n\in\mathbb{N}}A_n\right)\leq\!\sum_{n=1}^\infty\mu(A_n).\]
\end{teor}

\listoftheorems
\end{document}

在此处输入图片描述 在此处输入图片描述

我对定理的默认thmtools处理存在以下问题:

  1. 我可能想要改变同一个定理的计数器序列;例如,如果我定义teor[section](这似乎是合理的,因为我最常在有节而没有小节的章节中使用定理)但后来发现自己身处没有节的章节中,如示例中所示,我想要删除 0;如果我发现自己有小节,我想将小节编号添加到计数器序列中;
  2. 如果我需要一种新的定理,我可以使用手动粗体斜体字体更改并手动将内容写入列表的适当文件,或者返回到文档的开头添加\newtheorem
  3. 列表中项目的结构。

问题 #1 可以通过摆弄计数器\counterwithin和类似的东西来轻松处理。问题 #2 可以通过定义一个新\xbegin宏来轻松处理,该宏采用适当的参数,如果未定义则定义定理类型(顺便问一下,这是\newtheorem一个\@onlypreamble命令吗?),然后触发该\begin命令。让我更好地解释问题 #3,这是问题中的主要问题。列表中的项目结构如下:

<counter sequence><spacing determined bu \thmt@listnumwidth><Theorem kind><space>%
<Theorem name in brackets><dots>

我反而想要:

<Theorem kind><space><ctr seq><colon><space><theorem name>

我设计了一种一次性解决所有三个问题的方法,但它有大量的条件,并且不断给我带来问题。以下是我按照我的方式完成的 MWE:

\documentclass[a4paper]{report}
\usepackage{amsthm,thmtools,amsmath,amssymb,amsfonts,noindentafter}
\usepackage[thm=true,lang=english]{mworkxb} %Call to my own package for theorem handling; see code at link for.
\xtheorsetlist %See code at link. Sets \thmt@listnumwidth.
\listformat{#1} %See code. Removes brackets from \thmtformatoptarg.
%\newtheorem{teor}{Theorem}[section]

\begin{document}
\chapter{Measures}
\begin{teor}[$\sigma$-subadditivity of a measure]
If $(X,\mathcal{E},\mu)$ is a measure space, then for any countable collection of measurable sets $\{A_n\}_{n\in\mathbb{N}}$ we have:
\[\mu\!\left(\bigcup_{n\in\mathbb{N}}A_n\right)\leq\!\sum_{n=1}^\infty\mu(A_n).\]
\end{teor}

\listoftheorems
\end{document}

在此处输入图片描述 在此处输入图片描述

以下是该软件包相关部分要点的链接:

https://gist.github.com/anonymous/6ff1be172846725c516f#file-gistfile1-txt

我知道,该xtheor环境及其孪生环境的注释很乱,但我没有时间处理它们。它给我带来的主要问题与引用获取命令有关,这些命令经常给出难以理解的错误,可能是由于未找到引用序列,命令\@get@label@…返回“哦,天哪,我没有足够的参数”。我打算尝试一种迭代\@car方法\@cdr,但在此之前,我想知道是否有办法篡改列表标题并获得我指示的结构,而无需链接中的大量条件和复杂代码。有什么想法吗?提前谢谢。

编辑: 澄清一下,这个问题只是为了让定理列表中的项目看起来符合要求。我链接了代码,以防有人想看看我是如何以自己不太有效的方式实现这一点的。我不希望任何人帮助我清除该代码,我想重新开始,回到基础thmtools(或几乎),但改变定理列表的管理方式。基本上,我想知道如何重新定义命令\listoftheorems以使定理类型与计数器序列一起出现,因为这样很容易更改\thmt@formatoptarg以删除括号。所以如果你看第一个列表,我希望能够改变左列的生成方式,因为我知道如何改变右列(用\thmt@formatoptarg)。希望这能让问题清楚。

扩张: 为了进一步阐述“以防万一有人想看……”,我放上代码的主要原因是为了在第二张图片中显示结果,这是我的目标结果。我可能还会把代码全部删除,但由于这是一个 LaTeX 论坛,我想有人可能会好奇我是如何做到这一点的。我将长代码放在网站外面以避免问题超载,然后我认为对代码的呈现方式和为什么我想放弃这种方法的一些评论是合理的,这构成了原始问题的最后一部分。此外,如果有人想编译第二个 MWE,那么要点中的代码是必要的,所以这里还有另一个“以防万一”。

长代码阅读指南: 如果有人试图读懂要点中的 989 行代码,那么,有一部分重复了三次,即 ll. 266-427,在 ll. 430-592 和 ll. 596-747 中重复出现。重复是因为我有三个相同的环境,以允许不同的定理放在不同的列表中,因为每个环境中的定理都是一类:@thmattr@thmattr2和、@thmattr3匹配和。第 762 行有一个为各种语言设置一些字符串。您只对情况感兴趣,即 ll. 782-799。此外,ll. 184-223 是 ll. 158-183 的小写等价物,因此如果您想了解促使我放弃这种方法的问题,您可以阅读后者并跳过前者,因为唯一的区别是参考文本的小写。从 l. 963 到最后,有一些额外的与定理相关的东西,但实际上并不相关。我没有尝试在概括之前最小化代码,对此深表歉意。无论如何,它只是为了完整性,我并不是想让任何人阅读那堆乱七八糟的东西。除非他们想读 :)。xtheorxtheor2xtheor3\str_case:nnF{english}

更新: 由于这个问题被搁置了,我再次尝试寻找来源。这个问题指示我编辑\thmt@mklistcmd。事实上,我看到:

\addtotheorempostheadhook{%
  \thmtlo@chaptervspacehack
  \addcontentsline{loe}{\thmt@envname}{%
    \csname ll@\thmt@envname\endcsname
  }%
}

\thmt@mklistcmd精确定义了\csname ll@thmt@envname\endcsname,所以如果我告诉它放置一条具有我想要的结构的线,一切都应该没问题。问题是,事实并非如此。使用以下 MWE:

\documentclass[a4paper]{report}
\usepackage{amsthm,thmtools,amsmath,amssymb,amsfonts}
\newtheorem{teor}{Theorem}[section]
\makeatletter
\renewcommand\thmt@mklistcmd{%
  \@xa\protected@edef\csname l@\thmt@envname\endcsname{% CHECK: why p@edef?
    \@nx\@dottedtocline{1}{1.5em}{\@nx\thmt@listnumwidth}{\thmt@thmname}{mu}%
  }%
  \ifthmt@isstarred
    \@xa\def\csname ll@\thmt@envname\endcsname{%
      \protect\numberline{\thmt@thmname\protect\let\protect\autodot\protect:}%
      \ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi
    }%
  \else
    \@xa\def\csname ll@\thmt@envname\endcsname{%
      \thmt@thmname\ \csname the\thmt@envname\endcsname:\hfil%
      \ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi
    }%
  \fi
  \@xa\gdef\csname thmt@contentsline@\thmt@envname\endcsname{%
    \thmt@contentslineShow% default:show
  }%
}
\makeatother

\begin{document}
\chapter{Measures}
\begin{teor}[name=$\sigma$-subadditivity of a measure]
If $(X,\mathcal{E},\mu)$ is a measure space, then for any countable collection of measurable sets $\{A_n\}_{n\in\mathbb{N}}$ we have:
\[\mu\!\left(\bigcup_{n\in\mathbb{N}}A_n\right)\leq\!\sum_{n=1}^\infty\mu(A_n).\]
\end{teor}

\listoftheorems
\end{document}

我期望看到\@writefile{loe}{Theorem 1.0.1: \thmtformatoptarg{$\sigma$-subadditivity of a measure}}{1}}。但是我没有看到。我一直看到旧的\@writefile{loe}{\contentsline {teor}{\numberline {1.0.1}Theorem\thmtformatoptarg {$\sigma $-subadditivity of a measure}}{1}},并且我已删除了辅助 loe 和 co. 文件并重新编译了很多次。那么发生了什么?

更新: 手动重新定义每个这样的控制序列(或重新定义\newtheorem以自动执行此操作)解决了该问题,这非常奇怪,或者更确切地说,使前一个选项不起作用的事实更加奇怪,因为它以完全相同的方式定义了完全相同的控制序列。但我想我最好再问一个关于这个奇怪的事情的问题,因为它更像是后续问题。无论如何,这是工作的东西:

\documentclass[a4paper]{report}
\usepackage{amsthm,thmtools,amsmath,amssymb,amsfonts,letltxmacro}
\newtheorem{teor}{Theorem}[section]
\makeatletter
\renewcommand\ll@teor{%
      \thmt@thmname\ \csname the\thmt@envname\endcsname:\hfil%
      \ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi
}
\LetLtxMacro{\original@newtheorem}{\newtheorem}
\renewcommand{\newtheorem}[1]{\original@newtheorem #1 \@xa\def\csname ll@\thmt@envname\endcsname{\thmt@thmname\ \csname the\thmt@envname\endcsname:\hfil%
      \ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi
}}
\newtheorem{{defi}{Definizione}[section]}
\newtheorem{*{mapu}{Mapu}}
\makeatother

\begin{document}
\chapter{Measures}
\begin{teor}[name=$\sigma$-subadditivity of a measure]
If $(X,\mathcal{E},\mu)$ is a measure space, then for any countable collection of measurable sets $\{A_n\}_{n\in\mathbb{N}}$ we have:
\[\mu\!\left(\bigcup_{n\in\mathbb{N}}A_n\right)\leq\!\sum_{n=1}^\infty\mu(A_n).\]
\end{teor}
\begin{defi}[name=Una definizione a caso]
Eccheccavoloneso!
\end{defi}
\begin{mapu}[name=mapu]
Mapu mapu mapu mapu.
\end{mapu}

\listoftheorems
\end{document}

如果你重新打开,我可以自己回答,然后链接到后续帖子。如果你认为我也可以使用这篇文章进行后续讨论,请告诉我。顺便说一句,这个问题让我想到了手动重新定义每个。即使在 的重新定义中\csname ll@\thmt@envname\endcsname做出定义也是没用的,我在这里写下来只是为了完整性。\global\thmt@mklistcmd

答案1

答案已经在问题中了,因为当时我发现了它这个问题此答案所回答的问题已关闭,并有 4 票重新打开。现在我发现它已重新打开,所以我发布了部分答案来接受它,将问题从未回答列表中删除,并最终结束其可怕的历史。我需要做的是以下其中之一:

  • 重新定义\thmt@mklistcmd,该命令告诉我们thmtools如何定义下面的所有宏,以及如何制作列表,如果我想将更改应用于所有定理;
  • \ll@<envname>为我想改变外观的定理类型重新定义单一\listoftheorems;例如,如果我有一个名为的定理defi,并且想改变列表中该类定理的外观,我会重新定义\ll@defi

如何重新定义它显然取决于我想要什么。例如,如果我希望标题是

<theorem kind><space><counters><colon><space><theorem title><dots>

喜欢:

定义 2.1.4: 度量空间

我会做类似的事情:

\renewcommand\ll@defi{\thmt@thmname\ \csname the\thmt@envname\endcsname:\ \ifx\@empty\thmt@shortoptarg\else\protect\thmt@formatoptarg{\thmt@shortoptarg}

这自然需要重新定义\thmt@formatoptarg以避免使用括号,即:

\renewcommand\thmt@formatoptarg[1]{#1}

当然,\dottedtocline如果有必要,我会研究如何重新回到正题中,以便得到点。我还会研究如何对齐定理标题。我最后注意到,正如Ulrike Fischer 的评论\thmt@mklistcmd必须重新定义声明一个定理,并且我猜\ll@defi在声明该定理之前重新定义(或定义)defi是无用的。

相关内容