【问题标题】:Chunk reference using knitr, r markdown and pandoc (pander)使用 knitr、r markdown 和 pandoc (pander) 的块引用
【发布时间】:2013-06-14 13:33:42
【问题描述】:

我在尝试使用 pandoc.convert 将其转换为 .pdf 的 r markdown 文档中引用块时遇到问题。

如果我在文本中包含\label{mylabel} - 我可以通过\ref{mylabel} 引用它。但是,我认为我可能能够类似地引用一个块(或一个块中的表/图) - 但我没有运气。

例如,对于块:

```{r myplot, echo=FALSE, warning=FALSE}
plot(cars)
```

虽然我可以输入\ref{myplot}\ref{fig:myplot} 甚至是内部降价参考[car plot](myplot)。文档似乎提到标签是根据块的名称创建的,这些是与类似问题相关的建议格式。但似乎没有一个工作。

对于表(我使用 pander 创建的)也是如此 - 我有类似的块:

```{r car_sum}
library(pander)
car_summary<-summary(cars)
pander(car_summary, caption = "This is a summary of cars")
```

当使用“pandoc.convert”从 .md 文件转换为 .pdf 时,表格被赋予了一个很好的标题“表 3 这是汽车的摘要”并编号,但我似乎无法使用标签作为参考\ref{car_sum} 它总是显示为“??”。一些论坛似乎提到您必须在标签名称之前包含“标签:”或“无花果:”,但这仍然对我不起作用。

可以在文本中进行块引用吗?如果是这样,需要输入什么才能正确执行此操作,以便它在最终文档中显示类似“参见表 2”的内容。

【问题讨论】:

  • AFAIK 在 pandoc 中,您必须在绘图标题中明确写一个乳胶\label{},并在文本中引用它。它只适用于 LaTeX。我希望我错了。
  • 我不确定 Markdown 是否可行。我想 Markdown 最常见的问题是人们对它的要求太多了...... LaTeX 用户经常想到“见表 2”,而 Markdown 用户应该只想到“见下表/上表”。 LaTeX 可以是非线性的,而 Markdown 最好是非常线性的。我希望我也错了。
  • @Yihui,我正在查看 LazyWeave 并考虑您的引擎/挂钩设置......我在下面答案中的概念肯定可以集成到诸如 Latex 包之类的形式中。在这些方面还有另一个问题,我相信你提到了一些关于 html 和 Latex 合并的事情......啊,是的,stackoverflow.com/questions/16173995/…
  • 有一项倡议是为了产生一种降价风格,增加了学术写作(科学论文、博客等)所需的一些功能,其中一个缺失的功能是对数字和表格的内联链接/引用,而没有过多地扩展标记。有关更多详细信息,请参阅 github repo wiki

标签: r knitr pandoc r-markdown


【解决方案1】:

一切皆有可能!!

请参阅this gist,它符合您的描述。只需保存并编织它以查看它的实际效果...出于某种原因,Rpub 不想发布它(未知错误)。

通过 pandoc 将 knitr 生成的 .html 转换为 .pdf 进行测试也产生了工作链接,这是一个不错的奖励!

主力是::

```{r setup, echo=FALSE, results='hide'}
chunkref <- local({
  function(chunklabel) {
    sprintf('[%s](#%s)', chunklabel, chunklabel )
  }  
})

secref <- local({
  function(seclabel) {
    sprintf('[%s](#%s)', seclabel, seclabel )
  }  
})

pgref <- local({
  function(n)
  sprintf('[Page-%i](#Page-%i)', n, n)
})

sec <- local({
  function(seclabel) {
    sprintf('# <a name="%s"/> %s', seclabel, seclabel )
  }  
})

pgcount <- local({
  pg <- 0
  function(inc=T) {
    if( inc ) { pg <<- pg + 1 }
    return( pg )
  }
})

pganchor <- local({
  function(doLabel=T) {
    if( doLabel) {
      sprintf('\n-----\nPage-%i\n<a name="Page-%i"/>\n', pgcount(inc=F), pgcount() )
    } else {
      sprintf('\n<a name="Page-%i"/>\n', pgcount() )
    }
  }
})

knit_hooks$set( anchor = function(before, options, envir) {
  if ( before ) {
    sprintf('<a name="%s"/>\n', options$label )
  }
})

knit_hooks$set( echo.label = function(before, options, envir) {
  if ( before ) {
    sprintf('> %s', options$label )
  }
})

knit_hooks$set( pgbreak = function(before, options, envir) {
  if ( !before ) {
    pganchor();
  }
})
````

这允许创建多种类型的引用...

Inline: `r sec("Introduction")` then `r secref("Introduction")`

或者

作为块选项:

```{r car-summary, echo=T, warning=FALSE, anchor=T, pgbreak=T, echo.label=F}`

然后

`r chunkref("car-summary")`

即使是“页面顶部”链接和“页面底部”标记和标签...

【讨论】:

    【解决方案2】:

    引用数字的更简单的解决方案:将其放在 fig.cap 字段中(双 \\ 以转义第一个 \):

    fig.cap="\\label{mylabel}Caption of my figure."
    

    然后,使用\autoref{mylabel}引用正文中的图。

    我正在使用带有 Rmarkdown 的 RStudio。完整的 RMD 文档:

    ---
    output: pdf_document
    ---
    
    ```{r fig.cap="\\label{mylabel}Caption of my figure."}
    plot(1)
    ```
    
    The generated figure is \autoref{mylabel}.
    

    【讨论】:

    • 欢迎来到 SO 并感谢您分享您的解决方案。我认为这很聪明。我“稍微”编辑了您的帖子,使其更清晰,可读性更好。如果您不同意,请随时回滚编辑。
    • 这对我来说效果很好,并且比当前的“获胜”答案要简单得多。谢谢!
    • 在序言中不添加 hyperref 包是否有效?
    猜你喜欢
    • 2021-08-26
    • 2017-03-26
    • 2013-07-31
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2013-05-13
    相关资源
    最近更新 更多