Contexto

Contexto

Contexto

En mi documento, adjunto una información sobre herramientas en la parte media de una palabra. Para demostrar este comportamiento, intente colocar el mouse sobre solo la letra Vde la palabra .AVA

Aquí está la implementación y el uso de mi \tooltipcomando.

%% 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

Los detalles específicos de la creación de información sobre herramientas no son directamente relevantes para la pregunta, pero los he incluido para contextualizar.

Problema

Separar las partes de la palabra intercalándolas \special{}, es decir, A\special{}V\special{}Ahace que ya no se aplique el interletraje entre partes.¹(Nota: \specialno es especial; este comportamiento también ocurre en A{V}Ay A{}V{}A, a menos que se use XeLaTeX o LuaLaTeX.²)

Solución parcial

Pude restaurar el kerning en las dos últimas partes usando el siguiente comando, adaptado deesta respuesta, que suele \futureletfuncionar.

\newcommand\kernright[1]{\def\hltext{#1}\futurelet\hlnext\hldokern}
\def\hldokern{%
    \sbox0{\mbox\hltext\mbox\hlnext}\sbox2{\hltext\hlnext}\kern\dimexpr\wd2-\wd0\relax%
}

(Aunque esa pregunta se refiere específicamente al kerning entre diferentes estilos, la solución aún funciona. Otra más genéricapreguntano tiene una solución satisfactoria.)

Aquí hay tres comandos contenedores para \tooltip.

\newcommand\tooltipA[2]{#1}
\newcommand\tooltipB[2]{\tooltip{#1}{#2}}
\newcommand\tooltipC[2]{\tooltip{#1}{#2}\kernright{#1}}

A continuación se muestra una tabla comparativa y la imagen renderizada correspondiente.

                        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

ejemplos de kerning en grupos vacíos

Sin embargo, no he podido encontrar una manera de escribir un \tooltipDcomando que también restablezca el interletraje entre A y V, ya que no parece haber un comando que haga lo "opuesto" a \futurelet.

Pregunta

¿Cómo restablezco el interletraje entre A y V?

Esperaría insertar un \kernleftcomando adicional en algún lugar del cuerpo del \tooltipCcomando para producir un resultado equivalente a la parte superior de la imagen.

MWE

(La información sobre herramientas debería funcionar en XeLaTeX.³)

\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}

Respuesta1

¿Se permite un overstrike? Si es así, esto restaura el interletraje. No comprendo el código de información sobre herramientas, pero intenté mostrar lo que quiero decir en este MWE. La clave para restaurar el kerning adecuado es iniciar y finalizar la \tooltipmacro .#1#1

He EDITADO para insertar \relaxdespués de la \kerns, según la advertencia del OP.

Lo he reEDITADO, según los comentarios del OP. Ahora que entiendo completamente que el primer argumento de \tooltipno es sólo un carácter, sino que podría ser una palabra o varias palabras, he revisado mi estrategia de la siguiente manera: el único kerning/overstrike que ocurre es en la primera y última letra de el argumento. Por lo tanto, se pueden utilizar espacios y guiones explícitos en medio del argumento para un salto de línea. El único caso que todavía tiene dificultades es el de las palabras que se pueden separar con guiones. Este método no divide con guiones, pero no estoy muy seguro de por qué.

A continuación se muestra una variante (realizada para compilar en PDFLaTeX) del archivo proporcionado por el OP en sus comentarios, para probar el interletraje de los distintos métodos, AD, cuando los métodos se enfatizaron con un salto de línea inminente. La solución propuesta actualmente es el método D, que captura los kerns, pero no puede separarlos automáticamente.

\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}

ingrese la descripción de la imagen aquí


Solución original:

La conversación con el OP en los comentarios conduce a dos puntos que deben señalarse sobre esta solución. Una es que este método se interrumpirá si hay un espacio en el primer argumento de \tooltip. La razón es que un espacio tiene pegamento y el pegamento no tiene un ancho fijo. Por lo tanto, el interletraje no se puede utilizar para deshacer un espacio.

El segundo punto es que la información sobre herramientas en el medio de la palabra evitará la separación de palabras para esa palabra. Si bien esto no hace que el método esté "roto", sí permite que las palabras largas que de otro modo se dividirían con guiones no lo hagan, con una información sobre herramientas en el medio. Por lo tanto, uno podría experimentar sobrecostos de margen, no debido directamente al método, sino porque indirectamente se evita la separación de palabras normal.

\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}

ingrese la descripción de la imagen aquí

Respuesta2

probablemente simplemente volvería a agregar los kerns explícitamente después de medir el texto con y sin los caracteres adyacentes separados por límites de cuadro.

\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}

Respuesta3

Mi sugerencia es rediseñar ligeramente la \tooltipsintaxis. El primer parámetro de dicha macro es la palabra completa, pero el texto resaltado está rodeado por un segundo par de llaves, por ejemplo:

\tooltip{A{V}Atar}{avatar}

Si no existe el segundo par de llaves, se resalta todo el texto:

\tooltip{tipped text}{tip}

Esto se puede implementar simplemente sin superponer letras:

\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
}

La separación de palabras se puede establecer directamente \-si es necesario, por ejemplo

\tooltip{A{V}A\-tar}{avatar}

información relacionada