Kontext

Kontext

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 Vim Wort .AVA

Hier ist die Implementierung und Verwendung meines \tooltipBefehls.

%% 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{}Adass die Unterschneidung zwischen den Wortteilen nicht mehr gilt.¹(Hinweis: \specialist nichts Besonderes – dieses Verhalten tritt auch in A{V}Aund 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 \futureletnormalerweise.

\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

Beispiele für Kerning über leere Gruppen hinweg

Mir ist es jedoch nicht gelungen, einen \tooltipDBefehl 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?

\kernleftIch würde erwarten , irgendwo im Hauptteil des Befehls einen zusätzlichen Befehl einzufügen, \tooltipCum 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 \tooltipMakro mit zu starten #1und mit zu beenden #1.

Ich habe es BEARBEITET , um es gemäß der Warnung des OP \relaxnach 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 \tooltipnicht 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}

Bildbeschreibung hier eingeben


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}

Bildbeschreibung hier eingeben

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}

verwandte Informationen