R Programm:

#' htmlMatrix
#'
#' Creates a wiki crosstable.
#'
#' @param corner character: entries for the four matrix corners 
#' @param top character: vector for the entries of the first row without corner
#' @param left character: vector for the entries of the first column without corner
#' @param right character: vector for the entries of the last row without corner, NULL = no last row
#' @param bottom character: vector for the entries of the last column without corner, NULL = no last column
#' @param common character: entry for the 
#' @param cindex character: column indices
#' @param rindex character: row indices
#' @param table character: table attributes
#' @param caption character: table caption, NULL = no caption
#'
#' @return HTML code
htmlMatrix <- function(corner=c("<math>Z\\setminus S</math>", 
                                "Randhäufig-<br>keit von <math>Z</math>", 
                                "Randhäufig-<br>keit von <math>S</math>",
                                "<math>n_{\\bullet\\bullet}=N</math>"),
                       top   ="<math>s_{%s}</math>",
                       left  ="<math>z_{%s}</math>", 
                       right ="<math>n_{%s \\bullet}</math>",
                       bottom="<math>n_{\\bullet %s}</math>",
                       common="<math>n_{%s%s}</math>",
                       cindex=c("1", "2", NA, "K"),
                       rindex=c("1", "2", NA, "J"),
                       table='class="wikitable float-right" style="text-align: center"',
                       caption=NULL) {
   ncol <- length(cindex)+2-is.null(right)
   nrow <- length(cindex)+2-is.null(bottom)
   m <- matrix(NA, nrow=nrow, ncol=ncol)
   mcol <- 1:length(cindex)
   mrow <- 1:length(rindex)
   m[1,1]                    <- corner[1]
   m[1,1+mcol] <-  ifelse(is.na(cindex), '<math>\\ldots</math>', sprintf(top, as.character(cindex)))
   m[1+mrow,1] <-  ifelse(is.na(rindex), '<math>\\vdots</math>', sprintf(left, as.character(rindex)))
   if (!is.null(right)) {
     m[1,ncol] <- corner[2]
     m[1+mrow,ncol] <- ifelse(is.na(rindex), '<math>\\vdots</math>', sprintf(right,  as.character(rindex)))
   }
   if (!is.null(bottom)) {
     m[nrow,1] <- corner[3]
     m[nrow,1+mcol] <- ifelse(is.na(cindex), '<math>\\ldots</math>', sprintf(bottom, as.character(cindex)))
   }
   if (!is.null(bottom) || !is.null(right)) m[nrow,ncol] <- corner[4]
   for (i in mcol) {
     for (j in mrow) {
       m[j+1,i+1] <- sprintf(common, as.character(rindex[j]), as.character(cindex[i]))
       if (is.na(cindex[i])) {
         m[j+1,i+1]  <- if (is.na(rindex[j])) '<math>\\ddots</math>' else '<math>\\ldots</math>'
       } else if (is.na(rindex[j])) m[j+1,i+1]  <- '<math>\\vdots</math>'
     } 
   }
   res <- c("<!--", "https://de.wikipedia.org/wiki/Benutzer:Sigbert/Kreuztabelle", "", match.call(), "-->", sprintf("{| %s", table))
   if(!is.null(caption)) res <- c(res, sprintf("|+ %s", caption))
   res <- c(res, "|-", paste(" !", m[1,]))
   for (i in 2:nrow(m)) res <- c(res, "|-", paste0(" !", m[i,1]), paste0(" |", m[i,-1]))
   res <- paste0(c(res, "|}"), collapse="\n")
}