Tikz: el nodo en el margen derecho de otro nodo interactúa con tcbtheorem

Tikz: el nodo en el margen derecho de otro nodo interactúa con tcbtheorem

Actualmente estoy intentando utilizar la respuesta de @GonzaloMedina paracrear un entorno enmarcado para una nota al margen

Considere el siguiente código simplificado:

\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}

El comando \cautionhace lo que espero: produce un cuadro rojo en el margen derecho, justo en el texto antes de la llamada de \caution.

Ahora supongamos que quiero hacer lo mismo, pero eso \cautionse llama dentro de un tcbtheorementorno. Por ejemplo:

\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}

Entonces el resultado es el siguiente:

salida-tcb

No estoy acostumbrado a TikZ, pero lo que entiendo es que:

  • el efecto de tikzmarkes colocar un nodo en el lugar exacto donde se llama, y ​​las coordenadas de este nodo se pueden usar más tarde,
  • la remember picture, overlayopción de tikzpicturepermitir el uso de estas coordenadas.

Sin embargo, a tcolorbox(y por lo tanto a tcbtheorem) se dibuja usando TikZ, por lo que estas coordenadas se pierden (excepto que el problema solo proviene de la coordenada x, la coordenada y parece ser buena).

Parece que tikzmarkle da un nombre (el valor de mycaution) al nodo que crea, pero que realmente no usamos este nombre más adelante, asumiendo que TikZ no ha sido usado entre la llamada de \tikzmarky el dibujo de la caja. Sin embargo, no tengo idea de cómo puedo usar este nombre para especificar que mi cuadro debe estar en el margen derecho de este nodo...

¿Alguien puede proporcionar una solución (o mejor: una explicación de lo que realmente sucede aquí)?

Respuesta1

El problema es que los tcolorboxcambios \textwidthse utilizan en el tikzpagenodespaquete para calcular internamente la posición de los nodos de página que define.

Puedes ver esto usando

\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}

lo que da:

ingrese la descripción de la imagen aquí

entonces, dentro de tcolorbox, el current page text area.eastnodo está a la izquierda de donde realmente debería estar.

Una forma de evitar esto es usar los anclajes correctos que recuperamos antes del theoentorno con la ayuda del etoolboxpaquete y redefinir \cautionpara usar el anclaje corregido:

\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}

El resultado:

ingrese la descripción de la imagen aquí

información relacionada