
각 표기법이 첫 등장에 연결될 수 있는 명령을 작성하려고 합니다. 표기법 A와 벡터 B를 고려하십시오. x=/='에 대해 fun{'}=B' 및 fun{x}=B^{x}인 명령을 정의하십시오. B^(A)를 쓰고 싶다면 "fun{(A)}" 코드를 사용해야 합니다. 이 "A"는 "하이퍼링크" 코드를 사용합니다. 하지만 .\equal
\equal{(\hyperlink{x}{y})}{z}
내 문제의 최소한의 예는 다음과 같습니다.
\documentclass{article}
\usepackage{hyperref}
\usepackage{ifthen}
\newcommand{\hyperaword}{(\hyperlink{1}{456})}
\begin{document}
\hypertarget{1}{3} % work
\hyperlink{1}{2} % work
\ifthenelse{\equal{\string\hyperaword}{456}}{123}{456} % work
\ifthenelse{\equal{\string (\hyperlink{1}{456})}{456}}{123}{456} % ERROR: Use of \hyper@link@ doesn't match its definition.
\end{document}
이 문제는 "(\hyperlink{xx}{xx})"를 사용할 때만 발생합니다. "( )"를 사용하지 않고 "\hyperlink{xx}{xx}"를 사용하면 괜찮습니다.
답변1
귀하의 질문을 다시 작성해 보겠습니다.
명령이 있어요
\newcommand \f [1] { \ifthenelse { \equal {#1} {...} } ... }
이는 대부분의 경우 작동하지만
#1
포함 하면\hyperlink
false 분기를 실행하는 대신 오류가 발생합니다.
답변ifthen
: 패키지 에 설명된 #1
대로퍼지는비교할 문자열을 가져옵니다.
원본 내용을 비교하려면 를 사용하세요 \detokenize
.
\string
제한된 경우에만 작동합니다.
\newcommand \f [1] { \ifthenelse { \equal {\detokenize{#1}} {\detokenize{...}} } ... }
대체 접근법: expl3 및 \str_if_eq:nnTF
또는 을 사용하십시오 \tl_if_eq:nnTF
.
답변2
\string
명령 이름은 이름을 문자열(catcode 12의 문자 시퀀스)로 반환하므로 \usepackage
단일 토큰이지만 \string\usepackage
11개 토큰입니다.\
u
s
e
p
a
c
k
a
g
e
\ifthenelse
equal
두 인수를 확장한 다음 동일한지 테스트합니다.
\equal{\string\hyperaword}{456}
11개의 토큰 \ 하이퍼워드가 3개의 토큰 4 5 6과 같은지 테스트합니다. 이는 결코 사실이 아니므로
\ifthenelse{\equal{\string\hyperaword}{456}}{123}{456}
항상456
두 번째 테스트에서는 이미 catcode 12의 문자로 확장됩니다. 그러나 확장 \string(
컨텍스트 에서는 사용할 수 없는 깨지기 쉬운 명령입니다. 어쨌든 pdftex 프리미티브를 사용하여 링크를 구성하므로(pdftex를 사용하는 경우) 특히 로 둘러싸인 경우 는 결코 같지 않을 것입니다. 을 사용하면 오류를 피할 수 있지만 세 개의 토큰이 다음과 같은지 테스트합니다. 세 개의 토큰이 있는데 이는 결코 사실이 아닙니다.(
(
\hyperlink
()
456
\protect\hyperlink
(
\hyperlink
)
4
5
6
답변3
PDF 뷰어가 PDF 파일을 표시할 때,"하이퍼타겟"은 기본적으로 식별할 수 있는 이름이 있는 PDF 파일 페이지의 영역 1 입니다.
PDF 뷰어가 PDF 파일을 표시할 때 "하이퍼링크"는 기본적으로 PDF 파일 페이지의 영역 1 입니다. 여기서 클릭하면 PDF 파일의 다른 영역 을 창으로 스크롤하는 효과가 있습니다. pdf 파일이 표시됩니다.
따라서 매크로는 \hypertarget
pdf 파일을 볼 때, 즉 LaTeX 컴파일러가 더 이상 실행되지 않을 때 pdf 파일 지시문에 쓰기 위한 LaTeX 컴파일러에 대한 명령입니다. 보기 프로그램은 PDF 파일의 영역에 이름을 지정하는 데 사용됩니다. 이렇게 명명된 영역을 "대상"이라고 합니다. 그러한 지역의 이름을 "목적지"라고 합니다. 그러한 명명된 영역이 너무 작아서 PDF 파일의 단일 지점으로 간주될 수 있는 경우 "앵커"라고도 합니다. 삼
그리고 매크로는 \hyperlink
LaTeX 컴파일러가 pdf 파일을 볼 때, 즉 LaTeX 컴파일러가 더 이상 실행되지 않을 때 pdf 파일 지시어에 쓰라는 명령입니다. 보기 프로그램은 PDF 파일의 다른 (대상) 영역을 클릭할 때 PDF 파일이 표시되는 창으로 스크롤하라는 지시와 함께 PDF 파일의 영역을 연결하는 데 사용됩니다.
TeX 실행 중에 pdfTeX 기반 엔진은 명명된 영역=대상/앵커의 이름=목적지를 추적하고 다음을 제공하여 해당 대상을 도입하지 않고 하이퍼링크를 배치한 경우 TeX 실행이 끝날 때 오류 메시지를 발생시킵니다. pdf 파일 내의 대상 영역/앵커에 해당하는 이름입니다.
하지만어떤 TeX 엔진도 PDF 파일의 명명된 스크롤 가능 영역에서 발생하는 텍스트 문구 등을 추적하기 위해 \hypertarget
/ - 메커니즘을 사용하지 않습니다.\hyperlink
요약:
매크로는 \hyperlink
LaTeX 실행 중에 유용한 정보를 반환하지 않습니다. 이는 단지 PDF 파일을 볼 때 PDF 보기 프로그램에서 처리되는 PDF 파일에 대한 쓰기 지침을 트리거할 뿐입니다.즉, 이러한 명령은 라텍스 컴파일러가 아닌 다른 프로그램, 즉 PDF 보기 프로그램에 의해 처리됩니다. 즉, 이러한 명령은 latex-compiler가 더 이상 실행되지 않고 latex-compiler가 실행되는 동안에만 존재했던 모든 데이터 조각이 더 이상 존재하지 않을 때 처리됩니다.
코드의 표현식은
\ifthenelse{\equal{\string\hyperaword}{456}}{123}{456}
라텍스 컴파일러가 실행되는 동안
\ifthenelse{\equal{\string (\hyperlink{1}{456})}
적용의 "결과"를 어떻게든 평가하려는 시도를 나타냅니다 .\hyperlink
따라서 정확히 무엇을 달성하려고 하는지는 모르겠지만 매크로가 \hyperlink
TeX 실행 중 추가 처리/검사가 유용할 토큰/정보를 제공하는지 의심됩니다.
내가 올바르게 이해했다면 지금의 질문에는 TeX 매크로가 \hyperlink
실제로 무엇에 관한 것인지에 대한 오해가 포함되어 있어 이미 질문을 이해하기 어렵게 만들고 있습니다.
당신이 이루고 싶은 것이 무엇인지 정확하게 명시해주세요. 아마도 문제에 대한 접근 방식을 보여주는 코드 예제를 추가하기 위해 답변을 수정할 수 있을 것입니다.
1 페이지 나누기/열 나누기 등의 경우 하이퍼타겟과 하이퍼링크 모두 단일 영역이 아닌 여러 영역으로 구성될 수 있습니다.
2 "pdf 파일이 표시되는 창으로 pdf 파일의 다른 영역을 스크롤한다"는 의미는 pdf 파일을 보는 데 사용하는 프로그램에 따라 다릅니다. 왜냐하면 이러한 지침을 따르는 과정에서 "작업"이 다음과 같기 때문입니다. 해당 프로그램에 구현되었습니다. 다양한 PDF 보기 프로그램의 동작은 경우에 따라 다릅니다.
3 hyperref 패키지는 해당 링크를 클릭할 때 pdf 파일이 표시되는 창의 왼쪽 상단으로 앵커 포인트가 스크롤되는 것을 가정하여 다양한 상황에서 앵커와 함께 작동합니다. 내부적으로 hyperref 패키지는 링크를 클릭할 때 표시 창에 표시되는 텍스트/자료가 포함된 해당 상자의 참조 지점을 기준으로 앵커 지점의 위치를 지정합니다. 내가 아는 한 TeX 자체가 사물을 상자로 나누는 수평 모드에서는 링크를 클릭할 때 표시 창에 표시되어야 하는 텍스트/자료의 일부가 포함된 첫 번째 수평 상자의 참조 지점입니다.
다음 예에서는 \LinkOrTarget{<destination name>}{<phrase>}
지정된 첫 번째 인스턴스의 매크로를 제공합니다.⟨목적지 이름⟩하이퍼타겟을 형성하고 후속 인스턴스가 하이퍼링크를 형성합니다.
명령이 \IntroduceHypertargetHere{<destination name>}{<phrase>}
발생하면 해당 명령은 하이퍼타겟을 형성하고 모든 인스턴스는 \LinkOrTarget{<destination name>}{<phrase>}
하이퍼링크를 형성합니다.
명령이 \IntroduceHypertargetHere{<destination name>}{<phrase>}
발생하면 모든 것이 일치할 때까지 두 번 이상의 라텍스 실행이 필요합니다.
따라서: LaTeX를 다시 실행해야 한다는 필요성에 대한 터미널과 .log 파일의 정보와 경고를 따르십시오(LaTeX 실행 사이에 보조 파일을 삭제하지 않음).
\IntroduceHypertargetHere{<destination name>}{<phrase>}
같은 것을 위해 배치하지 마십시오⟨목적지 이름⟩한 번 이상. 그렇게 하면 다중 정의 레이블에 대한 경고가 표시되고 이러한 인스턴스 중 첫 번째 인스턴스에서 하이퍼타겟이 생성됩니다.
\documentclass{article}
\usepackage{hyperref}
\usepackage{zref}
\makeatletter
\zref@newprop{DestinationExplicitlyPlaced}{}%
\newcommand\WrapHypertargetInHy@raisedlink[2]{%
\Hy@raisedlink{\hypertarget{#1}{}}#2%
}%
\newcommand\IntroduceHypertargetHere[1]{%
\zref@setcurrent{DestinationExplicitlyPlaced}{true}%
\zref@labelbyprops{ExplicitDestination-#1}{DestinationExplicitlyPlaced}%
\IntroduceHypertargetHereInternal{#1}%
}%
\newcommand\IntroduceHypertargetHereInternal[2]{%
\@ifundefined{NameOfDestination_#1}{%
\expandafter\gdef\csname NameOfDestination_#1\endcsname{}%
\WrapHypertargetInHy@raisedlink
}{\hyperlink}{#1}{#2}%
}%
\newcommand\LinkOrTarget[2]{%
\zref@ifrefundefined{ExplicitDestination-#1}{\IntroduceHypertargetHereInternal}{%
\zref@ifrefcontainsprop{ExplicitDestination-#1}{DestinationExplicitlyPlaced}%
{\hyperlink}{\IntroduceHypertargetHereInternal}%
}%
{#1}{#2}%
}%
\makeatother
\begin{document}
Dummy page
\newpage
Smme text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
\newpage
Some text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
\newpage
Some text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
%Some text \IntroduceHypertargetHere{destination name}{Phrase which is in target area}.
\newpage
Some text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
\newpage
Some text \LinkOrTarget{destination name}{Phrase which either is in link area or is in target area}.
\end{document}