2012-01-23 6 views
4

Похоже, что это должна быть общая проблема, но я не нашел очевидного трюка. Рассмотрим knitr RNW файл ниже,фигура * окружающая среда в twocolumn knitr/Sweave document

\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} 

Я хотел бы это широкая фигура, чтобы охватить две колонки, используя среду в {figure*} LaTeX. Есть ли крючок для этого?

EDIT: обертывание куска в figure* дает следующий выход.

enter image description here

+0

Вы можете иметь больше удачи по адресу: //tex.stackexchange.com/ –

+0

@ MartinSchröder да, согласен. Но я, вероятно, должен свести его к проблеме латекса, и я не уверен, откуда возникла среда «kframe» (из источника это похоже на частное сообщение). – baptiste

ответ

6

два факта:

  1. knitr делает все доступным для вас, поэтому LaTeX трюки часто ненужные;
  2. есть chunk hook, с помощью которого вы можете обернуть результаты вашего куска;

простодушных решений:

knit_hooks$set(chunk = function(x, options) { 
         sprintf('\\begin{figure*}\n%s\n\\end{figure*}', x) 
}) 

Я оставляю остальную часть работы для вас, чтобы заботиться о более подробно в options (например, при options$fig.keep == 'none', вы не должны обернуть вывод в figure*) , Вы можете посмотреть, как the default chunk hook для LaTeX определен в knitr, чтобы лучше знать, как работает крюк chunk.

Однако в этом случае я предпочитаю писать код LaTeX самостоятельно в документе, а не автоматически его создавать. После того, как вы получили figure*, вы можете начать думать о \caption{} и \label{} (not hard, но я все еще хочу их увидеть в LaTeX).

+0

Звучит очень многообещающе, спасибо. Однако, как я понимаю, этот крючок будет применяться к каждому фрагменту документа, верно? Если я хочу только один конкретный кусок, чтобы иметь такое поведение, я должен, вероятно, определить новый дополнительный крючок, скажем, fullwidth. Правильно ли я это понял? – baptiste

+0

Да, это относится ко всем кускам. Для индивидуального управления вы можете добавить параметр chunk, например 'fullwidth', а затем использовать' if (options $ fullwidth) {use figure * ...} else {normal output} 'в куске блока, а кусок выглядит как' < <..., fullwidth = TRUE >> = ' –

+0

Моя первая попытка действительно заключалась в том, чтобы обернуть кусок в' \ begin {figure *} \ end {figure *} ', но по какой-то причине выравнивание нарушено (см. править). – baptiste

2

Не уверен, что о том, как knitr но Sweave (и основного латекса) есть на самом деле трюк:. Есть код 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} 

я получил ниже документ (который я затем преобразованный из PDF в PNG):

enter image description here

+0

уверен, спасибо, но это не _elegant_, не так ли? – baptiste

+0

Давай, ты сейчас в Содружестве. Вы ушли * элегантность * назад домой :) Там могут быть и другие трюки. Всегда полезно проверить виньетку, в которой Ахим Цейлейс является автором (соавтором), поскольку он является бесконечным источником латексных трюков. –

+0

, по общему признанию, я вяжущий, но, надеюсь, существует более аккуратный способ. Если бы я использовал этот трюк, у меня, вероятно, было бы «заваривание» надежно связать графическое имя файла между R и LaTeX. – baptiste

0

У меня также была аналогичная проблема при подготовке фигуры, которая должна охватывать две колонки в двухколоночной конференции IEEE.

Установка крючка куска вызвала некоторую странную ошибку в моей настройке. Даже этот простой крюк: knit_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*">>= 
@ 
+0

вопрос и ответ @Yihui датируются 2012 годом, так что все может измениться – baptiste