1### Port to R and a few small improvements:
2### Copyright � 2000 Martin Maechler, ETH Zurich
3
4mat2tex <- function(x, file = "mat.tex", envir = "tabular",
5                    nam.center = "l", col.center = "c",
6                    append = TRUE, digits = 3, title)
7{
8    if(length(d.x <- dim(x)) != 2)
9        stop("'x' must be a matrix like object with dim(x) of length 2")
10    if(any(d.x <= 0))
11        stop("'dim(x)' must be positive")
12    nr.x <- d.x[1]
13    nc.x <- d.x[2]
14    c2ind <- (1:nc.x)[-1] # possibly empty
15
16    ## determine if there are labels to be processed
17    dn.x <- dimnames(x)
18    if(has.rowlabs <- !is.null(dn.x[[1]]))        rowlabs <- dn.x[[1]]
19    if(has.collabs <- !is.null(dn.x[[2]]))        collabs <- dn.x[[2]]
20
21    ## produce column specification
22    stopifnot(any(nam.center  ==  c("l","r","c")))
23    stopifnot(all(col.center %in% c("l","r","c")))
24    col.center <- rep(col.center, length = nc.x)
25    colspec <- "{|"
26    if(has.rowlabs)
27        colspec <- paste(colspec, nam.center, "||")
28    colspec <- paste0(colspec, paste(col.center, "|", collapse=""), "}")
29    cat(paste(sprintf("\\begin{%s}", envir), colspec, " \n"), file=file, append=append)
30
31    span <- nc.x + if(has.rowlabs) 1 else 0
32    cat(if(!missing(title)) paste("\\multicolumn{", span,
33                                  "}{c}{", title, "} \\\\"),
34        "\\hline \n", file = file, append = TRUE)
35    ## output column labels if needed
36    if(has.collabs) {
37        collabline <- " "
38        if(has.rowlabs)
39            collabline <- paste(collabline, " \\  &")
40        collabline <- paste(collabline, collabs[1])
41        for(i in c2ind)
42            collabline <- paste(collabline, "&", collabs[i])
43        collabline <- paste(collabline, "\\\\ \\hline \\hline")
44        cat(collabline, "\n", file = file, append = TRUE)
45    }
46    ## output matrix entries
47    op <- options(digits = digits); on.exit(op)
48    for(i in 1:nr.x) {
49        thisline <-
50            if(has.rowlabs)
51                paste(rowlabs[i], "&", format(x[i, 1])) else format(x[i, 1])
52        for(j in c2ind)
53            thisline <- paste(thisline, "&", format(x[i, j]))
54
55        thisline <- paste(thisline, "\\\\ \\hline")
56        cat(paste(thisline, "\n"), file = file, append = TRUE)
57    }
58    cat(paste0("\\end{", envir, "}\n"), file = file, append = TRUE)
59}
60
61