문맥

문맥

문맥

내 문서에서는 단어의 중간 부분에 툴팁을 첨부합니다. 이 동작을 시연하려면 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}

관련 정보