图*两列knitr/Swave文档中的环境

图*两列knitr/Swave文档中的环境,r,knitr,tex,sweave,R,Knitr,Tex,Sweave,听起来这应该是一个常见的问题,但我没有发现明显的窍门。 考虑下面的KNITR RNW文件, \documentclass[twocolumn, 12pt]{article} \usepackage{graphicx} \begin{document} %\SweaveOpts{dev=pdf, fig.align=center} \begin{figure*} <<aaa, fig.width=8, fig.height=5, fig.show=hold>>= plot(

听起来这应该是一个常见的问题,但我没有发现明显的窍门。 考虑下面的KNITR RNW文件,

\documentclass[twocolumn, 12pt]{article}
\usepackage{graphicx}
\begin{document}
%\SweaveOpts{dev=pdf, fig.align=center}
\begin{figure*}
<<aaa, fig.width=8, fig.height=5, fig.show=hold>>=
plot(1,1)
@
\end{figure*}
\end{document}
\documentclass[twocolumn,12pt]{article}
\usepackage{graphicx}
\开始{document}
%\SweaveOpts{dev=pdf,fig.align=center}
\开始{图*}
=
地块(1,1)
@
\结束{图*}
\结束{document}
我希望这个宽图跨越两列,使用
{figure*}
LaTeX环境。有钩子吗

编辑:将区块包装在
图*
中,将给出以下输出


不确定knitr的使用方法,但对于Swave(和基本乳胶),实际上有一个技巧:让R代码生成一个pdf文件,然后使用标准的
\includegraphics
将其拉入

因此:

\documentclass[twocolumn, 12pt]{article}
\usepackage{graphicx}
\begin{document}
%\SweaveOpts{dev=pdf}

<<aaa,fig=FALSE,print=FALSE,echo=FALSE>>=
pdf("mychart.pdf", width=6, height=3)
set.seed(42)
plot(cumsum(rnorm(100)), type='l', main="yet another random walk")
invisible(dev.off())
@

\begin{figure*}
  \includegraphics{mychart.pdf}
\end{figure*}

\end{document}
\documentclass[twocolumn,12pt]{article}
\usepackage{graphicx}
\开始{document}
%\SweaveOpts{dev=pdf}
=
pdf(“mychart.pdf”,宽=6,高=3)
种子(42)
绘图(cumsum(rnorm(100)),type='l',main=“又一次随机游走”)
不可见(dev.off())
@
\开始{图*}
\includegraphics{mychart.pdf}
\结束{图*}
\结束{document}
我得到了下面的文档(然后我将其从pdf转换为png):

两个事实:

  • knitr
    使您可以访问所有内容,因此乳胶技巧通常是不必要的
  • 有一种方法可以包装块结果 一个简单的解决方案是:

    knit_hooks$set(chunk = function(x, options) {
                           sprintf('\\begin{figure*}\n%s\n\\end{figure*}', x)
    })
    
    我将剩下的工作留给您在
    选项中处理更多细节(例如,当
    选项$fig.keep=='none'
    时,您不应将输出包装在
    图*
    )。您可能希望了解如何在
    knitr
    中定义for LaTeX,以便更好地了解
    chunk
    hook的工作原理


    然而,在这种情况下,我倾向于自己在文档中编写LaTeX代码,而不是自动创建它。在你得到了
    图*
    之后,你可能会开始考虑
    \caption{}
    \label{}
    (,但我仍然想在LaTeX中看到它们)。

    我在准备IEEE两栏会议论文中应该跨越两栏的图时也遇到了类似的问题

    设置区块挂钩在我的设置中导致了一些奇怪的错误。 即使是这个简单的钩子:
    knit\u hooks$set(chunk=function(x,options)x)

    但是在研究了
    knitr::opts_chunk$get()
    之后,我意识到简单地设置
    fig.env=“figure*”
    就可以优雅地解决问题

    以下是我的区块在Rnw文件中的外观:

    <<fig1, fig.width=18, fig.height=6, fig.env="figure*">>=
    @
    
    =
    @
    
    C'mon,你现在是英联邦成员了。你在回家的路上离开了雅致:)可能还有其他的把戏。检查有阿希姆·泽利斯作为(合作)作者的小插曲总是一个好主意,因为他是乳胶技巧的永无止境的来源。无可否认,我喜欢编织,但我相信有更整洁的方式。如果我使用这个技巧,我可能会让
    brew
    在R和LaTeX之间可靠地链接图形文件名。我倾向于有一个子目录figures/,并将swave块命名为与生成的pdf相同的名称。效果很好。另外,如果pdf存在,你可以获得基本免费的b/c缓存,你可以决定跳过重新创建它。我进行可复制研究的方法是让软件处理我不能相信自己能够可靠完成的事情。一致的命名方案就是其中之一。我恭敬地建议你尝试一下knitr,事实证明,它改变了人们的思维方式,与(cache | pgf |)相比,它有一些老把戏。它在排队,这是一种礼貌的说法,表示我还有一公吨其他事情要做。此外,我们在这里讨论的w.r.t.Swave没有从可复制的研究方法中拿走任何东西。这听起来很有希望,谢谢。然而,据我所知,这个钩子将应用于文档中的每个块,对吗?如果我只想要一个特定的块具有这种行为,我可能应该定义一个新的可选钩子,比如fullwidth。我做对了吗?是的,它适用于所有的块。对于单个控件,您可以添加一个区块选项,如
    fullwidth
    ,然后在区块挂钩中使用
    if(options$fullwidth){use figure*..}else{normal output}
    ,区块看起来像
    =
    我的第一次尝试确实是在
    \begin{figure*}\end{figure*}中包装区块
    但由于某种原因,对齐被破坏(请参见编辑)。我不知道。这听起来像是一个完全的乳胶问题。为您做一些作业,比如为什么
    \centering{}
    图*
    中不起作用。查看latex输出,整个块位于{kframe},这改变了位置。这是一些相当先进的特克斯,显然是来自框架乳胶包的作者。确实是一个TeX问题。你在@MartinSchröder可能会更幸运是的,同意。但我可能应该把它归结为乳胶问题,我不确定
    kframe
    环境从何而来(从源头上看,它看起来像是一个私人通信)。这个问题和@Yihui的答案可以追溯到2012年,所以事情很可能已经发生了变化