
Ich versuche derzeit, die Antwort von @GonzaloMedina zu verwenden, umErstellen Sie eine gerahmte Umgebung für eine Randnotiz
Betrachten Sie den folgenden vereinfachten Code:
\documentclass[oneside]{book}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{tikzpagenodes}
\usepackage{lipsum}
\newcounter{mycaution}
\newcommand\tikzmark[1]{%
\tikz[remember picture,overlay]
\node[inner xsep=0pt,outer sep=0pt] (#1) {};
}
\newcommand{\caution}{
\stepcounter{mycaution}
\tikzmark{\themycaution}%
\begin{tikzpicture}[remember picture,overlay]
\node[draw=red,anchor=west,xshift=\marginparsep,yshift=0pt]
(mybox\themycaution)
at ([yshift=3pt]current page text area.east|-\themycaution)
{\parbox{\marginparwidth}{Some text}};
\end{tikzpicture}
}
\begin{document}
\lipsum[1]
Some random text\caution{}
\lipsum[2-5]
\end{document}
Der Befehl \caution
macht, was ich erwarte: Er erzeugt ein rotes Kästchen im rechten Rand, direkt neben dem Text vor dem Aufruf von \caution
.
Nehmen wir nun an, ich möchte dasselbe tun, aber das \caution
geschieht innerhalb einer tcbtheorem
Umgebung. Beispiel:
\documentclass[oneside]{book}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{tikzpagenodes}
\usepackage[most]{tcolorbox}
\tcbuselibrary{theorems}
\usepackage{lipsum}
\newcounter{mycaution}
\newcommand\tikzmark[1]{%
\tikz[remember picture,overlay]
\node[inner xsep=0pt,outer sep=0pt] (#1) {};
}
\newcommand{\caution}{
\stepcounter{mycaution}
\tikzmark{\themycaution}%
\begin{tikzpicture}[remember picture,overlay]
\node[draw=red,anchor=west,xshift=\marginparsep,yshift=0pt]
(mybox\themycaution)
at ([yshift=3pt]current page text area.east|-\themycaution)
{\parbox{\marginparwidth}{Some text}};
\end{tikzpicture}
}
\newtcbtheorem{theo}{Theorem}{theorem style=plain}{th}
\begin{document}
\begin{theo}{}{}
Some random text\caution{}
\lipsum[1]
\end{theo}
\lipsum[1]
Some random text\caution{}
\end{document}
Die Ausgabe ist dann folgende:
Ich bin nicht an TikZ gewöhnt, aber ich verstehe Folgendes:
- Der Effekt
tikzmark
besteht darin, einen Knoten genau an der Stelle zu platzieren, an der er aufgerufen wird. Die Koordinaten dieses Knotens können später verwendet werden. - die
remember picture, overlay
Option,tikzpicture
die Verwendung dieser Koordinaten zuzulassen.
Da jedoch a tcolorbox
(und damit auch a tcbtheorem
) mit TikZ gezeichnet wird, gehen diese Koordinaten gewissermaßen verloren (das Problem liegt allerdings nur bei der x-Koordinate, die y-Koordinate scheint in Ordnung zu sein).
Es scheint, dass es dem erstellten Knoten tikzmark
einen Namen (den Wert von ) gibt , diesen Namen aber später nicht wirklich verwenden wird, vorausgesetzt, dass TikZ zwischen dem Aufruf von und dem Zeichnen der Box nicht verwendet wurde. Ich habe jedoch keine Ahnung, wie ich diesen Namen verwenden kann, um anzugeben, dass meine Box am Rand rechts neben diesem Knoten stehen soll...mycaution
\tikzmark
Kann jemand eine Lösung anbieten (oder besser: eine Erklärung, was hier wirklich passiert)?
Antwort1
Das Problem besteht in den tcolorbox
Änderungen \textwidth
, die vom tikzpagenodes
Paket verwendet werden, um die Position für die von ihm definierten Seitenknoten intern zu berechnen.
Sie können dies sehen mit
\documentclass[oneside]{book}
\usepackage{tikzpagenodes}
\usepackage[most]{tcolorbox}
\newtcbtheorem{theo}{Theorem}{theorem style=plain}{th}
\begin{document}
\the\textwidth
\begin{theo}{}{}
\the\textwidth
\end{theo}
\end{document}
Das Ergebnis ist:
Innerhalb der Farbbox current page text area.east
befindet sich der Knoten also links von der Stelle, an der er wirklich sein sollte.
Eine Möglichkeit, dies zu verhindern, besteht darin, die richtigen Anker zu verwenden, die wir vor der theo
Umgebung mit Hilfe des etoolbox
Pakets abrufen und neu definieren, \caution
um den korrigierten Anker zu verwenden:
\documentclass[oneside]{book}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{tikzpagenodes}
\usepackage[most]{tcolorbox}
\tcbuselibrary{theorems}
\usepackage{lipsum}
\usepackage{etoolbox}
\usetikzlibrary{fit}
\newcounter{mycaution}
\newcommand\tikzmark[1]{%
\tikz[remember picture,overlay]
\node[inner xsep=0pt,outer sep=0pt] (#1) {};
}
\newcommand{\caution}{
\stepcounter{mycaution}%
\tikzmark{\themycaution}%
\begin{tikzpicture}[remember picture,overlay]
\node[draw=red,anchor=west,xshift=\marginparsep,yshift=0pt]
(mybox\themycaution)
at ([yshift=3pt]current page text area.east|-\themycaution)
{\parbox{\marginparwidth}{Some text}};
\end{tikzpicture}
}
\newtcbtheorem{theo}{Theorem}{theorem style=plain}{th}
\BeforeBeginEnvironment{theo}{%
\tikz[remember picture,overlay]
\node[fit=(current page text area),line width=0,inner sep=0,name=correct current page text area]{};
\renewcommand{\caution}{
\stepcounter{mycaution}%
\tikzmark{\themycaution}%
\begin{tikzpicture}[remember picture,overlay]
\node[draw=red,anchor=west,xshift=\marginparsep,yshift=0pt]
(mybox\themycaution)
at ([yshift=3pt]correct current page text area.east|-\themycaution)
{\parbox{\marginparwidth}{Some text}};
\end{tikzpicture}%
}%
}
\begin{document}
\begin{theo}{}{}
Some random text\caution{}
\lipsum[1]
\end{theo}
\lipsum[1]
Some random text\caution{}
\end{document}
Das Ergebnis: