Recientemente fui referidoResaltado de texto interesante en LaTeXpara Tikz resaltado-subrayado.
Logré modificar la respuesta de Antal según mis necesidades, pero parece que no puedo lograr lo siguiente: me gustaría que el resaltado se dibuje en el fondo del texto y no sobre él, como está ahora.
He preparado un MWE para explicar mejor lo que quiero decir:
\documentclass{minimal}
\usepackage{soul}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.pathmorphing}
\makeatletter
\newcommand{\defhighlighter}[3][]{%
\tikzset{every highlighter/.style={color=#2, fill opacity=#3, #1}}%
}
\defhighlighter{yellow}{.5}
\newcommand{\highlight@DoHighlight}{
\fill [ decoration = {random steps, amplitude=1pt, segment length=15pt}
, outer sep = -15pt, inner sep = 0pt, decorate
, every highlighter, this highlighter ]
($(begin highlight)+(0,8pt)$) rectangle ($(end highlight)+(0,-3pt)$) ;
}
\newcommand{\highlight@BeginHighlight}{
\coordinate (begin highlight) at (0,0) ;
}
\newcommand{\highlight@EndHighlight}{
\coordinate (end highlight) at (0,0) ;
}
\newdimen\highlight@previous
\newdimen\highlight@current
\DeclareRobustCommand*\highlight[1][]{%
\tikzset{this highlighter/.style={#1}}%
\SOUL@setup
%
\def\SOUL@preamble{%
\begin{tikzpicture}[overlay, remember picture]
\highlight@BeginHighlight
\highlight@EndHighlight
\end{tikzpicture}%
}%
%
\def\SOUL@postamble{%
\begin{tikzpicture}[overlay, remember picture]
\highlight@EndHighlight
\highlight@DoHighlight
\end{tikzpicture}%
}%
%
\def\SOUL@everyhyphen{%
\discretionary{%
\SOUL@setkern\SOUL@hyphkern
\SOUL@sethyphenchar
\tikz[overlay, remember picture] \highlight@EndHighlight ;%
}{%
}{%
\SOUL@setkern\SOUL@charkern
}%
}%
%
\def\SOUL@everyexhyphen##1{%
\SOUL@setkern\SOUL@hyphkern
\hbox{##1}%
\discretionary{%
\tikz[overlay, remember picture] \highlight@EndHighlight ;%
}{%
}{%
\SOUL@setkern\SOUL@charkern
}%
}%
%
\def\SOUL@everysyllable{%
\begin{tikzpicture}[overlay, remember picture]
\path let \p0 = (begin highlight), \p1 = (0,0) in \pgfextra
\global\highlight@previous=\y0
\global\highlight@current =\y1
\endpgfextra (0,0) ;
\ifdim\highlight@current < \highlight@previous
\highlight@DoHighlight
\highlight@BeginHighlight
\fi
\end{tikzpicture}%
\the\SOUL@syllable
\tikz[overlay, remember picture] \highlight@EndHighlight ;%
}%
\SOUL@
}
\makeatother
\begin{document}
\highlight[yellow]{The highlight is drawn over the text}
\bigskip
\begin{tikzpicture}
\node[fill=yellow!50]{the highlight is drawn below text};
\end{tikzpicture}
\end{document}
¿Es posible mover el resaltado debajo del texto como en el relleno estándar para los nodos Tikz?
Respuesta1
Con esta solución, dejo la solución del OP en su lugar y agrego otra capa en forma de \Ohighlight
, en forma de
\newsavebox\tmpbox
\usepackage{tabto}
\newcommand\Ohighlight[2][]{%
\tabto*{0in}\edef\tmpx{\TabPrevPos}\tabto*{\tmpx}% SAVES THE CURRENT x POSITION
\savebox\tmpbox{% SETS THE TEXT, STARTING AT x, IN A SAVED MINIPAGE
\begin{minipage}[b]{\textwidth}
\tabto*{\tmpx}#2\strut%
\end{minipage}}%
{\color{\highlightcolor!0}\highlight[#1]{#2}}% STEP #1, BELOW
\vspace*{\dimexpr-\dp\tmpbox-\ht\tmpbox+\dp\strutbox}% STEP #2, BELOW
\tabto*{\tmpx}#2\unskip\ % STEP #3, BELOW
}
que intenta lograr lo siguiente:
1) haga la \highlight
edición original, mientras hace que el texto tenga el mismo color que el resaltado (también conocido como invisible);
2) retroceder hasta la ubicación original (horizontalmente a través del tabto
paquete) y verticalmente a través de \vspace
una medida minipage
;
3) vuelva a escribir el texto, en claro, encima del resaltado anterior, lo que deja la posición de la página donde debería estar.
Esta solución se EDITÓ cuando se observaron algunas diferencias de interletraje entre la salida \highlight
y el texto en claro. El pre- \highlight
ahora está hecho en un color en blanco, para evitar el problema del texto con doble tachadura.
Este enfoque no funcionará entre los límites de las páginas. En MWE, funciona a través de los límites de los párrafos, pero me imagino que el pegamento insertado en una página podría estropearlo, a menos que \raggedbottom
se use.
El hecho de que se observaran algunos problemas de interletraje que provocaron una edición de mi código deja abierta la posibilidad de que, en algunos casos, el \highlight
salto de línea difiera del texto claro, lo que obviamente representaría una falla del método. Dado que el problema parecía estar relacionado con los espacios en blanco al final, agregar un \unskip\
al texto final sin cifrar (paso 3) pareció solucionar el problema del interletraje, pero no diré que no puede aparecer bajo otra forma.
Si desea comprobar el problema del interletraje, edite esta línea {\color{\highlightcolor!0}\highlight[#1]{#2}}%
en {\color{red}\highlight[#1]{#2}}%
, lo que producirá una doble tacha del texto. Si no coinciden, lo verás allí.
\documentclass{minimal}
\usepackage{soul}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.pathmorphing}
\makeatletter
\newcommand{\defhighlighter}[3][]{%
\tikzset{every highlighter/.style={color=#2, fill opacity=#3, #1}}%
}
\def\highlightcolor{yellow}
\defhighlighter{\highlightcolor}{.5}
\newcommand{\highlight@DoHighlight}{
\fill [ decoration = {random steps, amplitude=1pt, segment length=15pt}
, outer sep = -15pt, inner sep = 0pt, decorate
, every highlighter, this highlighter ]
($(begin highlight)+(0,8pt)$) rectangle ($(end highlight)+(0,-3pt)$) ;
}
\newcommand{\highlight@BeginHighlight}{
\coordinate (begin highlight) at (0,0) ;
}
\newcommand{\highlight@EndHighlight}{
\coordinate (end highlight) at (0,0) ;
}
\newdimen\highlight@previous
\newdimen\highlight@current
\DeclareRobustCommand*\highlight[1][]{%
\tikzset{this highlighter/.style={#1}}%
\SOUL@setup
%
\def\SOUL@preamble{%
\begin{tikzpicture}[overlay, remember picture]
\highlight@BeginHighlight
\highlight@EndHighlight
\end{tikzpicture}%
}%
%
\def\SOUL@postamble{%
\begin{tikzpicture}[overlay, remember picture]
\highlight@EndHighlight
\highlight@DoHighlight
\end{tikzpicture}%
}%
%
\def\SOUL@everyhyphen{%
\discretionary{%
\SOUL@setkern\SOUL@hyphkern
\SOUL@sethyphenchar
\tikz[overlay, remember picture] \highlight@EndHighlight ;%
}{%
}{%
\SOUL@setkern\SOUL@charkern
}%
}%
%
\def\SOUL@everyexhyphen##1{%
\SOUL@setkern\SOUL@hyphkern
\hbox{##1}%
\discretionary{%
\tikz[overlay, remember picture] \highlight@EndHighlight ;%
}{%
}{%
\SOUL@setkern\SOUL@charkern
}%
}%
%
\def\SOUL@everysyllable{%
\begin{tikzpicture}[overlay, remember picture]
\path let \p0 = (begin highlight), \p1 = (0,0) in \pgfextra
\global\highlight@previous=\y0
\global\highlight@current =\y1
\endpgfextra (0,0) ;
\ifdim\highlight@current < \highlight@previous
\highlight@DoHighlight
\highlight@BeginHighlight
\fi
\end{tikzpicture}%
\the\SOUL@syllable
\tikz[overlay, remember picture] \highlight@EndHighlight ;%
}%
\SOUL@
}
\makeatother
\newsavebox\tmpbox
\usepackage{tabto}
\newcommand\Ohighlight[2][]{%
\tabto*{0in}\edef\tmpx{\TabPrevPos}\tabto*{\tmpx}%
\savebox\tmpbox{%
\begin{minipage}[b]{\textwidth}
\tabto*{\tmpx}#2\strut%
\end{minipage}}%
{\color{\highlightcolor!0}\highlight[#1]{#2}}%
\vspace*{\dimexpr-\dp\tmpbox-\ht\tmpbox+\dp\strutbox}%
\tabto*{\tmpx}#2\unskip\ %
}
\textwidth=5in
\begin{document}
\highlight{The original highlight is drawn over the text.
The original definition works over...
Multi paragraphs, so my fix should try to as well.}
\bigskip
\begin{tikzpicture}
\node[fill=yellow!50]{with tikz, the highlight is drawn below text but not fancy};
\end{tikzpicture}
Now here is my fix. \Ohighlight{The highlight is drawn under the text}
Does it work multiline?
\Ohighlight[yellow]{The highlight is drawn under the text The highlight is drawn under the text The highlight is drawn under the text The highlight is drawn under the text
A new paragraph}
And more...
\Ohighlight{short}
\end{document}
La siguiente imagen muestra un zoom.