如何系统地更改 knitr \label{} 行为以添加超链接锚点
How to systematically change knitr \label{} behavior to add hyperlink anchors
我想更改 knitr
在 LaTeX
中创建 figure
环境时的行为,以调用与 \label{}
不同的 LaTeX
命令,例如,\alabel{}
我使用 hyperref
LaTeX
包将 \alabel
定义为 运行 \label{foo}
以及 \hypertarget{foo}{}
。我这样做是为了在网络浏览器中构建一个 URL 以到达使用 pdflatex
构建的 .pdf
文档中的特定位置,例如http://.../my.pdf#nameddest=foo
.
如何覆盖 \label{}
或在图中发出额外的 \hypertarget{same label used by \label{}
?
这是在 .Rnw
文件的上下文中。我希望锚出现在 figure
环境 for optimal positioning of the cursor when jumping into the
.pdf` 文档中。
更新
在重新考虑这一点时,我认为最好不要生成 hypertarget
锚点,而是编写一个 R
函数来解析 LaTeX
aux
文件以检索页码的引用(\newlabel
行)生成所需的 URL 到 pdf
文件。在 .Rnw
或 .Rmd
文件中,我可以从一个句子中调用此函数以插入计算的 URL.
更新
我最终还是决定采用@werner 的出色方法,该方法完美无缺。对于任何对不需要使用 hypertarget
的基于 R
的方法感兴趣的人,这里是设置它所需的 LaTeX
代码 - 这处理了物理页面的情况编号与逻辑页码不匹配(例如,使用逻辑编号,例如章节编号 - 章节中的页面。
% Creates .pag file mapping absolute page numbers to logical page
% numbers; works with R function latexRef
\newwrite\pgfile
\immediate\openout\pgfile=\jobname .pag
\newcounter{abspage}
\setcounter{abspage}{0}
\useackage{everypage}
\AddEverypageHook{%
\addtocounter{abspage}{1}
\immediate\write\pgfile{\thepage, \theabspage}%
}
\AtEndDocument{\clearpage\immediate\closeout\pgfile}
这是在 .aux, .pag
文件中查找的 R
函数:
## Create hyperlink to appropriate physical page in a pdf document
## created by pdflatex given the .aux and .pag file. Absolute and
## named page numbers are store in the .pag file created by hslide.sty
latexRef <- function(label, base, name, path='doc/',
blogpath='/home/harrelfe/R/blog/blogdown/static/doc/',
lang=c('markdown', 'latex')) {
lang <- match.arg(lang)
aux <- paste0(blogpath, base, '.aux')
if(! file.exists(aux))
stop(paste('no file named', aux))
path <- paste0(path, base, '.pdf')
pag <- paste0(blogpath, base, '.pag')
pagemap <- NULL
if(file.exists(pag)) {
p <- read.table(pag, sep=',')
pagemap <- trimws(p[[2]])
names(pagemap) <- trimws(p[[1]])
}
r <- readLines(aux)
w <- paste0('\\newlabel\{', label, '\}')
i <- grepl(w, r)
if(! any(i)) stop(paste('no label =', label))
r <- r[i][1]
r <- gsub('\{', ',', r)
r <- gsub('\}', ',', r)
x <- scan(text=r, sep=',', what=character(0), quiet=TRUE)
section <- x[5]
if(section != '') section <- paste0(' Section ', section)
page <- trimws(x[7])
if(length(pagemap)) page <- pagemap[page]
url <- paste0('http://fharrell.com/', path, '#page=', page)
switch(lang,
markdown = paste0('[', name, section, '](', url, ')'),
latex = paste0('\href{', url, '}{', name, section, '}')
)
}
您可以将以下内容添加到您的 LaTeX 序言中,通过以下方式使用 \label
-和-\hypertarget
的组合全局替换 \label
:
---
title: 'A title'
author: 'An author'
date: 'A date'
output:
pdf_document:
keep_tex: true
header-includes:
- \AtBeginDocument{
\let\oldlabel\label
\renewcommand{\label}[1]{\oldlabel{#1}\hypertarget{#1}{}}
}
---
See Figure \ref{fig:figure}.
\begin{figure}
\caption{A figure caption}
\label{fig:figure}
\end{figure}
我想更改 knitr
在 LaTeX
中创建 figure
环境时的行为,以调用与 \label{}
不同的 LaTeX
命令,例如,\alabel{}
我使用 hyperref
LaTeX
包将 \alabel
定义为 运行 \label{foo}
以及 \hypertarget{foo}{}
。我这样做是为了在网络浏览器中构建一个 URL 以到达使用 pdflatex
构建的 .pdf
文档中的特定位置,例如http://.../my.pdf#nameddest=foo
.
如何覆盖 \label{}
或在图中发出额外的 \hypertarget{same label used by \label{}
?
这是在 .Rnw
文件的上下文中。我希望锚出现在 figure
环境 for optimal positioning of the cursor when jumping into the
.pdf` 文档中。
更新
在重新考虑这一点时,我认为最好不要生成 hypertarget
锚点,而是编写一个 R
函数来解析 LaTeX
aux
文件以检索页码的引用(\newlabel
行)生成所需的 URL 到 pdf
文件。在 .Rnw
或 .Rmd
文件中,我可以从一个句子中调用此函数以插入计算的 URL.
更新
我最终还是决定采用@werner 的出色方法,该方法完美无缺。对于任何对不需要使用 hypertarget
的基于 R
的方法感兴趣的人,这里是设置它所需的 LaTeX
代码 - 这处理了物理页面的情况编号与逻辑页码不匹配(例如,使用逻辑编号,例如章节编号 - 章节中的页面。
% Creates .pag file mapping absolute page numbers to logical page
% numbers; works with R function latexRef
\newwrite\pgfile
\immediate\openout\pgfile=\jobname .pag
\newcounter{abspage}
\setcounter{abspage}{0}
\useackage{everypage}
\AddEverypageHook{%
\addtocounter{abspage}{1}
\immediate\write\pgfile{\thepage, \theabspage}%
}
\AtEndDocument{\clearpage\immediate\closeout\pgfile}
这是在 .aux, .pag
文件中查找的 R
函数:
## Create hyperlink to appropriate physical page in a pdf document
## created by pdflatex given the .aux and .pag file. Absolute and
## named page numbers are store in the .pag file created by hslide.sty
latexRef <- function(label, base, name, path='doc/',
blogpath='/home/harrelfe/R/blog/blogdown/static/doc/',
lang=c('markdown', 'latex')) {
lang <- match.arg(lang)
aux <- paste0(blogpath, base, '.aux')
if(! file.exists(aux))
stop(paste('no file named', aux))
path <- paste0(path, base, '.pdf')
pag <- paste0(blogpath, base, '.pag')
pagemap <- NULL
if(file.exists(pag)) {
p <- read.table(pag, sep=',')
pagemap <- trimws(p[[2]])
names(pagemap) <- trimws(p[[1]])
}
r <- readLines(aux)
w <- paste0('\\newlabel\{', label, '\}')
i <- grepl(w, r)
if(! any(i)) stop(paste('no label =', label))
r <- r[i][1]
r <- gsub('\{', ',', r)
r <- gsub('\}', ',', r)
x <- scan(text=r, sep=',', what=character(0), quiet=TRUE)
section <- x[5]
if(section != '') section <- paste0(' Section ', section)
page <- trimws(x[7])
if(length(pagemap)) page <- pagemap[page]
url <- paste0('http://fharrell.com/', path, '#page=', page)
switch(lang,
markdown = paste0('[', name, section, '](', url, ')'),
latex = paste0('\href{', url, '}{', name, section, '}')
)
}
您可以将以下内容添加到您的 LaTeX 序言中,通过以下方式使用 \label
-和-\hypertarget
的组合全局替换 \label
:
---
title: 'A title'
author: 'An author'
date: 'A date'
output:
pdf_document:
keep_tex: true
header-includes:
- \AtBeginDocument{
\let\oldlabel\label
\renewcommand{\label}[1]{\oldlabel{#1}\hypertarget{#1}{}}
}
---
See Figure \ref{fig:figure}.
\begin{figure}
\caption{A figure caption}
\label{fig:figure}
\end{figure}