言語フィールドの値に応じて Bibtex フィールドの一部を条件付きで非表示にする

言語フィールドの値に応じて Bibtex フィールドの一部を条件付きで非表示にする

Biber で XeLaTeX を使用して参考文献付きの文書を作成したいと思います。参考文献には、中国語の書籍や記事のほか、英語やドイツ語の書籍や記事があります。著者の中には、中国語と英語の両方で記事 (または書籍、どちらでもかまいません) を書いている人もいます。中国語の記事では、著者に中国語名を文字で表示したいのですが、英語の記事ではその必要はありません。

以下は私の .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 は「2 人の」著者が実際には同一であるという事実を無視して、著者を区別できるようにフルネームを記述します。したがって、英語やドイツ語の記事でも著者名に中国語の文字を含める必要があります。

そうすることで、すべて望みどおりになりました。参考文献では、著者名が「LIU, Guofu (刘国福) (2008)」というパターンになっており、脚注には「LIU 2008」とだけ記載されています (Liu という名前の他の著者がいない限り)。

私は .tex ファイルのプリアンブル部分に次のコード スニペットを追加してこれを実行しました。

\providecommand{\zh}[1]{}
\AtBeginBibliography{%
 \renewcommand*{\zh}[1]{#1}
}

しかし、エントリの言語として中国語が設定されていない場合、著者フィールドの部分を印刷しないように LaTeX に指示するにはどうすれば\zh{}よいでしょうか。これを条件付きで設定する方法はありますか。また、脚注には中国語の文字が表示されないはずです。.tex ファイルで直接 LaTeX に指示できれば便利です。

また、複数の著者がいる論文もあり、その場合は「WANG, Liping (王丽萍); ZHANG, Ailing (张爱玲) (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{}この例では、Audrey がここで説明しているように、名前の接尾辞を使用して機能するため、トークンを使用する必要はありません。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 ファイルの部分です (上記の Audrey のリンクされた投稿から若干編集されています)。

% 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}
}

考慮すべき点が 1 つあります。参考文献に著者の初出のみが表示され、後続の登場がダッシュに置き換えられている場合、このスクリプトは最初のエントリの言語に応じて初出を選択します。したがって、最初のエントリが中国語ではなく、後続のエントリの 1 つが中国語である場合、中国語名はどこにも表示されません。


編集 (2018-01-22):

マクロ名とname:lastname:firstと に変更され、name:familyそれに応じてname:givenマクロの名前がと\mkbibnamefirstに変更されました。さらに、は に変更する必要があります。この回答は最近テストしたわけではありません。その間に BibLaTeX パッケージが数回更新されているため、他のいくつかの変更が必要になると思います。\mkbibnamegiven\iffirstinits\ifgiveninits\ifblank\ifdefvoid

これは 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}

書誌の出力は次のとおりです。

ここに画像の説明を入力してください

脚注の出力は次のとおりです。

ここに画像の説明を入力してください

関連情報