动态引用Sweave文档中R注释中的数字

时间:2012-01-26 18:24:45

标签: r latex pdflatex sweave

我想找到一种方法来使用LaTeX \ref{}标记来评论Sweave .Rnw文件中的R代码。这是两个例子,一个是印刷品

http://cm.bell-labs.com/cm/ms/departments/sia/project/nlme/UGuide.pdf

和一个用来合作的人:

.Rnw文件

% File: example.Rnw

\documentclass{article}
\usepackage{fullpage}
\usepackage{graphics}
\usepackage{Sweave} 
\usepackage[margin = 10pt, font=small, labelfont={bf}]{caption}

\begin{document}

Here is an example file to show what I want to do.  I would like to figure out how to use the \LaTeX\ reference command to reference a figure being generated by R code.  Note in the R code, in a comment there is a reference to the figure, but of course the output file shows a verbatim copy of the \LaTeX\ markup.  Does anyone know how to get something for Figure \ref{fig2}?

<< example plot >>=
library(reshape)
library(ggplot2)

n <- 100
lambda <- 1 / 3 
x <- seq(0, qexp(0.999, rate = lambda), length = n)
q1.a <- data.frame(x =   x,
                   f =   dexp(x, rate = lambda),
                   F =   pexp(x, rate = lambda))

q1.a <- melt(q1.a, id.vars = 'x')
g <- ggplot(q1.a) +                                     # Produces \ref{fig1} 
       aes(x = x, y = value) + 
       geom_line() + 
       facet_wrap( ~ variable, scale = "free_y")
ggsave(g, filename = "example1.jpeg")                    
@

\begin{figure}[h]
\centering
\includegraphics[width = 0.48\textwidth]{./example1}
\caption{Exponential Distribution based plots.}
\label{fig1}
\end{figure}

Here is more of what I would like to see:

<< example plot 2 >>=
ggsave(g + geom_point(), filename = "example2.jpeg")    # Produces Figure 2
@

\begin{figure}
\centering
\includegraphics[width = 0.48\textwidth]{./example2}
\caption{Exponential Distribution based plots with points and lines.}
\label{fig2}
\end{figure}

\end{document}

并且使用R命令构建pdf

Sweave(file = 'example.Rnw',
       engine = "R",
       keep.source = 'TRUE',
       echo = 'TRUE',
       results = 'verbatim')

tools::texi2dvi(file  = "example.tex",
                pdf   = TRUE,
                clean = TRUE)

有关如何做到这一点的任何见解。

1 个答案:

答案 0 :(得分:1)

以下是通过重新定义Sinput包含源代码的Sweave环境来解决此问题的一种方法。默认情况下,它是一个简单的verbatim环境,latex不会为令牌处理。诀窍是重新定义它以使用alltt环境,该环境允许在alltt环境中解析一些令牌。请注意,这可能会导致我不知道的不必要的副作用,因此请谨慎使用!

这是一个可重复的例子。如果您编译它,您将生成一个文件,其中ref{fig1}被图号替换。

\documentclass{article}
\usepackage{Sweave}
\usepackage{alltt}
\renewenvironment{Sinput}{\begin{alltt}}{\end{alltt}}

\begin{document}

In this document, we will create a plot using `R`, and reference its position in 
the source code.

<<produce-plot, results = hide>>=
pdf('example1.pdf')
plot(1:10, 1:10)     # Produces Figure \ref{fig1}
dev.off()
@

\begin{figure}
\includegraphics{example1.pdf}
\caption{Figure 1}
\label{fig1}
\end{figure}

\end{document}