utextvp <- function(label, x, y, ..., name="utextvp") { w <- stringWidth(label) viewport(x, y, width=w, height=unit(1, "lines"), ..., name=name) } grid.utextvp <- function(label, x=.5, y=.5, ..., name="utext") { pushViewport(utextvp(label, x, y, ...)) grid.text(label, y=0, just="bottom", name=paste0(name, ".label")) grid.segments(0, unit(-.2, "lines"), 1, unit(-.2, "lines"), name=paste0(name, ".underline")) upViewport() } grid.utextvp("underlined text", angle=20) grid.newpage() grid.rect(gp=gpar(col="grey")) grid.utextvp("underlined text", angle=20)