2012-01-23 1 views
4

Cela semble être un problème courant, mais je n'ai pas trouvé de truc évident. Considérons le knitr fichier Rnw ci-dessous,figure * environnement dans 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} 

Je voudrais que cette grande figure pour enjamber deux colonnes, en utilisant un environnement {figure*} LaTeX. Y a-t-il un crochet pour ça?

EDIT: l'enroulement du bloc en figure* donne la sortie suivante.

enter image description here

+0

Vous pouvez avoir plus de chance à l'adresse http: //tex.stackexchange.com/ –

+0

@ MartinSchröder oui, d'accord. Mais je devrais probablement le réduire au problème du latex, et je ne suis pas sûr d'où vient l'environnement 'kframe' (à la source, cela ressemble à une communication privée). – baptiste

Répondre

6

Deux faits:

  1. knitr rend tout accessible pour vous, astuces LaTeX sont souvent inutiles;
  2. il y a un chunk hook avec lequel vous pouvez envelopper vos résultats de morceau;

Une des solutions simples d'esprit est:

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

Je laisse le reste du travail pour vous de prendre soin de plus de détails dans options (par exemple lorsque options$fig.keep == 'none', vous ne devriez pas envelopper la sortie dans figure*) . Vous voudrez peut-être voir comment the default chunk hook pour LaTeX est défini dans knitr pour savoir comment fonctionne le crochet chunk.

Cependant, dans ce cas, j'ai tendance à écrire le code LaTeX par moi-même dans le document au lieu de le créer automatiquement. Après avoir obtenu figure*, vous pouvez commencer à penser à \caption{} et \label{} (not hard, mais je veux toujours les voir dans LaTeX).

+0

cela semble très prometteur, merci. Cependant, si je comprends bien, ce crochet s'appliquerait à chaque morceau dans le document, non? Si je veux seulement un morceau particulier avoir ce comportement, je devrais probablement définir un nouveau crochet facultatif, disons fullwidth. Ai-je bien compris? – baptiste

+0

Oui, cela s'applique à tous les morceaux. Pour le contrôle individuel, vous pouvez ajouter une option de bloc comme 'fullwidth', puis utiliser' if (options $ fullwidth) {use figure * ...} else {normal output} 'dans le crochet de morceau, et le bloc ressemble à' < <..., fullwidth = TRUE >> = ' –

+0

Mon premier essai était en effet d'envelopper le morceau dans' \ begin {figure *} \ end {figure *} 'mais pour une raison quelconque, l'alignement est rompu (voir edit). – baptiste

2

Je ne sais pas comment knitr mais pour Sweave (et le latex de base), il y a en fait une astuce:. A le code R produire un fichier PDF, puis utiliser le standard \includegraphics pour le tirer dans

donc, avec ceci:

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

Je suis le document ci-dessous (que je puis converti de pdf à .png):

enter image description here

+0

bien sûr, merci, mais ce n'est pas _elegant_, n'est-ce pas? – baptiste

+0

Allez, vous êtes maintenant dans le Commonwealth. Vous avez quitté * l'élégance * chemin du retour à la maison :) Il peut y avoir d'autres astuces. C'est toujours une bonne idée de vérifier la vignette qui a Achim Zeileis comme un (co-) auteur car il est une source sans fin de tours de latex. –

+0

Je crois que je suis en train de tricoter, mais je crois qu'il existe une façon plus simple. Si je devais utiliser cette astuce, j'aurais probablement 'brasser 'relier de manière fiable le nom de fichier graphique entre R et LaTeX. – baptiste

0

J'ai également eu un problème similaire lors de la préparation d'une figure qui devrait couvrir deux colonnes dans un document de conférence à deux colonnes de l'IEEE.

La définition du crochet de bloc a causé une erreur étrange dans ma configuration. Même ce simple crochet: knit_hooks$set(chunk = function(x, options) x)

Mais après avoir regardé knitr::opts_chunk$get(), je réalise que la mise simplement fig.env="figure*" résout le problème d'une manière élégante.

Voici comment mon morceau ressemble dans un fichier Rnw:

<<fig1, fig.width=18, fig.height=6, fig.env="figure*">>= 
@ 
+0

la question et la réponse de @Yihui remontent à 2012, donc les choses ont bien changé – baptiste

Questions connexes