Tikz: Knoten im Rand rechts neben anderem Knoten interagiert mit tcbtheorem

Tikz: Knoten im Rand rechts neben anderem Knoten interagiert mit tcbtheorem

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 \cautionmacht, 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 \cautiongeschieht innerhalb einer tcbtheoremUmgebung. 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:

Ausgabe-TCB

Ich bin nicht an TikZ gewöhnt, aber ich verstehe Folgendes:

  • Der Effekt tikzmarkbesteht 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, overlayOption, tikzpicturedie 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 tikzmarkeinen 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 tikzpagenodesPaket 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:

Bildbeschreibung hier eingeben

Innerhalb der Farbbox current page text area.eastbefindet 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 theoUmgebung mit Hilfe des etoolboxPakets abrufen und neu definieren, \cautionum 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:

Bildbeschreibung hier eingeben

verwandte Informationen