
A documentação doflutuação finalO pacote explica como personalizar o texto nos marcadores a partir do padrão "[Tabela 3 sobre aqui.]" Mas eu gostaria de personalizar os marcadores para incluir um hiperlink para a figura no final do documento. Como pode ser isto alcançado?
Aqui está uma subquestão: Ao personalizar o marcador, \thepostfigure
refere-se ao número da figura. Existe um comando semelhante \thefigurereference
que se refere à referência à figura, para que o texto do marcador possa ser algo como Figure \ref{\thefigurereference}} about here.
?
Atualização 2:Nos comentários, perguntei sobre um backlink também, para que a legenda da figura no final do documento fosse um hiperlink de volta para o flutuador "[Figura 1 sobre aqui]" incorporado no texto. A solução aceita de @John Kormylo oferece isso.
Atualização 1 [editada para ficar mais claro, refere-se à resposta original de @John Kormylo, não à revisada]:
A solução (original) de @John Kormylo funciona, mas como aprendi, é incompatível com o pacote subcaption. Então, minha pergunta revisada é: existe uma maneira de criar hiperlinks para figuras que ainda funcionam com legenda?
Aqui está um MWE usando sua solução onde os hiperlinks não vão para as figuras no final. A Figura 2 está aí apenas para demonstrar por que preciso de subcaption - a vinculação ainda falha mesmo sem ela, desde que o pacote subpcaption seja usado.
\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}
O aux
arquivo produzido sugere que o motivo pelo qual a solução não funcionou é que a sublegenda altera o nome dos contadores de figure.1
, figure.2
etc. para figure.caption.2
, figure.caption.3
etc. Possui estas linhas para a lista de tabelas (que possui hiperlinks funcionais para as figuras):
\@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}}
Uma opção seria reescrever o \floatplace
comando (original) de John Kormylo, começando a numeração em 2 e renomeando o cabeçalho para figure.caption
ou table.caption
. Mas em um documento diferente, a numeração figure.caption
no arquivo aux começa em 18. (No entanto, ainda não descobri como reproduzir isso em um MWE.) Isso significa que tal solução alternativa não funcionará.
Responder1
As \caption
chamadas \refstepcounter{figure}
que criam um \hypertarget
arquivo nomeado \@currentHref
. Infelizmente, \floatplace
só tem acesso a \thefigure
(na verdade \thepostfigure
). Portanto, precisamos criar um mapa de \thefigure
até \@currentHref
e movê-lo para o início do documento por meio do arquivo aux. Para combinar isso e o backlink, substituí \caption
por \figurecaption
.
Mantendo o original, \floatplace
tornei-o independente do tipo float. No entanto, adicionei apenas código para \figurecaption
e \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}
Isso deve funcionar, não importa o que a estranha sublegenda da convenção de nomenclatura imponha.
Responder2
Eu precisava fazer o mesmo para tabelas e figuras e ao mesmo tempo manter sob controle um erro no pacote de glossários. (Acho que pode ter uma função própria "tablecaption" definida em algum lugar.)
Aqui está:
\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}