6.13 Tables
6.13.1 Tables in Latex
Tables in raw LaTeX work ONLY when the output format is PDF. In HTML output, the LaTeX code will be ignored and the table won’t show.
Tables in raw LaTeX can be included in Quarto documents using fenced divs or code chunks with {=latex}.
- Use fenced div to add labels
#tbl-xxxfor cross-referencing. Note the#is mandatory. Without it, the table cross reference will show as??in the output.- You can ignore the fenced divs if you don’t need cross-reference.
- Refer to the table using
@tbl-xxx. - The table lable must begin with
tbl-no matter whether you use div or latex approach for cross-references.
::: {#tbl-1}
```{=latex}
% Or whatever actual you want, includegraphics, whatever.
% (_not_ \begin{table}, just the content of it)
\begin{tabular}{l c r}
\hline
Header 1 & Header 2 & Header 3 \\
\hline
Row 1 Col 1 & Row 1 Col 2 & Row 1 Col 3 \\
Row 2 Col 1 & Row 2 Col 2 & Row 2 Col 3 \\
\hline
\end{tabular}
```
This is a table caption.
:::
For cross-reference: See @tbl-1.Alternatively, use LaTeX syntax entirely as follows.
The regression results are summarized in Table \ref{tbl-regression-results}.
```{=latex}
\begin{table}
\centering
\caption{Regression Results: CAPM vs. Fama-French 3-Factor Model}
\label{tbl-regression-results}
\begin{tabular}{l c r}
\hline
Header 1 & Header 2 & Header 3 \\
\hline
Row 1 Col 1 & Row 1 Col 2 & Row 1 Col 3 \\
Row 2 Col 1 & Row 2 Col 2 & Row 2 Col 3 \\
\hline
\end{tabular}
\end{table}
```Q: How to use [H] to force table placement in qmd?
A: Add the following to the preamble file:
\usepackage{float} % for [H] placement specifier
% Make all tables use [H] placement by default
\makeatletter
\renewenvironment{table}[1][H]{%
\@float{table}[#1]%
}{%
\end@float
}
\makeatother\renewenvironment{table}[1][H] takes one optional argument (the placement specifier) that defaults to H. This means that if you use \begin{table} without specifying a placement, it will default to [H], which forces the table to be placed exactly where it appears in the source code.
You can still override the default placement for individual tables by providing a different specifier, e.g. \begin{table}[htbp] will use the standard htbp placement for that table.
ref: https://github.com/quarto-dev/quarto-cli/discussions/6734#discussioncomment-6919437
6.13.2 Tables in Markdown
You can create tables using standard Markdown syntax.
| Col1 | Col2 | Col3 |
| ---- | ---- | ---- |
| A | B | C |
| E | F | G |
| A | G | G |
: My Caption {#tbl-letters .striped .hover}
See @tbl-letters for the table.
Captions are added using Pandoc table syntax:
:␣Caption text.Table labels and attributes can be added within curly braces
{}after the caption.If your table does not have a caption, you can still add attributes by placing them directly after
:␣You can also explicitly specify columns widths using the
tbl-colwidthsattribute or document-level option. If you have a table with two columns, and want to set 1st col to 25% and 2nd col to 75% of the table width, you can do:| fruit | price | |--------|--------| | apple | 2.05 | | pear | 1.37 | | orange | 3.09 | : Fruit prices {tbl-colwidths="[25, 75]"}
ref: https://quarto.org/docs/authoring/tables.html#markdown-tables
6.13.3 Stargazer
An example of a stargazer landscape table that supports both HTML and PDF output.
```{r alterative-models, echo=TRUE, eval=FALSE}
library(stargazer)
# Run three models
model1 <- lm(mpg ~ wt, data = mtcars)
model2 <- lm(mpg ~ wt + cyl, data = mtcars)
model3 <- lm(mpg ~ wt + cyl + hp, data = mtcars)
# generate a summarizing table using stargazer
is_html <- knitr::is_html_output()
stargazer(
model1, model2, model3,
title = "Regression Results",
type = if (is_html) "html" else "latex",
dep.var.labels = "Miles Per Gallon (mpg)",
covariate.labels = c("Weight (lbs)", "Cylinders", "Horsepower"),
digits = 2,
notes = "Standard errors in parentheses.",
notes.append = TRUE,
header = FALSE, # PDF: suppress the LaTeX header, % Table created by stargazer...
float = is_html, # PDF: emit a bare tabular so it fits inside adjustbox
font.size = if (is_html) NULL else "small", # PDF: reduce font size
column.sep.width = if (is_html) "" else "1pt"
)
```The code above is only displayed (eval=FALSE); the chunk below re-runs it via ref.label and prints the table.
For PDF the table sits on a landscape page and is scaled with adjustbox. The raw-LaTeX wrappers are kept as literal {=latex} blocks so Quarto passes them through reliably; only the table – not the echoed source code – goes inside adjustbox, otherwise the verbatim listing breaks the box.
In HTML these blocks are dropped and a normal table is shown.
The fenced divs with {=latex} only appear in the PDF output, and are dropped in HTML output.
See .content-visible for more details on how to conditionally show content based on metadata.
Note that you need to load lscale and adjustbox packages in the preamble for the PDF output.
::: {.content-visible when-format="pdf"}
```{=latex}
\begin{landscape}
\begin{adjustbox}{width=\linewidth,center}
```
:::
```{r alterative-models-out, ref.label='alterative-models', echo=FALSE, results='asis'}
```
::: {.content-visible when-format="pdf"}
```{=latex}
\end{adjustbox}
\end{landscape}
```
:::