2016-04-25 14 views
2

(This question bedeutet dies nicht lösen, weil das über Zentrierung innerhalb Linienbreite war ich in die volle Seitenbreite interessiert bin..)xtable and knitr: Wie zentriert man die Tabelle auf die volle Seitenbreite?

ich eine Tabelle wie folgt produzieren:

\documentclass{article} 

\begin{document} 

<<tabletest, message=F, warning=F, echo = F, results = "asis">>= 
library(readr) 
library(xtable) 
# Create dummy data.frame 
values <- 1:14 
df <- t(data.frame(values, values)) 
colnames(df) <- paste("column", values, sep="") 
rownames(df) <- c("row1", "row2") 
ltable <- xtable(
    x = df 
) 
print(ltable) 
@ 

\end{document} 

Das Ergebnis sieht dies wie:

enter image description here

ich möchte diese auf der Seite horizontal zu zentrieren. Mein erster Versuch war das Einwickeln der Brocken in \centerline{}, aber das hat mich dies:

Runaway argument? 
{ \begin {table}[ht] \centering \begin {tabular}{rrrrrrrrrrrrrrr} \hline \ETC. 
! Paragraph ended before \centerline was complete. 
<to be read again> 
        \par 

Der interessante Teil in der resultierenden .tex-Datei wie folgt aussieht:

\centerline{ 
% latex table generated in R 3.2.5 by xtable 1.8-2 package 
% Mon Apr 25 16:40:48 2016 
\begin{table}[ht] 
\centering 
\begin{tabular}{rrrrrrrrrrrrrrr} 
    \hline 
& column1 & column2 & column3 & column4 & column5 & column6 & column7 & column8 & column9 & column10 & column11 & column12 & column13 & column14 \\ 
    \hline 
row1 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 \\ 
    row2 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 \\ 
    \hline 
\end{tabular} 
\end{table} 

} 

Wenn ich manuell bearbeiten zu diesem:

% latex table generated in R 3.2.5 by xtable 1.8-2 package 
% Mon Apr 25 16:40:48 2016 
\begin{table}[ht] 
\centerline{ 
\begin{tabular}{rrrrrrrrrrrrrrr} 
    \hline 
& column1 & column2 & column3 & column4 & column5 & column6 & column7 & column8 & column9 & column10 & column11 & column12 & column13 & column14 \\ 
    \hline 
row1 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 \\ 
    row2 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 \\ 
    \hline 
\end{tabular} 
} 
\end{table} 

Dann funktioniert es. Aber wie kann ich das automatisch erreichen? Nach this und this lesen, habe ich versucht:

x <- capture.output(print(xtable(ltable))) 
x <- gsub("\\\\centering", "", x, fixed=TRUE) # Remove \centering 
x <- gsub("\\begin{table}[ht]", "\\begin{table}[ht]\\centerline{", x, fixed=TRUE) # Add \centerline{ 
x <- gsub("\\end{table}", "\\end{table}}", x, fixed=TRUE) # Add ending } 

Aber das Format der x ist nicht, wie ich, wenn bekam print(ltable) früher Aufruf:

> print(x) 
[1] "% latex table generated in R 3.2.5 by xtable 1.8-2 package"                                                                    
[2] "% Mon Apr 25 16:51:02 2016" 

Das heißt, dies wird ausgegeben, um die Klammern mit Zahlen vor ist von jeder Linie und es wird keine Tabelle erzeugen. Kann mir jemand dabei helfen?

+0

Möchten Sie, dass der Tisch schwebt? –

+0

Ich möchte, dass der Tisch in der Mitte (horizontal gesprochen) der gesamten Seitenbreite positioniert wird. – L42

+0

Sicher. Dennoch kann es entweder schweben (es erscheint, wo es nach den LaTeX-Regeln passt) oder als Teil des Textes an einer Position erscheinen, die seiner Position im Quellcode entspricht. –

Antwort

3

Fall 1: Nicht-Floating-Tabelle

Wenn die Tabelle nicht schweben soll, ist es einfach, die tabular in einem makebox wie vorgeschlagen here einzuschließen:

\documentclass{article} 
\begin{document} 

<<echo = F, results = "asis">>= 
library(xtable) 

cat("\\makebox[\\textwidth]{") 
print(xtable(t(cars)[, 1:16]), floating = FALSE) 
cat("}") 

@ 
\end{document} 

Output case 1

Fall 2: Schwimmende Tabelle

In diesem Fall ist die best solution I found verwendet die adjustwidth-Umgebung aus dem changepage-Paket.

Definieren Sie zuerst eine neue Umgebung, die ihren Inhalt in einer adjustwidth Umgebung enthält, um den linken Rand zu entfernen.

\newenvironment{widestuff}{\begin{adjustwidth}{-4.5cm}{-4.5cm}\centering}{\end{adjustwidth}} 

Zweitens gibt diese neue Umgebung als latex.environments-print.xtable. (Wenn es ein Weg, um Argumente für die Umwelt in latex.environments zu passieren, würde die individuelle Umgebung gar nicht notwendig sein.)

\documentclass{article} 
\usepackage{changepage} 
\newenvironment{widestuff}{\begin{adjustwidth}{-4.5cm}{-4.5cm}\centering}{\end{adjustwidth}} 
\begin{document} 
<<echo = F, results = "asis">>= 
library(xtable) 
print(xtable(t(cars)[, 1:16]), latex.environments = "widestuff") 

print(xtable(t(cars)[, 1:12]), latex.environments = "widestuff") 
@ 
\end{document} 

Output case 2

(Die Screenshots enthalten einen Text, die nicht in der ist Codebeispiel.Es ist nur dort, um die Seitenabmessungen zu visualisieren.)

+0

Vielen Dank für Ihre Antwort. Bei keinem dieser Ansätze wurde die Tabelle für mich auf die gesamte Seitenbreite zentriert. Fall 1 zentrierte die Tabelle mit '\ textwidth', was ich nicht möchte. Hast du irgendwelche Vorschläge, wie ich das ändern kann, um stattdessen an der Papierbreite zu arbeiten? Fall 2 erforderte einige Treffer mit dem Wert adjustwidth, um eine Tabelle zentriert zu erhalten. Dieser Wert zentriert jedoch nicht die nächste Tabelle in meinem Dokument, die eine andere Breite hat. – L42

+0

@ L42 Haben Sie Fall 1 getestet? Ich denke, es funktioniert, abgesehen von einem sehr kleinen Rand auf der linken Seite. Sorry für Fall 2, das war falsch, aber ich denke, ich habe es behoben. Sie müssen die "adjustvalue" -Einstellungen nicht für jede Tabelle anpassen, sondern nur einmal, um sie an den linken und rechten Rand des Dokuments anzupassen. Ich habe einige Screenshots hinzugefügt. –

+1

Ja, ich habe getestet. Für Fall 1: [Code hier] (http://pastebin.com/Ld1grkCw) und [Screenshot hier] (http://s31.postimg.org/fzcqkuiwr/case1.png). Für neuen Fall 2: [Code hier] (http://pastebin.com/mbN3uS1v) und [Screenshot hier] (http://s31.postimg.org/rbect6tkr/case2.png). Siehe die zweite Tabelle in Fall 2: Es ist zu weit rechts. – L42