动机

动机

动机

我正在为哲学家编写一个 biblatex bbx 文件,并且我想为它包含 eprint 支持(就像 arXiv 内置的支持一样)斯坦福哲学百科全书。SEP 要求引用其文章时引用特定版本。版本按季度更新,使用 URL 来识别它们,方案如下:plato.stanford.edu/archives/<season-code><year>/<article-slug>其中<year>是版本的年份,<article-slug>是文章的唯一标识符,是、、和<season>之一。sprsumfallwint

我想编写我的 biblatex eprint 打印机,以便它将文章 slug 作为相关版本条目的超链接打印。

具体技术问题

在 biblatex 中存储和检索季节很容易,我正在现场存储 slug eprint。问题是上面的季节代码与季节不同名称(甚至是 biblatex 使用的原始本地化字符串)。因此,我打算使用\IfStrEqCasefromxstring将条目的季节与四个季节本地化字符串中的每一个进行比较,然后返回相关季节 str 以用于 sep url。我打算将其放在调用中的链接文本中\href以构建 url。

问题是对的调用\IfStrEqCase没有在内部展开\href。而是打印整个 url(第一个参数 to \href,然后是预期的显示文本。(即plato.stanford.edu/archives/spr2020/prob-percprob-perc

我怎样才能让案例陈述正确扩展?

平均能量损失

一个最小的工作示例:

\documentclass{article}

\begin{filecontents}{\jobname.bib}
@Article{sep-foo,
    eprint = {perception-problem},
    eprinttype = {sep},
    date = {2021-21},
    author = {Crane, Tim and Craig French},
    title = {The Problem of Perception},
}
\end{filecontents}

% Declare my own style
\begin{filecontents}{\jobname.bbx}
\ProvidesFile{href-prob.bbx}
[\abx@bbxid]

% Basis to alter
\RequireBibliographyStyle{authoryear}

\RequirePackage{xstring}

\DeclareFieldFormat{eprint:sep}{%
  \href{www.example.com/%
    \IfStrEqCase{\bibstring{\thefield{season}}}{%
      {\bibstring{spring}}{spr}%
      {\bibstring{summer}}{sum}%
      {\bibstring{autumn}}{fall}% 
      {\bibstring{winter}}{wint}}%
      }{#1}}

\endinput
\end{filecontents}

\begin{filecontents}{\jobname.cbx}
\ProvidesFile{href-prob.cbx}
[\abx@cbxid]

\RequireCitationStyle{authoryear-ibid}

\endinput
\end{filecontents}

\usepackage[style=\jobname]{biblatex}
\addbibresource{\jobname.bib}

\begin{document}

Foo bar. \autocite{sep-foo}

\printbibliography{}

\end{document}

答案1

或者您\hyperref可能\url想要可扩展的命令,以便参数实际上可以扩展到完整的 URL。

我认为\IfStrEqCase它不可扩展。对于问题中显示的用例,您本质上需要用一个字符串替换另一个字符串,我会选择基于预定义宏的解决方案。

hpblx@season@<season in biblatex lingo>具体来说,我们定义用替换文本调用的宏<season in SEP lingo>。然后可以将这些宏与一起使用\csuse

请注意,在biblatexv3.17 及更高版本中season称为yeardivision。(请参阅https://github.com/plk/biblatex/blob/master/doc/latex/biblatex/CHANGES.mdhttps://github.com/plk/biblatex/wiki/Changes-to-the-standard-styles。

\documentclass{article}

\usepackage[bibstyle=authoryear]{biblatex}
\usepackage{hyperref}

\csdef{hpblx@season@spring}{spr}
\csdef{hpblx@season@summer}{sum}
\csdef{hpblx@season@autumn}{fall}
\csdef{hpblx@season@winter}{wint}

\DeclareFieldFormat{eprint:sep}{%
  \href{https://plato.stanford.edu/archives/%
    \ifcsundef{hpblx@season@\thefield{yeardivision}}
      {}
      {\csuse{hpblx@season@\thefield{yeardivision}}}%
    \thefield{year}/entries/%
    \thefield{eprint}}
    {SEP: \texttt{#1}}}

\begin{filecontents}{\jobname.bib}
@Article{sep-foo,
  eprint     = {perception-problem},
  eprinttype = {sep},
  date       = {2021-21},
  author     = {Crane, Tim and Craig French},
  title      = {The Problem of Perception},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
Foo bar. \autocite{sep-foo}

\printbibliography
\end{document}

SEP链接

相关内容