
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 V
da palavra .AVA
Aqui está a implementação e uso do meu \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
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{}A
faz com que o kerning entre as partes não se aplique mais.¹(Nota: \special
nã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 \futurelet
fazer 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
No entanto, não consegui encontrar uma maneira de escrever um \tooltipD
comando 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 \kernleft
comando adicional em algum lugar do corpo do \tooltipC
comando 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 \tooltip
macro #1
e finalizá-la em #1
.
EDITEI para inserir \relax
após o \kern
s, 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 \tooltip
nã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}
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}
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 \tooltip
sintaxe. 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}