사용자 정의 biblatex 스타일에서 bibstring을 지원하는 필드를 선언하는 올바른 방법

사용자 정의 biblatex 스타일에서 bibstring을 지원하는 필드를 선언하는 올바른 방법

문제

나는 사용자 정의 biblatex 스타일을 만들고 있으며 필드가 month일반적인 구현에 있는 것과 유사한 bibstring에 대한 지원을 원했습니다. 즉, 괄호 안에 항목을 넣으면 {something}해당 내용이 something필드에 렌더링됩니다. 그러나 대괄호가 없는 항목이 있는 경우 이는 턱받이 문자열로 해석되어 해당 정의로 변환됩니다.

\ifbibstring(그리고 친구들을 통해) 필드의 내용이 bibstring인지 확인함으로써 부분적으로 이를 달성할 수 있습니다 . 그러나 이는 내용이 항상 대괄호 안에 있는 경우에만 작동합니다. biber가 아닌 경우 오류가 발생하고 추가 처리를 위해 필드를 전달하지 않습니다.

예를 들어 아래 코드는 경고 메시지를 생성합니다.

경고 - BibTeX 하위 시스템: /tmp/M3YJZ8wGD7/mwe.bib_28410.utf8, 21행, 경고: 정의되지 않은 매크로 "mytitle"

그러면 biber가 해당 필드를 파일에 생성하지 않게 됩니다 .bbl. 비슷한 오류를 발견했습니다biblatex/biber: 여러 참조 섹션에서 한 파일의 문자열 매크로 사용, 하지만 그것은 내 문제를 해결하지 못합니다.

MWE

이것은 내 문제를 보여주기 위한 최소한의 구현입니다.

% !BIB program = biber
\documentclass{article}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
  @test{test1,
    title = {A},
    year = {1995},
  }

  @test{test2,
    title = {B},
    year = {1994},
  }

  @test{test3,
    title = {mytitle},
    year = {1998},
  } 

  @test{test4,
    title = mytitle,
    year = {1998},

  }
\end{filecontents}

\begin{filecontents}{test.dbx}
  \DeclareDatamodelFields[type=field, datatype=literal]{title}

  \DeclareDatamodelFields[type=field, datatype=datepart]{year}

  \DeclareDatamodelEntryfields[test]{%
    year,%
    title%
  }
\end{filecontents}

\begin{filecontents}{english-test.lbx}
  \InheritBibliographyExtras{english}

  % Bibliography strings
  \NewBibliographyString{mytitle}

  \DeclareBibliographyStrings{%
    inherit = {american},
    mytitle = {{my title}{my title}},
  }
\end{filecontents}

\begin{filecontents}{test.bbx}
  \RequireBibliographyStyle{standard}

  % map language
  \DeclareLanguageMapping{english}{english-test}

  % Dummy driver for testing
  \DeclareBibliographyDriver{test}{%
    \usebibmacro{begentry}%
    \printfield{title}%
    \newunit%
    \printfield{year}%
    \newunit%
    \usebibmacro{finentry}%
  }

  \DeclareFieldFormat[test]{title}{%
    \ifbibstring{#1}{\bibstring{#1}}{#1}%
  }
\end{filecontents}

\usepackage[backend=biber, bibstyle=test]{biblatex}
\addbibresource{\jobname.bib}


\begin{document}

  \nocite{*}
  \printbibliography

\end{document}

현재 출력:

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

예상 출력:

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

질문

와 같은 턱받이 스트링에서도 동일한 동작이 예상됩니다 month. 대괄호가 없는 필드가 있는 경우(예: 의 항목 test4) .bib이는 bibstring의 정의를 사용하여 변환되어야 합니다. 하지만 에서와 같이 대괄호를 사용한 동일한 정의가 있는 경우 test3내용이 대신 인쇄되어야 합니다.

사용자 정의 스타일을 사용하여 어떻게 이를 달성할 수 있습니까?

답변1

여기에는 '문자열'에 대한 최소한 두 가지 개념이 있습니다. 그 자체로도 당신이 원하는 것을 얻을 수 없습니다. 이 둘의 조합만이 그렇게 할 수 있습니다.

@string에스

첫째로 가 있습니다 @string. 매번 전체 텍스트를 다시 입력할 필요 없이 @string동일한 텍스트를 여러 항목에 삽입하는 방법입니다 . .bib이 기능은 전적으로 .bib파일 수준에서 작동합니다.

항목 @string에는 ID(일반 .bib항목의 항목 키와 동일)가 있으며 해당 이름으로 호출할 수 있습니다.

@string{brontostring = {On the Theory of Brontosauruses}}

@string문자열 ID를 필드 값으로 제공하여 a의 내용을 사용할 수 있습니다.없이교정기.

@book{foo,
  author = {Anne Elk},
  title  = brontostring,
  date   = {1970},
}

Biber(또는 BibTeX)는 .bib파일을 읽을 때 이러한 문자열을 즉시 확인합니다. 한 가지 주의할 점은 @strings를 사용하기 전에 정의해야 한다는 것입니다. 특히 중괄호 없이는 임의의 텍스트를 사용할 수 없으며 알려진 @string텍스트만 사용할 수 있습니다. 그러면 우리는

@book{foo,
  author = {Anne Elk},
  title  = {On the Theory of Brontosauruses},
  date   = {1970},
}

항목이 추가로 처리되면 텍스트가 @string.

이렇게 하면 항목에 임의의 텍스트를 삽입할 수 있습니다. 텍스트는 에서 변경할 수 없지만 동일한 문자열에 대해 다른 정의가 있는 biblatex다른 파일을 로드하여 변경할 수 있습니다 . .bib이것이 및 와 ieeetran함께 수행되는 작업입니다 . 축약된 저널 이름을 얻거나 전체 저널 이름을 얻기 위해 로드합니다 .IEEEabrv.bibIEEEfull.bibIEEEabbrv.bibIEEEfull.bib

모든 의도와 목적에 대해 월 문자열은 비슷한 방식으로 작동합니다. 는 for , for 등 jan입니다 .@string1feb2

@string.bibs는 필드 값으로 사용될 때 파일 에 중괄호를 사용하지 않습니다 .

참고문헌 문자열

그런 다음 전혀 관련이 없는 두 번째 '문자열' 개념, 즉 턱받이 스트링이 있습니다. \ifbibstring, \bibstring및 으로 참조하는 항목입니다 \NewBibliographyString. Bibstring은 biblatex의 현지화 기능 의 일부 이며 특정 용어를 다른 언어로 번역할 수 있게 해줍니다. 일반적으로 파일에 정의되어 있지만 .lbx해당 값은 서문에서도 재정의될 수 있습니다.

\bibstring{<bibstringid>}Bibstrings은 으로 <bibstringid>정의된 Bibstring의 이름 과 함께 사용할 수 있습니다 \NewBibliographyString. 이상적으로는 파일 <bibstringid>의 값도 수신해야 하며 .lbx, 그렇지 않으면 <bibstringid>굵게 인쇄됩니다.

전체 날짜 처리는 훨씬 더 복잡하지만 이 답변의 경우 1을 , 2를 등 으로 매핑 biblatex하는 함수가 있다고 가정할 수 있습니다. 따라서 호출하면 결과가 나오 므로 영어인 경우 'July'가 문서에 인쇄됩니다. 활성 언어이거나 독일어가 활성 언어인 경우 'Juli'입니다.\mkbibmonth\bibstring{january}\bibstring{february}\mkbibmonth{7}\bibstring{july}

Bibstring의 더 간단하고 일반적인 예는 필드입니다 pubstate. 필드 형식은 pubstate다음과 같습니다.

\DeclareFieldFormat{pubstate}{\ifbibstring{#1}{\bibstring{#1}}{#1}}

필드 에 사용할 수 있는 사전 정의된 문자열이 있습니다 pubstate(예 inpress: , forthcoming, ) submitted. 그 중 하나를 사용하는 경우, 즉

pubstate = {inpress},

.bib항목 중 하나에서 biblatex문서에 "inpress"를 인쇄하지 않고 대신 bibstring에 제공된 해당 용어의 번역을 사용합니다. (물론 biblatex여러분이 제공한 다른 턱받이 문자열도 기꺼이 사용할 수 있으며 pubstate = {january}잘 작동합니다.) 해당 이름을 가진 턱받이 문자열이 없는 경우 필드는 있는 그대로 인쇄되므로 pubstate = {foonostring}간단히 'foonostring'을 인쇄합니다.

bibstrings파일 의 입력에는 항상 .bib중괄호가 포함됩니다.

두 문자열 유형의 비교

내가 아는 한 , 정확히 같은 방식으로 작동하는 다른 조합 @strings과 턱받이 스트링 은 없습니다 . biblatex나는 월 @strings가 이전 버전과의 호환성을 위해서만 구현되었다고 강하게 의심합니다.

따라서 우리가 본 것처럼 일반적으로 상황에 따른 출력을 생성하는 두 가지 방법이 있습니다.

  1. @string백엔드에서 해결됨
  2. ( .lbx) 턱받이 문자열은 다음으로 해결됩니다.biblatex

어느 것이 더 적합한지는 사용 사례에 따라 다릅니다. @string단지 타이핑 시간을 절약하고 싶거나 여러 형태의 입력(긴 저널 이름과 짧은 저널 이름) 사이를 전환할 수 있는 방법을 원하는 경우에는 이 방법이 더 적절해 보입니다. 일반적으로 @string는 언어나 로케일에 연결되지 않습니다. 진정한 현지화를 원한다면 Bibstring을 사용하는 것이 좋습니다.

귀하의 질문에 나온 예에서는 두 가지 접근 방식 중 어느 것이 귀하의 사용 사례에 더 유용할지 알 수 없습니다.

당신이 원하는 것을 얻을 수 있나요?

귀하의 질문에서 설명한 계획을 고집한다면 두 가지 접근 방식을 결합하면 거의 가능합니다. 별로 좋은 생각은 아닌 것 같지만 가보겠습니다.

@string중괄호 없이 가능한 각 값에 대해 대체 텍스트를 사용하여 정의해야 합니다 . 이식 가능한 솔루션을 원한다면 .bib모든 프로젝트에서 로드해야 하는 특수 파일에서 이 작업을 수행해야 합니다.

@string{bracelessa = {bracelessa}}
@string{bracelessb = {bracelessb}}

그런 다음 턱받이 끈을 만드 십시오 bracelessa.bracelessbbiblatex

\NewBibliographyString{bracelessa}
\NewBibliographyString{bracelessb}

그리고 그들을 정의

\DeclareBibliographyStrings{%
  inherit = {american},
  bracelessa = {{A title}{A t\addddot}},
  bracelessb = {{B title}{B t\addddot}},
}

그런 다음 필드 형식을 사용하십시오.

\DeclareFieldFormat[test]{title}{\ifbibstring{#1}{\bibstring{#1}}{#1}}

해당 분야에 대해.

지금

title = bracelessa,

문서에 '제목'이 인쇄됩니다.

왜 그것이 당신이 설명하는 것을 정확히 제공하지 않습니까?

첫째, 중괄호 입력은 임의적이지 않습니다. a @string와 적절한 을 모두 정의해야 합니다 bibstring. 둘째, title = {something}항상 렌더링되지는 않습니다 something. 대신 'A title' 이라고 쓰면 title = {bracelessa}나옵니다. Bibstring에 더 우스꽝스러운 이름을 선택하면 충돌이 더 어려워질 수 있지만 필드 값이 직접 또는 @string.

관련 정보