                        Changes in version 0.4.0                        

  - modify_split_caption() now errors when given a table that was never
    split, instead of silently returning it unchanged. A plain table has
    no split level to build a subtitle from; the message points at
    split_by_rows = list(variable_level = ...). Pages of a row-number
    split are still skipped silently, as before. (#318)

  - Added add_label_column() to split a {gtsummary} table's row labels
    into a new left label column (label0) and the existing label column,
    computing the new column from an expression evaluated in the table
    body. This is the strata_location = "new_column" layout of
    tbl_shift() exposed as a standalone step for nested count and shift
    tables. (#314)

  - tbl_null_report() now centers its message, so with no body content
    it reads as a "no data" panel spanning the table instead of text
    hugging the left edge. (#305)

  - get_mmrm_results() gains a weights argument (default "equal") passed
    to emmeans::emmeans(), so proportionally weighted LS Means can be
    requested with weights = "proportional". Check ?emmeans::emmeans()
    for other weights options. (#299)

  - tbl_mmrm() gains a baseline_args argument, forwarded to the baseline
    tbl_roche_summary() call, to configure the baseline section
    statistics (previously locked to n and Mean (SE)). (#299)

  - tbl_mmrm() gains a postbaseline_args argument to select, reorder,
    relabel and reformat the post-baseline statistics (previously locked
    to n, adjusted means, differences and p-value). Built-in
    "geom_mean_ratio" and "geom_mean_ratio_ci" statistics are available
    for log-transformed responses. (#299)

  - remove_duplicate_keys() now keeps the tbl_split class and attributes
    when applied to a split table, instead of returning a plain list.
    (#301)

  - annotate_lineplot_df() gains "se" and "ci" as summary_stats options,
    reporting the standard error and the confidence interval of the mean
    (at a new conf_level argument) in the summary table below the plot.
    (#307)

  - gg_lineplot() gains a show_n argument to append group sizes to the
    legend (e.g. "Placebo (N=42)") and a jitter argument to horizontally
    separate overlapping groups while keeping points, lines, and error
    bars aligned. (#307)

  - Added tbl_proportion() to summarize a binary or multinomial variable
    as proportions with confidence intervals (estimate and CI on
    separate rows), with a selectable CI method and conf.level. The CI
    row label can be overridden with ci_label; the default for the
    continuity-corrected methods now reads "with continuity correction".
    (#303)

  - Added add_proportion_difference() to append the difference in rates,
    its confidence interval, and a p-value ("chisq", "fisher", or
    "cmh"), with stratified (Cochran-Mantel-Haenszel) support via
    strata. The correct flag controls the continuity correction on the
    difference interval and test_correct (default FALSE) the Yates
    correction on the chi-squared p-value. (#303)

  - Added add_proportion_odds_ratio() to append an odds ratio, with
    stratified (Cochran-Mantel-Haenszel) support via strata. (#303)

  - Added modify_split_caption() to subtitle each page of a split
    {gtsummary} table (e.g. from tbl_listing(), tbl_baseline_chg(), or
    tbl_shift()) from its split level via a glue pattern (default
    "Parameter: {spl_level}") and hide the now-redundant split column.
    (#282)

  - annotate_lineplot_df() and annotate_pkc_df() gain a font_size
    argument to control the summary table font size, matching
    annotate_riskdf(). The text_size argument of annotate_pkc_df() is
    soft-deprecated in favor of font_size. (#295)

  - Renamed imputation_rules() to pk_imputation_rules() to make its PK
    scope explicit. It applies BLQ display rules to PK summary
    statistics based on the BLQ ratio and dosing timing, and now marks
    any missing statistic (e.g. standard deviation or CV% when n = 1) as
    "NE" (not estimable). (#293)

  - Renamed d_pkparam() to pk_param_metadata() and h_pkparam_sort() to
    pk_param_sort(), dropping the d_/h_ prefixes. pk_param_sort() now
    warns about parameter codes missing from the reference and keeps
    their rows instead of dropping them silently. (#293)

  - PK summary helpers (cv(), geom_cv(), geom_mean(), fmt_3sig(),
    fmt_pct(), pk_imputation_rules()) now validate their inputs and
    raise informative errors. (#293)

  - geom_mean() returns NA_real_ instead of NaN when all concentrations
    are missing. (#293)

  - fmt_3sig() and fmt_pct() are now vectorized and return NA_character_
    for NA or non-finite input. (#293)

  - annotate_riskdf() now builds the "Numbers at Risk" table at the
    plot's x-axis breaks, so custom ticks set with
    ggplot2::scale_x_continuous(breaks = ...) are reflected in the
    table. (#278)

  - theme_gtsummary_roche() now frames the flextable column labels with
    an outer border only, removing the internal borders between header
    rows and the inconsistent missing right border. (#272)

  - Fixed minor typo in the DESCRIPTION file.

  - tbl_hierarchical_incidence_rate() gains an overall_row argument to
    control whether the overall summary row is included. (#264)

  - tbl_hierarchical_incidence_rate() now supports add_overall() to
    append an unstratified column pooling all treatment arms, consistent
    with the other add_overall() methods in the package (last = FALSE
    and a glue col_label by default). (#264)

  - tbl_hierarchical_incidence_rate() now renders spanning headers for
    treatment arm columns, customizable via the new spanning_label glue
    argument (e.g. "{level} (N = {n})"). (#264)

  - tbl_with_pools() no longer strips spanning headers set by the inner
    .tbl_fun, so pooling tbl_baseline_chg() keeps the treatment-arm
    headers. (#297)

                 Changes in version 0.3.2 (2026-06-03)                  

New Functions and Functionality

  - Added g_lineplot() for creating line plots with optional summary
    statistics table. Includes helper functions calc_stats(),
    g_lineplot_table(), and preprocess_lineplot_data().

  - Added ard_tabulate_abnormal_by_baseline() for creating an Analysis
    Results Data (ARD) object counting participants with abnormal
    assessments, stratified by their baseline status.

  - Added tbl_mmrm() and get_mmrm_results() functions to create
    regression tables for Mixed Models for Repeated Measures (MMRM).
    (#163)

  - Added gg_mmrm_lineplot() to create line plots of MMRM results.
    (#181)

  - Added gg_pkc_lineplot() to create line plots for PK data. (#185)

  - Added annotate_gg_pkc() to add optional summary statistics table to
    gg_pkc_lineplot(). (#189)

  - Refactored the underlying data.frame alignment and rendering
    methodology used for plot annotations. Functions for table
    annotation now use a completely rebuilt engine that ensures X-axis
    synchronization for stacked tables (annotate_riskdf()) and flexible,
    reliable placement for floating tables (annotate_surv_med(),
    annotate_coxph()). (#189)

  - Refactored functions for lineplot plotting - added gg_lineplot() and
    annotate_gg() to create lineplots and annotate summary statistics
    table. (#184)

  - Added functions reverse_ci(), reverse_rate_difference() to reverse
    confidence intervals and rate differences in tables from
    add_row_difference(). (#204)

  - g_lineplot(), g_lineplot_table(), and preprocess_lineplot_data()
    were deprecated. (#184)

  - Added tbl_coxph() to render pairwise Cox proportional hazards
    results as a gtsummary table. (#159)

  - Added tbl_hierarchical_incidence_rate() which computes the incidence
    rate of adverse events (#211)

  - Added adjust_stat_columns_wrap() which keep the presentation of
    statistics in one row (#219)

  - get_cox_pairwise_df() now allows for different methods to compute
    p-value (#191) and to handle ties (#193).

  - tbl_coxph() now accepts a data.frame created by
    get_cox_pairwise_df() as input. (#207)

  - Added add_grade_column() to inject a grade-label column into
    tbl_hierarchical_rate_by_grade() output. Decoupled from the table
    builder to prevent Cartesian join explosion in tbl_merge(). (#226)

  - get_cox_pairwise_df() now fully supports strata() terms in survival
    formulas (#256).

  - The "likelihood-ratio" test now intelligently switches between
    survival::survreg() (for unstratified models) and survival::coxph()
    (for stratified models) (#256).

  - Stripped package namespace prefixes (e.g., survival::) from survival
    formulas to prevent evaluation errors (#256).

  - Added ... support in get_cox_pairwise_df() for conf.int (e.g., to
    adjust CI level) and robust = TRUE (for robust standard errors).

Other Updates

  - tbl_hierarchical_rate_and_count() now emits zero-rows for unobserved
    factor levels in the first hierarchical variable. (#233)

  - df2gg_aligned() and df2gg_floating() now preserve original ggplot
    objects in attr(result, "plotlist") for downstream data extraction
    after combining with cowplot. (#208)

  - Remove warning when data has more levels than needed for
    grade_groups on tbl_hierarchical_rate_by_grade.

  - Changed the default conf.type from "log" to "plain" (linear) in
    tbl_survfit_times() and tbl_survfit_quantiles() to align with GDSR
    guidelines. (#173)

  - Removed bold from headers when using tbl_strata() (#133).

  - Unified border width in theme_gtsummary_roche() to 0.5 for header.
    (#154)

  - Added example on how to stratify tbl_baseline_chg() by PARAM and
    split into a list.

  - Adjusted tbl_mmrm() to allow base_df = NULL.

  - Fixed two bugs related to summary statistics calculation in
    ard_tabulate_abnormal_by_baseline(). (#198)

  - Fixed a bug in gg_pkc_lineplot() causing misplaced error bars on a
    log scale. (#199)

  - Adjusted gg_pkc_lineplot() to use tbl_roche_summary() for automatic
    decimals formatting.

  - Adjusted tbl_hierarchical_incidence_rate() to handle first event as
    well as all events (#217)

  - Adjusted tbl_baseline_chg() to allow for custiomization of display
    statistics (#222)

  - Changed baseline statistic argument in tbl_baseline_chg() (#224)

  - Adjusted modify_zero_recode() to account for strings comprising
    regular and non-breaking spaces (#230)

  - tbl_roche_subgroups() now shows n, Events, and Median per arm when
    time_to_event is specified. The total column shows Total Events
    instead of Total n. (#235)

  - Skip tests if suggested packages are missing (Failing test due to
    missing suggested package #252, @llrs-roche)

  - The default "log-rank" test now uses survival::survdiff() instead of
    coin, aligning output more closely with SAS and rtables

  - tbl_survfit_quantiles() now indicates censored observation in
    min/max values with * (#192)

                 Changes in version 0.3.1 (2026-01-21)                  

New Functions and Functionality

  - Added tbl_roche_subgroups() for subgroup analysis.

  - Added g_forest to create forest plot.

                 Changes in version 0.3.0 (2025-12-06)                  

New Functions and Functionality

  - Added tbl_null_report() for cases without any information to
    display. (#11)

  - Added functions style_roche_number() and label_roche_number() to
    replace their respective gtsummary versions, with additional inf
    argument for customization of Inf/-Inf/NaN values.

  - Added gg_km() function for creating Kaplan-Meier plots.

  - Added tbl_subgroups and g_forest to make subgroup analysis and
    forest plots.

  - Added list("assign_summary_type-arg:cat_threshold" = 0L) to
    theme_gtsummary_roche(). Numeric variables with few levels will no
    longer default to summary type 'categorical' in
    gtsummary::tbl_summary() and tbl_roche_summary(). (#79)

Other Updates

  - Updated variable processing in tbl_baseline_chg() to allow for
    non-string input. (#114)

  - Updated details about the sort_hierarchical() and
    filter_hierarchical() functions in the hierarchical tables article.
    (#116)

  - Added the label argument to tbl_hierarchical_rate_and_count() to set
    hierarchy variables labels in the table header. (#118)

Bug Fixes

  - Fixed remove_duplicate_keys() to remove non-unique column values
    when the key columns are a mix of unique and duplicated entries.
    (#129)

                 Changes in version 0.2.0 (2025-08-29)                  

New Functions and Functionality

  - The tbl_demographics() function has been renamed to
    tbl_roche_summary() with the following updates. (#73).
    
      - Updated tbl_roche_summary() to convert cells with "0 (0.0%)" to
        "0".
    
      - Update the tbl_roche_summary() returned inputs list to match the
        tbl_roche_summary() argument inputs, whereas it previously
        returned the tbl_summary() inputs. (#31)
    
      - Changed the default header in tbl_roche_summary() tables from
        **Characteristic** to an empty string.
    
      - Fix in tbl_roche_summary() when a variable is all NA within a
        stratum. The zero count was displayed as "0 (NA%)" instead of
        "0". (#60)

  - Added function tbl_hierarchical_rate_by_grade() to summarize adverse
    event rates by highest toxicity grade. (#46)

  - Adding the modify_zero_recode() function that recodes "0 (0.0%)" to
    "0" in summary tables.

  - Adding the modify_header_rm_md() function to remove bold and italic
    markdown syntax from the headers of a gtsummary table. (#53)

  - Adding tbl_hierarchical_rate_and_count() and associated S3 method
    add_overall() to summarize hierarchical event rates and counts.
    (#36)

  - Added tbl_survfit_quantiles() and
    add_overall.tbl_survfit_quantiles() to create a table of survival
    quantiles. (#19)

  - Adding tbl_survfit_times() and add_overall.tbl_survfit_times()

  - Adding tbl_baseline_chg() function. (#62)

  - Added function tbl_shift() for easing the creation of shift tables.
    (#83)

  - Added style_roche_percent() and label_roche_percent() functions.

  - Added formatting functions style_roche_ratio() and
    label_roche_ratio(). (#91)

  - Added variables and row_numbers arguments to the add_blank_rows()
    function. (#45)

  - Re-coding 0 / 0 (NA%) to 0 / 0 in modify_zero_recode(). (#85)

Other Updates

  - Added an article giving an overview of the {crane} package. (#37)

  - The {gtsummary} is now loaded with {crane}.

  - Updated Roche theme to bold headers for flextable outputs.

  - Updated Roche theme to include parentheses around Ns in header, and
    updated function defaults to include the parentheses in crane
    functions.

  - Updated theme_gtsummary_roche() to further style results from
    gtsummary::tbl_hierarchical*() functions.

  - Added theme_gtsummary_roche(font_size, print_egine) arguments to
    control the default font size and the print engine.

  - Updated Roche theme to use style_roche_percent() as the default
    function to format percentages.

  - Added additional {flextable} specs for theme_gtsummary_roche().
    Mainly border line width (0.5) and footer font size (font_size - 1).

                 Changes in version 0.1.0 (2025-02-24)                  

  - Initial release
