定义宏的正确方法是什么选修的可以在<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}