huxtable-news | R Documentation |
This help page simply gives the contents of NEWS.md.
Bugfix: fix quarto referencing in quarto 1.5
Bugfix: quarto cross-referencing was giving too many warnings.
Bugfix: quarto cross-referencing doesn’t work for PDF with quarto
version 1.4. See ?huxtable-FAQ
for workarounds.
Bugfix: by_cases()
wasn’t picking up variables from the caller
environment.
huxtable 5.5.4 was never released due to failing a reverse dependency check.
Bugfix: disable quarto styling on HTML tables. You can reenable quarto
processing with options(huxtable.quarto_process = TRUE)
.
Bugfix: borders weren’t working with merged cells in Word documents.
Update by_cases()
to work with dplyr 1.1.0. Within by_cases()
formulas, .
is now vector rather than matrix when dplyr version
1.1.0 is detected. Thanks @DavisVaughan.
Add package checks in quick_*
functions. Thanks @reuning.
CSS borders are now set explicitly even if they are all set to 0.
Bugfix: shell-quote files in quick_*
functions. Thanks to @ceresek.
Bugfix: cope with adjustbox version “1.3a” among latex dependencies.
Huxtable should work with Quarto documents.
Quarto labels and captions will override huxtable-provided ones.
Quarto style references like @table-label
only work with quarto
labels.
Please report any bugs!
New column_to_header()
function converts a column to header rows.
New as_hux()
method for grouped_df
objects optionally converts
groups to header rows.
New convenience functions stripe_rows()
and stripe_columns()
.
Add format
and ...
options to fmt_percent()
to allow flexible
formatting via formatC()
.
add_footnote()
gets an explicit number_format
argument which is
NA
by default.
Bugfix: infinite loop with wide characters in to_screen()
.
Bugfix: duplicate colnames when exporting
huxreg(..., error_pos = "right")
to flextable.
Bugfix: bookdown-style references weren’t working in blogdown.
New behaviour: setting colspan()
or rowspan()
overwrites the
content of cells that have been shadowed.
ht <- hux(c(1, 1), c(2, 2), c(3, 3)) ht <- set_all_borders(ht) colspan(ht)[1, 1] <- 3 # old behaviour ht[, c(2, 1, 3)] ## +--------------------------+ ## | 2 | ## +--------+--------+--------+ ## | 2 | 1 | 3 | ## +--------+--------+--------+ # new behaviour ht[, c(2, 1, 3)] ## +--------------------------+ ## | 1 | ## +--------+--------+--------+ ## | 2 | 1 | 3 | ## +--------+--------+--------+
New option huxtable.latex_siunitx_align
allows you to use the LaTeX
siunitx
package to handle decimal point alignment. This is FALSE
by default.
Bugfix: centre alignment was not working in print_screen()
.
Bugfix: failure in to_md()
with recent versions of stringi
package.
Bugfix: repeating a single row in a subset, like
ht[c(1, 1, 2, 3), ]
, was setting colspan = 2
on the repeated row.
Bugfix: zero-argument subset replacement like ht[] <- ...
wasn’t
working.
Improve decimal alignment in LaTeX when align(ht) == "."
. This may
change the appearance of some documents.
Allow tidy_override()
to extend columns of tidy
and glance
.
Bugfix: #196 ^
was giving errors in LaTeX.
Add table_environment
property so you can use e.g. "table*"
in
TeX.
Bugfix: print_screen(h, colnames = FALSE)
didn’t print a final
newline.
Bugfix: italic from markdown was being printed as underlined in TeX.
Minor test update for compatibility with broom.
Minor test update for compatibility with broom.
Fixes for R 4.1.0.
as_flextable()
now exports markdown in cells to RTF, and to Word
with the help of the optional ftExtra
package. Thanks @atusy for
adding this feature.
Improvements to markdown screen export. This now uses the optional
fansi
package.
New feature: as_Workbook()
gains start_row
and start_col
arguments, to write a huxtable into an Excel worksheet starting at a
particular row or column.
New feature: huxreg()
gains a glance_args
argument to pass
arguments to glance()
.
New feature: options(huxtable.long_minus = TRUE)
will try to use
long minus signs before numbers. The default is FALSE
. It will
probably become TRUE
in a future version.
Bugfix: insert_row/column(..., after = 0)
was unsetting table
properties.
Bugfix: unicode characters above 32767 were incorrectly represented in RTF. Thanks @kaigu1990.
Bugfix: columns were being collapsed in as_Workbook()
.
Bugfix: style_cells
didn’t work unless huxtable was on the search
path.
Bugfix: merge_repeated_rows
merged NA
rows incorrectly.
Bugfix: number format was not set correctly in huxreg()
’s note
.
Bugfix: in huxreg()
, tidy_args
threw an error if the first
argument to tidy()
was a named list.
Bugfix: tidy_replace()
was broken.
Clearer error messages for tidy_override()
when extend = FALSE
. In
future, extend
will probably default to TRUE
.
Huxtable received its first Patreon sponsor! Thanks to Ross Mattheis.
Huxtable 5.0.0 brings numerous changes. For a more user-friendly introduction, see https://hughjonesd.github.io/whats-new-in-huxtable-5.0.0.html.
There are changes to LaTeX output.
LaTeX \tabcolsep
is now set to 0 within huxtable tables, while
left and right padding should now take effect even when wrap
is
FALSE
.
The default LaTeX table environment is now “tabular” unless width
is set. If width
is set, it is “tabularx”.
wrap
only matters if width
is set. Otherwise, cell wrapping is
off.
the \centerbox
macro from the LaTeX “adjustbox” package is used to
centre tables. This should improve centring when tables are too
wide. You may need to update the LaTeX “adjustbox” package to a
recent version. check_latex_dependencies()
can inform you about
this.
As previously signalled, add_colnames
has now become TRUE
by
default in huxtable()
and as_huxtable()
. Set
options(huxtable.add_colnames = FALSE)
to go back to the old
behaviour.
Newlines in cell contents are now respected (in LaTeX, so long as
wrap = TRUE
and width
has been set).
Huxtable borders have been reworked, fixing some longstanding bugs and adding new features.
Borders are now automatically collapsed. For example:
jams %>% set_right_border(everywhere, 1, 1) %>% set_left_border(everywhere, 2, 0.4)
will set the border in between the columns of jams
to 0.4
,
overwriting the previous value. This is more in line with what you
would expect. For example, the following code now does what you
probably want:
jams %>% set_rowspan(2, 1, 3) %>% set_bottom_border(4, everywhere, 1) ## Type Price ## Strawberry 1.90 ## 2.10 ## 1.80 ## ---------------------------
instead of the old behaviour:
jams %>% set_rowspan(2, 1, 3) %>% set_bottom_border(4, everywhere, 1) ## Type Price ## Strawberry 1.90 ## 2.10 ## 1.80 ## -----------
set_left_border()
, set_all_borders()
and friends all use a
default value of 0.4. So to set a default border, write e.g.
as_hux(head(iris)) %>% set_bottom_border(1, everywhere)
A new brdr()
class encapsulates border thickness, style and
colour. You can set all properties at once by writing, e.g.:
as_hux(jams) %>% set_bottom_border(1, everywhere, brdr(1, "dotted", "darkgreen"))
left_border(ht)
and friends return a brdr
object. To access the
border thickness, write brdr_thickness(left_border(ht))
.
Various deprecated items have been removed:
The 3-argument form of set_*
. Instead, use map_*
.
The byrow
argument to set_*
. Instead, use map_*
and
by_cols()
.
error_style
and pad_decimal
arguments in huxreg
. Use
error_format
and align(hx) <- "."
.
The where()
, is_a_number()
and pad_decimal()
functions. Use
map_*
functions, ! is.na(as.numeric(x))
, and align(ht) <- "."
.
Default padding has been increased to 6 points.
By default, width()
is now unset.
By default, wrap()
is now TRUE
.
every()
has been renamed to stripe()
, to avoid a clash with
purrr::every()
. everywhere
, evens
and odds
are still the same.
The little-used ability to set copy_cell_props
to a character vector
in rbind.huxtable
and cbind.huxtable
has been removed. You can
still set it to FALSE
.
add_rows()
and add_columns()
now always call rbind.huxtable()
or
cbind.huxtable()
and return a huxtable.
Huxtable no longer supports dplyr versions less than 0.7.0 (released mid-2017).
set_cell_properties()
has been renamed style_cells()
. It is
retained as a soft-deprecated alias.
Various themes have been tweaked:
theme_basic()
now has bold headers and no header column by
default.
theme_plain()
defaults to position = "centre"
.
theme_striped()
uses grey stripes, a white border, and subtler
headers.
theme_article()
has thinner borders.
You can now use markdown within table cells.
Use set_markdown(ht, rows, cols)
to turn this on.
Or use the convenience function set_markdown_contents()
to set
cell contents that will be interpreted as markdown.
Markdown works for HTML and LaTeX. There’s basic support for on-screen display.
Huxtable now has the concept of header row and columns.
By default, data frame column names will be headers.
To set other rows to be headers, use
set_header_rows(ht, row_numbers, TRUE)
. For columns, use
header_cols()
or set_header_cols()
.
New functions style_headers()
, style_header_cols()
, and
style_header_rows()
to set multiple properties on headers.
In themes, header_row/col = TRUE
set the first row/col to a
header, and style all header rows/cols.
set_bold()
and set_italic()
now use a default value of TRUE
. So
you can write e.g.
as_hux(head(iris)) %>% set_bold(1, everywhere)
Console output in R now shows table position and caption position.
By default, huxtable now sets labels from the current knitr chunk
label, if there is one. This is consistent with kable()
. In
bookdown, you can then do e.g.
Some iris species are shown in \@ref(tab:mytable): ```r as_hux(iris) ```
Set options(huxtable.autolabel = FALSE)
to turn off this behaviour.
The one-argument form of [
now works for huxtables just as it does
for data frames. For example, ht[2:3]
selects columns 2 and 3.
New functions fmt_percent()
and fmt_pretty()
for passing into
number_format()
:
jams$Sugar <-c ("Sugar content", 0.4, 0.35, 0.45) set_number_format(jams, -1, "Sugar", fmt_percent(1))
split_across()
and split_down()
split a huxtable into a list of
sub-tables. Headers can be automatically included.
restack_across()
and restack_down()
split a huxtable, then join it
back up. This is useful for making a table fit on a page.
merge_across()
and merge_down()
merge an area of cells
horizontally across rows, or vertically down columns.
New functions
set_lr_borders()/_border_colors()/_border_styles()/_padding()
set left and right borders and padding simultaneously. New functions
set_tb_borders()
etc. set top and bottom properties simultaneously.
There are map_
equivalents of all of these.
set_outer_padding()
sets padding around a range of cells, similarly
to set_outer_borders()
.
A new table-level property, caption_width()
, allows you to set the
width of the caption. The default, NA
, sets the width equal to the
table width.
There are two new themes: theme_compact()
and theme_bright()
.
For huxreg()
, a new function tidy_replace()
allows you to replace
the output of tidy(x)
entirely.
huxtable now only sets options(huxtable.knit_print_df = TRUE)
if it
is attached, not if it is loaded.
huxtable supports dplyr::relocate()
, new in dplyr 1.0.0.
Improvements to as_flextable()
.
Improvements to quick_pptx()
(thanks @davidgohel).
Bugfixes for options(huxtable.use_fontspec = TRUE)
.
Bugfix: add_rownames = "string"
now works as promised.
Bugfix: non-ASCII characters are now supported in RTF.
New versions of the
gtsummary package will
have an as_huxtable()
method.
Package texreg on CRAN
includes a huxtablereg()
function for creating a table of regression
outputs.
The expss package now supports export to huxtables.
by_quantiles()
, by_equal_groups()
and by_colorspace()
have
gained a colwise
argument, which calculates quantiles or colors
separately for each column.
Add caption support for as_flextable()
(thanks @sjewo).
Better error messages.
New merge_repeated_rows()
function: merge repeated rows into a
single cell.
New fill
and colspan/rowspan
arguments for
insert_row()/insert_column()
:
insert_row(ht, "blah", "", "", "", "", ...)
can be written
insert_row(ht, "blah", fill = "")
.
colspan/rowspan
set colspan/rowspan
of the first cell in the
inserted row/column.
Bugfix: right borders in wrong place when cells were merged.
Bugfix: chinese characters were displaying wrongly in to_screen()
.
Set options('huxtable.latex_use_fontspec')
to TRUE
to use portable
font names in TeX documents, with the LaTeX “fontspec” package.
Bugfix: attributes were being copied wrongly in subset assignment of huxtables.
Bugfix: text colors in hux_logo()
.
Bugfix: rbind of huxtable and matrix wasn’t setting row_height
correctly.
Add quick_latex()
function.
The texreg
package now includes a huxtablereg
function, analogous
to huxreg
, which outputs a huxtable from a list of regressions. This
will be available from the next version of texreg
.
Huxtables can now be printed directly in Word documents and Powerpoint
presentations, thanks to the flextable
package and recent versions
of Pandoc. (Powerpoint printing requires Pandoc >= 2.4.0.)
New “wrapleft” and “wrapright” options to position()
allow text
wrapping around tables.
New set_outer_border_colors()
and set_outer_border_styles()
functions, like set_outer_borders()
.
Huxtable no longer requires the broom
package, instead using the
generics
package. If you use huxreg()
, you will still need
e.g. broom
or broom.mixed
to provide tidy()
and glance()
methods for specific models.
Bugfix: tidy.tidy_override()
and glance.tidy_override()
should
work even if underlying object has no tidy()
or glance()
method.
Bugfix: huxtables had option clash when echo = TRUE
in Rmd
pdf_document format.
Bugfix: caption()
and height()
weren’t playing nicely.
Bugfix: mutate(..., copy_cell_props = FALSE)
was adding a column
named copy_cell_props
.
Bugfix: check_latex_dependencies
and install_latex_dependencies
gave misleading errors.
Enhancement: when stars
is NULL
in huxreg
, don’t print a note by
default.
Enhancement: use tinytex
when available, allowing autoinstallation
of latex packages.
More work on TeX. Tables should now compile when raw_attributes is not set.
New map_xxx
functions to set properties variably by cell values.
Functions for mapping properties variably: by_rows
, by_values
,
by_ranges
, by_quantiles
etc.
Correct bookdown labels are now automatically created.
New grey, blue, green and orange themes.
New “themes” vignette.
New tidy_override
function to override p values etc. in huxreg
.
New set_contents
function to change huxtable contents within dplyr
pipes.
Enhancement: left- and right-aligned captions are now set above the
table in LaTeX, using the “threeparttable” package. You will need to
install this using e.g. install_latex_dependencies()
or tlmgr
if
it is not already on your system.
Enhancement: in huxtable()
and friends, add_rownames = "Colname"
now sets the name for the new column.
Improvements to the vignettes and help files.
Bugfix: to_md could hang with bold/italic cells.
The 3 argument form of set_xxx
functions is deprecated, as is the
where
function. Use map_xxx
instead.
Argument byrow
is soft-deprecated. Use by_cols()
instead.
Bugfix: wrap=TRUE
caused squeezed text in RTF.
TeX code was getting escaped by pandoc. To avoid this, if possible, huxtable now adds fenced code blocks round latex tables (see https://pandoc.org/MANUAL.html#extension-raw_attribute). You must add
md_extensions: +raw_attribute
to your YAML header for this to work, and you will need a recent (> 2.0.0) version of Pandoc.
More speedups: LaTeX 2-3x faster, as_Workbook 2-3x faster.
Simplify LaTeX output using our own LaTeX commands.
RTF support: new print_rtf
, to_rtf
and quick_rtf
functions.
New border_style
properties to set “solid”, “double”, “dotted” or
“dashed” borders. (At present, LaTeX only allows “solid” or “double”.)
New merge_cells
function, an alternative interface to colspan
and
rowspan
.
New quick_pptx
function to print data frames and huxtables into
Powerpoint.
New install_latex_dependencies
and check_latex_dependencies
utility functions.
add_rows
and add_columns
now accept data frames as arguments.
New theme_mondrian
theme :-D
Enhancement: print_md
now handles bold and italic cells.
Enhancement: quick_pdf
has new width
and height
options to
change paper size.
Use CSS writing-mode where possible for text rotation. Note that this may break on non-LTR languages. If this affects you, please file an issue.
Bugfix: LaTeX didn’t compile when height and caption were both set.
Bugfix: print_screen
and print_md
would hang with a wide huxtable.
Tweaks to documentation.
dplyr, knitr, rmarkdown and some other packages have moved to “Suggests:”, lowering the dependency load considerably. All the functionality is still present. huxtable gives an informative warning if a needed package is not installed.
Code rewrites for better performance and maintainability: HTML is up to 10x faster, LaTeX is up to 4x faster.
Documentation improvements.
New tribble_hux
function wrapping tibble::tribble()
for readable
data input.
New add_rows
and add_columns
functions to insert one or more rows
into the middle of a huxtable.
New option “huxtable.knitr_output_format” to override the default output format in knitr documents.
Numeric row heights and column widths are rescaled to 1 when huxtables are cbinded/rbinded.
LaTeX: at points where borders cross, priority is given to the horizontal border color.
Bugfix: property accessors had the wrong environment. Thanks to Iñaki Úcar.
Bugfix: row heights and column widths weren’t being copied with cbind/rbind.
Bugfixes for 0-row or 0-column huxtables:
Output works, usually with a warning.
cbind and rbind work.
Bugfix: HTML cols were printed with ‘width: NA’.
Bugfix: width, col_width etc. can be reset to a number after setting them to a string.
The (undocumented) ability to mix numeric and non-numeric values for padding and/border widths has been removed. If you want a number, set a number and not a string.
Bugfix: HTML tables with position “right” weren’t right-aligned.
Nicer error messages when rbinding objects with different numbers of rows.
Vignette improvements.
is_a_number
is deprecated.
… and a cool new randomized hux_logo()
;-)
Improved formatting in Excel output.
New format
method which returns the result of to_html
, to_latex
etc. as appropriate.
Bugfix: to_html
printing e.g. “left-border: NA;” in cell CSS.
Bugfix: set_all_*
not working when huxtable is not attached.
Bugfix: as_Workbook
failing with non-numeric width
.
Bugfix: hux_logo
was using multiple fonts, fails with Excel output.
Bugfix: as_flextable
borders not working in cells with colspan > 1.
Documentation bugfixes.
Compatibility with broom 5.0.0 - thanks @alexpghayes
New theme_plain
theme.
The default value for add_colnames
is going to become TRUE
. At
present it remains FALSE
. Set options("huxtable.add_colnames")
to
TRUE
or FALSE
to set the default and avoid warnings in future.
quick_*
functions now automatically open documents if used
interactively. Use open = FALSE
to avoid.
Tweak top and bottom margins for HTML tables.
pad_decimal
is deprecated in favour of align(ht) <- "."
.
huxreg
continues with a warning if statistics
are unavailable for
some models.
huxtable now provides knit_print.data.frame
methods. This means that
bare data frames will be pretty-printed via huxtable if the package is
loaded.
Set options("huxtable.knit_print_df")
to FALSE
if you don’t want
this.
By default data frames are printed using the theme_plain
theme.
Set options(“huxtable.knit_print_df_theme”) to a different
one-argument function if you want to use a different theme.
The new autoformat
argument lets huxtable()
and as_huxtable()
automatically choose alignment and number format based on column type.
Set options("huxtable.autoformat")
to FALSE
to turn off this
feature by default.
The default value of number_format
has changed from “%5.3g” to
“%.3g”, which no longer space-pads numbers.
as_flextable
now does not print column names in the header. This
matches the standard huxtable behaviour whereby headers are “just
another row/column”. To get the old behaviour, use
colnames_to_header = TRUE
.
Bugfix: Date and datetime columns were converted to numbers by
add_colnames
.
LaTeX bugfix: background colors were printing an extra space.
huxreg
was never using built-in confidence intervals.
Screen bugfixes:
set max_width to screen width (thanks @jacob-long)
misaligned decimal points
Various bugfixes for number_format
, huxreg
, as_hux.table
,
as_flextable
.
Output to Excel workbooks using the openxlsx
package.
New quick_xlsx
function.
dplyr select helpers now work inside set_*
column specifications:
e.g. set_bold(ht, 1:3, matches(“ab”), TRUE)
Column names can now be used for the after
argument to
insert_column
.
quick_*
functions: when the file
argument is not explicitly
specified, confirm overwrites manually, or fail if called
non-interactively.
Add pointless quote marks in Description and Title… I don’t make the rules.
Don’t apply number_format to negative exponents (e.g. 1.12e-3).
New tidy_args
argument to huxreg allows per-model customization of
the call to tidy
.
quick_xxx
functions without an explicit file
argument throw an
error if called non-interactively, and prompt before overwriting files
if called interactively.
Don’t apply number_format
to exponents in scientific notation.
Turn off some tests on CRAN, as they fail there but not elsewhere.
Fix quick_pdf
error when moving output across filesystems.
New quick_html
, quick_pdf
and quick_docx
functions to print
table-like objects to a new document.
to_screen
only shows colnames if there are any non-zero-length
column names.
number_format
now applies to any number-like substrings in cells.
This means you can include e.g. significance stars in a cell and still
use number_format
to format the content.
If number_format
is NA, numbers are unchanged.
Default value of number_format
has changed from “%5.2f” to “%5.3g”,
which plays nicer with integers but may surprise you by using
scientific format for large numbers.
New outer_borders
argument for huxreg
. This changes default
behaviour slightly.
New border
argument for add_footnote
to choose width of footnote’s
top border.
Added guard assertions to many exported functions.
Bugfix: captions and colnames are wrapped in to_screen to respect max_width.
No more ugly autocreated column names.
Allow huxtable to have invalid or empty column names in general.
LaTeX should now be much faster on large tables.
set_outer_borders
now accepts the same row/column arguments as other
set_
functions.
Better handling in LaTeX of horizontal borders which don’t cross the entire table. (But not varying positive border widths….)
Bugfix: flextable didn’t like huxreg’s syntactically invalid column names.
Accept, but silently change, English spelling of ‘centre’ in align
,
position
and caption_pos
.
LaTeX implements different thicknesses for vertical and horizontal borders (but only one horizontal thickness per row).
LaTeX border colors now collapse nicely: set colors override unset ones.
React gracefully to lack of p values in huxreg
.
New set_outer_borders
function to set borders round a rectangle of
cells.
to_screen
and to_md
now respect wrap
and col_widths
properties.
Screen and markdown wrap respect word boundaries.
to_screen
and to_md
gain a min_width
argument; to_md
gains a
logical header
argument; to_screen
gains a compact
argument
replacing blank = NULL
.
On screen colour and bold support, if the crayon
package is
installed. New huxtable.color_screen
option.
Move from ReporteRs
to officer
and flextable
. No more RJava
horror.
New error_format
argument to huxreg
for flexible control over
uncertainty estimates.
Infrastructure improvements: slightly less ugly code in screen.R and LaTeX.R.
Removed options collapse
, borders
, blank
and colname_color
from to_screen
/print_screen
.
as_FlexTable
is deprecated and calls as_flextable
with a warning.
header_rows
and footer_rows
arguments are ignored. If you need
this feature, tell me.
HTML border sizes are now set in points, not pixels.
In huxreg
:
ci_level
is NULL
by default. Set it to a number to calculate
confidence intervals.
error_style
is deprecated with a warning in favour of
error_format
.
Use {stars}
not %stars%
to display significance levels in the
note
argument.
borders
becomes a number specifying border width. Set to 0 for no
borders.
New convenience functions insert_row
and insert_column
.
latex_float
property allows you to change positioning in LaTeX.
(Semantic versioning fail: this should have been 0.4.0.)
New borders argument for huxreg, gives borders in sensible places.
Allow more flexible caption positioning with caption_pos
.
New set_default_properties
function to set default properties for
new huxtables.
Fix compatibility with dplyr 0.6.0.
Fix a bug that could lead to wrong significance stars in huxreg
.
Compatibility with dplyr 0.6.0.
Use ~ for decimal padding in LaTeX.
New huxreg
function to convert a list of models to a huxtable.
New set_* interface allowing column ranges, expressions a la
subset
, and filling in values by row.
Replacement methods $<-
, [<-
and [[<-
now work better.
New function set_cell_properties
to set multiple properties on
cells.
evens
, odds
, everywhere
, every(n, from)
, final(n)
,
where(cond)
: convenience functions to select rows, columns and
cells.
Export to Word/Powerpoint via ReporteRs
.
Huxtable now supports dplyr verbs like filter
and select
.
Exported function guess_knitr_output_format
.
Ability to set border colors.
Prevent overlapping row/colspans.
Expanded introduction and new vignette for huxreg
.
Numerous bugs have been fixed and replaced with new, more advanced bugs.
theme_minimal
has been renamed theme_basic
to avoid a name clash
with ggplot2
.
Added a NEWS.md
file to track changes to the package.
First CRAN release.
Maintainer: David Hugh-Jones davidhughjones@gmail.com
Useful links:
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.