Как сделать перекрестную ссылку на (всю) библиографию?

Aug 17 2020

Простой вопрос, но мне не удалось найти его на Stackexchange здесь или где-то еще.

Я хочу сделать перекрестную ссылку на заголовок, созданный \printbibliography, т.е. не на конкретную запись, а только на заголовок / начальную страницу.

Как я могу это сделать?

Я использую это так:

\printbibliography[title={Quellenverzeichnis}, heading=subbibnumbered]

Проблема в том, что пакет генерирует заголовок автоматически, поэтому я не могу просто поместить \labelтуда и сослаться на него.

В принципе, я просто хочу делать то , что нужно , чтобы я мог использовать обычный \ref, \hyperref, \autoref, и \fullrefт.д.

И я также ничего не нашел в документах biblatex (стр. 88 и далее, также известный как раздел 3.7.2, он начинает говорить о \printbibliographyкоманде).

Ответы

3 DavidPurton Aug 17 2020 at 13:28

Как ни странно, я не могу найти очевидного способа сделать это.

Вот вариант, который печатает заголовок, затем вставляет этикетку, а затем распечатывает остальную библиографию. По какой-то неизвестной мне причине, \@currentlabelне обновляется \printbibheading, поэтому мне нужен хак, чтобы уменьшить счетчик подразделов, а затем увеличить его, используя \refstepcounter.

Я думаю, что должен быть лучший вариант.

\documentclass{article}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage[colorlinks]{hyperref}
\begin{document}
\section{Here}
\subsection{There}
Page \pageref{bib}. Section \ref{bib}.
\nocite{westfahl:space,aksin}
\printbibheading[title=Quellenverzeichnis, heading=subbibnumbered]
\addtocounter{subsection}{-1}
\refstepcounter{subsection}
\label{bib}
\printbibliography[heading=none]
\end{document}

3 moewe Aug 17 2020 at 14:12

Поскольку вы уже явно указали название своей библиографии, вы можете просто прокрасться \labelтуда.

С MWE Дэвида Пертона и очевидными изменениями

\documentclass{article}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage[colorlinks]{hyperref}
\begin{document}
\section{Here}
\subsection{There}
Page \pageref{bib}. Section \ref{bib}.
\nocite{sigfridsson,worman}

\printbibliography[title={Quellenverzeichnis\label{bib}}, heading=subbibnumbered]
\end{document}

Если вам нужно решение, которое автоматически выбирает «Ссылки» или «Библиография» в зависимости от класса, вы можете попробовать

\documentclass{article}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage[colorlinks]{hyperref}

\makeatletter
\newcommand*{\reforbibname}{%
  \ifodd\abx@classtype\relax
    \bibname
  \else
    \refname
  \fi
}
\makeatother

\begin{document}
\section{Here}
\subsection{There}
Page \pageref{bib}. Section \ref{bib}.
\nocite{sigfridsson,worman}

\printbibliography[title={\reforbibname\label{bib}}, heading=subbibnumbered]
\end{document}

Внутренняя команда \abx@classtypeиспользуется biblatexдля обнаружения определенных классов. Удобно, что «даже классы» являются article-как и использование \refname, в «нечетные классы» являются report/ book-как и использование \bibname.

Обратите внимание, что это не учитывает возможные изменения заголовка по умолчанию в определениях заголовков библиографии.


Альтернативой было бы включение \labelнепосредственно в определение заголовка библиографии. В этом случае это было бы

\documentclass{article}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage[colorlinks]{hyperref}

\defbibheading{subbibnumbered:link}[\refname]{%
  \subsection{#1}%
  \label{bib}}

\begin{document}
\section{Here}
\subsection{There}
Page \pageref{bib}. Section \ref{bib}.
\nocite{sigfridsson,worman}

\printbibliography[heading=subbibnumbered:link]
\end{document}

(конечно, вы можете перезаписать заголовок, subbibnumberedесли хотите, но поскольку метка жестко закодирована в заголовке, может быть лучше выбрать уникальное имя, чтобы избежать его повторного использования). В любом случае для этого необходимо знать / скопируйте исходное определение заголовка библиографии, используемого в вашем документе.

3 rugk Jan 03 2021 at 16:33

Начиная с версии 3.16 biblatex теперь вы можете использовать label.

Пример и т. Д. Скопированы из запроса на выпуск / функцию , поэтому все кредиты достаются @moewew , который также это реализовал.

Вот пример:

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}
\usepackage{cleveref}

\addbibresource{biblatex-examples.bib}


\begin{document}
\autocite{sigfridsson}

\Cref{biblabel}

\printbibliography[heading=bibnumbered, label=biblabel]
\end{document}