% File src/library/graphics/man/strwidth.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2022 R Core Team
% Distributed under GPL 2 or later

\name{strwidth}
\title{Plotting Dimensions of Character Strings and Math Expressions}
\description{
  These functions compute the width or height, respectively, of the
  given strings or mathematical expressions \code{s[i]} on
  the current plotting device in \emph{user} coordinates, \emph{inches}
  or as fraction of the figure width \code{par("fin")}.
}
\usage{
strwidth(s, units = "user", cex = NULL, font = NULL, vfont = NULL, ...)
strheight(s, units = "user", cex = NULL, font = NULL, vfont = NULL, ...)
}
\alias{strwidth}
\alias{strheight}
\arguments{
  \item{s}{a character or \link{expression} vector whose dimensions
    are to be determined.  Other objects are coerced by
    \code{\link{as.graphicsAnnot}}.}
  \item{units}{character indicating in which units \code{s} is measured;
    should be one of \code{"user"}, \code{"inches"}, \code{"figure"};
    partial matching is performed.}
  \item{cex}{numeric \bold{c}haracter \bold{ex}pansion factor; multiplied
    by \code{\link{par}("cex")} yields the final character size; the
    default \code{NULL} is equivalent to \code{1}.}
  \item{font, vfont, \dots}{additional information about the font,
    possibly including the graphics parameter \code{"family"}:
    see \code{\link{text}}.}
}
\details{
  Note that the \sQuote{height} of a string is determined only by the
  number of linefeeds (\code{"\n"}, aka \dQuote{newline}s) it contains: it is the (number of
  linefeeds - 1) times the line spacing plus the height of \code{"M"} in
  the selected font.  For an expression it is the height of the
  bounding box as computed by \link{plotmath}.  Thus in both cases it is
  an estimate of how far \bold{above} the final baseline the typeset
  object extends.  (It may also extend below the baseline.)  The
  inter-line spacing is controlled by \code{cex},
  \code{\link{par}("lheight")} and the \sQuote{point size} (but not the
  actual font in use).

  Measurements in \code{"user"} units (the default) are only available
  after \code{\link{plot.new}} has been called -- otherwise an error is
  thrown.
}
\value{
  Numeric vector with the same length as \code{s}, giving the estimate of
  width or height for each \code{s[i]}.  \code{NA} strings are given
  width and height 0 (as they are not plotted).
}
\seealso{
  \code{\link{text}}, \code{\link{nchar}}
}
\examples{
str.ex <- c("W","w","I",".","WwI.")
op <- par(pty = "s"); plot(1:100, 1:100, type = "n")
sw <- strwidth(str.ex); sw
all.equal(sum(sw[1:4]), sw[5])
#- since the last string contains the others

sw.i <- strwidth(str.ex, "inches"); 25.4 * sw.i  # width in [mm]
unique(sw / sw.i)
# constant factor: 1 value
mean(sw.i / strwidth(str.ex, "fig")) / par('fin')[1]  # = 1: are the same

## See how letters fall in classes
##  -- depending on graphics device and font!
all.lett <- c(letters, LETTERS)
shL <- strheight(all.lett, units = "inches") * 72  # 'big points'
table(shL)  # all have same heights ...
mean(shL)/par("cin")[2] # around 0.6

(swL <- strwidth(all.lett, units = "inches") * 72)  # 'big points'
split(all.lett, factor(round(swL, 2)))

sumex <- expression(sum(x[i], i=1,n), e^{i * pi} == -1)
strwidth(sumex)
strheight(sumex)

par(op)  #- reset to previous setting
}
\keyword{dplot}
\keyword{character}
