我在最後幾個問題中的目標是定義一個非常靈活的命令,允許定義各種定理。這樣做的原因是基本上對所有類型的定理都有一個命令,無論是已經使用過的還是以前從未使用過的定理,以避免必須定義多種定理,包括一些我一生中會使用一次而不再使用的定理,並且必須將特殊定理的名稱放在括號中 as [name=foo]
,這會產生 (foo)。關於這個命令的另一個有用的事情是,我定義它的方式是它允許計數器顯示的靈活性,允許相同“種類”的定理(即定理,定義等)有時編號為[section]
,有時編號為[subsection]
,有時編號為as [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,我會收到錯誤並進行更正;我怎麼做?注意,這是問題的一半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=]
刪除定理名稱後面的點/冒號/任何內容。
\str_if_eq:nnTF
問題 2 在評論中有答案`\multirow` 和 `\multicolumn` 縮寫的問題 (LaTeX)。
至於問題3的間距問題,似乎隨著問題1的解決而消失了,這是一種幸福。
唯一的麻煩是,除了選擇在 中顯示和忽略哪些定理的方法\listoftheorems
(可以通過使用另一個名稱複製命令,或者實際上添加另一個參數來決定mystyle
使用哪種類型的定理來輕鬆解決),還\listoftheorems
顯示了定理名稱兩邊都有括號,當然名稱中間還有計數器。我想知道是否可以刪除括號(主要問題)並為這個混亂中的清單定義不同的標籤(小問題)。事實上,「小問題」有一個簡單的解決方案:只需使用[{name=[<list name>]<page name>}]
(在複雜的環境中適當實現thmattr
),儘管想想我可能不希望那樣。
無論如何,這個答案有兩個目的:
1)總結我從幾個問題和評論以及對該問題頁面的一個明確點的單獨研究中得到的解決方案,以及
2)鏈接到將(或可能)解決的新問題其餘問題,即客製化定理列表