动机
我正在为哲学家编写一个 biblatex bbx 文件,并且我想为它包含 eprint 支持(就像 arXiv 内置的支持一样)斯坦福哲学百科全书。SEP 要求引用其文章时引用特定版本。版本按季度更新,使用 URL 来识别它们,方案如下:plato.stanford.edu/archives/<season-code><year>/<article-slug>
其中<year>
是版本的年份,<article-slug>
是文章的唯一标识符,是、、和<season>
之一。spr
sum
fall
wint
我想编写我的 biblatex eprint 打印机,以便它将文章 slug 作为相关版本条目的超链接打印。
具体技术问题
在 biblatex 中存储和检索季节很容易,我正在现场存储 slug eprint
。问题是上面的季节代码与季节不同名称(甚至是 biblatex 使用的原始本地化字符串)。因此,我打算使用\IfStrEqCase
fromxstring
将条目的季节与四个季节本地化字符串中的每一个进行比较,然后返回相关季节 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
。
请注意,在biblatex
v3.17 及更高版本中season
称为yeardivision
。(请参阅https://github.com/plk/biblatex/blob/master/doc/latex/biblatex/CHANGES.md和https://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}