언어 필드 값에 따라 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는 작성자 필드의 내용이 두 레코드에서 동일한 경우에만 작성자를 동일한 것으로 인식합니다. 영문 기사에서도 한자를 사용하지 않으면, 비버는 '두' 저자를 구별할 수 있도록 성명을 표기하며 실제로 동일하다는 사실을 무시합니다. 그러므로 영어나 독일어 기사에서도 저자 이름에 한자를 포함시켜야 합니다.

그렇게 해서 원하는 대로 다 얻었습니다. 참고문헌에는 저자 이름이 “LIU, Guofu (刘國福) (2008)” 패턴으로 되어 있고, 각주에는 “LIU 2008”만 있습니다. Liu라는 다른 작가는 없습니다).

내 .tex 파일의 서문 부분에 다음 코드 조각을 사용하여 이 작업을 수행했습니다.

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

\zh{}하지만: 항목에 중국어가 언어로 설정되어 있지 않은 경우 작성자 필드의 해당 부분을 인쇄하지 않도록 LaTeX에 어떻게 지시합니까? 조건부로 설정하는 방법이 있나요? 또한, 각주에는 한자가 절대로 나타나서는 안 됩니다. LaTeX에게 .tex 파일에서 직접 수행하는 방법을 알려줄 수 있다면 좋을 것 같습니다.

저자가 여러 명인 기사도 있는데, 그러면 “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

나는 Audrey의 제안 중 일부를 사용하지 않았습니다 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}
}

고려해야 할 한 가지: 참고문헌에 저자의 첫 번째 등장만 있고 다음 등장은 대시로 대체된 경우 이 스크립트는 첫 번째 항목의 언어에 따라 첫 번째 등장을 선택합니다. 따라서 첫 번째 항목이 중국어가 아니지만 다음 항목 중 하나가 중국어인 경우 중국어 이름은 어디에도 표시되지 않습니다.


편집(2018-01-22):

매크로 이름 name:last및 가 및 name:first로 변경되었으며 이에 따라 매크로 이름도 및 로 변경되었습니다 . 또한 로 변경해야 합니다 . 나는 최근에 이 답변을 테스트하지 않았습니다. 그 동안 BibLaTeX 패키지가 여러 번 업데이트되었기 때문에 몇 가지 다른 사항을 변경해야 할 것 같습니다.name:familyname:given\mkbibnamefirst\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}

참고문헌의 출력은 다음과 같습니다.

여기에 이미지 설명을 입력하세요

각주의 출력은 다음과 같습니다.

여기에 이미지 설명을 입력하세요

관련 정보