Ocultando condicionalmente partes de campos Bibtex dependendo do valor do campo de idioma

Ocultando condicionalmente partes de campos Bibtex dependendo do valor do campo de idioma

Gostaria de criar um documento com bibliografia usando XeLaTeX com Biber. Na bibliografia encontram-se livros e artigos chineses, bem como ingleses ou alemães. Alguns dos autores escreveram artigos (ou livros, o que não importa aqui) tanto em chinês quanto em inglês. Nos artigos chineses, gostaria também de dar aos autores nomes chineses usando caracteres, enquanto em seus artigos em inglês não há essa necessidade.

Abaixo está um exemplo do meu arquivo .bib. A \zh{}função é usada para evitar que o LaTeX imprima também os caracteres das notas de rodapé:

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

Agora a questão é: é claro que Biber só reconhece o autor como sendo o mesmo se o conteúdo dos campos do autor for o mesmo em ambos os registros. Se eu não usar também os caracteres chineses no artigo em inglês, Biber escreverá o nome completo para tornar os “dois” autores distinguíveis, ignorando o fato de que eles são na verdade o mesmo. Portanto, preciso incluir os caracteres chineses no nome do autor, mesmo em artigos em inglês ou alemão.

Fazendo isso, consegui tudo como queria: Na Bibliografia, os nomes dos autores têm o padrão “LIU, Guofu (刘国福) (2008)”, e nas notas de rodapé há apenas “LIU 2008” (desde que haja nenhum outro autor chamado Liu).

Fiz isso com o seguinte trecho de código na parte do preâmbulo do meu arquivo .tex:

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

Mas: Como posso dizer ao LaTeX para não imprimir a \zh{}parte no campo do autor se a entrada não tiver o chinês definido como idioma. Existe alguma maneira de definir isso condicionalmente? Além disso, nas notas de rodapé os caracteres chineses nunca devem aparecer. Seria bom se eu pudesse dizer ao LaTeX como fazer diretamente no arquivo .tex.

Existem também artigos com múltiplos autores que deveriam então ter o padrão “WANG, Liping (王丽萍); ZHANG, Ailing (张爱玲) (2008)” o que torna o uso de apenas mais um campo de entrada para os caracteres chineses um tanto complicado, eu acho, porque então todos os nomes em caracteres chineses viriam depois da lista de nomes de autores em caracteres latinos.


Editar (22/03/2014):

Parece que meu problema já foi considerado em outro lugar:

Como criar bibliografias multilíngues (inglês, japonês) com biblatex, biber e polyglossia

Assim, a partir do bibLaTeX 3.0 e do biber 2.0 (ambas as versões estão em fase experimental no momento) existe a possibilidade de salvar transcrições ou traduções para a maioria dos campos e, o que é ainda mais surpreendente, existe uma maneira de definir o modo de exibição (mostrar original idioma, mostrar tradução, etc.) para cada entrada .bib separadamente.

Editar (23/03/2014):

Outra abordagem, usando o afixo de nome:

https://tex.stackexchange.com/a/66825/47927

Este parece ser um exemplo prático da proposta de Ienissei.

Responder1

Para finalmente dar uma resposta abrangente à minha própria pergunta para referência futura, o seguinte fará o que eu queria inicialmente:

Em primeiro lugar, não há necessidade de usar o \zh{}token, pois este exemplo funcionará com o uso do afixo de nome conforme descrito aqui por Audrey:https://tex.stackexchange.com/a/66825/47927

Não usei a titleaddonparte da proposta da Audrey, pois não preciso disso. Além disso, optei por usar apenas a ordem do sobrenome.

Portanto, as entradas da bibliografia devem ser assim (as palavras-chave 'latn' ou 'hani' destinam-se a representar o sistema de escrita do respectivo artigo e são usadas para ocultar condicionalmente a parte chinesa do nome):

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

Agora a parte do arquivo .tex (ligeiramente editado na postagem de Audrey no link acima):

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

Uma coisa a considerar: Se houver apenas a primeira aparição do autor mostrada na bibliografia e as aparições seguintes substituídas por um travessão, este script escolherá a primeira aparição dependendo do idioma da primeira entrada. Portanto, se a primeira entrada não for chinesa, mas uma das entradas seguintes for, o nome chinês não aparecerá em lugar nenhum.


Editar (22/01/2018):

Os nomes das macros name:laste name:firstforam alterados para name:familye name:given, a macro \mkbibnamefirstfoi renomeada para \mkbibnamegivene \iffirstinitspara \ifgiveninits. Além disso, \ifblankdeve ser alterado para \ifdefvoid. Não testei essa resposta muito recentemente. Eu acho que algumas outras coisas precisam ser alteradas, já que os pacotes BibLaTeX foram atualizados várias vezes nesse meio tempo.

Esta é minha configuração final como MWE (embora seja bastante código):

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

A saída para a bibliografia é:

insira a descrição da imagem aqui

A saída para as notas de rodapé é:

insira a descrição da imagem aqui

informação relacionada