
문제
나는 사용자 정의 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
파일을 읽을 때 이러한 문자열을 즉시 확인합니다. 한 가지 주의할 점은 @string
s를 사용하기 전에 정의해야 한다는 것입니다. 특히 중괄호 없이는 임의의 텍스트를 사용할 수 없으며 알려진 @string
텍스트만 사용할 수 있습니다. 그러면 우리는
@book{foo,
author = {Anne Elk},
title = {On the Theory of Brontosauruses},
date = {1970},
}
항목이 추가로 처리되면 텍스트가 @string
.
이렇게 하면 항목에 임의의 텍스트를 삽입할 수 있습니다. 텍스트는 에서 변경할 수 없지만 동일한 문자열에 대해 다른 정의가 있는 biblatex
다른 파일을 로드하여 변경할 수 있습니다 . .bib
이것이 및 와 ieeetran
함께 수행되는 작업입니다 . 축약된 저널 이름을 얻거나 전체 저널 이름을 얻기 위해 로드합니다 .IEEEabrv.bib
IEEEfull.bib
IEEEabbrv.bib
IEEEfull.bib
모든 의도와 목적에 대해 월 문자열은 비슷한 방식으로 작동합니다. 는 for , for 등 jan
입니다 .@string
1
feb
2
@string
.bib
s는 필드 값으로 사용될 때 파일 에 중괄호를 사용하지 않습니다 .
참고문헌 문자열
그런 다음 전혀 관련이 없는 두 번째 '문자열' 개념, 즉 턱받이 스트링이 있습니다. \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
나는 월 @string
s가 이전 버전과의 호환성을 위해서만 구현되었다고 강하게 의심합니다.
따라서 우리가 본 것처럼 일반적으로 상황에 따른 출력을 생성하는 두 가지 방법이 있습니다.
@string
백엔드에서 해결됨- (
.lbx
) 턱받이 문자열은 다음으로 해결됩니다.biblatex
어느 것이 더 적합한지는 사용 사례에 따라 다릅니다.
@string
단지 타이핑 시간을 절약하고 싶거나 여러 형태의 입력(긴 저널 이름과 짧은 저널 이름) 사이를 전환할 수 있는 방법을 원하는 경우에는 이 방법이 더 적절해 보입니다. 일반적으로 @string
는 언어나 로케일에 연결되지 않습니다. 진정한 현지화를 원한다면 Bibstring을 사용하는 것이 좋습니다.
귀하의 질문에 나온 예에서는 두 가지 접근 방식 중 어느 것이 귀하의 사용 사례에 더 유용할지 알 수 없습니다.
당신이 원하는 것을 얻을 수 있나요?
귀하의 질문에서 설명한 계획을 고집한다면 두 가지 접근 방식을 결합하면 거의 가능합니다. 별로 좋은 생각은 아닌 것 같지만 가보겠습니다.
@string
중괄호 없이 가능한 각 값에 대해 대체 텍스트를 사용하여 정의해야 합니다 . 이식 가능한 솔루션을 원한다면 .bib
모든 프로젝트에서 로드해야 하는 특수 파일에서 이 작업을 수행해야 합니다.
@string{bracelessa = {bracelessa}}
@string{bracelessb = {bracelessb}}
그런 다음 턱받이 끈을 만드 십시오 bracelessa
.bracelessb
biblatex
\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
.