Contexto

Contexto

Contexto

No meu documento, anexei uma dica de ferramenta à parte central de uma palavra. Para demonstrar esse comportamento, tente passar o mouse apenas sobre a letra Vda palavra .AVA

Aqui está a implementação e uso do meu \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

As especificidades de fazer as dicas de ferramentas não são diretamente relevantes para a questão, mas as incluí para fins de contexto.

Problema

Separar as partes da palavra intercalando \special{}, ou seja, A\special{}V\special{}Afaz com que o kerning entre as partes não se aplique mais.¹(Nota: \specialnão é especial — esse comportamento também ocorre emA{V}A e A{}V{}A, a menos que se use XeLaTeX ou LuaLaTeX.²)

Solução parcial

Consegui restaurar o kerning nas duas últimas partes usando o seguinte comando, adaptado deesta resposta, que costuma \futureletfazer o truque.

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

(Embora essa questão diga respeito especificamente ao kerning entre estilos diferentes, a solução ainda funciona. Outra questão mais genéricaperguntanão tem solução satisfatória.)

Aqui estão três comandos wrapper para \tooltip.

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

Abaixo está uma tabela de comparação e a imagem renderizada correspondente.

                        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

exemplos de kerning em grupos vazios

No entanto, não consegui encontrar uma maneira de escrever um \tooltipDcomando que também restaurasse o kerning entre A e V, pois não parece haver um comando que faça o “oposto” de \futurelet.

Pergunta

Como restauro o kerning entre A e V?

Eu esperaria inserir um \kernleftcomando adicional em algum lugar do corpo do \tooltipCcomando para produzir uma saída equivalente à parte superior da imagem.

MWE

(As dicas devem funcionar no 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}

Responder1

É permitido um overstrike? Nesse caso, isso restaura o kerning. Não compreendo o código da dica, mas tentei mostrar o que quero dizer neste MWE. A chave para restaurar o kerning adequado é iniciar a \tooltipmacro #1e finalizá-la em #1.

EDITEI para inserir \relaxapós o \kerns, de acordo com o aviso do OP.

Eu reeditei, com base nos comentários do OP. Agora que entendi perfeitamente que o primeiro argumento para \tooltipnão é apenas um caractere, mas poderia ser uma palavra ou várias palavras, revisei minha estratégia da seguinte forma: o único kerning/overstrike que ocorre está na primeira e na última letras de o argumento. Assim, espaços e hifens explícitos no meio do argumento podem ser usados ​​para quebra de linha. O único caso que ainda apresenta dificuldade são as palavras hifenizáveis. Este método não hifeniza, mas não sei bem por quê.

Abaixo está uma variante (feita para compilar em PDFLaTeX) do arquivo fornecido pelo OP em seus comentários, para testar o kerning dos vários métodos, AD, quando os métodos foram estressados ​​com uma quebra de linha iminente. A solução atualmente proposta é o método D, que captura os kerns, mas não pode hifenizar automaticamente.

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

insira a descrição da imagem aqui


Solução original:

A conversa com o OP nos comentários leva a dois pontos que devem ser destacados sobre esta solução. Uma é que esse método será interrompido se houver um espaço no primeiro argumento de \tooltip. A razão é que um espaço contém cola e a cola não tem largura fixa. Assim, o kerning não pode ser usado para desfazer um espaço.

O segundo ponto é que a dica de ferramenta no meio da palavra impedirá a hifenização dessa palavra. Embora isso não torne o método "quebrado", permite que palavras longas que de outra forma seriam hifenizadas não o façam, com uma dica de ferramenta no meio. Assim, pode-se experimentar estouros de margem, não por causa direta do método, mas porque indiretamente a hifenização normal é impedida.

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

insira a descrição da imagem aqui

Responder2

provavelmente eu apenas adicionaria novamente os kerns explicitamente depois de medir o texto com e sem os caracteres adjacentes separados pelos limites da caixa.

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

Responder3

Minha sugestão é redesenhar ligeiramente a \tooltipsintaxe. O primeiro parâmetro dessa macro é a palavra inteira, mas o texto destacado é colocado entre colchetes, por exemplo:

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

Se não houver o segundo par de chaves, todo o texto será destacado:

\tooltip{tipped text}{tip}

Isso pode ser implementado de forma simples, sem sobreposição de 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
}

A hifenização pode ser definida diretamente, \-se necessário, por exemplo

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

informação relacionada