biblatex \cite 中另一个可选参数内的可选参数

biblatex \cite 中另一个可选参数内的可选参数

定义宏的正确方法是什么选修的可以在<postnote>biblatex 的可选参数中调用的参数\cite

下面最后两个\cite不起作用。

(除非它们像第三和第四个一样被括在括号中\cite

在此处输入图片描述

\documentclass{article}
\usepackage{xparse}
\usepackage[backend=biber, style=authortitle]{biblatex}
\usepackage{ifthen}
\usepackage{filecontents}

\DeclareFieldFormat{postnote}{#1}
\bibliography{mybib.bib}

\begin{filecontents}{mybib.bib}
@Book{mykey, author={Author}, title={Title}, journal={Journal}, year={1950}}
\end{filecontents}

\newcommand         \x [2][] {\ifthenelse{\equal{#1}{}}{}{(#1)}#2}
\NewDocumentCommand \y {mo}  {#1\IfValueT{#2}{(#2)}}

\begin{document}

\cite [\x{100}]      {mykey}

\cite [\y{100}]      {mykey}

\cite [{\x[a]{100}}] {mykey}

\cite [{\y{100}[a]}] {mykey}

\cite [\x[a]{100}]   {mykey}

\cite [\y{100}[a]]   {mykey}

\end{document}

答案1

格式指令postnote已经作用于字段的内容postnote。其默认定义可以在以下位置找到biblatex.def

\DeclareFieldFormat{postnote}{\mkpageprefix[pagination]{#1}}

将类似宏传递\x{100}给 postnote 参数会阻止 biblatex 识别页面引用。因此,您应该修改该指令。下面的示例采用了这种方法。Postnotes 可以按以下形式指定:

\cite[<prenote>][(<postnote prefix>)(<postnote suffix>)<postnote stem>]{<key>}

其中,后记前缀和后缀参数是可选的。如果只给出一个参数,则假定为后缀。新的指令用于格式化后记的三个部分。

\documentclass{article}
\usepackage{biblatex}
\usepackage[colorlinks]{hyperref}

% just for demonstration
\ExecuteBibliographyOptions{parentracker=false}
\renewcommand*{\multicitedelim}{\addsemicolon\space}

\DeclareFieldFormat{postnote:stem}{%
  \addcolon\space\mkcomprange[{\mkpageprefix[pagination]}]{#1}}
\DeclareFieldFormat{postnote:prefix}{#1}
\DeclareFieldFormat{postnote:suffix}{\addcomma\space#1}
\DeclareFieldFormat{postnote}{\mkpostnote{#1}}

\makeatletter

\newrobustcmd*{\mkpostnote}[1]{\mkpostnote@i#1&}

\def\mkpostnote@i{%
  \@ifnextchar(%)
    {\mkpostnote@ii}
    {\mkpostnote@ii()}}

\def\mkpostnote@ii(#1){%
  \@ifnextchar(%)
    {\mkpostnote@iii(#1)}
    {\mkpostnote@iii()(#1)}}

\def\mkpostnote@iii(#1)(#2)#3&{%
  \ifblank{#1}{}{%
    \blx@getformat\cbx@postnote@prefix@fmt{ffd}{}{postnote:prefix}%
    \cbx@postnote@prefix@fmt{#1}}%
  \ifblank{#3}{}{%
    \blx@getformat\cbx@postnote@stem@fmt{ffd}{}{postnote:stem}%
    \cbx@postnote@stem@fmt{#3}}%
  \ifblank{#2}{}{%
    \blx@getformat\cbx@postnote@suffix@fmt{ffd}{}{postnote:suffix}%
    \cbx@postnote@suffix@fmt{#2}}}
\def\cbx@postnote@stem@fmt{}
\def\cbx@postnote@prefix@fmt{}
\def\cbx@postnote@suffix@fmt{}

\makeatother

\addbibresource{biblatex-examples.bib}
\begin{document}
\subsection*{Without postnote affixes}
\cite[See][]{companion}
\cite[See][10]{companion}
\cite[See][11--19]{companion}
\cite[See][11--19 and the last section]{companion}
\cites[10]{companion}[e.g.][]{ctan}[11--19]{markey}[10]{knuth:ct}
\cites(See)()[11--19]{companion}{ctan,markey,knuth:ct}
\subsection*{With postnote affixes}
\cite[See][(post)]{companion}
\cite[See][(post)10]{companion}
\cite[See][(pre)()11--19]{companion}
\cite[See][(pre)(post)11--19 and the last section]{companion}
\cites[10]{companion}[e.g.][()(post)]{ctan}[11--19]{markey}[(pre)()10]{knuth:ct}
\cites(See)()[(pre)(post)11--19]{companion}{ctan,markey,knuth:ct}
\printbibliography
\end{document}

在此处输入图片描述

相关内容