%20und%20%5Cmdtheorem%20(mdframed).png)
Wenn Sie den \mdtheorem
Befehl (from mdframed
) zusammen mit \nameref
(from hyperref
) verwenden, scheinen Beschriftungen, die auf einen mit erstellten Satz angewendet werden, \mdtheorem
nicht den dem Satz gegebenen Titel zu übernehmen. Stattdessen wird der Titel des aktuellen Abschnitts übernommen, wie im folgenden MWE:
\documentclass{article}
\usepackage{tikz}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{hyperref}
\tikzset{tatregris/.style =
{draw=gray, thick, fill=white, shading = theoremtitle, %
text=gray, rectangle, rounded corners, right,minimum height=.7cm}}
\pgfdeclarehorizontalshading{theorembackground}{100bp}
{color(0bp)=(black!2); color(100bp)=(black!15)}
\makeatletter
\mdfdefinestyle{theoremstyle}{%
outerlinewidth=0em,outerlinecolor=white,%
leftmargin=-1em,rightmargin=-1em,%
middlelinewidth=1.2pt,roundcorner=5pt,linecolor=gray,
apptotikzsetting={\tikzset{mdfbackground/.append style ={%
shading = theorembackground}}},
innertopmargin=1.2\baselineskip,
skipabove={\dimexpr0.5\baselineskip+\topskip\relax},
skipbelow={-1em},
needspace=\baselineskip,
frametitlefont=\sffamily\scshape,
}
\makeatother
\mdtheorem[style=theoremstyle]{thm}{Theorem}[section]
\begin{document}
\section{Section name}
\begin{thm}[Theorem name] \label{theorem name}
This is a theorem.
\end{thm}
\nameref{theorem name} is a theorem.
\end{document}
Beachten Sie, dass das Problem bei Verwendung nicht auftritt \newmdtheoremenv
(was keine gültige Lösung ist, da ich die von angegebene nicht nummerierte Umgebung benötige \mdtheorem
und ich es vorziehe, dass der Titel des Theorems der Frame-Titel ist).
Gibt es eine Möglichkeit, dies zu umgehen?
Antwort1
Sie müssen zulassennameref
um den Namen zu extrahieren, wenn er gesetzt ist thm
. Dafür können wir patchen \thm
(mitxpatch
):
\documentclass{article}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{hyperref,xpatch}
\tikzset{tatregris/.style =
{draw=gray, thick, fill=white, shading = theoremtitle, %
text=gray, rectangle, rounded corners, right,minimum height=.7cm}}
\pgfdeclarehorizontalshading{theorembackground}{100bp}
{color(0bp)=(black!2); color(100bp)=(black!15)}
\mdfdefinestyle{theoremstyle}{%
outerlinewidth=0em,outerlinecolor=white,%
leftmargin=-1em,rightmargin=-1em,%
middlelinewidth=1.2pt,roundcorner=5pt,linecolor=gray,
apptotikzsetting={\tikzset{mdfbackground/.append style ={%
shading = theorembackground}}},
innertopmargin=1.2\baselineskip,
skipabove={\dimexpr0.5\baselineskip+\topskip\relax},
skipbelow={-1em},
needspace=\baselineskip,
frametitlefont=\sffamily\scshape,
}
\mdtheorem[style=theoremstyle]{thm}{Theorem}[section]
\newcommand{\thmautorefname}{Theorem}
\makeatletter
\xpatchcmd{\thm}{\refstepcounter}{\NR@gettitle{#1}\refstepcounter}{}{}
\makeatother
\begin{document}
\section{Section name}
\begin{thm}[Theorem name] \label{theorem_name1}
This is a theorem.
\end{thm}
\nameref{theorem_name1} is a named theorem. \autoref{theorem_name2} is not a named theorem.
\begin{thm}\label{theorem_name2}
This is a theorem.
\end{thm}
\end{document}
Wenn Sie keinen Namen als optionales Argument angeben thm
, \nameref
schlägt natürlich fehl. Sie können \autoref
hierfür jedoch auch verwenden.
Antwort2
Die Verallgemeinerung von WernersAntwort. Das folgende Beispiel wird so gepatcht, \mdtheorem
dass alle Theoreme mit diesem Befehl erfasst werden. Der Code von \mdtheorem
enthält viele Fälle, daher verwendet das Beispiel eine Schleife, um alle abzurufen \ifstrempty
, deren Argument wiederverwendet wird, um den Titel abzurufen. Das Beispiel legt keinen Titel fest, wenn der Titel leer ist. Dies kann auch geändert werden, um einen leeren Titel für zu verwenden nameref
.
\documentclass{article}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{hyperref,xpatch}
\tikzset{tatregris/.style =
{draw=gray, thick, fill=white, shading = theoremtitle, %
text=gray, rectangle, rounded corners, right,minimum height=.7cm}}
\pgfdeclarehorizontalshading{theorembackground}{100bp}
{color(0bp)=(black!2); color(100bp)=(black!15)}
\mdfdefinestyle{theoremstyle}{%
outerlinewidth=0em,outerlinecolor=white,%
leftmargin=-1em,rightmargin=-1em,%
middlelinewidth=1.2pt,roundcorner=5pt,linecolor=gray,
apptotikzsetting={\tikzset{mdfbackground/.append style ={%
shading = theorembackground}}},
innertopmargin=1.2\baselineskip,
skipabove={\dimexpr0.5\baselineskip+\topskip\relax},
skipbelow={-1em},
needspace=\baselineskip,
frametitlefont=\sffamily\scshape,
}
\makeatletter
\newcommand*{\mdfNR@gettitle@ifstrempty}[1]{%
\ifstrempty{#1}{%
\@firstoftwo
}{%
\NR@gettitle{#1}%
\@secondoftwo
}%
}
% Variant: Define title string for nameref regardless of its emptyness
% \newcommand*{\mdfNR@gettitle@ifstrempty}[1]{%
% \NR@gettitle{#1}%
% \ifstrempty{#1}%
% }
\count@=\@ne
\@whilenum\count@>\z@\do{%
\expandafter\xpatchcmd\csname mdtheorem code\endcsname{%
\ifstrempty%
}{%
\mdfNR@gettitle@ifstrempty
}{%
\advance\count@\@ne
}{%
\count@=-\count@
}%
}
\ifnum\count@>\z@
\else
\@latex@warning{Could not patch \string\mdtheorem}%
\fi
\makeatother
\mdtheorem[style=theoremstyle]{thm}{Theorem}[section]
\newcommand{\thmautorefname}{Theorem}
\begin{document}
\section{Section name}
\begin{thm}[Theorem name] \label{theorem_name1}
This is a theorem.
\end{thm}
\nameref{theorem_name1} is a named theorem. \autoref{theorem_name2} is not a
named theorem.
\begin{thm}\label{theorem_name2}
This is a theorem.
\end{thm}
\end{document}