如何使 biblatex 的参考书目正确对齐?

如何使 biblatex 的参考书目正确对齐?

在下面的 MWE 中,我希望将参考书目中的参考文献对齐。如您所见,第二个参考文献与第一个参考文献不一致。我正在使用该koma-moderncvclassic包及其模板来生成此 CV 文档。是什么导致了此对齐问题?非常感谢您的帮助。

平均能量损失

\RequirePackage{filecontents}
\begin{filecontents}{MWE.bib}
@ARTICLE{2006,
  title = {journalarticle},
  journal = {journal},
  year = {2006},
  volume = {6},
  pages = {19--75}
}
@BOOK{2000,
  title = {Some Book},
  address = {Around the Corner},
  year = {2000}
}
\end{filecontents} 

\documentclass[%
fontsize=11pt,%
a4paper,%
pagesize,%
headinclude,footinclude,%
headings=normal,%
]{scrartcl}
\usepackage[left=2cm,right=2cm,top=3cm,bottom=3cm]{geometry} % page layout
\usepackage{scrpage2}
\tolerance=200 % white space
\clubpenalty = 1000 % orphans
\widowpenalty = 1000 % widows

\renewcommand*{\title}{Curriculum Vitae}% für PDF
\newcommand*{\firstname}{John}
\newcommand*{\familyname}{Doe}
\newcommand*{\acadtitle}{MD, PhD}
\newcommand*{\addressstreet}{Street 70}
\newcommand*{\addresscity}{New Avenue}
\newcommand*{\address}[2]{\addressstreet{#1}\addresscity{#2}}
\newcommand*{\mobile}{+999 077777781}
\newcommand*{\email}{anyname (at) domainname.com}

\usepackage[myblue]{koma-moderncvclassic}
\renewcommand{\firstnamefont}{\fontsize{28}{26}\sffamily\mdseries\upshape} % name in smaller font
\newcommand*{\totalpagemark}{\usekomafont{pagenumber}\thepage/\pageref{lastpage}}% for page and pagetotal


\pagestyle{scrheadings}
\clearscrheadfoot
\ifoot{CV~\firstname~\familyname}

\usepackage[backend=biber,%
style=authortitle,% 
sorting=ydnt%
]{biblatex}
\bibliography{MWE.bib}

\defbibheading{bibliography}[Publications]{\section{#1}}

\begin{document}

\maketitle

\section{Personal Information}
\cvline{Gender:}{Male}
\cvline{Place of Birth:}{Country}
\cvline{Date of Birith:}{1975}


% \newpage

\nocite{*}
\printbibliography

\label{lastpage}%

\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% TeX-engine: xetex
%%% End:

输出

当我使用 xetex 引擎编译文档时,我得到了这种不必要的对齐:

在此处输入图片描述

期望

现在,如果我取消注释\newpage上述代码中的行,我将获得正确的对齐方式,但我不想超出简历中的一页。那么如何在简历中没有新页面的情况下获得正确的对齐方式?

在此处输入图片描述

答案1

这是由 中的一个错误引起的问题koma-moderncvclassic.sty。问题的真正根源在于这个包是从moderncv类派生出来的。由于moderncv是一个类,因此它可以定义在标准类中以其他方式定义的宏。

问题描述:bug

moderncv课堂上我们发现了以下定义\quote

\newcommand*{\quote}[1]{\def\@quote{#1}}

当然,这与\quote(即quote 环境) 定义于scrartcl

  \newenvironment{quote}{%
  \list{}{\rightmargin\leftmargin}%
  \item\relax
}{%
  \endlist
}

但是包的重新定义中的代码\maketitle包含以下内容:

...
  \ifthenelse{\isundefined{%
\quote}}%
    {}%
    {\centering{\begin{minipage}{\quotewidth}\centering\quotestyle{\quote}\end{minipage}}%\\[2.5em]
}

...

在原始moderncv代码中,检查的是内部定义的\@quote,但软件包版本的作者错误地将其更改为\quote。但由于\quote始终由定义scrartcl,因此它会执行条件的第二部分:

{\centering{\begin{minipage}{\quotewidth}\centering\quotestyle{\quote}\end{minipage}}

这实际上做了两件事:它将文档的其余部分放入环境中\centering(因为首字母\centering不在组中),并且它开始(但永远不会结束)一个quote环境。

这就是搞砸了参考书目的缩进的原因:整个参考书目都在列表环境中(这是quote实现的方式。)

有效\newpage地结束该quote环境,这就是为什么新页面的缩进是正确的。

解决方案

由于这是 中的一个错误koma-moderncvclassic.sty,因此长期的解决方案是让作者修复它。

快速解决方法

一个非常快速的解决方法是添加

\let\quote\relax

在 之前\maketitle。这将阻止执行错误的代码。当然,这不会让您使用\quote来自moderncv实现的命令或quote来自 的环境scrartcl

修复错误:重新定义\maketitle

更强大的解决方案是重新定义命令\quote以匹配moderncv定义并修复maketitle包的命令。

\makeatletter
\renewcommand\quote[1]{\def\@quote{#1}}
\renewcommand*{\maketitle}{%
  % name and title
  \begin{minipage}[b]{\maketitlenamewidth}%
    \firstnamestyle{%
\firstname~}\familynamestyle{%
\familyname}%
    \ifthenelse{\equal{%
\acadtitle}{}}{}{\\[1.25em]\acadtitlestyle{%
\acadtitle}}%
  \end{minipage}%
  % optional data
\begin{minipage}[b]{\maketitledetailswidth}%
    \raggedleft\addressfont\color{addresscolor}%
    \ifthenelse{\isundefined{\addressstreet}}{}{%
      \maketitledetailsnewline%
      \addresssymbol~\addressstreet%
      \ifthenelse{\isundefined{\addresscity}}{}{\\\addresscity}}%
    \ifthenelse{\isundefined{\mobile}}{}{\maketitledetailsnewline\mobilesymbol~\mobile}%
    \ifthenelse{\isundefined{\phone}}{}{\maketitledetailsnewline\phonesymbol~\phone}%
    \ifthenelse{\isundefined{\faxnr}}{}{\maketitledetailsnewline\faxsymbol~\faxnr}%
    \ifthenelse{\isundefined{\email}}{}{\maketitledetailsnewline\emailsymbol~\emaillink{\email}}%
    \ifthenelse{\isundefined{\extrainfo}}{}{\maketitledetailsnewline\extrainfo}%
  \end{minipage}%
% optional photo
  \ifthenelse{\isundefined{\photoname}}%
    {}%
    {\hspace*{\separatorcolumnwidth}%
     \ifthenelse{\equal{\pictureframe}{noframe}}
      {\begin{minipage}[b]{\photowidth}
         \includegraphics[width=\photowidth]{\photoname}
       \end{minipage}}
      {\color{firstnamecolor}%
       \framebox{\includegraphics[width=\photowidth]{\photoname}}}} 
% optional quote
  \ifthenelse{\isundefined{% <---- changed \quote to \@quote below (twice)
\@quote}}%
    {}%
    {{\centering{\begin{minipage}{\quotewidth}\centering\quotestyle{\@quote}\end{minipage}}}%\\[2.5em] <----- added extra pair of braces
}%
}
\makeatother

这个包还存在一些其他问题,包括在应该使用\\[<length>]a 的地方的自由使用。\vspace{<length>}

完整示例

下面是使用该解决方法的完整示例(我添加了一些较长的参考资料以正确显示格式,并使用了选项showframegeometry清楚地显示边距。)

通常你希望参考书目条目采用悬挂缩进格式,因为这样更容易区分每个条目。如果您确实希望参考文献与左边距齐平(我不建议这样做),您可以将长度更改\bibhang为 0。

\RequirePackage{filecontents}
\begin{filecontents}{\jobname.bib}

@book{Knuth1984texbook,
    Author = {Knuth, D.E.},
    Publisher = {Addison-Wesley, Reading, Massachusetts,},
    Title = {The TEXbook, volume A of Computers and typesetting},
    Year = {1984}}


@article{HauserChomskyFitch2002,
    Author = {Hauser, Marc and Chomsky, Noam and Fitch, W. Tecumseh},
    Journal = {Science},
    Number = {5598},
    Pages = {1569--1579},
    Title = {The Faculty of Language: What Is It, Who Has It, and How Did It Evolve?},
    Volume = {298},
    Year = {2002}}
\end{filecontents} 

\documentclass[%
fontsize=11pt,%
a4paper,%
pagesize,%
headinclude,footinclude,%
headings=normal,%
]{scrartcl}
\usepackage[left=2cm,right=2cm,top=3cm,bottom=3cm,showframe]{geometry} % page layout
\usepackage{scrpage2}
\tolerance=200 % white space
\clubpenalty = 1000 % orphans
\widowpenalty = 1000 % widows

\renewcommand*{\title}{Curriculum Vitae}% für PDF
\newcommand*{\firstname}{John}
\newcommand*{\familyname}{Doe}
\newcommand*{\acadtitle}{MD, PhD}
\newcommand*{\addressstreet}{Street 70}
\newcommand*{\addresscity}{New Avenue}
\newcommand*{\address}[2]{\addressstreet{#1}\addresscity{#2}}
\newcommand*{\mobile}{+999 077777781}
\newcommand*{\email}{anyname (at) domainname.com}

\usepackage[myblue]{koma-moderncvclassic}
\renewcommand{\firstnamefont}{\fontsize{28}{26}\sffamily\mdseries\upshape} % name in smaller font
\newcommand*{\totalpagemark}{\usekomafont{pagenumber}\thepage/\pageref{lastpage}}% for page and pagetotal
\let\quote\relax% undefine \quote


\pagestyle{scrheadings}
\clearscrheadfoot
\ifoot{CV~\firstname~\familyname}

\usepackage[backend=biber,%
style=authortitle,% 
sorting=ydnt%
]{biblatex}
\addbibresource{\jobname.bib}

\defbibheading{bibliography}[Publications]{\section{#1}}


\begin{document}

\maketitle

\section{Personal Information}
\cvline{Gender:}{Male}
\cvline{Place of Birth:}{Country}
\cvline{Date of Birth:}{1975}

\nocite{*}

\printbibliography

\label{lastpage}%

\end{document}

代码输出

如果您希望出版物列表在标题的左边缘下对齐,则bibliography可以使用 SamCarter 的答案中对环境进行重新定义。由于我仍然认为项目应该有悬挂缩进,因此我建议进行以下重新定义:

\defbibenvironment{bibliography}
{\list {}
   {\setlength{\leftmargin}{3.6cm}%
    \setlength{\itemindent}{-.4cm}%
    \setlength{\itemsep}{\bibitemsep}%
    \setlength{\parsep}{\bibparsep}}}
{\endlist}
{\item}

相关内容