Saltar al contenido

Agregar una fila vacía después de cada 5 o 10 filas en la tabla LaTeX

Posterior a de una extensa selección de datos hemos podido resolver este enigma que pueden tener ciertos lectores. Te dejamos la solución y deseamos servirte de mucha apoyo.

Solución:

La siguiente solución configura un entorno blocktable derivado de longtable que proporciona la funcionalidad deseada usando solo LaTeX.

Notas de implementación

Primero, se necesitan algunos contadores:

newcounter@tabrow
newcounter@emptyrow
newcounter@modulus
newcounter@[email protected]

@tabrow se incrementará en cada fila para determinar el número de fila actual mientras @emptyrow tendrá múltiplos de @modulus (que, en consecuencia, se establece en el número de filas que debe contener un bloque / fragmento; para ser precisos, será @modulus+1). La última mención se establece internamente a través de @setblocksize:

newcommand@setblocksize[1]%
  setcounter@modulus#1
  setcounter@emptyrow[email protected]
  stepcounter@modulus

@[email protected] contiene el valor predeterminado global que se le dará a @modulus si no se especifica ningún argumento opcional (ver a continuación: blocktable).

La macro principal es [email protected]@[email protected] que se expande a una línea vacía, es decir &...&\, si [email protected] es un múltiplo de [email protected] y simplemente nada si no:

def[email protected]@[email protected]%
  ifnum[email protected]=[email protected]
    addtocounter@emptyrow[email protected]%
    @colseps[email protected]@tabularcr
  fi

Se agregará a cada ocurrencia de \ diciendo:

def[email protected][email protected]@tabularcr[email protected]@[email protected]

Como se vio en [email protected]@[email protected] internamente, la fila vacía se construye internamente a través de @colseps[email protected]@tabularcr dónde [email protected]@tabularcr es una versión almacenada de [email protected] y @colseps contiene el número correcto de &s que se hace con la ayuda de longtable‘s [email protected] (que contiene el número de columnas) mediante un comando auxiliar:

newcommand[email protected]%
  @tempcnta@ne
  loop
    advance@tempcnta by 1
    [email protected]@macro@colseps&
  ifnum@tempcnta[email protected]repeat

La funcionalidad principal se aplica a un nuevo entorno. blocktable Residencia en longtable:

newenvironmentblocktable[2][[email protected]@blocksize]
  @setblocksize#1[email protected]longtable@stepcounter@tabrow#2
  endlongtable gdef@colseps setcounter@tabrow0

que reúne todo el trabajo realizado anteriormente. También limpia el @tabrow contar y @colseps macro – que también se asignó vacío de antemano.

Para asegurarse de que el bloqueo / fragmentación comience en la fila derecha, las siguientes líneas concluyen el código de la solución:

[email protected]@macroendfirstheadsetcounter@tabrow1
[email protected]@macroendheadsetcounter@tabrow1
[email protected]@macroendfootsetcounter@tabrow1
[email protected]@macroendlastfootsetcounter@tabrow1

Ejemplo

Figura

Antes del código completo, aquí hay una imagen de ejemplo producida con el tamaño de fragmento predeterminado de 5:

producción

Código completo

documentclassarticle
usepackagebooktabs
usepackagelongtable,array

makeatletter

newcounter@tabrow
newcounter@emptyrow
newcounter@modulus
newcounter@[email protected]
setcounter@[email protected]5 def@colseps let[email protected]@tabularcr=[email protected] def[email protected]@[email protected]% ifnum[email protected]=[email protected] addtocounter@emptyrow[email protected]% @colseps[email protected]@tabularcr fi def[email protected][email protected]@tabularcr[email protected]@[email protected] newenvironmentblocktable[2][[email protected]@blocksize] @setblocksize#1[email protected]longtable@stepcounter@tabrow#2 endlongtable gdef@colseps setcounter@tabrow0 newcommand[email protected]% @tempcnta@ne loop advance@tempcnta by 1 [email protected]@macro@colseps& ifnum@tempcnta[email protected]repeat newcommand@setblocksize[1]% setcounter@modulus#1 setcounter@emptyrow[email protected] stepcounter@modulus newcommanddefaultBTblocksize[1]setcounter@[email protected]#1 [email protected]@macroendfirstheadsetcounter@tabrow1 [email protected]@macroendheadsetcounter@tabrow1 [email protected]@macroendfootsetcounter@tabrow1 [email protected]@macroendlastfootsetcounter@tabrow1 makeatother %defaultBTblocksize10 begindocument listoftables beginblocktableccc captionBoring example table\ toprule textbfcol1 & textbfcol2 & textbfcol3\ midrule endfirsthead foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ foo & bar & baz\ bottomrule endblocktable enddocument

Observaciones

  1. No uso knitr y, por lo tanto, no probé la solución con una tabla generada a partir de un archivo de datos externo como en el OP’s mwe, pero debería funcionar sin ningún problema cuando declaras tabular.environment = 'blocktable'.
  2. Al insertar una línea en blanco real, existe la advertencia de que el material insertado por @... también afecta a las líneas que quedan fuera (lo cual no es deseable en mi opinión) y la numeración de las filas es simplemente incorrecta y se necesitan trucos. #
  3. Para no sobrecargar esta respuesta, empaqueté una solución alternativa combinada con la anterior en un repositorio de github: https://github.com/giannotr/blocktable (como un paquete llamado blocktable. Este no es un paquete oficial y no está debidamente documentado ni probado. Obtiene la solución original eligiendo la opción ‘línea vacía’).

Ya que estas usando knitr, lo mas sencillo es agregar \ cada décima fila usando add.to.row parámetro de print.xtable.

Este es un código muy aproximado; en el caso general también es necesario comprobar que MatrixData tiene más de 10 filas.

documentclassarticle 
usepackagelongtable

begindocument

listoftables

<< label=LongTable, results='asis', echo = FALSE >>=
library(xtable)
set.seed(12345)
MatrixData <- matrix(rnorm(1000), ncol = 10)

caption <- paste("\hline  \endfirsthead"  ,                          # First caption
                                "\caption[]Example of longtable spanning several pages \labeltab:MatrixData \\ \hline", # Additional captions
                                paste("&", 1:ncol(MatrixData),collapse=" "),                              # Column names
                                "\\ \hline ",
                                "\endhead", 
                                "\hline \multicolumn11r\textitContinued \                    
                                 \endfoot
                                 \endlastfoot",collapse=" ")
positions <- seq(from=10, to=dim(MatrixData)[1], by=10)
print(
  xtable(
      x = MatrixData
    , caption = "Example of longtable spanning several pages"
    #, label = "tab:MatrixData"
    , align = c("l|", rep("r", ncol(MatrixData)))
    , digits = c(rep(3, ncol(MatrixData)+1))
  )

  , table.placement = "H"
  , caption.placement = "top"
  , include.rownames = TRUE
  , include.colnames = TRUE
  , size = "small"
  , tabular.environment = 'longtable'
  , floating = FALSE
  , add.to.row = 
      list(pos = as.list(c(0,positions)),
             command = c(caption,rep("\\",length(positions)))))

@

 enddocument

Sección de Reseñas y Valoraciones

Si sostienes alguna vacilación y forma de afinar nuestro artículo te inspiramos dejar una ilustración y con gusto lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *