Условное скрытие частей полей Bibtex в зависимости от значения поля языка

Условное скрытие частей полей Bibtex в зависимости от значения поля языка

Я хотел бы создать документ с библиографией с помощью 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}

Выходные данные для библиографии:

введите описание изображения здесь

Вывод для сносок:

введите описание изображения здесь

Связанный контент