Я использую biblatex-apa для определения макета моей библиографии. Теперь я цитирую несколько (внутренних) документов из учреждений или новостных сайтов, которые теперь отображаются в документе с использованием их аббревиатуры. Я хотел бы, чтобы эти аббревиатуры отображались маленькими заглавными буквами. На самом деле, я хочу, чтобы все сокращенные названия учреждений отображались маленькими заглавными буквами. Возможно ли это? Теперь я разделяю свою библиографию с помощью тегов (экспортированных из Zotero), поэтому я предполагаю, что тег также может позволить цитированию отображаться маленькими заглавными буквами в тексте? Кто-нибудь знает, как это сделать?
Мой МВЭ:
\documentclass[10pt,a4paper,twoside]{book}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage[backend=biber, style=apa, date=year, natbib=true, sorting=nyt, sortcites=true]{biblatex}
\DeclareLanguageMapping{american}{american-apa}
\bibliography{Zotero}
\begin{document}
\chapter{Literature review}
This is some text with a double reference \cite{nos_weeralarm_2009, ns_volle_2013}.
\printbibliography[notkeyword=internal]
\printbibliography[title={Internal Documents}, keyword=internal]
\end{document}
И содержимое моего Zotero.bib:
@online{nos_weeralarm_2009,
title = {Weeralarm en verkeeralarm ingetrokken},
url = {http://nos.nl/l/124074},
titleaddon = {{NOS.nl}},
author = {{NOS}}, %THIS AUTHOR MUST BE PRINTED IN SC
urldate = {2014-02-12},
date = {2009-12-20},
keywords = {gladheid, ijs, ongeluk, openbaar vervoer, schiphol, sneeuw}
}
@report{ns_volle_2013,
location = {Utrecht},
title = {Internal document title}},
institution = {NS},
type = {Internal Document},
author = {{NS}}, % THIS AUTHOR MUST BE PRINTED IN SC
date = {2013},
keywords = {internal}
}
решение1
Если все ваши ссылки, требующие указания учреждения малыми заглавными буквами, действительно имеют один и тот же тег, то это должно быть возможно.
Однако в вашем MWE эти две записи не имеют общего символа keyword
, поэтому я добавил ключевое слово instauth
для проверки.
То, что мы делаем, очень просто: при каждой команде цитирования и перед каждой записью библиографии мы проверяем, есть ли в записи ключевое слово instauth
, если да, то формат фамилии устанавливается для создания аббревиатур с помощью biblatex
макроса \mkbibacro
(обратите внимание, что для того, чтобы это работало, «аббревиатура должна быть указана заглавными буквами.», стр. 89,biblatex
документация).
\AtEveryCitekey{%
\ifkeyword{instauth}
{\renewcommand*{\mkbibnamelast}[1]{\mkbibacro{#1}}}
{}%
}
\AtEveryBibitem{%
\ifkeyword{instauth}
{\renewcommand*{\mkbibnamelast}[1]{\mkbibacro{#1}}}
{}%
}
Альтернативное переопределение — более короткое
\renewcommand*{\mkbibnamelast}[1]{%
\ifkeyword{instauth}
{\mkbibacro{#1}}
{#1}}
Где условное наклонениевнутридиректива форматирования. Тогда нет необходимости вставлять изменение в группы, где \ifkeyword
определено, как это было необходимо выше.
Мы даже можем сделать обнаружение instauth
автоматическим до некоторой степени.
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite=true]{
\step[fieldsource=author, match=\regexp{^\{.+?\}$}, final]
\step[fieldset=keywords, append, fieldvalue={,instauth}]
}
}
}
все author
поля, содержащие строку, заключенную в двойные фигурные скобки, классифицируются как instauth
. Это может привести к сбоям в некоторых крайних случаях — как и многие автоматические решения.
МВЭ
\documentclass[a4paper]{article}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage{filecontents}
\usepackage[backend=biber, style=apa, date=year, natbib=true, sorting=nyt, sortcites=true]{biblatex}
\DeclareLanguageMapping{american}{american-apa}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\begin{filecontents*}{\jobname.bib}
@online{nos_weeralarm_2009,
title = {Weeralarm en verkeeralarm ingetrokken},
url = {http://nos.nl/l/124074},
titleaddon = {{NOS.nl}},
author = {{NOS}}, %THIS AUTHOR MUST BE PRINTED IN SC
urldate = {2014-02-12},
date = {2009-12-20},
keywords = {gladheid, ijs, ongeluk, openbaar vervoer, schiphol, sneeuw}
}
@report{ns_volle_2013,
location = {Utrecht},
title = {Internal document title},
institution = {NS},
type = {Internal Document},
author = {{NS}}, % THIS AUTHOR MUST BE PRINTED IN SC
date = {2013},
keywords = {internal},
}
\end{filecontents*}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite=true]{
\step[fieldsource=author, match=\regexp{^\{.+?\}$}, final]
\step[fieldset=keywords, append, fieldvalue={,instauth}]
}
}
}
\renewcommand*{\mkbibnamelast}[1]{%
\ifkeyword{instauth}
{\mkbibacro{#1}}
{#1}}
\begin{document}
This is some text with a double reference \cite{nos_weeralarm_2009, ns_volle_2013, wilde, cicero}.
\printbibliography[notkeyword=internal]
\printbibliography[title={Internal Documents}, keyword=internal]
\end{document}
решение2
Примечание: с марта 2016 г. (biblatex 3.3) необходимо изменить \mkbibnamefamily вместо \mkbibnamelast. Смотрите такжеФорматирование имени Biblatex 3.3.