
문맥
내 문서에서는 단어의 중간 부분에 툴팁을 첨부합니다. 이 동작을 시연하려면 V
단어의 문자 위에 마우스를 올려 보십시오 .AVA
내 명령의 구현 및 사용법은 다음과 같습니다 \tooltip
.
%% 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
툴팁을 만드는 구체적인 내용은 질문과 직접적인 관련이 없지만 맥락을 위해 포함했습니다.
문제
단어의 부분을 산재하여 분리하면 \special{}
부분 A\special{}V\special{}A
사이의 커닝이 더 이상 적용되지 않습니다.¹(참고: \special
특별한 것은 아닙니다. 이 동작은 XeLaTeX 또는 LuaLaTeX를 사용하지 않는 한 A{V}A
및 에서도 발생합니다.A{}V{}A
²)
부분적인 해결책
다음 명령을 사용하여 후반 두 부분의 커닝을 복원할 수 있었습니다.이 답변, \futurelet
트릭을 수행하는 데 사용됩니다.
\newcommand\kernright[1]{\def\hltext{#1}\futurelet\hlnext\hldokern}
\def\hldokern{%
\sbox0{\mbox\hltext\mbox\hlnext}\sbox2{\hltext\hlnext}\kern\dimexpr\wd2-\wd0\relax%
}
(해당 질문은 특히 다양한 스타일 간의 커닝에 관한 것이지만 솔루션은 여전히 작동합니다. 또 다른 좀 더 일반적인질문만족스러운 해결책이 없습니다.)
다음은 3가지 래퍼 명령입니다 \tooltip
.
\newcommand\tooltipA[2]{#1}
\newcommand\tooltipB[2]{\tooltip{#1}{#2}}
\newcommand\tooltipC[2]{\tooltip{#1}{#2}\kernright{#1}}
아래는 비교표와 해당 렌더링 이미지입니다.
 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
\tooltipD
그러나 의 "반대"를 수행하는 명령이 없는 것 같기 때문에 A와 V 사이의 커닝도 복원하는 명령을 작성하는 방법을 찾지 못했습니다 \futurelet
.
질문
A와 V 사이의 커닝을 어떻게 복원합니까?
이미지의 상단 부분과 동일한 출력을 생성하려면 명령 \kernleft
본문 어딘가에 추가 명령을 삽입해야 합니다 .\tooltipC
MWE
(툴팁은 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}
답변1
오버스트라이크가 허용되나요? 그렇다면 커닝이 복원됩니다. 툴팁 코드를 이해할 수 없지만 이 MWE에서 내가 의미하는 바를 보여 주려고 노력했습니다. 적절한 커닝을 복원하는 열쇠는 \tooltip
매크로를 에서 시작 #1
하고 에서 끝내는 것입니다 #1
.
OP의 경고에 따라 s \relax
뒤에 삽입하도록 편집했습니다 .\kern
OP의 의견을 바탕으로 다시 편집했습니다. 이제 에 대한 첫 번째 인수가 단순한 문자가 아니라 한 단어 또는 여러 단어일 수 있다는 점을 완전히 이해했으므로 \tooltip
전략을 다음과 같이 수정했습니다. 발생하는 유일한 커닝/중복선은 문자의 첫 번째 및 마지막 문자에서만 발생합니다. 논쟁 거리. 따라서 인수 중간에 있는 공백과 명시적인 하이픈을 줄 바꿈에 사용할 수 있습니다. 여전히 어려운 경우는 하이픈을 넣을 수 있는 단어입니다. 이 방법은 하이픈을 넣지 않지만 그 이유는 잘 모르겠습니다.
아래는 OP가 그의 의견에서 제공한 파일에 대한 변형(PDFLaTeX로 컴파일하도록 제작됨)입니다. 이는 임박한 줄바꿈으로 메서드가 강조되었을 때 다양한 메서드 AD의 커닝을 테스트하기 위한 것입니다. 현재 제안된 솔루션은 커른을 캡처하지만 자동 하이픈을 사용할 수 없는 방법 D입니다.
\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}
원래 솔루션:
댓글에서 OP와의 대화를 통해 이 솔루션에 관해 두 가지 사항을 확인해야 합니다. 하나는 에 대한 첫 번째 인수에 공백이 있으면 이 메서드가 중단된다는 것입니다 \tooltip
. 그 이유는 공간에는 접착제가 있고 접착제의 폭은 고정되어 있지 않기 때문입니다. 따라서 커닝을 사용하여 공백을 취소할 수 없습니다.
두 번째 요점은 단어 중간에 있는 도구 설명이 해당 단어에 대한 하이픈 연결을 방지한다는 것입니다. 이것이 방법을 "깨뜨린" 것은 아니지만 중간에 툴팁을 사용하여 하이픈을 넣을 긴 단어가 하이픈을 사용하지 않도록 허용합니다. 따라서 직접적인 방법 때문이 아니라 간접적으로 정상적인 하이픈 연결이 방지되기 때문에 여백 초과가 발생할 수 있습니다.
\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}
답변2
아마도 인접한 문자를 상자 경계로 구분하지 않고 텍스트를 측정한 후 명시적으로 커른을 다시 추가했을 것입니다.
\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}
답변3
내 제안은 구문을 약간 다시 디자인하는 것입니다 \tooltip
. 이러한 매크로의 첫 번째 매개변수는 전체 단어이지만 강조 표시된 텍스트는 두 번째 중괄호 쌍으로 묶입니다. 예를 들면 다음과 같습니다.
\tooltip{A{V}Atar}{avatar}
두 번째 중괄호 쌍이 없으면 전체 텍스트가 강조 표시됩니다.
\tooltip{tipped text}{tip}
이는 문자가 겹치지 않고 간단하게 구현될 수 있습니다.
\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
}
필요한 경우 하이픈 넣기를 직접 설정할 수 있습니다 \-
. 예를 들어
\tooltip{A{V}A\-tar}{avatar}