2015-04-15 7 views
5

Ich habe kürzlich Knitr entdeckt und verwende es hauptsächlich, um Plots mit dev=tikz zu erstellen, um einen Latex-Satz leicht zu bekommen. Ich verstehe jedoch nicht, wie man die Chunk-Optionen fig.width und out.width konsistent setzt.Wie fig.width und out.width konsistent mit knitr gemacht werden?

Ich meine, ich weiß, dass die erste ist eine R-Option, während der zweite die mit \includegraphics kommenden Latex Option ist, aber es scheint, wie wenn fig.width zu groß ist im Vergleich zu out.width dann die Linien sehr dünn sind, weil Latex die schrumpfen Bild. Auf der anderen Seite, wenn es zu klein ist, dehnt es Latex und alles ist zu groß.

Grundsätzlich hätte ich auch gerne eine Einstellung in der ich nur die out.width wähle und dann die Dicke der Zeilen und Texte mit der Textgröße des Dokuments übereinstimmt.

Ich schließe ein MWE ein, das mein Problem darstellt. Auch habe ich fig.height im ersten Beispiel eingestellt ansonsten wäre das Bild dann größer als die Seite, das verstehe ich auch nicht so gut.

Jede Hilfe ist herzlich willkommen!

\documentclass[12pt,a4paper]{article} 
\usepackage[utf8]{inputenc} 
\usepackage[english]{babel} 
\usepackage[T1]{fontenc} 
\usepackage{graphicx} 

<<setup, include=FALSE, cache=FALSE>>= 
    library(knitr) 
    options(formatR.arrow=TRUE,width=50) 
    opts_chunk$set(fig.path='figure/graphics-', 
       cache.path='cache/graphics-', 
       fig.align='center', 
       dev='tikz') 
@ 

\begin{document} 
\begin{figure}[!ht] 
    <<fig_1,fig.width=2, fig.height = 3,out.width = '\\textwidth',echo=FALSE>>= 
    x = seq(1,3,l=100) 
    plot(x,cos(x), type ="l", xlab = "x", ylab = "y") 
    @ 
\end{figure} 
\begin{figure}[!ht] 
<<fig_2,fig.width=10, out.width = '\\textwidth',echo=FALSE>>= 
    x = seq(1,3,l=100) 
    plot(x,cos(x), type ="l", xlab = "x", ylab = "y") 
    @ 
\end{figure} 

\end{document} 
+0

die Ziffernhöhe einen Standardwert hat (ich schätze etwa 5 Zoll, nicht überprüfen), und da Sie eine geringere Breite einstellen, wenn Latex Ändert die Größe der Grafik auf die volle Seitenbreite, die Höhe wird proportional vergrößert. – baptiste

Antwort

6

Grundsätzlich sollte keine Größenänderung vorgenommen werden, nachdem die tikzpicture erstellt wurde, weil es die Übereinstimmung mit Textart verloren. Wenn die Chunk-Option cache=FALSE gesetzt ist, hat out.width keine Auswirkung, da keine PDF-Ausgabe erstellt wird. Daher müssen für jedes Stück exakte Maße in Zoll für fig.width und fig.height angegeben werden.

Nach einigen Recherchen sowohl auf Stackoverflow und in Knitr Websites, ich habe einen Trick haben fast die gleiche Benutzer Experiment, also gefunden, die ich will nicht über reale Größen kümmern, sondern nur denken, relativ zu \textwidth und andere Latex Variablen:

  • im Setup-Chunk definiert R Variablen mit expliziten Namen (wie paperwidth, textwidth entsprechend die Latex einer in Zoll, zum Beispiel eines A4-Papier (w, h) = (8,3, 11,7) .
  • in jedem Stück mit einer Handlung, können Sie dann fig.width = 0.5*paperwidth für ex verwenden Hier reichlich

ist ein MWE:

\documentclass[12pt,a4paper]{article} 
\usepackage[utf8]{inputenc} 
\usepackage[english]{babel} 
\usepackage[T1]{fontenc} 
\usepackage{graphicx} 
\usepackage{tikz} 
<<setup, include=FALSE, cache=FALSE>>= 
    library(knitr) 
    options(formatR.arrow=TRUE,width=50) 
    opts_chunk$set(fig.path='figure/graphics-', 
       cache.path='cache/graphics-', 
       fig.align='center', 
       dev='tikz', 
       external=TRUE, 
       echo=FALSE 
       ) 
    a4width<- 8.3 
    a4height<- 11.7 
@ 

\begin{document} 
\begin{figure}[!ht] 
\centering 
<<fig_1, fig.width = 0.4*a4width, fig.height = 0.2*a4height>>= 
    x = seq(1,3,l=100) 
    plot(x,cos(x), type ="l", xlab = "x", ylab = "y") 
@ 

<<fig_2, fig.width = 0.2*a4width, fig.height = 0.5*a4height>>= 
    x = seq(1,3,l=100) 
    plot(x,cos(x), type ="l", xlab = "x", ylab = "y") 
@ 

\caption{Test figure} 
\end{figure} 
\end{document} 
1

Sie sollten wahrscheinlich haben \begin{figure} nicht da knitr sie für Sie umfassen wird. Außerdem finde ich es am besten, wenn LaTeX die Größe der Figuren nicht ändert, d. H. Sie haben bereits die richtige Größe. Hier ist ein Beispiel, wo ich die Textbreite auf 6 Zoll und die Ziffernbreite auf den gleichen Wert einstelle.

\documentclass[12pt,a4paper]{article} 
\usepackage[utf8]{inputenc} 
\usepackage[english]{babel} 
\usepackage[T1]{fontenc} 
\usepackage{graphicx} 

<<setup, include=FALSE, cache=FALSE>>= 
    library(knitr) 
    options(formatR.arrow=TRUE,width=50) 
    opts_chunk$set(fig.path='figure/graphics-', 
       cache.path='cache/graphics-', 
       fig.align='center', 
       dev='tikz') 
@ 

\usepackage[text={6in,9in},centering]{geometry} 
\begin{document} 

    <<fig_1, fig.width=6, echo=FALSE>>= 
    x = seq(1,3,l=100) 
    plot(x,cos(x), type ="l", xlab = "x", ylab = "y") 
@ 

<<fig_2, fig.width=6, out.width = '\\textwidth',echo=FALSE>>= 
    x = seq(1,3,l=100) 
    plot(x,cos(x), type ="l", xlab = "x", ylab = "y") 
@ 

\end{document} 
+0

danke für die Antwort. Es war nicht, dass ich genau erwartet wurde, aber ließ mich tiefer in knitr Optionen schauen. Schließlich hatten Sie Recht damit, dass 'out.width' NICHT mit Tikz-Geräten verwendet werden sollte. Ich habe einige Kommentare zu meiner Frage, also füge ich sie als Antwort hinzu. – clemlaflemme

+0

und figure environment wird nur gesetzt, wenn die Chunk-Option 'fig.cap' gesetzt ist – clemlaflemme

Verwandte Themen