我经常收集大量(数千个)pdf 文档,并编写一个脚本,根据文件命名系统将bash
它们编译成一个文件。在此过程中,脚本先前会生成一个静态文档,并将其放入脚注引用中。静态文档总是从第 1 页打开链接的文档(可能有 100 页长),但任何单个文档可能有数十个引用,每个引用都指向不同的页面,因此读者必须仔细查找。bib
\href
howpublished
\href
脚本创建的先前静态(工作)链接的形式为
howpublished={\href{run:./biblio/161229.bcw.bmg.mom.0001.Bundle.11.footnotes.ocr.pdf}{[link]}}
为了消除读者寻找的需要,我尝试将页码与索引一起传递给每个脚注bib
,以便\href
可以编写文件来打开任何文档的任何页面。
对于任何文档,路径和文件名都是静态的,很容易从文件中提取bib
,但当我尝试编写\href
这些“内部”命令时,它们不会展开,\href
会中断。
\href
有没有办法以类似于下面 MWE 中注释掉的行的方式编写使用子命令?
% TeXstudio 3.1.2 (git n/a)
% Using Qt Version 5.15.2, compiled with Qt 5.15.2 R
\documentclass[oneside,a4paper,12pt]{article}
\usepackage{hyperref}
\usepackage{biblatex}
\addbibresource{bib.bib}
% usage \hdetail{bibkey}{page}{commentary text}
\newcommand{\hdetail}[3]{
\footnote{\cite[Appendix A-\thesection][]{#1}
\citeauthor{#1}'s \citefield{#1}{note} of \citedate{#1}, #3
% I want this ....
\citefield{#1}{howpublished}\#page=#2
% question edited to change ?page to #page
% to expand inside this .....
% \href{\citefield{#1}{howpublished}#page=#2}{Link}
}
}
\begin{document}
\section{A Section}
An item.\hdetail{161206.bmg.bcw.eml.1029}{1}{Something to say about it}
\end{document}
bib.bib
目前看起来像这样
@misc{161206.bmg.bcw.eml.1029,author={{Big mak}},note="Email 1029",title={161206.bmg.bcw.eml.1029.Bundle.10.footnotes.ocr.pdf},date="2016-12-06",howpublished={./biblio/161206.bmg.bcw.eml.1029.Bundle.10.footnotes.ocr.pdf}}
@misc{161227.bmg.bcw.let.0002,author={{Big mak}},note="Letter 0002",title={161227.bmg.bcw.let.0002.Bundle.30.footnotes.ocr.pdf},date="2016-12-27",howpublished={./biblio/161227.bmg.bcw.let.0002.Bundle.30.footnotes.ocr.pdf}}
@misc{161229.bcw.bmg.mom.0001,author={{Big cojones}},note="Minutes of meeting 0001",title={161229.bcw.bmg.mom.0001.Bundle.11.footnotes.ocr.pdf},date="2016-12-29",howpublished={./biblio/161229.bcw.bmg.mom.0001.Bundle.11.footnotes.ocr.pdf}}
推论
虽然接受的答案在实现扩展方面 100% 正确,但\href
无法成功解析和编译#
外部锚点中的。使用\url
而\href
不是解析,#
因此权宜之计是
\newcommand*{\mypage}{}
\DeclareFieldFormat{howpublished:page}{\tiny\url{#1\#page=\mypage}}
答案1
biblatex
biblatex
的数据打印命令是不可扩展的,因此通过字段格式等在“内部”进行所有处理通常更安全。
这里还有一个额外的困难,那就是我们想要将.bib
数据与来自宏的参数结合起来。将两者结合起来的一个快速方法是将参数保存在宏中,然后稍后在字段格式中使用它。幸运的是,\href
它对接受的参数非常宽容,所以这样做是可行的。
\documentclass[oneside,a4paper,12pt]{article}
\usepackage{biblatex}
\usepackage{hyperref}
\newcommand*{\mypage}{}
\DeclareFieldFormat{howpublished:page}{\href{#1\#page=\mypage}{Link}}
\newcommand{\hdetail}[3]{%
\footnote{\cite[Appendix A-\thesection][]{#1}
\citeauthor{#1}'s \citefield{#1}{note} of \citedate{#1}, #3
\def\mypage{#2}%
\citefield{#1}[howpublished:page]{howpublished}%
}%
}
\begin{filecontents}{\jobname.bib}
@misc{161206.bmg.bcw.eml.1029,
author = {{Big mak}},
note = "Email 1029",
title = {161206.bmg.bcw.eml.1029.Bundle.10.footnotes.ocr.pdf},
date = "2016-12-06",
howpublished = {./biblio/161206.bmg.bcw.eml.1029.Bundle.10.footnotes.ocr.pdf},
}
@misc{161227.bmg.bcw.let.0002,
author = {{Big mak}},
note = "Letter 0002",
title = {161227.bmg.bcw.let.0002.Bundle.30.footnotes.ocr.pdf},
date = "2016-12-27",
howpublished = {./biblio/161227.bmg.bcw.let.0002.Bundle.30.footnotes.ocr.pdf},
}
@misc{161229.bcw.bmg.mom.0001,
author = {{Big cojones}},
note = "Minutes of meeting 0001",
title = {161229.bcw.bmg.mom.0001.Bundle.11.footnotes.ocr.pdf},
date = "2016-12-29",
howpublished = {./biblio/161229.bcw.bmg.mom.0001.Bundle.11.footnotes.ocr.pdf},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\begin{document}
\section{A Section}
An item.\hdetail{161206.bmg.bcw.eml.1029}{1}{Something to say about it}
\end{document}