
В документе мне нужно добавить много ссылок через запись biblatex, например:
\NewDocumentCommand{\addLink}{O{}mm}{\href{#2}{#3}}
\addLink{https://en.wikipedia.org/}{Wikipedia}\cite{Wiki}
где нагрудник содержит:
@online{Wiki,
title = {Wikipedia},
author = {Wikipedia},
year = 2024,
url = {https://en.wikipedia.org/},
}
Но ручное ведение этих двух списков довольно затратно, а добавление записи биб для простой ссылки довольно раздражает и ее трудно поддерживать. Можно ли как-то избежать этого, автоматически создавая запись в ? \NewDocumentCommand
Год может быть зафиксирован на 2024
, а author
может быть равен названию, если в необязательном аргументе не указано иное.
МВЭ:
\documentclass[]{article}
\begin{filecontents}[noheader,overwrite]{main.bib}
@online{Wiki,
title = {Wikipedia},
author = {Wikipedia},
year = 2024,
url = {https://en.wikipedia.org/},
}
\end{filecontents}
\usepackage[
style=alphabetic,% also
minalphanames=3,maxalphanames=4, % [Foo+99] -> [FBB+99].
maxnames=99, % Do not put "et al". Sets maxbibnames, maxcitenames and maxsortnames.
sortcites=true,
%sorting=none,
doi=false,
url=false,
giveninits=true, % Bob Foo --> B. Foo
isbn=false,
url=false,
eprint=false,
sortcites=false, % \cite{B,A,C}: [A,B,C] --> [B,A,C]
%backref=true, % [1] Title, blabla --> [1] Title, blabla (pages 1, 45, 56)
%% TODO: customize using https://tex.stackexchange.com/questions/36307/formatting-back-references-in-bibliography
]{biblatex}
\addbibresource{main.bib}%
\NewDocumentCommand{\addLink}{O{}mm}{
\href{#2}{#3}
}
\usepackage{hyperref}
\begin{document}
You can go to \addLink{https://en.wikipedia.org/}{Wikipedia}\cite{Wiki}.
\printbibliography
\end{document}
РЕДАКТИРОВАТЬ Думаю, я могу придумать решение, которое записывает во временный файл все записи, и это (может быть, переименовать?) и загружает этот файл при запуске... но это кажется довольно грязным решением. Есть ли лучшее?
решение1
Я не думаю, что есть реальная возможность «внедрить» запись во biblatex
внутренние компоненты исключительно на стороне LaTeX, хотя бы потому, что сортировку должен выполнять Biber.
Поэтому я думаю, что ваш лучший шанс — это записать во временный .bib
файл и \addbibresource
этот файл. Это все можно скрыть от пользователя во вспомогательных макросах, как показано вмой ответкВыделите конкретного автора жирным шрифтом с помощью biblatex.
Например, вы можете попробовать
\documentclass[]{article}
\usepackage[
style=alphabetic,% also
minalphanames=3,maxalphanames=4, % [Foo+99] -> [FBB+99].
maxnames=99, % Do not put "et al". Sets maxbibnames, maxcitenames and maxsortnames.
sortcites=true,
%sorting=none,
doi=false,
url=false,
giveninits=true, % Bob Foo --> B. Foo
isbn=false,
url=false,
eprint=false,
sortcites=false, % \cite{B,A,C}: [A,B,C] --> [B,A,C]
]{biblatex}
\usepackage{hyperref}
\makeatletter
\def\tbblx@bibfile@name{\jobname -tblx.bib}
\newwrite\tbblx@bibfile
\immediate\openout\tbblx@bibfile=\tbblx@bibfile@name
\immediate\write\tbblx@bibfile{%
@comment{Auto-generated file}\blx@nl}
\newcounter{tbblx@name}
\setcounter{tbblx@name}{0}
\newcommand*{\tbblx@citeandwritetobib}[3]{%
\stepcounter{tbblx@name}%
\edef\tbblx@tmp@cite{%
\noexpand\autocite{tbblx@name@\the\value{tbblx@name}}}%
\tbblx@tmp@cite
\immediate\write\tbblx@bibfile{%
@online{tbblx@name@\the\value{tbblx@name},
author = {\unexpanded{#1}}, %
title = {\unexpanded{#2}},
year = {2024},
url = {\unexpanded{#3}},}%
}%
}
\AtEndDocument{%
\closeout\tbblx@bibfile}
\addbibresource{\tbblx@bibfile@name}
\NewDocumentCommand{\addLink}{O{#3}mm}{%
\href{#2}{#3}
\tbblx@citeandwritetobib{#1}{#3}{#2}%
}
\makeatother
\addbibresource{biblatex-examples.bib}
\begin{document}
You can go to \addLink{https://en.wikipedia.org/}{Wikipedia}.
\cite{sigfridsson}
\printbibliography
\end{document}
Это создает вспомогательный файл <jobname>-tblx.bib
, в который мы записываем все .bib
записи на лету (через \tbblx@citeandwritetobib
). В этом примере всем записям дается entry key tbblx@name@<counter>
, но вы, конечно, можете изменить код так, чтобы вы могли предоставить полезный entry key для последующего повторного использования. (В настоящее время вы не можете легко получить entry key для определенной записи, потому что спецификация ничего не говорит о entry key, который вы хотите использовать, а произвольный текст, такой как author
, title
или url
небезопасен, как и не должен использоваться для entry key. Вот почему в настоящее время \tbblx@citeandwritetobib
выдает \autocite
для записи. Если вы сделаете entry key предсказуемым, вы можете отделить это.) Помимо этого нам просто нужна обычная бухгалтерия открытия и закрытия выходного файла. (Нам нужно close , \AtEndDocument
чтобы гарантировать, что мы можем писать в любое время в документе.)
решение2
Чтобы добавить к ответу moewe, я понял, что простое использование счетчика довольно подвержено ошибкам (например, если я просто удалю один элемент, все записи будут смещены без каких-либо ошибок, если я забуду перезапустить biblatex).
Поэтому вместо этого я использую:
\usepackage{pdftexcmds}
\makeatletter
\def\tbblx@bibfile@name{\jobname -tblx.bib}
\newwrite\tbblx@bibfile
\immediate\openout\tbblx@bibfile=\tbblx@bibfile@name
\immediate\write\tbblx@bibfile{%
@comment{Auto-generated file}\blx@nl}
\usepackage{pdftexcmds}
\newcommand*{\tbblx@citeandwritetobib}[5]{%
\edef\tbblx@name@entry{\pdf@mdfivesum{\detokenize{#1#2#3#4#5}}}%just the counter is not enough, as we might forget to run latexmk to regenerate the entries if one changes. Also, not adding the counter is better as it allows exactly identical entries to share the same line in the bibliography.
\edef\tbblx@tmp@cite{%
\noexpand\cite{tbblx@name@\tbblx@name@entry}}%
\tbblx@tmp@cite
\immediate\write\tbblx@bibfile{%
@online{tbblx@name@\tbblx@name@entry,
author = {\unexpanded{#1}}, %
title = {\unexpanded{#2}},
year = {#4},
url = {\unexpanded{#3}}
}%
}%
}
\AtEndDocument{%
\closeout\tbblx@bibfile}
\addbibresource{\tbblx@bibfile@name}
\NewDocumentCommand{\mylinkCite}{O{{#3}}mO{#4}mO{2024}}{%
\href{#2}{#4}
\tbblx@citeandwritetobib{#1}{#3}{#2}{#5}{}%
}
\makeatother
И я использую это так:\mylinkCite[author, default to text]{link}[title, default to text]{text to write in pdf}[year (default 2024)]
Обратите внимание, что biblatex не планирует поддерживать эту функцию «из коробки», поскольку ее слишком сложно реализовать внутренне.Biblatex: автоматическое создание записи о нагрудном знаке из \addCitation{http://myurl}