
다른 항목에 대해 다른 문자열을 어떻게 선언할 수 있나요? 예를 들어, 일반 URL의 경우 urldate는 "Accessed: urldate"로 인쇄되는 반면 Wikipedia의 경우 urldate는 "Last Modified: urldate"로 인쇄됩니다.
\iffieldequalstr과 같은 것을 시도했지만 작동하지 않는 것 같습니다. 아래는 MWE입니다.
\documentclass{article}
\usepackage[style=ieee,backend=bibtex]{biblatex}
\usepackage{xpatch}
\begin{filecontents}{\jobname.bib}
@ELECTRONIC{MEMSnet,
title = {What is {MEMS}?},
organization = {MEMSnet},
url = {http://www.memsnet.org/mems/what_is.html},
urldate = {2013-12-01},
}
@ELECTRONIC{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
organization = {Wikipedia.org},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
timestamp = {09:59},
urldate = {28 November 2013}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\xpatchbibdriver{online}
{\printtext[parens]{\usebibmacro{date}}}
{\iffieldundef{year}
{}
{\printtext[parens]{\usebibmacro{date}}}}
{}
{\typeout{There was an error patching biblatex-ieee (ieee.bbx's @online driver)}}
\AtEveryBibitem{
\ifentrytype{online}{
\iffieldequalstr{author}{Wikipedia}{
\DefineBibliographyStrings{english}{%
urlseen = {Last modified}
}
\DeclareFieldFormat{urldate}{\mkbibbrackets{\bibstring{urlseen}\addcolon\space#1\addcomma\space\printfield{timestamp}}}
}{
\DefineBibliographyStrings{english}{%
urlseen = {Accessed}
}
\DeclareFieldFormat{urldate}{\mkbibbrackets{\bibstring{urlseen}\addcolon\space#1}}
}
}{}
}
\begin{document}
\nocite{MEMSnet,WikiMEMS,wilde,markey}
\printbibliography
\end{document}
답변1
원하는 것에 매우 가까운 한 가지 솔루션은 다음을 수행하고 bibstring
적절한 이름의 새 를 선언하는 것입니다 lastmodified
.
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
이름을 비교하려면 author
매크로가 필요합니다 \wikitestname
. 불행하게도 현재로서는 이름*을 문자열과 대조하여 확인할 수 있는 쉬운 방법이 없으므로 \ifnameequals
매크로를 대조하여 확인하는 데 사용해야 합니다. 이름 형식은 매우 구체적이지만 파일에서 찾아볼 수 있습니다 .bbl
.
\def\wikitestname{{}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}}
그런 다음 현재 처리된 항목이 Wiki 항목인지 확인합니다.
\AtEveryBibitem{
\ifentrytype{online}{
\ifnameequals{author}{\wikitestname}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{lastmodified}\space#1}}}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{urlseen}\space#1}}}
}
}
urldate
필요한 경우 그에 따라 앞의 문자열을 변경합니다 .
\documentclass{article}
\usepackage[style=ieee,backend=bibtex]{biblatex}
\usepackage{xpatch}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ELECTRONIC{MEMSnet,
title = {What is {MEMS}?},
organization = {MEMSnet},
url = {http://www.memsnet.org/mems/what_is.html},
urldate = {2013-12-01},
}
@ELECTRONIC{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
organization = {Wikipedia.org},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
timestamp = {09:59},
date = {2013-11-28},
urldate = {2013-12-25},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\xpatchbibdriver{online}
{\printtext[parens]{\usebibmacro{date}}}
{\iffieldundef{year}
{}
{\printtext[parens]{\usebibmacro{date}}}}
{}
{\typeout{There was an error patching biblatex-ieee (ieee.bbx's @online driver)}}
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
\def\wikitestname{{}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}}
\AtEveryBibitem{
\ifentrytype{online}{
\ifnameequals{author}{\wikitestname}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{lastmodified}\space#1}}}
{\DeclareFieldFormat{urldate}{\mkbibparens{\bibstring{urlseen}\space#1}}}
}
}
\begin{document}
\nocite{MEMSnet,WikiMEMS,wilde,markey}
\printbibliography
\end{document}
*
biblatex
name
s, field
s, s를 구별합니다 list
. 예를 들어, author
a name
, series
a field
및 organization
a 입니다 list
. 해당 필드 간의 동등성을 확인하는 다양한 매크로가 있습니다. a가 주어진 문자열과 같은지 \iffieldequalstr
확인하는 데 사용할 수 없습니다 . name
이름은 틀림없이 다루어야 할 가장 복잡한 부분이기 때문에 biblatex
가장 복잡한 신원 조건도 가지고 있습니다. 결국 .bib
파일 에 지정된 이름이 Peter Smith
string 과 일치하는 것을 원하지는 않지만 두 입력 형식이 파일에서 동일하게 유효하므로 및 가 모두 일치하기를 Smith
원할 것입니다 . 따라서 파일에 지정된 고유 이름 구문을 이미 포함해야 하는 매크로와의 비교만 허용됩니다 . 우리의 경우에는 .Peter Smith
Smith, Peter
Peter Smith
.bib
biblatex
.bbl
{}{{{}{Wikipedia}{W.}{}{}{}{}{}{}}}
다른 메모에서. 이 경우 @wiki
이 작업에 대한 전용 항목 유형(이라고 부르는 것이 좋을 수도 있음)을 정의하는 것이 매우 적절할 수 있습니다 .
BibTeX를 백엔드로 사용하고 (적어도 제 생각에는) 훨씬 우수한 biber가 아닌 것으로 보이므로 먼저 BibTeX의 가능성을 탐색한 다음 biber로 얼마나 더 나은 작업을 수행할 수 있는지 살펴보겠습니다.
biblatex
기본적으로 사용자 정의 수정을 위한 6가지 항목 유형이 customa
있습니다 customf
. 여기서는 를 사용하겠습니다 customa
.
이제부터 위키 항목을 인용하려면 @online
/를 사용하지 @electronic
말고 를 사용하세요 @customa
.
@customa{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
organization = {Wikipedia, The Free Encyclopedia},
date = {2013-11-28},
urldate = {2013-12-25},
}
필드는 예상대로입니다. 예상대로 urldate
리소스에 마지막으로 액세스한 날짜와 리소스가 마지막으로 수정된 날짜를 사용 합니다 .date
다시 한 번 우리는
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
마지막으로 참고문헌 항목을 인쇄하는 코드 조각인 드라이버가 있습니다.
\DeclareBibliographyDriver{customa}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\addperiod\addspace}%or \setunit{\adddot\addspace}
\iffieldundef{year}%
{}
{\printtext[parens]{\bibstring{lastmodified}\space\usebibmacro{date}}}%
\setunit{\adddot\addspace}%
\usebibmacro{title}%
\setunit{\adddot\addspace}%
\printlist{language}%
\setunit{\adddot\addspace}%
\usebibmacro{byauthor}%
\setunit{\adddot\addspace}%
\usebibmacro{byeditor+others}%
\setunit{\adddot\addspace}%
\printfield{version}%
\setunit{\adddot\addspace}%
\printfield{note}%
\newunit\newblock
\printlist{organization}%
\setunit{\adddot\addspace}%
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\newunit\newblock
\usebibmacro{url+urldate}%
\setunit{\adddot\addspace}%
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\usebibmacro{related}%
\usebibmacro{finentry}%
}
이 드라이버는 '마지막 수정됨'을 인쇄하는 영역을 약간 수정한 것을 제외하면 ieee.bbx
의 드라이버 와 거의 일대일 복사본입니다 .@online
date
MWE
\documentclass{article}
\usepackage[style=ieee,backend=bibtex]{biblatex}
\usepackage{xpatch}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ELECTRONIC{MEMSnet,
title = {What is {MEMS}?},
organization = {MEMSnet},
url = {http://www.memsnet.org/mems/what_is.html},
urldate = {2013-12-01},
}
@customa{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
organization = {Wikipedia, The Free Encyclopedia},
date = {2013-11-28},
urldate = {2013-12-25},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\xpatchbibdriver{online}
{\printtext[parens]{\usebibmacro{date}}}
{\iffieldundef{year}
{}
{\printtext[parens]{\usebibmacro{date}}}}
{}
{\typeout{There was an error patching biblatex-ieee (ieee.bbx's @online driver)}}
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
\DeclareBibliographyDriver{customa}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\addperiod\addspace}%or \setunit{\adddot\addspace}
\iffieldundef{year}%
{}
{\printtext[parens]{\bibstring{lastmodified}\space\usebibmacro{date}}}%
\setunit{\adddot\addspace}%
\usebibmacro{title}%
\setunit{\adddot\addspace}%
\printlist{language}%
\setunit{\adddot\addspace}%
\usebibmacro{byauthor}%
\setunit{\adddot\addspace}%
\usebibmacro{byeditor+others}%
\setunit{\adddot\addspace}%
\printfield{version}%
\setunit{\adddot\addspace}%
\printfield{note}%
\newunit\newblock
\printlist{organization}%
\setunit{\adddot\addspace}%
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\newunit\newblock
\usebibmacro{url+urldate}%
\setunit{\adddot\addspace}%
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\usebibmacro{related}%
\usebibmacro{finentry}%
}
\begin{document}
\nocite{MEMSnet,WikiMEMS,wilde,markey}
\printbibliography
\end{document}
대신 위와 같이 드라이버를 정의하여 biber
새로운 유형을 정의할 수 있습니다.@wiki
wiki
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
\DeclareBibliographyDriver{wiki}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\addperiod\addspace}%or \setunit{\adddot\addspace}
\iffieldundef{year}%
{}
{\printtext[parens]{\bibstring{lastmodified}\space\usebibmacro{date}}}%
\setunit{\adddot\addspace}%
\usebibmacro{title}%
\setunit{\adddot\addspace}%
\printlist{language}%
\setunit{\adddot\addspace}%
\usebibmacro{byauthor}%
\setunit{\adddot\addspace}%
\usebibmacro{byeditor+others}%
\setunit{\adddot\addspace}%
\printfield{version}%
\setunit{\adddot\addspace}%
\printfield{note}%
\newunit\newblock
\printlist{organization}%
\setunit{\adddot\addspace}%
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\newunit\newblock
\usebibmacro{url+urldate}%
\setunit{\adddot\addspace}%
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\usebibmacro{related}%
\usebibmacro{finentry}%
}
.bib
예상대로 파일
@wiki{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
organization = {Wikipedia, The Free Encyclopedia},
date = {2013-11-28},
urldate = {2013-12-25},
}
MWE
\documentclass{article}
\usepackage[style=ieee,backend=biber]{biblatex}
\usepackage{xpatch}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ELECTRONIC{MEMSnet,
title = {What is {MEMS}?},
organization = {MEMSnet},
url = {http://www.memsnet.org/mems/what_is.html},
urldate = {2013-12-01},
}
@wiki{WikiMEMS,
author = {Wikipedia},
title = {Microelectromechanical systems},
url = {http://en.wikipedia.org/wiki/Microelectromechanical_systems},
organization = {Wikipedia, The Free Encyclopedia},
date = {2013-11-28},
urldate = {2013-12-25},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\xpatchbibdriver{online}
{\printtext[parens]{\usebibmacro{date}}}
{\iffieldundef{year}
{}
{\printtext[parens]{\usebibmacro{date}}}}
{}
{\typeout{There was an error patching biblatex-ieee (ieee.bbx's @online driver)}}
\NewBibliographyString{lastmodified}
\DefineBibliographyStrings{english}{%
lastmodified = {last modified}
}
\DeclareBibliographyDriver{wiki}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/editor+others/translator+others}%
\setunit{\addperiod\addspace}%or \setunit{\adddot\addspace}
\iffieldundef{year}%
{}
{\printtext[parens]{\bibstring{lastmodified}\space\usebibmacro{date}}}%
\setunit{\adddot\addspace}%
\usebibmacro{title}%
\setunit{\adddot\addspace}%
\printlist{language}%
\setunit{\adddot\addspace}%
\usebibmacro{byauthor}%
\setunit{\adddot\addspace}%
\usebibmacro{byeditor+others}%
\setunit{\adddot\addspace}%
\printfield{version}%
\setunit{\adddot\addspace}%
\printfield{note}%
\newunit\newblock
\printlist{organization}%
\setunit{\adddot\addspace}%
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
{}%
\newunit\newblock
\usebibmacro{url+urldate}%
\setunit{\adddot\addspace}%
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\usebibmacro{related}%
\usebibmacro{finentry}%
}
\begin{document}
\nocite{MEMSnet,WikiMEMS,wilde,markey}
\printbibliography
\end{document}
두 MWE 모두 수익률을 초과함
이제 biber를 사용하면 사용자 정의 필드를 매우 쉽게 추가할 수 있습니다. 예를 들어 항목의 사용 조건을 설명하는 라이센스 필드입니다 @wiki
. 이 작업은 다음에 설명된 대로 수행할 수 있습니다.참고문헌에 가격을 포함하는 방법은 무엇입니까?.