Специальная команда теоремы

Специальная команда теоремы

Моя цель в последних нескольких вопросах состояла в том, чтобы определить очень гибкую команду, позволяющую определять теоремы различных видов. Причина этого заключалась в том, чтобы иметь одну команду в основном для всех видов теорем, как уже используемых, так и никогда ранее не использовавшихся, чтобы избежать необходимости определять множество видов теорем, включая некоторые, которые я использовал бы один раз в жизни и никогда больше, и необходимости заключать название специальной теоремы в скобки как [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) Ссылка на новый вопрос, который решит (или может решить) оставшиеся проблемы, который находится по адресуНастройка списка теорем

Связанный контент