Gemeinsam genutzte Zähler von mdthereom, cleverref und verschachtelte Theoreme

Gemeinsam genutzte Zähler von mdthereom, cleverref und verschachtelte Theoreme

Ich habe Probleme, mdframed so einzurichten, dass

  1. Es ist kompatibel mit cleverref
  2. alle mdframed-Boxen teilen sich den gleichen Zähler
  3. bricht nicht ab, wenn MDFramed-Umgebungen verschachtelt sind

Demo-Datei. Idealerweise sollten wir sehen

  • Lemma 1.1: Hauptlemma

  • Anmerkung 1.2: Berechnungen

  • Lemma 1.3: Berechnung 1

  • Lemma 1.4: Berechnung 2

  • Bemerkung 1.5: rmk 1

Hier ist meine ursprüngliche Präambeldatei, die 1) und 3) erfüllt. Aber wir haben Lemma 1.1, Anmerkung 1.1, Lemma 1.2, Lemma 1.3. Anmerkung 1.1 Da die Zähler für jeden\mdtheorem

\documentclass{book}
\usepackage{amsthm,xcolor,mdframed,hyperref,cleveref}

%Headers and Sections

% Colors

\definecolor{tab-blue}{rgb}{0.341,0.471,0.643}
\definecolor{tab-orange}{rgb}{0.894,0.580,0.267}

%%%
%Counters
\newcounter{thechapter}
%%%
% Define fChapter
%for putting chapter numbers after the title


% Chapters
\newcommand{\fchapter}[1]%
{%
    \phantomsection\chapter*{Chapter #1}%
    \stepcounter{thechapter}
    \newpage% Chapter Number
} 

% Copy the same style but modify the colour only
\mdfdefinestyle{theoremstyle}{%
    backgroundcolor=tab-blue!10
}

\mdfdefinestyle{remarkstyle}{%
    backgroundcolor=tab-blue!5,
}

\mdfdefinestyle{notestyle}{%
    backgroundcolor=tab-orange!5,
}

\mdtheorem[style=theoremstyle]{lemma}{Lemma}[thechapter]
\mdtheorem[style=remarkstyle]{remark}{Remark}[thechapter]
\mdtheorem[style=notestyle]{note}{Note}[thechapter]

% Here we manage Clever Headers
\crefname{lemma}{lem.}{lems.}
\Crefname{lemma}{Lemma}{Lemmas}

\crefname{note}{note}{notes}
\Crefname{note}{Note}{Notes}

\begin{document}
\fchapter{1: main result}
\begin{lemma}[main lemma]\label{lem:main}
1234556
\end{lemma}
\begin{proof}
    123
\begin{note}[calculations]
\begin{lemma}[calculation 1]\label{lem:calc 1}
calc 1 here
\end{lemma}
\begin{proof}
calc 1 proof
\end{proof}
\begin{lemma}[calculation 2]\label{lem:calc 2}
calc 2 here
\end{lemma}
\begin{proof}
calc 2 proof
\end{proof}
\begin{remark}[rmk 1]\label{rmk: rmk 1}
rmk 
\end{remark}
\end{note}

\end{proof}

Cleveref tests: 
\begin{itemize}
    \item main lemma \cref{lem:main}
    \item note calculations: \cref{note:calculations}
    \item lemma calc 1: \cref{lem:calc 1}
    \item lemma calc 2: \cref{lem:calc 2}
    \item rmk 1 1: \cref{rmk: rmk 1}
\end{itemize}
\end{document}


Inspiriert vonHier, und durch die Verwendung eines neuen Zählers boxcounterhabe ich die drei \mdtheoremZeilen im vorherigen Dokument ersetzt. Wir haben jetzt einen gemeinsamen Zähler, aber wir haben cleveref kaputt gemacht (das beim Versuch, auf die Umgebungen zu verweisen, ??? anzeigt). Das liegt daran, dass \crefversucht wird, auf den Boxzähler statt auf die Umgebung selbst zu verweisen.

Verschachtelte Umgebungen sind ebenfalls fehlerhaft, mit wiederholten Nummern (Hinweis 1.5 sollte Hinweis 1.2 sein), da das Kompilieren des Dokuments

Lemma 1.1, Anmerkung 1.5, Lemma 1.3, Lemma 1.4, Bemerkung 1.5.

\documentclass{book}
\usepackage{amsthm,xcolor,mdframed,hyperref,cleveref}
% Colors
\definecolor{tab-blue}{rgb}{0.341,0.471,0.643}
\definecolor{tab-orange}{rgb}{0.894,0.580,0.267}

%%%
%Counters
\newcounter{thechapter}

% Chapters
\newcommand{\fchapter}[1]%
{%
    \phantomsection\chapter*{Chapter #1}%
    \stepcounter{thechapter}
    \newpage% Chapter Number
} 

% Copy the same style but modify the colour only
\mdfdefinestyle{theoremstyle}{%
    backgroundcolor=tab-blue!10
}

\mdfdefinestyle{remarkstyle}{%
    backgroundcolor=tab-blue!5,
}

\mdfdefinestyle{notestyle}{%
    backgroundcolor=tab-orange!5,
}

\newcounter{boxcounter}[thechapter]
\renewcommand{\theboxcounter}{\arabic{thechapter}.\arabic{boxcounter}}

\newenvironment{lemma}[1][]{%
    \refstepcounter{boxcounter}
    \begin{mdframed}[%
        frametitle={Lemma \theboxcounter\ #1},
        style=theoremstyle
    ]%
}{%
    \end{mdframed}
}

\newenvironment{note}[1][]{%
    \refstepcounter{boxcounter}
    \begin{mdframed}[%
        frametitle={Note \theboxcounter\ #1},
        style=notestyle
    ]%
}{%
    \end{mdframed}
}

\newenvironment{remark}[1][]{%
    \refstepcounter{boxcounter}
    \begin{mdframed}[%
        frametitle={Remark \theboxcounter\ #1},
        style=remarkstyle
    ]%
}{%
    \end{mdframed}
}

% Here we manage Clever Headers
\crefname{lemma}{lem.}{lems.}
\Crefname{lemma}{Lemma}{Lemmas}

\crefname{note}{note}{notes}
\Crefname{note}{Note}{Notes}

\begin{document}
\fchapter{1: main result}
\begin{lemma}[main lemma]\label{lem:main}
1234556
\end{lemma}
\begin{proof}
    123
\begin{note}[calculations]\label{note:calculations}
\begin{lemma}[calculation 1]\label{lem:calc 1}
calc 1 here
\end{lemma}
\begin{proof}
calc 1 proof
\end{proof}
\begin{lemma}[calculation 2]\label{lem:calc 2}
calc 2 here
\end{lemma}
\begin{proof}
calc 2 proof
\end{proof}
\begin{remark}[rmk 1]\label{rmk: rmk 1}
rmk 
\end{remark}
\end{note}

\end{proof}

Cleveref tests: 
\begin{itemize}
    \item main lemma \cref{lem:main}
    \item note calculations: \cref{note:calculations}
    \item lemma calc 1: \cref{lem:calc 1}
    \item lemma calc 2: \cref{lem:calc 2}
    \item rmk 1 1: \cref{rmk: rmk 1}
\end{itemize}
\end{document}

Antwort1

Da du kein kompilierbares MWE gepostet hast, ist die folgende Antwort nicht direkt auf deine Bedürfnisse zugeschnitten, sondern dient nur der Veranschaulichung des Prinzips. Der Grund, warum dein dritter angezeigter Codeblock nicht funktioniert, ist, dass du für die drei Umgebungen denselben Zähler verwendest. Cleveref verwendet den Zählernamen, um die verschiedenen Umgebungen voneinander zu unterscheiden.

Die Lösung hierfür (die intern zum cleverefUmgang mit Theoremumgebungen verwendet wird, die denselben Zähler gemeinsam nutzen und amsthmdas gleiche Problem aufweisen) besteht in der Erstellung eines doppelten Slave-Zählers.

Zum Beispiel

\documentclass{article}
\usepackage{cleveref}

\newcounter{mastercounter}
\newcounter{envAcount}
\newcounter{envBcount}
\makeatletter
\let\c@envAcount\c@mastercounter
\let\c@envBcount\c@mastercounter
\makeatother

\newenvironment{envA}{\refstepcounter{envAcount}\textbf{First Environment \theenvAcount}\par}{}
\newenvironment{envB}{\refstepcounter{envBcount}\textbf{Second Enviornment \theenvBcount}\par}{}

\Crefname{envAcount}{First}{First}
\Crefname{envBcount}{Second}{Second}

\begin{document}

\begin{envA}\label{envAtest}
        Test
\end{envA}

\begin{envB}\label{envBtest}
        Another test
\end{envB}

\Cref{envAtest} and \Cref{envBtest}

\end{document}
  1. Dieser Code erstellt drei Zähler: mastercounter, envAcount, und envBcount.
  2. Die Zeilen zwischen \makeatletter...\makeatother„make“ envAcountund „ envBcountintern“ weisen denselben Zähler auf wie mastercounter, daher erhöht eine Erhöhung um eine Zeile alle drei * .
  3. Dann definieren wir neue Umgebungen envAund envB; beachten Sie, dass Sie in jeder Umgebung \refstepcounterentweder envAcountoder envBcountje nach Bedarf verwenden. Dies ist wichtig, da der Zählername in der .auxDatei aufgezeichnet wird, wenn Sie \labeldie Umgebung verwenden.
  4. Beachten Sie, dass wir die \Crefnamemithilfe derNamen der Zähler, nicht die Namen der Umgebung, die den Zähler verwendet.

Der obige Code erzeugt die folgende Ausgabe Bildbeschreibung hier eingeben

Sie können den Trick jetzt selbst in Ihr gesamtes Dokument integrieren, indem mdframedSie Ihre Umgebungen definieren.

* Eine Alternative zur manuellen Ausführung ist die Verwendung eines Pakets wieAliasname.


Nachdem Sie nun ein MWE hinzugefügt haben, finden Sie hier eine an Ihr MWE angepasste Version

\documentclass{book}
\usepackage{amsthm,xcolor,mdframed,hyperref,cleveref}
% Colors
\definecolor{tab-blue}{rgb}{0.341,0.471,0.643}
\definecolor{tab-orange}{rgb}{0.894,0.580,0.267}

%%%
%Counters
\newcounter{thechapter}

% Chapters
\newcommand{\fchapter}[1]%
{%
    \phantomsection\chapter*{Chapter #1}%
    \stepcounter{thechapter}
    \newpage% Chapter Number
} 

% Copy the same style but modify the colour only
\mdfdefinestyle{theoremstyle}{%
    backgroundcolor=tab-blue!10
}

\mdfdefinestyle{remarkstyle}{%
    backgroundcolor=tab-blue!5,
}

\mdfdefinestyle{notestyle}{%
    backgroundcolor=tab-orange!5,
}

\newcounter{boxcounter}[thechapter]
\renewcommand{\theboxcounter}{\arabic{thechapter}.\arabic{boxcounter}}
\newcounter{lemma}
\newcounter{note}
\newcounter{remark}
\makeatletter
\let\c@lemma\c@boxcounter
\let\c@note\c@boxcounter
\let\c@remark\c@boxcounter
\let\thelemma\theboxcounter
\let\thenote\theboxcounter
\let\theremark\theboxcounter
\makeatother


\newenvironment{lemma}[1][]{%
    \refstepcounter{lemma}
    \edef\x{Lemma \thelemma\ #1}
    \begin{mdframed}[%
        frametitle={\x},
        style=theoremstyle
    ]%
}{%
    \end{mdframed}
}

\newenvironment{note}[1][]{%
    \refstepcounter{note}
    \edef\x{Note \thenote\ #1}
    \begin{mdframed}[%
        frametitle={\x},
        style=notestyle
    ]%
}{%
    \end{mdframed}
}

\newenvironment{remark}[1][]{%
    \refstepcounter{remark}
    \edef\x{Remark \theremark\ #1}
    \begin{mdframed}[%
        frametitle={\x},
        style=remarkstyle
    ]%
}{%
    \end{mdframed}
}

% Here we manage Clever Headers
\crefname{lemma}{lem.}{lems.}
\Crefname{lemma}{Lemma}{Lemmas}

\crefname{note}{note}{notes}
\Crefname{note}{Note}{Notes}

\begin{document}
\fchapter{1: main result}
\begin{lemma}[main lemma]\label{lem:main}
1234556
\end{lemma}
\begin{proof}
    123
\begin{note}[calculations]\label{note:calculations}
\begin{lemma}[calculation 1]\label{lem:calc 1}
calc 1 here
\end{lemma}
\begin{proof}
calc 1 proof
\end{proof}
\begin{lemma}[calculation 2]\label{lem:calc 2}
calc 2 here
\end{lemma}
\begin{proof}
calc 2 proof
\end{proof}
\begin{remark}[rmk 1]\label{rmk: rmk 1}
rmk 
\end{remark}
\end{note}

\end{proof}

Cleveref tests: 
\begin{itemize}
    \item main lemma \cref{lem:main}
    \item note calculations: \cref{note:calculations}
    \item lemma calc 1: \cref{lem:calc 1}
    \item lemma calc 2: \cref{lem:calc 2}
    \item rmk 1 1: \cref{rmk: rmk 1}
\end{itemize}
\end{document}

welche Shows

Bildbeschreibung hier eingeben

Ein Trick dabei ist die Zeile

\edef\x{Note \thenote\ #1}

um das Problem zu umgehen, dass, wenn Sie in eingeben \thenote, der Wert von frametitle={Note \thenote\ #1}bis zum mdframedErweitern \thenotebereits von den Innenumgebungen geändert wurde. Dieser Trick stellt im Wesentlichen sicher, dass der aktuelle Wert von \thenotein gespeichert wird \x, und mit der Magie der „variablen Bereichsbestimmung“ wird der Wert von beim Verlassen der Innenumgebung \xauf den Wert vor dem Eintritt in die Umgebungen zurückgesetzt.

verwandte Informationen