%20(%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%20%D1%81%20%5CDefineBibliographyStrings%7Blanguage%7D%20%D0%B8%20%D0%BD%D0%B0%D1%80%D1%83%D1%88%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%D0%BE%D0%B2%20%5Ciffieldequalstr%7Bhyphenation%7D).png)
Я пытаюсь получить зависящую от языка (настроенную) text
библиографию с помощью pdflatex (biber).
Я нашел как минимум 3 подхода, как это сделать:
\DefineBibliographyStrings{language}{bibfield={formatting}}
\NewBibliographyString
- создайте новую bibstring и используйте ее как вэтот пример\iffieldequalstr{hyphenation}{language}{true}{false}
Однако,первый подход
\DefineBibliographyStrings{english}{series = {Ser\adddot\addcolon\space{#1}\isdot}}
\DefineBibliographyStrings{russian}{series = {Сер\adddot\addcolon\space{#1}\isdot}}
приводит к ошибке:
Ошибка пакета keyval: серия не определена. }
Второй подходсложно реализовать, если вам нужно много чего text tuples
настроить.
Третий подход
\DeclareFieldFormat{series}{\iffieldequalstr{hyphenation}{russian}{Сер}{Ser}\adddot\addcolon\space{#1}\isdot} %
не работает ни с одним языково-ориентированным полем, например hyphenation
.
Помогите, пожалуйста, с ответом, решающим задачи с 1 и 3 подходами.
МВЭ
\documentclass{memoir}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@INBOOK{Inbook,
author = {Peter Eston},
title = {The title of the work},
booktitle = {Book title},
chapter = {8},
pages = {201-213},
publisher = {The name of the publisher},
year = {1993},
volume = {4},
series = {5},
address = {The address of the publisher},
edition = {3},
month = {7},
hyphenation = {english}
}
@Book{avtonomova:fya,
author = {Н. С. Автономова},
title = {Философский язык Жака Деррида},
year = 2011,
publisher = {Российская политическая энциклопедия (РОССПЭН)},
location = {М.},
isbn = {978-5-8243-1618-6},
series = {Российские Пропилеи},
pagetotal = 510,
hyphenation =russian,
}
\end{filecontents}
\usepackage[T2A,T1]{fontenc}
\usepackage[utf8]{inputenc}[2014/04/30] %
\usepackage[english, russian]{babel}[2014/03/24]%
\usepackage[%
backend=biber,
bibencoding=utf8,
style=gost-numeric,
babel=other,
defernumbers=true,
sortcites=true,
doi=true,
]{biblatex}[2016/09/17]
%add Ser.: to series format
%%% First approach
%\DefineBibliographyStrings{english}{series = {Ser\adddot\addcolon\space{#1}\isdot}}
%
%\DefineBibliographyStrings{russian}{series = {Сер\adddot\addcolon\space{#1}\isdot}}
%%% Third approach
\DeclareFieldFormat{series}{\iffieldequalstr{hyphenation}{russian}{Сер}{Ser}\adddot\addcolon\space{#1}\isdot} % do not work
%% Work perfectly
%\DeclareFieldFormat{series}{\iffieldequalstr{pagetotal}{510}{Сер}{Ser}\adddot\addcolon\space{#1}\isdot} %
\addbibresource{\jobname.bib}
\begin{document}
\cite{avtonomova:fya,Inbook}
\printbibliography
\end{document}
Желаемый результат
решение1
Обратите внимание, что в файле необходимо указывать нечисловые значения, .bib
заключенные в фигурные скобки (или кавычки). hyphenation = russian
Это неправильно и приводит к предупреждению WARN - BibTeX subsystem: <filename>, line 29, warning: undefined macro "russian"
. Это должно быть
hyphenation = {russian},
\iffieldequalstr{hyphenation}{russian}
Не работает, потому что это hyphenation
устаревший псевдоним. Внутри поле теперь называется langid
. Следовательно,
\iffieldequalstr{langid}{russian}
работает.
Однако я бы предпочел подход со строками библиографии. Поскольку строка series
еще не определена, вам нужно сначала объявить ее с помощью \NewBibliographyString{series}
. Затем вы можете дать ее определение в \DefineBibliographyStrings
. Обратите внимание, что это определение должно содержать только переведенную строку, без дополнительной пунктуации и другого форматирования, похожего на макросы. Наконец, вы можете использовать строку с\bibsring
в формате поля. Это по сути второй подход изСоздание новых команд внутри bibfile.
\documentclass{memoir}
\usepackage[T2A,T1]{fontenc}
\usepackage[utf8]{inputenc}[2014/04/30] %
\usepackage[english, russian]{babel}[2014/03/24]%
\usepackage[%
backend=biber,
style=gost-numeric,
babel=other,
defernumbers=true,
sortcites=true,
doi=true,
]{biblatex}[2016/09/17]
\NewBibliographyString{series}
\DefineBibliographyStrings{english}{series = {Ser\adddot}}
\DefineBibliographyStrings{russian}{series = {Сер\adddot}}
\DeclareFieldFormat{series}{\bibstring{series}\addcolon\space{#1}\isdot}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@INBOOK{Inbook,
author = {Peter Eston},
title = {The title of the work},
booktitle = {Book title},
chapter = {8},
pages = {201-213},
publisher = {The name of the publisher},
year = {1993},
volume = {4},
series = {5},
address = {The address of the publisher},
edition = {3},
month = {7},
hyphenation = {english}
}
@Book{avtonomova:fya,
author = {Н. С. Автономова},
title = {Философский язык Жака Деррида},
year = 2011,
publisher = {Российская политическая энциклопедия (РОССПЭН)},
location = {М.},
isbn = {978-5-8243-1618-6},
series = {Российские Пропилеи},
pagetotal = 510,
hyphenation = {russian},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{avtonomova:fya,Inbook}
\printbibliography
\end{document}
Обратите внимание, что третий подход быстро выходит из-под контроля, если вы хотите добавить третий язык. Первый подход просто не работает, поскольку biblatex
разделяет локализацию (bibstrings) и общее форматирование (форматы полей и т. д.). Но второй подход не намного сложнее первого. Фактически, вы даже избегаете дублирования кода в этом примере.