목록이나 그림과 같은 부동 환경을 언급 된 위치로 역 참조하는 방법은 무엇입니까?
자세한 내용은이 질문을 참조하십시오.)에 대한 자세한 내용은 부록 에 소스 코드 항목과 그림 / 이미지를 넣고 싶습니다 (참고 문헌 또는 약어 TOC에서 가질 수있는 것처럼). 와 acro
) 정도,이 참조하는 부분은 아주 멀리가 인쇄 된 곳에서 있기 때문에 (즉, 부록).
요컨대,이 질문은 기본적으로 "표 / 그림을 언급 된 위치에 가깝게 유지" 라는 질문의 "반대"를 가정합니다 . 즉, 내 이미지 / 목록이 언급 된 위치에서 멀리 떨어져 있으므로 역 참조를 원합니다. , 그래서 사람들은 부록을 보면 내가 인용 한 코드 스 니펫이나 이미지에 대한 설명을 찾을 수 있습니다.
내가 사용한 hyperref
그림을 참조하거나 발행 년도를 통해 생성 예를 들어, 그래서 목록에 대한의 명령을 \autoref
, \nameref
또는 \fullref
.
따라서, 그것은 자막에 대한 역 참조를 (역 참조 / 뒤로)를 추가 할 어떻게 든 가능하다 또는 - 이 헤드 라인 대신 자막을 사용하는 마음에 내 다른 생각을 유지하는 텍스트에서 다른 곳?
예를 들어 다음과 같은 캡션이 필요합니다.
A가 B를 만드는 방법을 보여주는 소스 코드 스 니펫 (5, 7-8 페이지에 언급 됨)
정확한 스타일, 즉 간결하고 페이지를 건너 뛰는 지 또는 사용하는 인트로 ( "페이지에 언급 된"는 "pp"또는 일부 biblatex 또는 acro 매크로에서 이미 정의 된 다른 약어로 대체 될 수도 있음) 중요하지 않지만 예를 들어 스타일 acro
사용을 좋아 합니다.)
편집 : 여전히 명확하지 않은 것처럼 보이므로 acro와 같은 것을 원합니다.
나는 이러한 "S. 10, 14, 27"등의 페이지에 대한 백 링크를 원합니다. @John Kormylo의 답변은 좋은 예를 제공하지만 완전하지는 않습니다. 그러나 나는 할 수 없습니다 (또한 그렇게 할 수 biblatex, 나도 알아)의 약어 또는 참조 목록을 원하지만, 일부 부록 그림 / 명부 / 자막 .
BTW 페이지로 백 링크하면 충분 합니다 . 정확한 위치 일 필요는 없습니다.
여기서는 작동하지 않기 때문에 내가 줄 수있는 MWE가 없습니다.
참고 : 명백한 이유로 backref는 또는 같은 목차에서 링크를 제외 해야합니다 .\listoflistings
\listoffigures
답변
여기에 biblatex
의 backref 접근 방식을 느슨하게 기반으로 한 약간의 것이 있습니다.
\ref
/를 호출 할 때마다이 특정 페이지에서 레이블이 참조 된 파일에 \autoref
마커를 보냅니다 .aux
. 각 LaTeX 실행을 시작할 때 .aux
파일 에서 레이블-페이지 조합을 읽고 참조 된 페이지 목록을 각 레이블에 대해 컴파일 할 수 있습니다. 이 목록은 나중에 인쇄에 사용할 수 있습니다.
이 간단한 접근 방식을 사용하면 레이블이 참조 된 정확한 위치가 아닌 페이지로만 다시 연결되며 LaTeX 재실행 경고를 자동으로 발행하지 않습니다.
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\usepackage{hyperref}
\makeatletter
% stolen from biblatex
% we need a way to check if printable text is in a list
\newrobustcmd{\rugk@ifprintableinlist}[2]{%
\begingroup
\def\rugk@tempa{\endgroup
\@secondoftwo}%
\renewcommand*{\do}[1]{%
\ifstrequal{##1}{#1}
{\def\rugk@tempa{\endgroup
\@firstoftwo}%
\listbreak}
{}}%
\dolistloop{#2}%
\expandafter\rugk@tempa}
\newrobustcmd{\rugk@ifprintableinlistcs}[2]{%
\expandafter\rugk@ifprintableinlistcs@i\csname #2\endcsname{#1}}
\long\def\rugk@ifprintableinlistcs@i#1#2{\rugk@ifprintableinlist{#2}{#1}}
% add <page> to the list of pages where <label> was referenced
% {<label>}{<page>}{<page int>}
\protected\def\rugk@ref@backref#1#2#3{%
\ifcsundef{rugk@ref@backreflist@\detokenize{#1}}
{\global\cslet{rugk@ref@backreflist@\detokenize{#1}}\@empty}
{}%
\rugk@ifprintableinlistcs{#2}{rugk@ref@backreflist@\detokenize{#1}}
{}
{\listcsgadd{rugk@ref@backreflist@\detokenize{#1}}{#2}}}
% write label backref to aux file
% {<label>}
\def\rugk@write@ref@backref#1{%
\if@filesw
\protected@write\@mainaux{}{\string\rugk@ref@backref
{#1}{\thepage}{\noexpand\the\c@page}}%
\fi}
\newcommand{\backref}[1]{%
\rugk@write@ref@backref{#1}%
\ref{#1}%
}
\newcommand{\autobackref}[1]{%
\rugk@write@ref@backref{#1}%
\autoref{#1}%
}
\newcounter{backrefpages}
\newcounter{totalbackrefpages}
\newcommand*{\printbackrefpage}[1]{%
\stepcounter{backrefpages}%
\hyperlink{page.#1}{#1}%
\ifnumless{\value{backrefpages}}{\value{totalbackrefpages}}
{, }
{}}
\newrobustcmd*{\printlabelbackrefs}[1]{%
\setcounter{backrefpages}{0}%
\setcounter{totalbackrefpages}{0}%
\ifcsundef{rugk@ref@backreflist@\detokenize{#1}}
{Not referenced}
{\def\do##1{\stepcounter{backrefpages}}%
\dolistcsloop{rugk@ref@backreflist@\detokenize{#1}}%
\setcounter{totalbackrefpages}{\value{backrefpages}}%
\setcounter{backrefpages}{0}%
\ifnumgreater{\value{totalbackrefpages}}{1}
{pp.}
{p.}~%
\forlistcsloop{\printbackrefpage}{rugk@ref@backreflist@\detokenize{#1}}}}
\makeatother
\newrobustcmd{\backcaption}[3][]{%
\if\relax\detokenize{#1}\relax
\def\rugk@tmpcapt{\caption[#2]}%
\else
\def\rugk@tmpcapt{\caption[#1]}%
\fi
\rugk@tmpcapt{#2 (see \printlabelbackrefs{#3})}%
\label{#3}}
\begin{document}
\section{Introduction}
\listoffigures
Here is a reference to \backref{test} and \autobackref{test}
\clearpage
And here we talk about it again: \autobackref{test}
\clearpage
\begin{figure}[p]
\backcaption{This is a test.}{test}
\end{figure}
\end{document}
실행 카운터가있는 레이블을 기반으로하는 대안입니다. backref 출력은 페이지와 레이블 당 하나의 backref 레이블로만 backref되지만 원하는 경우 변경할 수 있습니다 ( "pp. 1, 1"과 같은 것을 얻을 수 있기 때문에 이상하게 보일 수 있음).
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\usepackage{hyperref}
\makeatletter
\newcounter{backrefinst}
% stolen from biblatex
% we need a way to check if printable text is in a list
\newrobustcmd{\rugk@ifprintableinlist}[2]{%
\begingroup
\def\rugk@tempa{\endgroup
\@secondoftwo}%
\renewcommand*{\do}[1]{%
\ifstrequal{##1}{#1}
{\def\rugk@tempa{\endgroup
\@firstoftwo}%
\listbreak}
{}}%
\dolistloop{#2}%
\expandafter\rugk@tempa}
\newrobustcmd{\rugk@ifprintableinlistcs}[2]{%
\expandafter\rugk@ifprintableinlistcs@i\csname #2\endcsname{#1}}
\long\def\rugk@ifprintableinlistcs@i#1#2{\rugk@ifprintableinlist{#2}{#1}}
% add <page> to the list of pages where <label> was referenced
% remember the first instance counter for each label/page combination
% {<label>}{<backref instance counter>}{<page>}{<page int>}
\protected\def\rugk@ref@backref#1#2#3#4{%
\ifcsundef{rugk@ref@backreflist@\detokenize{#1}}
{\global\cslet{rugk@ref@backreflist@\detokenize{#1}}\@empty}
{}%
\rugk@ifprintableinlistcs{#3}{rugk@ref@backreflist@\detokenize{#1}}
{}
{\listcsgadd{rugk@ref@backreflist@\detokenize{#1}}{#3}%
\csgdef{rugk@ref@backrefinst@\detokenize{#1}@\detokenize{#3}}{#2}}}
% write label backref to aux file
% {<label>}
\def\rugk@write@ref@backref#1{%
\if@filesw
\protected@write\@mainaux{}{\string\rugk@ref@backref
{#1}{\the\value{backrefinst}}{\thepage}{\noexpand\the\c@page}}%
\fi}
\newcommand*{\rugk@create@backref@label}[1]{%
\begingroup
\refstepcounter{backrefinst}%
\label{backref.\the\value{backrefinst}}%
\rugk@write@ref@backref{#1}%
\endgroup
}
\newcommand{\backref}[1]{%
\ref{#1}%
\rugk@create@backref@label{#1}%
}
\newcommand{\autobackref}[1]{%
\autoref{#1}%
\rugk@create@backref@label{#1}%
}
\newcounter{backrefpages}
\newcounter{totalbackrefpages}
% {<label>}{<page>}
\newcommand*{\printbackrefpage}[2]{%
\stepcounter{backrefpages}%
\pageref{backref.\csuse{rugk@ref@backrefinst@\detokenize{#1}@\detokenize{#2}}}%
\ifnumless{\value{backrefpages}}{\value{totalbackrefpages}}
{, }
{}}
\newrobustcmd*{\printlabelbackrefs}[1]{%
\setcounter{backrefpages}{0}%
\setcounter{totalbackrefpages}{0}%
\ifcsundef{rugk@ref@backreflist@\detokenize{#1}}
{Not referenced}
{\def\do##1{\stepcounter{backrefpages}}%
\dolistcsloop{rugk@ref@backreflist@\detokenize{#1}}%
\setcounter{totalbackrefpages}{\value{backrefpages}}%
\setcounter{backrefpages}{0}%
\ifnumgreater{\value{totalbackrefpages}}{1}
{pp.}
{p.}~%
\forlistcsloop{\printbackrefpage{#1}}{rugk@ref@backreflist@\detokenize{#1}}}}
\makeatother
\newrobustcmd{\backcaption}[3][]{%
\if\relax\detokenize{#1}\relax
\def\rugk@tmpcapt{\caption[#2]}%
\else
\def\rugk@tmpcapt{\caption[#1]}%
\fi
\rugk@tmpcapt{#2 (see \printlabelbackrefs{#3})}%
\label{#3}}
\begin{document}
\section{Introduction}
\listoffigures
Here is a reference to \backref{test} and \autobackref{test}
\clearpage
And here we talk about it again: \autobackref{test}
\clearpage
\begin{figure}[p]
\backcaption{This is a test.}{test}
\end{figure}
\end{document}
모든 backref 경우를 인쇄하려면이 코드를 약간 간소화 할 수 있습니다. 각 레이블에 대한 페이지 목록이 아니라 각 레이블에 대한 backref 인스턴스 개수 목록 만 기억하면됩니다.
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\usepackage{hyperref}
\makeatletter
\newcounter{backrefinst}
% add <page> to the list of pages where <label> was referenced
% remember the first instance counter for each label/page combination
% {<label>}{<backref instance counter>}
\protected\def\rugk@ref@backref#1#2{%
\ifcsundef{rugk@ref@backreflist@\detokenize{#1}}
{\global\cslet{rugk@ref@backreflist@\detokenize{#1}}\@empty}
{}%
\ifinlistcs{#2}{rugk@ref@backreflist@\detokenize{#1}}
{}
{\listcsgadd{rugk@ref@backreflist@\detokenize{#1}}{#2}}}
% write label backref to aux file
% {<label>}
\def\rugk@write@ref@backref#1{%
\if@filesw
\protected@write\@mainaux{}{\string\rugk@ref@backref
{#1}{\the\value{backrefinst}}}%
\fi}
\newcommand*{\rugk@create@backref@label}[1]{%
\begingroup
\refstepcounter{backrefinst}%
\label{backref.\the\value{backrefinst}}%
\rugk@write@ref@backref{#1}%
\endgroup
}
\newcommand{\backref}[1]{%
\ref{#1}%
\rugk@create@backref@label{#1}%
}
\newcommand{\autobackref}[1]{%
\autoref{#1}%
\rugk@create@backref@label{#1}%
}
\newcounter{backrefpages}
\newcounter{totalbackrefpages}
% {<label>}{<page>}
\newcommand*{\printbackrefpage}[1]{%
\stepcounter{backrefpages}%
\pageref{backref.#1}%
\ifnumless{\value{backrefpages}}{\value{totalbackrefpages}}
{, }
{}}
\newrobustcmd*{\printlabelbackrefs}[1]{%
\setcounter{backrefpages}{0}%
\setcounter{totalbackrefpages}{0}%
\ifcsundef{rugk@ref@backreflist@\detokenize{#1}}
{Not referenced}
{\def\do##1{\stepcounter{backrefpages}}%
\dolistcsloop{rugk@ref@backreflist@\detokenize{#1}}%
\setcounter{totalbackrefpages}{\value{backrefpages}}%
\setcounter{backrefpages}{0}%
\ifnumgreater{\value{totalbackrefpages}}{1}
{pp.}
{p.}~%
\forlistcsloop{\printbackrefpage}{rugk@ref@backreflist@\detokenize{#1}}}}
\makeatother
\newrobustcmd{\backcaption}[3][]{%
\if\relax\detokenize{#1}\relax
\def\rugk@tmpcapt{\caption[#2]}%
\else
\def\rugk@tmpcapt{\caption[#1]}%
\fi
\rugk@tmpcapt{#2 (see \printlabelbackrefs{#3})}%
\label{#3}}
\begin{document}
\section{Introduction}
\listoffigures
Here is a reference to \backref{test} and \autobackref{test}
\clearpage
And here we talk about it again: \autobackref{test}
\clearpage
\begin{figure}[p]
\backcaption{This is a test.}{test}
\end{figure}
\end{document}
이 솔루션은 \backcaption
및 \backref
대신 \caption\label
및 \ref
.
\documentclass{article}
\usepackage{hyperref}
\newcommand{\backref}[1]% #1 = label name
{\raisebox{\baselineskip}[\ht\strutbox]{\hypertarget{#1.back}{}}\ref{#1}}
\newcommand{\backcaption}[2]% #1 = caption, #2= label
{\caption[#1]{\hyperlink{#2.back}{#1}}\label{#2}}
\begin{document}
\listoffigures
\vspace{2in}
Here is a reference to \backref{test}.
\begin{figure}[p]
\backcaption{This is a test.}{test}
\end{figure}
\end{document}
좋아요, @John Kormylo 의 답변 덕분에 부분적인 해결책을 얻었습니다. 즉, 보통 \label
을 사용하면 당연히 \pageref
페이지를 다시 참조 하는 데 사용할 수 있습니다 .
유일한 문제는 : 이것은 하나의 ref 만있는 경우에만 작동합니다 .
다음은 몇 가지 코드입니다.
\documentclass{article}
\usepackage[utf8]{inputenc}
\title{test-backref}
\date{August 2020}
\usepackage{hyperref}
% thanks https://tex.stackexchange.com/a/559834/98645
\newcommand{\backref}[1]% #1 = label name
{
\raisebox{\baselineskip}[\ht\strutbox]{\label{#1.back}{}}%
\ref{#1}
}
\newcommand{\autobackref}[1]% #1 = label name
{
\raisebox{\baselineskip}[\ht\strutbox]{\label{#1.back}{}}%
\autoref{#1}
}
\newcommand{\backcaption}[2]% #1 = caption, #2= label
{\caption[#1]{#1 (see p.~\pageref{#2.back})}\label{#2}}
\newcommand{\backcaptionoptional}[3]% #1 optional label, 2 = caption, #3= label
{\caption[#1]{#2 (see p.~\pageref{#3.back})}\label{#3}}
\begin{document}
\maketitle
\section{Introduction}
\listoffigures
\vspace{2in}
Here is a reference to \backref{test} and \autobackref{test}….
\newpage
And here we talk about it again: \autobackref{test}
\newpage
\begin{figure}[p]
\backcaption{This is a test.}{test}
\end{figure}
\end{document}
또한 문제를 보여줍니다. LaTeX는 다음과 같이 불평합니다.
동일한 라벨을 두 번 이상 사용했습니다. 각 \ label {...}이 하나의 항목에만 레이블을 지정하는지 확인하십시오.
내가 그 그림을 여러 번 언급했기 때문에 이런 일이 발생합니다. 결국 출력은 마지막 레이블을 참조로 사용합니다.
그래서 아직 완성되지는 않았지만, 완전한 솔루션을 위해 라벨을 계산하기 위해 카운터 정도를 사용해야한다고 생각합니다. 그렇지 않습니까? (아이디어가 있으시면 언제든지 제출하여 기반으로 사용하십시오.)