
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 \caution
hace 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 \caution
se llama dentro de un tcbtheorem
entorno. 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:
No estoy acostumbrado a TikZ, pero lo que entiendo es que:
- el efecto de
tikzmark
es 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, overlay
opción detikzpicture
permitir 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 tikzmark
le 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 \tikzmark
y 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 tcolorbox
cambios \textwidth
se utilizan en el tikzpagenodes
paquete 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:
entonces, dentro de tcolorbox, el current page text area.east
nodo está a la izquierda de donde realmente debería estar.
Una forma de evitar esto es usar los anclajes correctos que recuperamos antes del theo
entorno con la ayuda del etoolbox
paquete y redefinir \caution
para 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: