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:
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
- 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'
. - 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. # - 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.