
Документацияторец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}