
Я хочу вырезать теги URL, определенные в файле Bibtex. Например, я хочу вырезать префикс "mailto:", чтобы он не отображался. Но гиперссылка все равно должна его содержать. Следующая команда работает в среде документа, но не работает для записей библиографии. Нужны ли им особые меры предосторожности?
МВЭ:
\documentclass{scrreprt}
\usepackage{hyperref}
\usepackage{xstring}
\let\oldUrl\url
\renewcommand{\url}[1]{
\StrBehind{#1}{:}[\tempa]
\StrBefore{#1}{:}[\tempb]
\IfBeginWith{\tempb}{mailto}
{\href{#1}{\nolinkurl{\tempa}}}
{\oldUrl{#1}}
}
\usepackage[
backend=biber,
style=alphabetic
]{biblatex}
\addbibresource{test.bib}
\begin{document}
\url{mailto:[email protected]}
\nocite{*}
\printbibliography
\end{document}
Файл Bibtex:
@MANUAL{ABC,
title = {Test Title},
author = {ABC},
url = {mailto:[email protected]}
}
Выход:
Это работает для тега заметки, но не для тега URL, поскольку в теге заметки используется макрос URL (обнаруженный с помощью движка bibtex вместо движка biber, поскольку bibtex не предоставляет тег URL):
@MANUAL{ABC,
title = {Test Title},
author = {ABC},
url = {mailto:[email protected]}
note = {\url{mailto:[email protected]}}
}
Мой первый вывод: biber не использует макрос url для создания гиперссылок, но тогда почему работает ветвь else макроса \IfBeginWith в переопределении макроса url?
решение1
См. xstring
руководство, 3.4 Catcode and starred macros
.
Если вы хотите использовать макросы в тестовом макросе, вам необходимо использовать отмеченную звездочкой версию.
\renewcommand{\url}[1]{
\StrBehind{#1}{:}[\tempa]
\StrBefore{#1}{:}[\tempb]
\IfBeginWith*{\tempb}{mailto}
{\href{#1}{\nolinkurl{\tempa}}}
{\oldUrl{#1}}
}