
Я хотел бы создать документ с библиографией с помощью XeLaTeX с Biber. В библиографии есть китайские книги и статьи, а также английские или немецкие. Некоторые авторы написали статьи (или книги, что тут не имеет значения) как на китайском, так и на английском языках. В китайских статьях я хотел бы также указать китайское имя автора с помощью иероглифов, тогда как в его английских статьях такой необходимости нет.
Ниже приведен пример моего файла .bib. Функция \zh{}
используется для того, чтобы запретить LaTeX печатать символы в сносках:
@article{Liu2008,
author = {Liu, {Guofu \zh{(刘国福)}}},
title = {The Latest Development of Immigration Law: On the Transformation of China's Emmigration and Immigration Administration Law (移民法的最新发展——兼论中国出入境管理法的改造和重塑)},
journal = {Journal of Henan Administrative Institute of Politics and Law (河南省政法管理干部学院学报)},
year = {2008},
volume = {5},
pages = {46--58},
language = {chinese},
keywords = {article,hani}
}
@book{Liu2011,
author = {Liu, {Guofu \zh{(刘国福)}}},
title = {Chinese Immigration Law},
year = {2011},
publisher = {Ashgate},
address = {Farnham},
language = {english},
keywords = {monography,latn}
}
Теперь суть в следующем: Biber, конечно, распознает автора как одного и того же, только если содержимое полей автора одинаково в обеих записях. Если я не использую китайские иероглифы в английской статье, Biber напишет полное имя, чтобы сделать «двух» авторов различимыми, игнорируя тот факт, что они на самом деле одни и те же. Поэтому мне нужно включить китайские иероглифы в имя автора даже в английских или немецких статьях.
Сделав так, я получил все, что хотел: в библиографии имена авторов имеют шаблон «ЛИУ, Гофу (刘国福) (2008)», а в сносках просто «ЛИУ 2008» (при условии, что нет другого автора по имени Лю).
Я сделал это с помощью следующего фрагмента кода в преамбуле моего .tex-файла:
\providecommand{\zh}[1]{}
\AtBeginBibliography{%
\renewcommand*{\zh}[1]{#1}
}
Но: Как мне сказать LaTeX не печатать \zh{}
часть в поле автора, если в записи не установлен китайский язык. Есть ли такой способ задать это условно? Кроме того, в сносках китайские иероглифы никогда не должны появляться. Было бы неплохо, если бы я мог сказать LaTeX, как это сделать, напрямую в файле .tex.
Есть также статьи с несколькими авторами, которые должны иметь шаблон «ВАН, Липин (王丽萍); ЧЖАН, Айлин (张爱玲) (2008)», что, как я полагаю, несколько усложняет использование еще одного поля ввода для китайских иероглифов, поскольку тогда все китайские иероглифы имен будут следовать после списка имен авторов латинскими буквами.
Редактировать (2014-03-22):
Кажется, моя проблема уже рассматривалась в другом месте:
Как создать многоязычные (английский, японский) библиографии с помощью biblatex, biber и polyglossia
Итак, начиная с bibLaTeX 3.0 и biber 2.0 (обе версии в настоящее время находятся на экспериментальной стадии) появилась возможность сохранять транскрипции или переводы для большинства полей и, что еще более удивительно, появилась возможность устанавливать режим отображения (показывать исходный язык, показывать перевод и т. д.) для каждой записи .bib отдельно.
Редактировать (2014-03-23):
Другой подход, использующий аффикс имени:
https://tex.stackexchange.com/a/66825/47927
Похоже, это рабочий пример предложения ienissei.
решение1
Чтобы наконец дать исчерпывающий ответ на мой собственный вопрос для дальнейшего использования, следующее сделает то, чего я изначально хотел:
Прежде всего, нет необходимости использовать токен \zh{}
, так как этот пример будет работать с использованием аффикса имени, как описано здесь Одри:https://tex.stackexchange.com/a/66825/47927
Я не использовал titleaddon
часть предложения Одри, так как у меня нет в этом необходимости. Кроме того, я придерживался только порядка «фамилия-имя».
Итак, библиографические записи должны выглядеть следующим образом (ключевые слова «latn» или «hani» обозначают систему письма соответствующей статьи и используются для условного сокрытия китайской части названия):
@article{Liu2008,
author = {Liu, 刘国福, Guofu},
title = {The Latest Development of Immigration Law: On the Transformation of China's Emmigration and Immigration Administration Law (移民法的最新发展——兼论中国出入境管理法的改造和重塑)},
journal = {Journal of Henan Administrative Institute of Politics and Law (河南省政法管理干部学院学报)},
year = {2008},
volume = {5},
pages = {46--58},
language = {chinese},
keywords = {article,hani}
}
@book{Liu2011,
author = {Liu, 刘国福, Guofu},
title = {Chinese Immigration Law},
year = {2011},
publisher = {Ashgate},
address = {Farnham},
language = {english},
keywords = {monography,latn}
}
Теперь часть для файла .tex (слегка отредактированная из приведенной выше ссылки на сообщение Одри):
% Keep name affixes for English names
\forcsvlist{\listadd\nameaffixlist}{Junior,Senior}
\newcommand{\ifnameaffix}[1]{%
\ifboolexpr{test{\ifrmnum{#1}} or test{\ifinlist{#1}{\nameaffixlist}}}}
% Set label format using last-first order
\DeclareNameFormat{labelname}{%
\ifboolexpr{test{\ifblank{#7}} or test{\ifnameaffix{#7}}}
{\ifcase\value{uniquename}%
\usebibmacro{name:last}{#1}{#3}{#5}{#7}\or
\ifuseprefix
{\usebibmacro{name:last-first}{#1}{#4}{#5}{#8}}
{\usebibmacro{name:last-first}{#1}{#4}{#6}{#8}}\or
\usebibmacro{name:last-first}{#1}{#3}{#5}{#7}\fi}%
{\ifnumequal{\value{uniquename}}{0}%
{\usebibmacro{name:cjk}{#1}{}{}}
{\usebibmacro{name:cjk}{#1}{#3}{}}}%
\usebibmacro{name:andothers}
}
% Set name field format also using last-first order
\DeclareNameFormat{last-first}{%
\ifboolexpr{test{\ifblank{#7}} or test{\ifnameaffix{#7}}}
{\iffirstinits
{\usebibmacro{name:last-first}{#1}{#4}{#5}{#7}}
{\usebibmacro{name:last-first}{#1}{#3}{#5}{#7}}}
{\usebibmacro{name:cjk}{#1}{#3}{#7}}%
\usebibmacro{name:andothers}
}
\DeclareNameAlias{sortname}{last-first}
\DeclareNameAlias{default}{last-first}
% Making Chinese name appear after first name in parentheses, but only if the keyword 'hani' exists (see bib entries above for reference)
\newbibmacro*{name:cjk}[3]{%
\usebibmacro{name:delim}{#2#3#1}%
\usebibmacro{name:hook}{#2#3#1}%
\mkbibnamelast{#1}%
\ifblank{#2}{}{\bibnamedelimd\mkbibnamefirst{#2}}%
\ifkeyword{hani}{%
\ifblank{#3}{}{\bibnamedelimd\mkbibnameaffix{\mkbibparens{#3}}}%
}{}
}
\AtEveryBibitem{\clearlist{language}}
\AtBeginBibliography{%
\renewcommand*{\multinamedelim}{\addsemicolon\space}
}
Следует учесть следующее: если в библиографии указано только первое упоминание автора, а последующие упоминания заменены тире, этот скрипт выберет первое упоминание в зависимости от языка первой записи. Таким образом, если первая запись не китайская, а одна из последующих — китайская, китайское имя нигде не появится.
Редактировать (2018-01-22):
Имена макросов name:last
и name:first
были изменены на name:family
и name:given
, макрос \mkbibnamefirst
соответственно был переименован в \mkbibnamegiven
и \iffirstinits
в \ifgiveninits
. Далее, \ifblank
следует изменить на \ifdefvoid
. Я не проверял этот ответ совсем недавно. Думаю, нужно изменить еще кое-что, так как пакеты BibLaTeX обновлялись несколько раз за это время.
Это моя окончательная настройка MWE (хотя кода довольно много):
\begin{filecontents}{example.bib}
@article{Liu2008,
author = {Liu, 刘国福, Guofu},
title = {The Latest Development of Immigration Law: On the Transformation of China's Emmigration and Immigration Administration Law (移民法的最新发展——兼论中国出入境管理法的改造和重塑)},
journal = {Journal of Henan Administrative Institute of Politics and Law (河南省政法管理干部学院学报)},
year = {2008},
volume = {5},
pages = {46--58},
language = {chinese},
keywords = {article,hani}
}
@book{Liu2011,
author = {Liu, 刘国福, Guofu},
title = {Chinese Immigration Law},
year = {2011},
publisher = {Ashgate},
address = {Farnham},
language = {english},
keywords = {monography,latn}
}
\end{filecontents}
\documentclass{article}
\usepackage{fontspec}
\setmainfont[SmallCapsFeatures={LetterSpace=2}]{TeX Gyre Termes}
\usepackage{xeCJK}
\setCJKmainfont[Script=CJK]{Noto Serif CJK SC}
\CJKsetecglue{\,}
\usepackage[
backend=biber,
language=autobib,
autolang=hyphen,
style=authoryear,
defernumbers=true,
sortlocale=en-GB,
urldate=long,
dateabbrev=false,
sortcites=true,
sorting=anyvt,
safeinputenc
]{biblatex}
% =====
\renewbibmacro*{labeltitle}{\iffieldundef{shorttitle}%
{\printfield{title}\clearfield{title}}%
{\mkbibemph{\printfield{shorttitle}}\addspace\printtext[parens]{\printfield{year}}}%
}
\renewbibmacro*{date+extradate}{\ifkeyword{law}%
{}%
{\printtext[parens]{%
\iflabeldateisdate%
{\printfield{issue}\setunit*{\addspace}\printdateextra}%
{\printlabeldateextra}}}%
}
\renewbibmacro*{issue+date}{\ifkeyword{law}%
{}%
{\iflabeldateisdate%
{\printfield{issue}\setunit*{\addspace}\printtext[parens]{\printdate}}%
{\printtext[parens]{\printfield{issue}\setunit*{\addspace}\printdate}}}%
}
\renewbibmacro*{cite:labeldate+extradate}{\ifkeyword{law}%
{}%
{\iffieldundef{labelyear}%
{}%
{\printtext[bibhyperref]{\mkbibparens{\printlabeldateextra}}}}%
}
\renewcommand*{\multinamedelim}{\addnbthinspace\slash\thinspace}
\renewcommand*{\finalnamedelim}{\multinamedelim}
\renewcommand*{\labelnamepunct}{\addcolon\addspace}
\renewcommand*\mkbibnameprefix[1]{\textsc{#1}}
\renewcommand*\mkbibnamefamily[1]{\textsc{#1}}
\renewcommand*\bibnamedash{\rule[.48ex]{3em}{.5pt}\addspace}
\DeclareFieldFormat*{citetitle}{\mkbibemph{#1}}
\DeclareFieldFormat*{extradate}{\addnbthinspace\mknumalph{#1}}
\DeclareFieldFormat*{url}{URL\addcolon\addspace\url{#1}}
% =====
% Settings for Chinese names
\forcsvlist{\listadd\nameaffixlist}{Junior,Senior}
\newcommand{\ifnameaffix}[1]{%
\ifboolexpr{ test {\ifrmnum{#1}} or test {\xifinlist{#1}{\nameaffixlist}} }}
% Based on definitions from biblatex.def
\newbibmacro*{name:cjk}[3]{%
\usebibmacro{name:delim}{#2#3#1}%
\usebibmacro{name:hook}{#2#3#1}%
\mkbibnamefamily{#1}%
\ifdefvoid{#2}{}{\bibnamedelimd\mkbibnamegiven{#2}}%
\ifkeyword{hani}{%
\ifdefvoid{#3}{}{\bibnamedelimd\mkbibnamesuffix{\mkbibparens{\upshape #3}}}%
}{}}
\newbibmacro*{name:cjk-short}[3]{%
\usebibmacro{name:delim}{#2#3#1}%
\usebibmacro{name:hook}{#2#3#1}%
\mkbibnamefamily{#1}%
\ifdefvoid{#2}{}{\bibnamedelimd\mkbibnamegiven{#2}}%
\ifkeyword{hani}{%
\ifdefvoid{#3}{}{}%
}{}}
\DeclareNameFormat{given-family}{%
\ifboolexpr{ test {\ifdefvoid{\namepartsuffix}} or test {\ifnameaffix{\namepartsuffix}} }%
{\ifgiveninits%
{\usebibmacro{name:given-family}
{\namepartfamily}
{\namepartgiveni}
{\namepartprefix}
{\namepartsuffix}}%
{\usebibmacro{name:given-family}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}}}%
{\usebibmacro{name:cjk}{\namepartfamily}{\namepartgiven}{\namepartsuffix}}%
\usebibmacro{name:andothers}}
\DeclareNameFormat{family-given}{%
\ifboolexpr{ test {\ifdefvoid{\namepartsuffix}} or test {\ifnameaffix{\namepartsuffix}} }%
{\ifgiveninits%
{\usebibmacro{name:family-given}
{\namepartfamily}
{\namepartgiveni}
{\namepartprefix}
{\namepartsuffix}}%
{\usebibmacro{name:family-given}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}}}%
{\usebibmacro{name:cjk}{\namepartfamily}{\namepartgiven}{\namepartsuffix}}%
\usebibmacro{name:andothers}}
\DeclareNameFormat{family-given/given-family}{%
\ifboolexpr{ test {\ifdefvoid{\namepartsuffix}} or test {\ifnameaffix{\namepartsuffix}} }%
{\ifnumequal{\value{listcount}}{1}%
{\ifgiveninits%
{\usebibmacro{name:family-given}
{\namepartfamily}
{\namepartgiveni}
{\namepartprefix}
{\namepartsuffix}}%
{\usebibmacro{name:family-given}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}}%
\ifboolexpe{ test {\ifdefvoid\namepartgiven} and test {\ifdefvoid\namepartprefix} }%
{}%
{\usebibmacro{name:revsdelim}}}%
{\ifgiveninits%
{\usebibmacro{name:given-family}
{\namepartfamily}
{\namepartgiveni}
{\namepartprefix}
{\namepartsuffix}}%
{\usebibmacro{name:given-family}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}}}}%
{\usebibmacro{name:cjk}{\namepartfamily}{\namepartgiven}{\namepartsuffix}}%
\usebibmacro{name:andothers}}
\DeclareNameFormat{labelname}{%
\ifcase\value{uniquename}%
\usebibmacro{name:family}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}%
\or%
\ifboolexpr{ test {\ifdefvoid{\namepartsuffix}} or test {\ifnameaffix{\namepartsuffix}} }%
{\ifuseprefix%
{\usebibmacro{name:given-family}
{\namepartfamily}
{\namepartgiven} % i
{\namepartprefix}
{\namepartsuffix}}% i
{\usebibmacro{name:given-family}
{\namepartfamily}
{\namepartgiven} % i
{\namepartprefix} % i
{\namepartsuffix}}}% i
{\usebibmacro{name:cjk-short}{\namepartfamily}{\namepartgiven}{\namepartsuffix}}%
\or%
\ifboolexpr{ test {\ifdefvoid{\namepartsuffix}} or test {\ifnameaffix{\namepartsuffix}} }%
{\usebibmacro{name:given-family}%
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}}%
{\usebibmacro{name:cjk-short}{\namepartfamily}{\namepartgiven}{\namepartsuffix}}%
\fi%
\usebibmacro{name:andothers}}
\DeclareFieldFormat{citetitle}{\mkbibemph{#1}\ifkeyword{law}{\addspace\printtext[parens]{\printfield{year}}}{}}
\AtEveryBibitem{\clearlist{language}}
\AtBeginBibliography{%
\renewcommand*{\multinamedelim}{\addsemicolon\addspace}%
}
\DefineBibliographyExtras{english}{%
\protected\def\mkbibdatelong#1#2#3{%
\iffieldundef{#3}
{}
{\stripzeros{\thefield{#3}}%
\iffieldundef{#2}{}{\nobreakspace}}%
\iffieldundef{#2}
{}
{\mkbibmonth{\thefield{#2}}%
\iffieldundef{#1}{}{\space}}%
\iffieldbibstring{#1}
{\bibstring{\thefield{#1}}}
{\stripzeros{\thefield{#1}}}%
}%
}
\addbibresource{example.bib}
\begin{document}
Some text.\footnote{\cite{Liu2008}, \cite{Liu2011}.}
\printbibliography
\end{document}
Выходные данные для библиографии:
Вывод для сносок: