![如何访问 biblatex 包选项/键的值](https://linux22.com/image/240455/%E5%A6%82%E4%BD%95%E8%AE%BF%E9%97%AE%20biblatex%20%E5%8C%85%E9%80%89%E9%A1%B9%2F%E9%94%AE%E7%9A%84%E5%80%BC.png)
是否可以访问作为书目选项给出的值。例如,如果我有
\usepackage[somekey=foobar]{biblatex}
我能否像 这样的宏一样获取 的值 ( foobar
) 。我尝试找出答案,然后查看那里,我找到了我现在知道的来自 的宏。我的搜索以我可以更改值但无法获取值的宏结束。somekey
\KV@<family>@somekey
biblatex.sty
\define@key
keyval.sty
\KV@blx@opt@pre@autocite{#1}
正如您所猜测的,我想获得该autocite
选项的价值。
更新
也许 Joseph 是对的,所以我想要的是:我希望能够根据选项更改宏的行为autocite
。宏是\quodecite
(参见biblatex:处理二次(“引用”)引文) 因为这是通过 定义的,我猜\DeclareMultiCiteCommand
我不能使用\DeclareAutoCiteCommand
。我本可以在其他问题中向 Audrex 询问这个问题,但我认为我可以自己解决,这引出了一个问题,即我是否可以访问键值……
更新 2
在biblatex:处理二次(“引用”)引文奥黛丽建议为其他autocite
选项构建一个额外的命令,但我希望有一个自动解决方案。
这是创建命令的部分代码\quotecite
:
\DeclareMultiCiteCommand{\quotecite}[\cbx@qcwrapper]{\cbx@quotecite}{\cbx@qcdelim}
\newrobustcmd{\cbx@qcwrapper}[1]{%
\global\toggletrue{cbx@isquote}%
\mkbibfootnote{#1}%
\global\togglefalse{cbx@isquote}%
\global\togglefalse{cbx@iflastibid}%
\global\togglefalse{cbx@ifquoteepost}%
\global\togglefalse{cbx@ifquoterpost}}
正如可以想象的那样——我的测试也证明了这一点——的输出格式(纯文本、脚注等)可以通过替换为来\quotecite
轻松更改。所以我的想法是实现一个条件,它关注的值,为此我需要选项的值。 我想,类似下面的内容在真正的 LaTeX 中肯定会解决这个问题。\mkbibfootnote{#1}
\mkbibparens{#1}
autocite
\newrobustcmd{\cbx@qcwrapper}[1]{%
\global\toggletrue{cbx@isquote}%
if (autocite=footnote)
\mkbibfootnote{#1}%
else if (autocite=parens)
\mkbibparens{#1}
else if (autocite=plain)
#1
else
#1
warning: unkown option of autocite for \quotecite
end if
end if
end if
\global\togglefalse{cbx@isquote}%
\global\togglefalse{cbx@iflastibid}%
\global\togglefalse{cbx@ifquoteepost}%
\global\togglefalse{cbx@ifquoterpost}}
答案1
该\autocite
命令取决于autocite
选项设置和各种引用命令。后者(部分)由选项决定citestyle
。在中biblatex.sty
您可以看到如何处理这些选项。的值citestyle
明确存储:
\define@key{blx@opt@ldt}{citestyle}{%
\def\blx@cbxfile{#1}}
但是的值autocite
不是;而是使用来自biblatex
和etoolbox
包的一些命令来识别控制序列名称。
\DeclareBibliographyOption{autocite}{%
\ifcsundef{blx@acite@#1}
{\blx@error
{Autocite command '#1' undefined}
{The autocite command '#1' has not been defined by
the\MessageBreak selected citation style}}
{\letcs\autocite{blx@acite@#1}%
\letcs\autocites{blx@macite@#1}}}
控制序列blx@acite@plain
、blx@macite@plain
、blx@acite@inline
等定义如下biblatex.def
:
\DeclareAutoCiteCommand{plain}{\cite}{\cites}
\DeclareAutoCiteCommand{inline}{\parencite}{\parencites}
\DeclareAutoCiteCommand{footnote}[f]{\smartcite}{\smartcites}
\DeclareAutoCiteCommand{superscript}[l]{\supercite}{\supercites}
下面是一个非常简单的示例,说明如何创建依赖于autocite
和citestyle
选项的格式。它使用来自和的一些命令,etoolbox
并假设上述通用定义构建。这些可以在以后使用时重新定义和扩展\DeclareAutoCiteCommand
。因此,此处的测试不是特别全面,也不太能适应引用样式的变化。
\documentclass{article}
\usepackage[style=authoryear,autocite=footnote]{biblatex}
\bibliography{biblatex-examples}
\makeatletter
\newrobustcmd{\mkbibautoformat}[1]{%
\cslet{cbx@autocite}{\autocite}%
\ifcsequal{cbx@autocite}{blx@acite@inline}
{\ifboolexpr{ test {\ifdefstring{\blx@bbxfile}{numeric}}
or test {\ifdefstring{\blx@bbxfile}{alphabetic}} }
{\mkbibbrackets{#1}}
{\mkbibparens{#1}}}
{\ifcsequal{cbx@autocite}{blx@acite@footnote}
{\iffootnote
{\ifboolexpr{ test {\ifdefstring{\blx@bbxfile}{numeric}}
or test {\ifdefstring{\blx@bbxfile}{alphabetic}} }
{\mkbibbrackets{#1}}
{\mkbibparens{#1}}}
{\mkbibfootnote{#1}}}
{\ifcsequal{cbx@autocite}{blx@acite@superscript}
{\mkbibsuperscript{#1}}
{#1}}}}
\makeatother
\DeclareCiteCommand{\autociteyear}[\mkbibautoformat]
{\boolfalse{citetracker}%
\boolfalse{pagetracker}%
\usebibmacro{prenote}}
{\printfield{year}}
{\multicitedelim}
{\usebibmacro{postnote}}
\begin{document}
\null\vfill
\footnote{\autociteyear{companion}\autocite{companion}}
\end{document}