Как разместить гиперссылки в маркерах endfloat?

Как разместить гиперссылки в маркерах endfloat?

Документацияторецpackage объясняет, как настроить текст в маркерах по умолчанию "[Таблица 3 здесь.]" Но я хотел бы настроить маркеры так, чтобы они включали гиперссылку на рисунок в конце документа. Как это можно сделать?

Вот подвопрос: При настройке маркера \thepostfigureссылается на номер рисунка. Есть ли похожая команда \thefigurereference, которая ссылается на ссылку на рисунок, так что текст маркера может быть чем-то вроде Figure \ref{\thefigurereference}} about here.?

Обновление 2:В комментариях я также спросил об обратной ссылке, чтобы подпись рисунка в конце документа была гиперссылкой на встроенный в текст плавающий элемент "[Рисунок 1 здесь]". Принятое решение @John Kormylo обеспечивает это.

Обновление 1 [отредактировано для большей ясности, это относится к оригинальному ответу @John Kormylo, а не к его измененному варианту]:

Решение @John Kormylo (оригинальное) работает, но, как я узнал, оно несовместимо с пакетом subcaption. Итак, мой пересмотренный вопрос: есть ли способ сделать гиперссылку на рисунки, которая все еще работает с caption?

Вот MWE, использующий его решение, где гиперссылки не ведут к рисункам в конце. Рисунок 2 просто демонстрирует, почему мне нужны субтитры — даже без них связывание не работает, пока используется пакет subpcaption.

\documentclass{article}
\usepackage{endfloat}
\usepackage{mwe}
\usepackage{hyperref}
\usepackage{subcaption}

% John Kormylo's original solution, which works when the subcaption package isn't used:
\renewcommand{\floatplace}[1]{% #1 = float type (e.g. figure)
   \begin{center}
     \hyperlink{#1.\csname thepost#1\endcsname}%
       {[\csname #1name\endcsname~\csname thepost#1\endcsname\ about here.]}
   \end{center}}

\begin{document}

\begin{figure}
\includegraphics{example-image}
\caption{A figure without subfigures}
\end{figure}

\begin{figure}[htb]
\centering
\begin{subfigure}{.5\textwidth}
  \centering
    \includegraphics[width=.9\textwidth]{example-image}
  \caption{first part}
\end{subfigure}%
%
\begin{subfigure}{.5\textwidth}
  \centering
    \includegraphics[width=.9\textwidth]{example-image}
  \caption{(second part)}
\end{subfigure}%
\caption{A figure with subfigures}
\end{figure}

\lipsum[1-2]


\end{document}

Полученный файл auxпредполагает, что причина, по которой решение не сработало, заключается в том, что subcaption меняет название счетчиков с и т figure.1. figure.2д. на figure.caption.2и figure.caption.3т. д. В нем есть следующие строки для списка таблиц (в котором есть рабочие гиперссылки на рисунки):

\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces This is figure 1.\relax }}{3}{figure.caption.2}}
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces This is figure 2.\relax }}{4}{figure.caption.3}}

Одним из вариантов было бы переписать \floatplaceкоманду Джона Кормило (оригинальную), начав нумерацию с 2 и переименовав заголовок в figure.captionили table.caption. Но в другом документе нумерация для figure.captionв файле aux начинается с 18. (Хотя я не понял, как воспроизвести это в MWE.) Это означает, что такой обходной путь не подойдет.

решение1

Вызовы \caption, \refstepcounter{figure}которые создают \hypertargetименованный \@currentHref. К сожалению, \floatplaceимеет доступ только к \thefigure(фактически \thepostfigure). Поэтому нам нужно создать карту из \thefigureв \@currentHrefи переместить ее в начало документа через aux-файл. Чтобы объединить это и обратную ссылку, я заменил \captionна \figurecaption.

В соответствии с оригиналом \floatplaceя сделал его независимым от типа float. Однако я добавил только код для \figurecaptionи \newfigure.

\documentclass{article}
\usepackage{endfloat}
\usepackage{mwe}
\usepackage{subcaption}
\usepackage{hyperref}

\makeatletter
\renewcommand{\floatplace}[1]{% #1 = float type (e.g. figure)
   \begin{center}
     \def\floatnumber{\csname thepost#1\endcsname}
     \def\floatname{\csname #1name\endcsname}
     \hypertarget{figureback\floatnumber}{}%
     \@ifundefined{#1anchor\floatnumber}%
       {[\floatname~\floatnumber\ about here.]}%
       {\hyperlink{\csname #1anchor\floatnumber\endcsname}%
         {[\floatname~\floatnumber\ about here.]}}
   \end{center}}

\newcommand{\figurecaption}[2][\empty]% #1=short caption (optional), #2=caption
 {\ifx\empty#1\relax \caption[#2]{\hyperlink{figureback\thefigure}{#2}}%
  \else \caption[#1]{\hyperlink{figureback\thefigure}{#2}}%
  \fi
  \immediate\write\@auxout{\string\newfigure{\thefigure}{\@currentHref}}}
\makeatother

\newcommand{\newfigure}[2]% #1 = \thefigure, #2 = \@currentHref
  {\expandafter\gdef\csname figureanchor#1\endcsname{#2}}

\begin{document}

\begin{figure}
\includegraphics{example-image}
\figurecaption{A figure without subfigures}
\end{figure}

\begin{figure}[htb]
\centering
\begin{subfigure}{.5\textwidth}
  \centering
    \includegraphics[width=.9\textwidth]{example-image}
  \caption{first part}
\end{subfigure}%
%
\begin{subfigure}{.5\textwidth}
  \centering
    \includegraphics[width=.9\textwidth]{example-image}
  \caption{(second part)}
\end{subfigure}%
\figurecaption{A figure with subfigures}
\end{figure}

\lipsum[1-2]

\end{document}

Это должно работать, независимо от того, какие странные соглашения об именовании навязывает subcaption.

решение2

Мне нужно было сделать то же самое для таблиц и рисунков и в то же время держать под контролем ошибку с пакетом глоссариев. (Я думаю, что где-то может быть определена собственная функция «tablecaption».)
Вот так:

\documentclass{scrartcl}
\usepackage{graphicx}
\usepackage{xcolor} %Farben
\usepackage{hyperref} %Links
\usepackage[nolists]{endfloat} % figures mit platzhalter und dann im Anhang
\renewcommand{\efloatseparator}{\mbox{}}
\usepackage{glossaries}
\usepackage{ifthen}

\usepackage{caption}
\usepackage{subcaption}
\usepackage{mwe}

\makeatletter
\renewcommand{\floatplace}[1]{% #1 = float type (e.g. figure)
    \begin{center}
        \def\floatnumber{\csname thepost#1\endcsname}
        \def\floatname{\csname #1name\endcsname}

        \ifthenelse{\equal{#1}{figure}}% define backlink based on figure or table
        {\def\backlink{figureback\floatnumber}}%
        {\def\backlink{tableback\floatnumber}}%

        \colorbox{yellow}{\floatname}
        \colorbox{red}{\backlink}

        \colorbox{orange}{\floatnumber}
        \colorbox{green}{\csname #1anchor\floatnumber\endcsname}

        \hypertarget{\backlink}{}
        \@ifundefined{#1anchor\floatnumber}%
        {[ \floatname~\floatnumber\ about here. ]}%
        {[ \hyperlink{\csname #1anchor\floatnumber\endcsname}%
            {\floatname~\floatnumber} about here. ]}
    \end{center}
}

%for figure
\newcommand{\figurecaption}[2][\empty]% #1=short caption (optional), #2=caption
{%
    \ifx\empty#1\relax %
        \caption[#2]{\hyperlink{figureback\thefigure}{#2}}%
    \else %
        \caption[#1]{\hyperlink{figureback\thefigure}{#2}}%
    \fi
    \immediate\write\@auxout{\string\newfigure{\thefigure}{\@currentHref}}%
}
\makeatother

\newcommand{\newfigure}[2]% #1 = \thefigure, #2 = \@currentHref
{\expandafter\gdef\csname figureanchor#1\endcsname{#2}}

\makeatletter
%for table
\newcommand{\tabcaption}[2][\empty]% #1=short caption (optional), #2=caption (tabcaption instead of tablecaption for glossaries)
{%
    \ifx\empty#1\relax %
        \caption[#2]{\hyperlink{tableback\thetable}{#2}}%
    \else %
        \caption[#1]{\hyperlink{tableback\thetable}{#2}}%
    \fi
    \immediate\write\@auxout{\string\newtable{\thetable}{\@currentHref}}%
}
\makeatother

\newcommand{\newtable}[2]% #1 = \thetable, #2 = \@currentHref
{\expandafter\gdef\csname tableanchor#1\endcsname{#2}}

\begin{document}
    \begin{table}
        \tabcaption{tab}
        \begin{tabular}{lcr}
            1 & 2 & 3 \\
        \end{tabular}
    \end{table}

    \begin{figure}
        \includegraphics{example-image}
        \figurecaption{A figure without subfigures}
    \end{figure}

    \begin{figure}[htb]
        \centering
        \begin{subfigure}{.5\textwidth}
            \centering
            \includegraphics[width=.9\textwidth]{example-image}
            \caption{first part}
        \end{subfigure}%
        %
        \begin{subfigure}{.5\textwidth}
            \centering
            \includegraphics[width=.9\textwidth]{example-image}
            \caption{(second part)}
        \end{subfigure}%
        \figurecaption{A figure with subfigures}
    \end{figure}

    \lipsum[1-2]
\end{document}

Связанный контент