![Специальная команда теоремы](https://rvso.com/image/286987/%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%20%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D1%8B.png)
Моя цель в последних нескольких вопросах состояла в том, чтобы определить очень гибкую команду, позволяющую определять теоремы различных видов. Причина этого заключалась в том, чтобы иметь одну команду в основном для всех видов теорем, как уже используемых, так и никогда ранее не использовавшихся, чтобы избежать необходимости определять множество видов теорем, включая некоторые, которые я использовал бы один раз в жизни и никогда больше, и необходимости заключать название специальной теоремы в скобки как [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, я получу ошибку и исправлю ее; как мне это сделать? Примечание: это была половина вопроса на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) Ссылка на новый вопрос, который решит (или может решить) оставшиеся проблемы, который находится по адресуНастройка списка теорем