Biblatex 风格创作。我们如何重构 DeclareCiteCommand 以获取附加参数?

Biblatex 风格创作。我们如何重构 DeclareCiteCommand 以获取附加参数?

我正在编写 biblatex 样式,我想向用户提供一个自定义引用命令,该命令除了 biblatex 本身支持的参数外,还接受一个可选参数。也就是说,除了可选的预注后记以及强制性钥匙

例如我想要支持如下命令变体:

% Explicit arguments to the additional parameter
\customcite{barker_2016_swiss}{apples}\\
\customcite[see][p. 25]{barker_2016_swiss}{oranges}\\

 % Some default when the additional parameter not supplied
\customcite[see][p. 25]{barker_2016_swiss}\\

% Relevant defaults when none of the optional parameters supplied.
\customcite{barker_2016_swiss}\\ 

...其中barker_2016_swiss是键,applesoranges是附加(可选)参数的参数。

我并不坚持通过大括号{}而不是方括号传递附加参数[]。事实上,我对 tex/latex 在哪些情况下可能支持通过大括号{}而不是方括号传递参数感到有点困惑[]。因此,如果命令需要类似...

 \customcite[see][p. 25][oranges]{barker_2016_swiss}\\

...我不认为这会带来任何特殊的困难。

apples并且oranges是愚蠢的假设,以使事情简单化并使这个 TeX 问题足够通用,以便对其他人有益(在我的生产代码中,我将传递给 DateTimePrecision 参数参数,如“daylevel、timelevel 等”)。但一般的想法是在 Select Case 类型语句中使用这个用户提供的参数(我IfEqCase在这个 latex 上下文中使用)来临时更改引用的格式。例如,我可能会继续这个愚蠢而简单的例子:

(see Barker Apples are healthy, p. 25)
(see Barker Oranges are fun, p. 25)

我们如何重构\DeclareCiteCommand自己的风格,或者编写其他技术来支持这种类型\customcite

我可能还想重构\DeclareAutoCiteCommand以达到相同的目的。我推测如果可以做到,\DeclareCiteCommand那么相同的解决方案或多或少也适用于 \DeclareAutoCiteCommand

接下来的最小工作示例(MWE)并没有完全帮助我实现这个目标,但是说明了我想要实现的目标:

在我的 C:\MyDevDirectory\

作者年份-jlb-mwe.bbx。

\ProvidesFile{authoryear-jlb-mwe.bbx}
[2016/11/16 v1.0 JLB's modification of authoryear.bbx]

\RequireBibliographyStyle{authoryear}

\endinput

因此 authoryear-jlb-mwe.bbx 只是一个存根,它不执行任何操作并且与当前目的无关。

作者年份-jlb-mwe.cbx

\ProvidesFile{authoryear-jlb-mwe.cbx}
[2016/11/16 v1.0 JLB's modification of authoryear.cbx]

\RequireCitationStyle{authoryear}

% I've successfully modifed this command from authoryear.cbx
% to take an additonal parameter
\renewbibmacro{cite:labelyear+extrayear}[1][oranges]{%
  \addspace
  \IfEqCase{#1}{
    {oranges}{Oranges are fun}%
    {apples}{Apples are healthy}%
    {bananas}{Bananas are tasty}%
  }[Unknown clause in cite:labelyear+extrayear]%
}%

\renewbibmacro*{cite}[1][apples]{%
  \iffieldundef{shorthand}
    {\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
       {\usebibmacro{cite:label}%
        \setunit{\printdelim{nonameyeardelim}}}
       {\printnames{labelname}%
        \setunit{\printdelim{nameyeardelim}}}%
     \usebibmacro{cite:labelyear+extrayear}[#1]} % Passing the argument along
    {\usebibmacro{cite:shorthand}}}

% How to redefine \DeclareCiteCommand to take an additional
% argument to pass along deeper to other redefined commands?
\DeclareCiteCommand{\customcite}[\mkbibparens]
  {\usebibmacro{prenote}}%
  {\usebibmacro{citeindex}
   \usebibmacro{cite}[bananas]} % Passing the argument along
  {\multicitedelim}
  {\usebibmacro{postnote}}

% Another approach? But it doesn't hook 
% into the facilities that \DeclareCiteCommand exposes.
% \newcommand*{\jlbCiteViaNewcommand}[4][see]{
%     (#1 #3 \usebibmacro{cite:labelyear+extrayear}[#4] ZZZZ, #2)
% }

\endinput

如您所见,我能够使用 覆盖authoryear.cbx命令\renewbibmacro{cite:labelyear+extrayear}\renewbibmacro*{cite}毫无问题地接受附加参数。将此参数毫无问题地\renewbibmacro*{cite}传递到端点。 并且我可以将参数毫无问题地传递给。\renewbibmacro{cite:labelyear+extrayear}\DeclareCiteCommand{\customcite}\renewbibmacro*{cite}

主要问题是我不知道如何重构\DeclareCiteCommand{\customcite}以在“前面”获取附加参数。也就是说,从用户编码类似\customcite[see][p. 25]{barker_2016_swiss}{oranges}

Biblatex-CustomStyle-Mwe.tex

\documentclass{article}

\begin{filecontents}{\jobname.bib}
@article{barker_2016_swiss,
  author = {Barker, Anne},
  title = {Swiss Voters Say No to Guaranteed Free Money},
  date = {2016-06-06T18:20:00+10:00},
  journaltitle = {ABC News}
}

@book{nietzsche_1969_thus,
  author = {Nietzsche, Friedrich Wilhelm},
  date = {1969},
  origdate = {1883},
  title = {Thus Spoke Zarathustra: A Book for Everyone and No One},
  publisher = {{Penguin Books}}
}
\end{filecontents}

\usepackage[%
  alldates=ymd, % year, short, long, terse, comp, ymd, edtf
  alldatesusetime=true,
  alltimes=24h,
  seconds=true,
  timezones=true,
  datezeros=true,
  dateabbrev=false,
  dateera=secular,
  datecirca=true,
  dateuncertain=true,
  style=authoryear-jlb-mwe,
  sorting=none,
]{biblatex}

\addbibresource{\jobname.bib}

\begin{document}

\section{Native Commands (although internals modified)}

\autocite[see][25]{barker_2016_swiss}\\
\parencite[see][25]{nietzsche_1969_thus}\\
\autocite{nietzsche_1969_thus}\\

\section{Custom command}

\customcite[see][p. 25]{barker_2016_swiss} \\


%\section{Desired command formats (currently not operational)}
%
%\customcite[see][p. 25]{barker_2016_swiss}\\ 
%\customcite{barker_2016_swiss}{apples}\\
%\customcite[see][p. 25]{barker_2016_swiss}{apples}\\
%\customcite[see][p. 25]{nietzsche_1969_thus}{oranges}\\
%\customcite[see][p. 25]{barker_2016_swiss}\\
%
%% Maybe a redfinition of autocite too?
%\autocite[see][p. 25]{barker_2016_swiss}\\ 
%\autocite{barker_2016_swiss}{apples}\\
%\autocite[see][p. 25]{barker_2016_swiss}{apples}\\
%\autocite[see][p. 25]{nietzsche_1969_thus}{oranges}\\
%\autocite[see][p. 25]{barker_2016_swiss}\\


\printbibliography

\end{document} 

...此 tex 文件的输出显示了我目前如何成功修改内部结构以获取传递给核心 Select 语句的值(\IfEqCase)...但如果所需命令格式(当前不可操作)部分未注释:因为\customcite(和\autocite)尚未重构以采用附加参数(biblatex 本身尚未支持)。

有一个类似措辞的 Tex Stack Exchange 问题有关 DeclareCiteCommand 的附加参数的帮助。但看起来提问者的目标完全不同,所以那里的答案似乎不适用。

更新:

我已经发布了我通常想要实现的目标,即“样式规范:作者年份与日期时间精度变化。#516”,位于https://github.com/plk/biblatex/issues/516

答案1

biblatex定义 cite 命令时使用了很多内部技巧。如果不重写整个\DeclareCiteCommand基础结构并可能在此过程中破坏它,添加额外的参数并不容易。或者,人们必须使用xparse或低级技巧来重现当前的行为。这两个选项听起来都不太有希望。

你可以通过后注论证偷偷地伪造一个附加论证。这就是 Maïeul Rouquette 的biblatex-source-division成功了。他的代码基于 Audrey 对biblatex \cite 中另一个可选参数内的可选参数

相关内容