
Kontext
In meinem Dokument füge ich dem mittleren Teil eines Wortes einen Tooltip hinzu. Um dieses Verhalten zu demonstrieren, bewegen Sie den Mauszeiger über nur den Buchstaben V
im Wort .AVA
Hier ist die Implementierung und Verwendung meines \tooltip
Befehls.
%% This tooltip command
\newcommand\tooltip[2]{%
\special{pdf:bann<</Type/Annot /Subtype/Widget /FT/Btn /Ff 65536 /H/N /TU(#2)>>}%
#1%
\special{pdf:eann}%
}
%% is used like so
A\tooltip{V}{Tooltip text here.}A
%% which expands like so.
A\special{…}V\special{…}A
Die Einzelheiten zur Erstellung der Tooltips sind für die Frage nicht unmittelbar relevant, ich habe sie jedoch zum besseren Verständnis aufgenommen.
Problem
Das Trennen der Wortteile durch Interspersion führt dazu \special{}
, A\special{}V\special{}A
dass die Unterschneidung zwischen den Wortteilen nicht mehr gilt.¹(Hinweis: \special
ist nichts Besonderes – dieses Verhalten tritt auch in A{V}A
und auf A{}V{}A
, es sei denn, man verwendet XeLaTeX oder LuaLaTeX.²)
Teillösung
Ich konnte das Kerning in den letzten beiden Teilen mit dem folgenden Befehl wiederherstellen, angepasst vondiese Antwort, das funktioniert \futurelet
normalerweise.
\newcommand\kernright[1]{\def\hltext{#1}\futurelet\hlnext\hldokern}
\def\hldokern{%
\sbox0{\mbox\hltext\mbox\hlnext}\sbox2{\hltext\hlnext}\kern\dimexpr\wd2-\wd0\relax%
}
(Obwohl diese Frage speziell das Kerning zwischen verschiedenen Stilen betrifft, funktioniert die Lösung trotzdem. Eine andere allgemeinereFragehat keine zufriedenstellende Lösung.)
Hier sind drei Wrapper-Befehle für \tooltip
.
\newcommand\tooltipA[2]{#1}
\newcommand\tooltipB[2]{\tooltip{#1}{#2}}
\newcommand\tooltipC[2]{\tooltip{#1}{#2}\kernright{#1}}
Unten finden Sie eine Vergleichstabelle und das entsprechende gerenderte Bild.
 A\tooltipX{V}{}A expands to AV kerned? VA kerned?
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾‾ ‾‾‾‾‾‾‾‾‾‾
A. Normal kerned text AVA yes yes
B. Interrupted text A\special{}V\special{}A no no
C. Partial solution A\special{}V\special{}\kernright{V}A no yes
Mir ist es jedoch nicht gelungen, einen \tooltipD
Befehl zu schreiben, der auch die Unterschneidung zwischen A und V wiederherstellt, da es anscheinend keinen Befehl gibt, der das „Gegenteil“ von macht \futurelet
.
Frage
Wie stelle ich das Kerning zwischen A und V wieder her?
\kernleft
Ich würde erwarten , irgendwo im Hauptteil des Befehls einen zusätzlichen Befehl einzufügen, \tooltipC
um eine Ausgabe zu erhalten, die dem oberen Teil des Bildes entspricht.
MWE
(Tooltips sollten in XeLaTeX funktionieren.³)
\documentclass[varwidth=true]{standalone}
\newcommand\tooltip[2]{%
\special{pdf:bann<</Type/Annot /Subtype/Widget /FT/Btn /Ff 65536 /H/N /TU(#2)>>}%
#1%
\special{pdf:eann}%
}
\newcommand\kernright[1]{\def\hltext{#1}\futurelet\hlnext\hldokern}
\def\hldokern{%
\sbox0{\mbox\hltext\mbox\hlnext}\sbox2{\hltext\hlnext}\kern\dimexpr\wd2-\wd0\relax%
}
% A-C are from original question; D is adapted from Steven's answer
\newcommand\tooltipA[2]{#1}
\newcommand\tooltipB[2]{\tooltip{#1}{#2}}
\newcommand\tooltipC[2]{\tooltip{#1}{#2}\kernright{#1}}
\newcommand\tooltipD[2]{%
#1%
\setbox0=\hbox{#1}\kern-\wd0%
\tooltip{#1}{#2}%
\kern-\wd0#1%
}
\begin{document}
\tooltip{Foo}{Bar}
A\tooltipA{V}{Tooltip text}A
A\tooltipB{V}{Tooltip text}A
A\tooltipC{V}{Tooltip text}A
A\tooltipD{V}{Tooltip text}A
\end{document}
Antwort1
Ist ein Überschreiben zulässig? Wenn ja, wird das Kerning wiederhergestellt. Ich verstehe den Tooltip-Code nicht, habe aber versucht, in diesem MWE zu zeigen, was ich meine. Der Schlüssel zum Wiederherstellen des richtigen Kernings besteht darin, das \tooltip
Makro mit zu starten #1
und mit zu beenden #1
.
Ich habe es BEARBEITET , um es gemäß der Warnung des OP \relax
nach dem s einzufügen .\kern
Ich habe es auf Grundlage der Kommentare des OP erneut BEARBEITET. Nachdem ich nun vollständig verstanden habe, dass das erste Argument \tooltip
nicht nur ein Buchstabe ist, sondern auch ein Wort oder mehrere Wörter sein könnte, habe ich meine Strategie wie folgt überarbeitet: Die einzige Unterschneidung/Überstreichung, die auftritt, ist beim ersten und letzten Buchstaben des Arguments. Daher können Leerzeichen und explizite Bindestriche in der Mitte des Arguments für einen Zeilenumbruch verwendet werden. Der einzige Fall, der immer noch Schwierigkeiten bereitet, sind Wörter, die mit Bindestrichen getrennt werden können. Diese Methode trennt keine Bindestriche, aber ich bin mir nicht ganz sicher, warum.
Unten finden Sie eine Variante (zum Kompilieren in PDFLaTeX) der vom OP in seinen Kommentaren bereitgestellten Datei, um das Kerning der verschiedenen Methoden AD zu testen, wenn die Methoden mit einem bevorstehenden Zeilenumbruch betont wurden. Die derzeit vorgeschlagene Lösung ist Methode D, die das Kerning erfasst, aber keine automatische Silbentrennung vornehmen kann.
\documentclass{article}
%\usepackage{fontspec}
\usepackage{xcolor}
%\setmainfont{Minion Pro}
%\setmonofont{Consolas}
\usepackage{stringstrings}
\newcommand\tooltip[2]{%
\special{pdf:bann<</Type/Annot /Subtype/Widget /FT/Btn /Ff 65536 /H/N /TU(#2)>>}%
#1%
\special{pdf:eann}%
}
\newcommand\kernright[1]{\def\hltext{#1}\futurelet\hlnext\hldokern}
\def\hldokern{%
\sbox0{\mbox\hltext\mbox\hlnext}\sbox2{\hltext\hlnext}\kern\dimexpr\wd2-\wd0\relax%
}
\newcommand\tooltipA[2]{#1}
\newcommand\tooltipB[2]{\tooltip{#1}{#2}}
\newcommand\tooltipC[2]{\tooltip{#1}{#2}\kernright{#1}}
\newcommand\tooltipD[2]{%
\firstof#1\relax%
\tooltip{#1}{#2}%
\substring[q]{#1}{$}{$}%
\setbox0=\hbox{\thestring}%
\kern-\wd0\relax\thestring%
}
\def\firstof#1#2\relax{#1\setbox0=\hbox{#1}\kern-\wd0\relax}
\begin{document}
\setlength\parindent{0pt}
\newcommand\lotsofxs{\textcolor{gray!20}{xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xx}}
\newcommand\trial[4]{\lotsofxs{} #2\csname tooltip#1\endcsname{#3}{Tooltip text}#4\par}
\newcommand\fourtrials[4]{
{\texttt{#2|#3|#4}\hfill\textbf{#1}}\par\hrule\par
\trial{A}{#2}{#3}{#4}
\trial{B}{#2}{#3}{#4}
\trial{C}{#2}{#3}{#4}
\trial{D}{#2}{#3}{#4}
\bigskip
}
Default behavior: VAVA\tooltipD{V}{text}AVAV\vspace{1em}
%\rule{\textwidth}{2pt}\par
\fourtrials{Unhyphenatable word (only situation with overflow)}{A}{VxxxxxxxxxxV}{A}
\fourtrials{Multiple words}{A}{Vxxxxx xxxxxV}{A}
\fourtrials{Explicit hyphen}{A}{Vxxxxx\-xxxxxV}{A}
\fourtrials{Hyphenatable word}{‘}{Automatically}{.}
\fourtrials{Multiple words}{‘}{Auto matically}{.}
\end{document}
Ursprüngliche Lösung:
Die Unterhaltung mit dem OP in den Kommentaren führt zu zwei Punkten, die zu dieser Lösung gemacht werden sollten. Einer ist, dass diese Methode abbricht, wenn ein Leerzeichen im ersten Argument von vorkommt \tooltip
. Der Grund ist, dass ein Leerzeichen eine Bindung hat und diese Bindung keine feste Breite hat. Daher kann Kerning nicht verwendet werden, um ein Leerzeichen rückgängig zu machen.
Der zweite Punkt ist, dass der Tooltip in der Mitte des Wortes die Silbentrennung für dieses Wort verhindert. Dies macht die Methode zwar nicht „kaputt“, sorgt aber dafür, dass lange Wörter, die sonst getrennt würden, dies nicht tun, wenn in ihrer Mitte ein Tooltip steht. Daher kann es zu Randüberschreitungen kommen, nicht direkt wegen der Methode, sondern weil indirekt die normale Silbentrennung verhindert wird.
\documentclass{article}
%% This tooltip command
\newcommand\tooltip[2]{%
#1%
\setbox0=\hbox{#1}\kern-\wd0\relax%
\special{pdf:bann<</Type/Annot /Subtype/Widget /FT/Btn /Ff 65536 /H/N /TU(#2)>>}%
\phantom{#1}%
\special{pdf:eann}%
\kern-\wd0\relax#1%
}
\parskip 1ex
\begin{document}
\noindent\rule{\textwidth}{2pt}
The tooltipped word is ``crAVAt,'' with the tooltip on the ``V''.
\noindent$\bullet$ \textbf{As it is supposed to work}
ccvcvf adsakljfd kdfklj sdkljsdf kjsdkj ds fdsfdggfds dd dgfd fsf dsf ddd
crA\tooltip{V}{Tooltip text}At
dfsf sdf s sd fsdf sdfsd sd ds sd frsdr d sfsd fds
ccvcvf adsakljfd kdfklj sdkljsdf kjsdkj ds fdsfdggfds dd dgfd fsf dsf dd %d
crA\tooltip{V}{Tooltip text}At
dfsf sdf s sd fsdf sdfsd sd ds sd frsdr d sfsd fds
\noindent$\bullet$ \textbf{Tooltip prevents hyphenation, which can cause margin overruns}
ccvcvf adsakljfd kdfklj sdkljsdf kjsdkj ds fdsfdggfds dd dgfd fsf ds
crA\tooltip{V}{Tooltip text}Atinated
the prior word is tooltipped.
ccvcvf adsakljfd kdfklj sdkljsdf kjsdkj ds fdsfdggfds dd dgfd fsf ds
crAVAtinated
the prior word is not tooltipped.
\noindent$\bullet$ \textbf{Spaces (glue) in tooltip's argument 1 can cause non-alignment of kern}
Here are spaces in the first argument iddsfxsxddgfdxffdxxfgsfdsfdd
crA\tooltip{V V}{Tooltip text}At
Here the tooltip was on the ``V V'' in the middle of ``crAV VAt.''
\end{document}
Antwort2
wahrscheinlich würde ich die Unterschneidungen einfach explizit erneut hinzufügen, nachdem ich den Text mit und ohne durch Kastengrenzen getrennte benachbarte Zeichen gemessen habe.
\documentclass[varwidth=true]{standalone}
\newcommand\tooltip[2]{%
\special{pdf:bann<</Type/Annot /Subtype/Widget /FT/Btn /Ff 65536 /H/N /TU(#2)>>}%
#1%
\special{pdf:eann}%
}
\newcommand\tooltipZ[6]{%
#1%
\kerna{#1}{#2}%
\tooltip{#3}{#4}%
\kerna{#5}{#6}%
#6%
}
\newcommand\kerna[2]{%
\sbox0{#1}\sbox2{#2}\sbox4{#1#2}%
\kern\dimexpr\wd4-\wd0-\wd2\relax}
\begin{document}
\tooltip{Foo}{Bar}
AVA
% #1 pre-char
% #2 first active char
% #3 active text
% #4 tooltip
% #5 last active char
% #6 post-char
\tooltipZ{A}{V}
{V}{Tooltip text}
{V}{A}
\end{document}
Antwort3
Mein Vorschlag ist, die Syntax leicht umzugestalten \tooltip
. Der erste Parameter eines solchen Makros ist das ganze Wort, aber der hervorgehobene Text wird von einem zweiten Klammernpaar umschlossen, zum Beispiel:
\tooltip{A{V}Atar}{avatar}
Wenn das zweite Klammernpaar nicht vorhanden ist, wird der gesamte Text hervorgehoben:
\tooltip{tipped text}{tip}
Dies lässt sich einfach und ohne Buchstabenüberlappung umsetzen:
\def\tooltip#1{\tooltipA#1{}\end}
\def\tooltipA#1#{\def\tmpa{#1}\tooltipB}
\def\tooltipB#1#2\end#3{\ifx\end#1\end
\tooltipC{}\tmpa{}{#3}\else \tooltipC\tmpa{#1}{#2}{#3}\fi
}
\def\tooltipC#1#2#3#4{% #1=pre-text, #2=tipped text, #3=post-text, #4=tip
#1\kerncorr{#1}{#2}%
\special{pdf:bann<</Type/Annot /Subtype/Widget /FT/Btn /Ff 65536 /H/N /TU(#4)>>}%
#2%
\special{pdf:eann}%
\kerncorr{#2}{#3}#3%
}
\def\kerncorr#1#2{\setbox0=\hbox{#1\kern0pt #2}\setbox2=\hbox{#1#2}%
\kern\wd2 \kern-\wd0
}
Die Silbentrennung kann bei \-
Bedarf direkt eingestellt werden, zum Beispiel
\tooltip{A{V}A\-tar}{avatar}