我喜欢解析.bib
文件中缩写的名字。例如,如果一本书的作者是,我将解析文件中的Paul G. J. Smith
缩写。Paul G[eorge] J[ohn] Smith
.bib
然而,有些期刊特别希望作者姓名的印刷方式与所引著作中的一致。因此,Smith 的条目应与Smith, Paul G. J.
印刷书目中的一致。
我需要做什么才能告诉它用点替换以 开头和以 结尾的biblatex
序列?请建议一个命令,我可以将其放在我的文件序言中。我的序言中有一长串的调整,如果可能的话,我希望将它们全部保留在那里。[
]
.
.tex
biblatex
一位 MWE 表示:
\documentclass{article}
\usepackage{csquotes}
\usepackage[
bibstyle = authoryear,
citestyle = authoryear-comp,
sorting = nyt,
language = american,
abbreviate = false,
backend = biber]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{smith2006,
AUTHOR = "Paul G[eorge] J[ohn] Smith",
TITLE = "My life with the Beatles",
YEAR = "2006"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\noindent
Text \parencite{smith2006}.
\printbibliography
\end{document}
答案1
执行此类操作的内置方法是使用 biblatex\DeclareSourcemap
宏。要使用此宏,您必须使用biber
。此方法是首选方法,因为它可以语义访问 biblatex 本机对象。尝试将其添加到上述示例的序言中:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=author,
match=\regexp{\[[^]]+\]},
replace=.]
}
}
}
您还可以用它做很多其他事情,请参阅当前 biblatex 手册的第 4.5.2 节。这完全独立于样式,它在 biblatex 看到它之前就改变了 .bib 中的数据流。
答案2
我不确定这是否是正确的方法,但它似乎有效(部分代码来自Marco Daniel 的回答\DeclareNameFormat
),特别是在和的使用上\DeclareNameAlias
。也许 的专家biblatex
可以改进它。
使用以下方法l3regex
可以删除括号部分:
\documentclass{article}
\usepackage{csquotes}
\usepackage[
bibstyle = authoryear,
citestyle = authoryear-comp,
sorting = nyt,
language = american,
abbreviate = false,
backend = biber]{biblatex}
\DeclareNameAlias{sortname}{last-first} % for styles where names are sorted last-first
\DeclareNameFormat{last-first}{%
\usebibmacro{name:last-first}{#1}{\removebrackets{#3}}{#5}{#7}%
\usebibmacro{name:andothers}}
\DeclareNameAlias{sortname}{first-last} % for styles where names are sorted first-last
\DeclareNameFormat{first-last}{%
\usebibmacro{name:first-last}{#1}{\removebrackets{#3}}{#5}{#7}%
\usebibmacro{name:andothers}}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\removebrackets}{m}
{
\sverre_remove_brackets:n { #1 }
}
\cs_new_protected:Npn \sverre_remove_brackets:n #1
{
\tl_set:Nn \l__sverre_input_tl { #1 }
\regex_replace_all:nnN { \[.*?\] } { \. } \l__sverre_input_tl
\tl_use:N \l__sverre_input_tl
}
\tl_new:N \l__sverre_input_tl
\ExplSyntaxOff
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{smith2006,
AUTHOR = "Paul G[eorge] J[ohn] Smith",
TITLE = "My life with the Beatles",
YEAR = "2006"}
@BOOK{smith2006x,
AUTHOR = "Paul G[eorge] J[ohn] Smith and Knuth, Donald E[rving]",
TITLE = "My life with the Beatles",
YEAR = "2006"}
@BOOK{smith2006y,
AUTHOR = "Paul G[eorge] J[ohn] Smith and X, Y and A, B and C, D and E, F and G, H",
TITLE = "My life with the Beatles",
YEAR = "2006"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\noindent
Text \parencite{smith2006}.
\parencite{smith2006x}
\parencite{smith2006y}
\printbibliography
\end{document}