在最后几个问题中,我的目标是定义一个非常灵活的命令,允许定义各种类型的定理。这样做的原因是,基本上要为所有类型的定理(包括已经使用过的和从未使用过的)定义一个单一的命令,以避免必须定义多种类型的定理,包括一些我一生中只会使用一次而不会再使用的定理,并且必须将特殊定理的名称放在括号中,如 ,[name=foo]
这会产生 (foo)。我定义此命令的另一个有用之处在于它允许计数器显示的灵活性,允许同一“类型”(即定理、定义等)的定理有时编号为[section]
,有时编号为[subsection]
,有时编号为[chapter]
,具体取决于定理位置的细分,从而避免在[subsection]
没有子部分划分的地方出现零,并且[section]
有时我希望将其定义为 ,[subsection]
因为存在这样的细分,所以必须将其定义为。目前,命令如下面最简代码所示:
\documentclass[a4paper]{report}
\usepackage{amsmath,amssymb,amsfonts,xparse,amsthm,mathptmx}
\makeatletter
\newtheorem*{@thmattr}{\theorem@attr}
\NewDocumentEnvironment{thmattr}{moO{x}oo}
{\IfNoValueTF{#2}
{\def\theorem@attr{#1}}
{\@ifundefined{c@#2}
{\newcounter{#2} \setcounter{#2}{1}}
{\addtocounter{#2}{+1}}
\def\counters{\if #3c
\arabic{chapter}.\arabic{#2}
\else{
\if #3s
\arabic{chapter}.\arabic{section}.\arabic{#2}
\else{
\if#3x
\arabic{chapter}.\arabic{section}.\arabic{subsection}.\arabic{#2}
\else
\errmessage{Illegal argument in counter definition}
\errhelp{The third argument must be either c, s or x, for chapter, section and subsection respectively}
\fi}
\fi}
\fi}\def\theorem@attr{#1\ \counters}}
\IfNoValueTF{#4}
{\begin{@thmattr}}
{\IfNoValueTF{#5}
{\begin{@thmattr}[\textbf{#4}]}
{\begin{@thmattr}[\textbf{#4}\label{#5}]}}}
{\end{@thmattr}}
\makeatother
\begin{document}
\begin{thmattr}{Teorema della Palla Pelosa}
\end{thmattr}
\begin{thmattr}{Teorema}[teor][x]
\end{thmattr}
\begin{thmattr}{Esercizio Imperiano}[eseese][c]
\end{thmattr}
\begin{thmattr}{Definizione}[defi][s][Estensione algebrica][thm:defi:EstAlg]
\end{thmattr}
\begin{thmattr}{Sorrata}[mu][c][Estensione algebrica]
\end{thmattr}
\end{document}
排版为:
我的问题是:
1) 如果我使用thmtools
,我会得到一个错误undefined control sequence: \thmt@thmname->\theorem@attr
(或类似的错误),但如果没有它,如上面的代码所示,名称周围的括号不会加粗,名称会被强制加粗,而使用 ,thmtools
我会自动将两者加粗;有没有办法在不使用thmtools
或 的情况下获得粗体以解决错误thmtools
?如果 的错误thmtools
无法解决,有没有办法在\listoftheorems
没有该包的情况下制作一个?
2)\if
当参数是字符串时,使用 比较参数会导致问题;如果参数是字符串而不是单个字符,我想发送一条错误消息,这样如果我的手在键盘上滑了一下,而不是 c,我输入了例如 cv,我会收到一个错误并更正它;我该怎么做?NB,这是问题的一半https://tex.stackexchange.com/questions/167513/special-conditionals-tex。
3) 一个有计数器但没有标签的定理(排版代码中的 Esercizio Imperiano)在计数器和点之间有一个相当难看的空格;我该如何删除它?或者,如果可能的话,我该如何删除点?为什么定理名称和计数器之间的空格以及计数器和点之间的空格的长度似乎会根据计数器的数量而变化?
更新: 正如评论中提到的,问题一已经解决。然而,解决方案将点变成了更难看的冒号,并产生了定理列表中名称周围的括号问题。我该如何解决这些问题?使用相同的定理集,加上第一个定理中输入的内容,使用以下代码:
\makeatletter
\declaretheoremstyle[
spaceabove=\topsep, spacebelow=\topsep,
headfont=\normalfont\bfseries,
notefont=\bfseries, notebraces={}{},
bodyfont=\normalfont\itshape,
postheadspace=0.5em,
name={\ignorespaces},
numbered=no,
headpunct=:]
{mystyle}
\declaretheorem[style=mystyle]{@thmattr}
\NewDocumentEnvironment{thmattr}{moO{x}oo}
{\IfNoValueTF{#2}
{\def\theorem@attr{#1}}
{\@ifundefined{c@#2}
{\newcounter{#2} \setcounter{#2}{1}}
{\addtocounter{#2}{+1}}
\def\counters{\if #3c
\arabic{chapter}.\arabic{#2}
\else{
\if #3s
\arabic{chapter}.\arabic{section}.\arabic{#2}
\else{
\if#3x
\arabic{chapter}.\arabic{section}.\arabic{subsection}.\arabic{#2}
\else
\errmessage{Illegal argument in counter definition}
\errhelp{The third argument must be either c, s or x, for chapter, section and subsection respectively}
\fi}
\fi}
\fi}\def\theorem@attr{#1\counters}}
\IfNoValueTF{#4}
{\begin{@thmattr}[\theorem@attr]}
{\IfNoValueTF{#5}
{\begin{@thmattr}[\theorem@attr (#4)]}
{\begin{@thmattr}[\theorem@attr (#4)\label{#5}]}}}
{\end{@thmattr}}
\renewcommand\thmt@listnumwidth{-1.5em}
\makeatother
生成:
答案1
问题 1 的解决方案为以名称作为参数的定理样式,注意应该使用[headpunct=]
删除定理名称后的点/冒号/其他内容。
问题 2 的答案在\str_if_eq:nnTF
评论中`\multirow` 和 `\multicolumn` 缩写的问题 (LaTeX)。
至于问题3中的间距问题,它似乎随着问题1的解决而消失了,真是一件令人高兴的事。
唯一的麻烦是,除了在 中选择显示和忽略哪些定理的方法\listoftheorems
(可以通过使用另一个名称复制命令或实际上添加另一个参数来决定mystyle
使用哪种类型的定理来轻松解决)之外,\listoftheorems
定理名称周围显示括号,当然名称中间有计数器。我想知道是否可以删除括号(主要问题)并为这个混乱中的列表定义不同的标签(次要问题)。事实上,“次要问题”有一个简单的解决方案:只需使用[{name=[<list name>]<page name>}]
(在复杂thmattr
环境中适时实现),尽管考虑一下我可能不想要那样。
无论如何,这个答案有两个目的:
1)总结我从几个问题和评论中得到的解决方案,并单独研究这个问题页面上的一个明确点,以及
2)链接到将(或可能)解决剩余问题的新问题,即自定义定理列表