Ich wurde vor kurzem verwiesen anCoole Texthervorhebung in LaTeXzum Hervorheben und Unterstreichen in Tikz.
Es ist mir gelungen, Antals Antwort meinen Bedürfnissen entsprechend zu modifizieren, aber Folgendes gelingt mir nicht: Ich möchte, dass die Hervorhebung auf den Hintergrund des Textes gezeichnet wird und nicht darüber, wie es jetzt der Fall ist.
Ich habe ein MWE vorbereitet, um besser zu erklären, was ich meine:
\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}
Ist es möglich, die Hervorhebung wie bei der Standardfüllung für Tikz-Knoten unter den Text zu verschieben?
Antwort1
Bei dieser Lösung lasse ich die Lösung des OP an Ort und Stelle und füge eine weitere Schicht in Form von hinzu \Ohighlight
, in Form von
\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
}
das folgende Ziel verfolgt:
1) Führen Sie die ursprüngliche \highlight
Prozedur aus, wobei Sie dem Text dieselbe Farbe wie der Hervorhebung geben (d. h. unsichtbar machen);
2) zurück zum ursprünglichen Standort (horizontal über tabto
das Paket) und vertikal über \vspace
eine gemessene minipage
;
3) Geben Sie den Text im Klartext über der vorherigen Hervorhebung erneut ein, sodass die Seitenposition dort bleibt, wo sie sein sollte.
Diese Lösung wurde BEARBEITET, als einige Unterschiede im Kerning zwischen der Ausgabe \highlight
und dem Klartext festgestellt wurden. Das Vorzeichen \highlight
wird jetzt in einer leeren Farbe dargestellt, um das Problem doppelt durchgestrichenen Textes zu vermeiden.
Dieser Ansatz funktioniert nicht über Seitengrenzen hinweg. Im MWE funktioniert es über Absatzgrenzen hinweg, aber ich kann mir vorstellen, dass eingefügter Klebstoff auf einer Seite das durcheinanderbringen könnte, wenn er nicht \raggedbottom
verwendet wird.
Die Tatsache, dass einige Kerning-Probleme festgestellt wurden, die eine Bearbeitung meines Codes veranlassten, lässt die Möglichkeit offen, dass in einigen Fällen der \highlight
Zeilenumbruch vom Klartext abweicht, was offensichtlich einen Fehler der Methode darstellen würde. Da das Problem mit nachstehenden Leerzeichen zusammenzuhängen schien, \unskip\
schien das Hinzufügen eines zum endgültigen Klartext (Schritt 3) das Kerning-Problem zu beheben, aber ich sage nicht, dass es nicht in einer anderen Gestalt auftauchen kann.
Wenn Sie das Kerning-Problem überprüfen möchten, bearbeiten Sie diese Zeile {\color{\highlightcolor!0}\highlight[#1]{#2}}%
zu {\color{red}\highlight[#1]{#2}}%
, wodurch der Text doppelt durchgestrichen wird. Wenn sie nicht übereinstimmen, sehen Sie es dort.
\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}
Das Bild unten zeigt eine Vergrößerung.