我正在实现一个自定义版本Guido 的回答当我遇到困难时。他的代码运行如下:
\DeclareAutoCiteCommand{inline}{\mycite}{\cites}
\DeclareCiteCommand{\mycite}
{}
{\ifentrytype{personalcommunication}
{\printnames{labelname} \mkbibparens{personal communication, \printdate}}
{\mkbibparens{\usebibmacro{cite}}}%
}
{}
{}
我想定制它,以便(Elliott, pers. comm., 20th Jul. 2017)
打印
@misc{elliott2017,
author = {Robin Elliott},
date = "2017-07-20",
howpublished = "personal communication"
}
当我尝试将日期作为参考书目条目的超链接(与上面指南的回答不同,我想保留它)时,我遇到了障碍。
查看 BibLaTeX 手册时,我发现了\bibhyperref
和\bibhypertarget
,但当\bibhyperref
我尝试引用 时却出现了很多错误\currentfield
。同样,当我考虑它时,我不确定这是否是一个合乎逻辑的过程。无论如何,这就是我修改上述代码的方式以及我声明 BibLaTeX 和 的方式hyperref
:
\documentclass[12pt,oneside]{article}
\usepackage[backend=bibtex, style=ieee, natbib=true, backref=true, backrefstyle=two, sortcites=true, autocite=inline]{biblatex}
\addbibresource{ref_pers_comm.bib}
\usepackage[plainpages=false,bookmarks=true,bookmarksnumbered=true,colorlinks=true,,breaklinks,pdftitle={},pdfauthor={},pdfdisplaydoctitle=true,pdfpagelayout={SinglePage}]{hyperref}
\DeclareAutoCiteCommand{inline}{\mycite}{\cites}
\DeclareCiteCommand{\mycite}
{}
{\ifentrytype{misc}{%
\IfStrEq{\thefield{howpublished}}{personal communication}
{\mkbibparens{\printnames{labelname}, {\emph{pers. comm.},
\bibhyperref{\currentfield}{\printdate}}}
{\mkbibparens{\usebibmacro{cite}}}%
}
{\mkbibparens{\usebibmacro{cite}}}%
}
{}
{}
\begin{document}
\ldots considerably more useful \autocite{elliott2017}\ldots
\printbibliography
\end{document}
然而,显然这\currentfield
至少是错误的,因为Undefined control sequence.
当我使用上述内容进行编译时,我收到错误。
所以:
- 是的
\bibhyperref
,或者\bibhypertarget
我应该使用(或完全使用第三种东西)? - 我可以使用什么句柄来执行上述命令以便获得正确的参考列表打印输出?
编辑:添加了所要求的信息(希望如此),但格式已经变得很乱。每次我尝试空格时都会添加随机换行符。
答案1
尝试
\makeatletter
\DeclareAutoCiteCommand{inline}{\mycite}{\mycites}
\DeclareMultiCiteCommand{\mycites}{\mycite}{\multicitedelim}
\DeclareCiteCommand{\mycite}
{\usebibmacro{cite:init}%
\bibopenbracket
\usebibmacro{prenote}}
{\ifboolexpr{test {\ifentrytype{misc}} and test {\iffieldequalstr{howpublished}{personal communication}}}
{\addtocounter{cbx@tempcntb}{1}%
\printnames{labelname}%
\setunit{\addcomma\space}%
\printtext[emph]{pers. comm\addperiod}%
\setunit{\addcomma\space}%
\printtext[bibhyperref]{\printdate}%
\ifnumgreater{\value{cbx@tempcntb}}{-1}
{\multicitedelim}
{}}
{\usebibmacro{cite:comp}}}
{}
{\usebibmacro{cite:dump}%
\usebibmacro{postnote}%
\bibclosebracket}
\makeatother
biblatex-ieee
不幸的是,由于您使用基于的,因此代码变得相当复杂nuemric-comp
。numeric-comp
需要相当多的辅助宏和技巧才能获得压缩输出。
由于需要进行复杂的更改,因此很难解释上述代码中发生的情况numeric-comp
,因此让我假设您使用了更易于修改的其他基本样式来解释。假设style=authoryear
。
从你原来的代码我就可以做出
\DeclareAutoCiteCommand{inline}{\mycite}{\mycites}
\DeclareMultiCiteCommand{\mycites}{\mycite}{\multicitedelim}
\DeclareCiteCommand{\mycite}[\mkbibparens]
{}
{\ifboolexpr{test {\ifentrytype{misc}} and
test {\iffieldequalstr{howpublished}{personal communication}}}
{\printnames{labelname}%
\setunit{\addcomma\space}%
\printtext[emph]{pers. comm\addperiod}%
\setunit{\addcomma\space}%
\printtext[bibhyperref]{\printdate}}
{\usebibmacro{cite}}}
{}
{}
在这里,可以更轻松地将我的解决方案与您的尝试进行比较和对比。
对于您的问题
- 你应该使用
\printtext[bibhyperref]{...}
\printtext[bibhyperref]{...}
已经处理好了一切,正确的标签会自动确定,您只需将要链接的文本放在花括号中即可。
biblatex
请注意我如何在您的命令定义中使用更多-y 命令。
- 不要使用文字标点符号,使用 的
biblatex
标点符号跟踪器和正确的宏。不要,
写\setunit{\addcomma\space}
。请参阅 §4.11.7使用标点符号追踪器的文件。 - 不要直接打印文本,请使用
\printtext
或更好\bibstring
的 - 使用
\iffieldequalstr
而不是\IfStrEq{\thefield{howpublished}}{...}
cite
直接修改 bibmacro 或至少 cite 命令\cite
而不是定义新的命令可能会更好\mycite
。