
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 V
de la palabra .AVA
Aquí está la implementación y el uso de mi \tooltip
comando.
%% 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{}A
hace que ya no se aplique el interletraje entre partes.¹(Nota: \special
no es especial; este comportamiento también ocurre en A{V}A
y 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 \futurelet
funcionar.
\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
Sin embargo, no he podido encontrar una manera de escribir un \tooltipD
comando 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 \kernleft
comando adicional en algún lugar del cuerpo del \tooltipC
comando 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 \tooltip
macro .#1
#1
He EDITADO para insertar \relax
después de la \kern
s, según la advertencia del OP.
Lo he reEDITADO, según los comentarios del OP. Ahora que entiendo completamente que el primer argumento de \tooltip
no 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}
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}
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 \tooltip
sintaxis. 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}