扩展命令以根据传入的变量构建 href

扩展命令以根据传入的变量构建 href

我经常收集大量(数千个)pdf 文档,并编写一个脚本,根据文件命名系统将bash它们编译成一个文件。在此过程中,脚本先前会生成一个静态文档,并将其放入脚注引用中。静态文档总是从第 1 页打开链接的文档(可能有 100 页长),但任何单个文档可能有数十个引用,每个引用都指向不同的页面,因此读者必须仔细查找。bib\hrefhowpublished\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

biblatexbiblatex的数据打印命令是不可扩展的,因此通过字段格式等在“内部”进行所有处理通常更安全。

这里还有一个额外的困难,那就是我们想要将.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}

相关内容