सूची या आंकड़ों की तरह अस्थायी वातावरण को कैसे वापस करना है जहाँ उनका उल्लेख किया गया है?

Aug 17 2020

मैं अपने स्रोत परिशिष्ट में कुछ स्रोत कोड प्रविष्टियाँ और कुछ आंकड़े / चित्र अधिक विवरण के लिए रखना चाहता हूं। साथ acroया तो), क्योंकि जिस हिस्से को संदर्भित किया जाता है, वह उस जगह से बहुत दूर है, जहां वह मुद्रित होता है (यानी परिशिष्ट में)।

संक्षेप में, यह प्रश्न मूल रूप से प्रश्न के "विपरीत" को मानता है / जहां उनका उल्लेख किया गया है वहां तालिकाओं / आंकड़ों को रखते हुए " , अर्थात मेरी छवियां / लिस्टिंग जहां वे उल्लेखित हैं, वहां से बहुत दूर हैं और इस प्रकार मैं उनके लिए एक backref चाहूंगा। , इसलिए लोगों को एक कोड स्निपेट या छवि के लिए स्पष्टीकरण मिल सकता है जब मैं सिर्फ एपेंडिक्स को देखता हूं।

मैंने hyperrefमिंटेड के माध्यम से बनाई गई आकृति या लिस्टिंग को संदर्भित करने के लिए कमांड का उपयोग किया है , इसलिए \autoref, \namerefया \fullref

इस प्रकार, किसी भी तरह कैप्शन में एक बैकरेन्स (backref / बैकलिंक) जोड़ना संभव है - या पाठ में कहीं और कैप्शन के बजाय हेडलाइन्स का उपयोग करने के बारे में मेरे अन्य विचार को ध्यान में रखते हुए ?

मुझे लगता है कि इस तरह एक कैप्शन चाहिए:

स्रोत कोड स्निपेट दिखा रहा है कि ए कैसे बी बनाता है (पृष्ठ 5, 7-8 पर उल्लेख किया गया है)

सटीक शैली, यानी कि यह कॉम्पैक्ट और स्किप पेज है या यह किस इंट्रो का उपयोग करता है ("पृष्ठों पर उल्लेख किया गया है" को केवल "पीपी" द्वारा प्रतिस्थापित किया जा सकता है या एक और संक्षिप्त नाम जो संभवतः पहले से ही कुछ biblatex या एक्रो मैक्रो में परिभाषित है)। कोई फर्क नहीं पड़ता, लेकिन मैं जैसे शैली acroका उपयोग करता है।)

संपादित करें: जैसा कि यह अभी भी स्पष्ट प्रतीत नहीं होता है, मैं कुछ चाहता हूं जैसे कि एकरो करता है:

मैं इन "एस। 10, 14, 27" आदि को पृष्ठ पर वापस करना चाहता हूं। @ जॉन कोरमेलो का जवाब एक अच्छा उदाहरण प्रदान करता है, लेकिन पूर्ण नहीं है। लेकिन मैं उन्हें एक संक्षिप्त या संदर्भ सूची के लिए नहीं चाहता हूं (biblatex भी ऐसा कर सकता है, मुझे यह पता है), लेकिन परिशिष्ट में कुछ आंकड़े / लिस्टिंग / कैप्शन के लिए

BTW यह पर्याप्त है अगर यह पृष्ठ पर बैकलिंक करता है, तो सटीक स्थिति होना आवश्यक नहीं है।

कोई एमडब्ल्यूई नहीं है जो मैं दे सकता हूं, क्योंकि यह यहां काम नहीं करता है।

नोट: स्पष्ट कारणों के लिए कि backref संभवतः एक TOC में या जैसे लिंक को बाहर करना चाहिए ।\listoflistings\listoffigures

जवाब

3 moewe Aug 27 2020 at 13:24

यहाँ एक छोटी सी बात पर आधारित है वापस biblatexआ गया है।

प्रत्येक कॉल के साथ \ref/ \autorefहम .auxफ़ाइल को एक मार्कर भेजते हैं जिसे लेबल इस विशेष पेज पर संदर्भित किया गया था। प्रत्येक LaTeX रन की शुरुआत में हम .auxफ़ाइल से लेबल-पेज संयोजन पढ़ सकते हैं और प्रत्येक लेबल के लिए उन पृष्ठों की एक सूची तैयार कर सकते हैं जहां यह संदर्भित था। यह सूची बाद में मुद्रण के लिए उपयोग की जा सकती है।

इस सरल दृष्टिकोण के साथ हम केवल पृष्ठों को वापस लिंक करते हैं, उस सटीक स्थान पर नहीं जिसे लेबल संदर्भित किया गया था, हम स्वचालित रूप से LaTeX rerun चेतावनी जारी नहीं करते हैं।

\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 होगा, लेकिन यदि आप चाहें तो इसे बदला जा सकता है (यह अजीब लग सकता है क्योंकि आपको "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}
2 JohnKormylo Aug 24 2020 at 21:04

इस समाधान का उपयोग करता है \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}
1 rugk Aug 27 2020 at 00:36

ठीक है, @ जोहान कोर्मिलो के उत्तर के लिए धन्यवाद मुझे एक आंशिक समाधान मिला, अर्थात यदि हम सामान्य रूप से उपयोग करते हैं तो हम \labelनिश्चित \pagerefरूप से पृष्ठ पर वापस जाने के लिए उपयोग कर सकते हैं ।

एकमात्र समस्या यह है: यह भी केवल तभी काम करता है जब हमारे पास केवल एक रेफरी हो

यहाँ कुछ कोड है:

\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 (अधिकारपूर्वक) शिकायत करता है:

आपने एक से अधिक बार एक ही लेबल का उपयोग किया है। जांचें कि प्रत्येक \ लेबल {...} केवल एक आइटम लेबल करता है।

ऐसा होता है, क्योंकि मैंने उस आकृति को कई बार संदर्भित किया है। अंत में, आउटपुट अंतिम लेबल को संदर्भ के रूप में उपयोग करता है।

तो यह बिल्कुल खत्म नहीं हुआ है, लेकिन मुझे लगता है कि हमें पूर्ण समाधान के लिए काउंटरों का उपयोग करने के लिए काउंटरों का उपयोग करने की आवश्यकता होगी? हम नहीं करेंगे? (यदि आपके पास कोई विचार है, तो कृपया इसे अपने आधार के रूप में प्रस्तुत करने और उपयोग करने के लिए स्वतंत्र महसूस करें।)