Rev 46914 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
#! /bin/sh## Rd2dvi -- Convert man pages (*.Rd help files) via LaTeX to DVI/PDF.#### Examples:## R CMD Rd2dvi /path/to/Rsrc/src/library/base/man/Normal.Rd## R CMD Rd2dvi `grep -l "\\keyword{distr" \## /path/to/Rsrc/src/library/stats/man/*.Rd | sort | uniq`revision='$Rev: 46964 $'version=`set - ${revision}; echo ${2}`version="Rd2dvi ${version}Copyright (C) 2000-2008 The R Core Development Team.This is free software; see the GNU General Public License version 2or later for copying conditions. There is NO warranty."usage="Usage: R CMD Rd2dvi [options] filesGenerate DVI (or PDF) output from the Rd sources specified by files, byeither giving the paths to the files, or the path to a directory withthe sources of a package.Unless specified via option '--output', the basename of the output fileequals the basename of argument 'files' if this specifies a package(bundle) or a single file, and 'Rd2' otherwise.The Rd sources are assumed to be ASCII unless they contain \encodingdeclarations (which take priority) or --encoding is supplied or if usingpackage sources, if the package DESCRIPTION file has an Encoding field.Options:-h, --help print short help message and exit-v, --version print Rd2dvi version info and exit--batch no interaction--debug turn on shell debugging (set -x)--no-clean do not remove created temporary files--no-preview do not preview generated DVI file--encoding=enc use 'enc' as the default encoding--os=NAME use OS subdir 'NAME' (unix or windows)--OS=NAME the same as '--os'-o, --output=FILE write output to FILE--pdf generate PDF output--title=NAME use NAME as the title of the document-V, --verbose report on what is done--no-index don't index PDF outputThe output papersize is set by the environment variable R_PAPERSIZE.The DVI previewer is set by the environment variable xdvi.The PDF previewer is set by the environment variable R_PDFVIEWER.Report bugs to <r-bugs@r-project.org>."start_dir=`pwd`build_dir=".Rd2dvi${$}"batch=falseclean=truedebug=falseonly_meta=falseout_ext="dvi"output=""verbose=falseenc=unknownindex=trueif test "${R_OSTYPE}" = "windows"; thenecho=echopreview=${xdvi-open}OSdir=windowselse## Need a `safe' echo which does not interpret backslash-escaped## characters in SysV style.## FIXME: R_SHARE_DIR might contain a space.echo="sh ${R_SHARE_DIR}/sh/echo.sh"preview=${xdvi-xdvi}OSdir=unixfiwhile test -n "${1}"; docase ${1} in-h|--help)${echo} "${usage}"; exit 0 ;;-v|--version)${echo} "${version}"; exit 0 ;;--batch)batch=true ;;--debug)debug=true ;;--no-clean)clean=false ;;--no-preview)preview=false ;;--pdf)out_ext="pdf";## allow for --no-preview --pdfif test "${preview}" != "false"; thenif test -n "${R_PDFVIEWER}"; thenpreview=${R_PDFVIEWER}elif test "${R_OSTYPE}" = "windows"; thenpreview=openelsepreview=falsefifiR_RD4DVI=${R_RD4PDF-"times,hyper"}R_LATEXCMD="${R_PDFLATEXCMD}";;--title=*)title=`echo "${1}" | ${SED} -e 's/[^=]*=//'` ;;-o)if test -n "`echo ${2} | ${SED} 's/^-.*//'`"; thenoutput="${2}"; shiftelseecho "ERROR: option '${1}' requires an argument"exit 1fi;;--only-meta)only_meta=true ;;--output=*)output=`echo "${1}" | ${SED} -e 's/[^=]*=//'` ;;--OS=*|--os=*)OSdir=`echo "${1}" | ${SED} -e 's/[^=]*=//'` ;;--encoding=*)enc=`echo "${1}" | ${SED} -e 's/[^=]*=//'` ;;--build-dir=*)build_dir=`echo "${1}" | ${SED} -e 's/[^=]*=//'` ;;-V|--verbose)verbose=${echo} ;;--no-index)index=false ;;--|*)break ;;esacshiftdoneif ${debug}; then set -x; fi. ${R_SHARE_DIR}/sh/dcf.sh # get_dcf_field()do_cleanup () {if ${clean}; thencd ${start_dir}rm -rf ${build_dir}elseecho "You may want to clean up by 'rm -rf ${build_dir}'"fi}Rdconv_dir_or_files_to_LaTeX () {## Convert Rd files in a dir or a list of Rd files to LaTeX, appending## the result to OUTFILE.## Usage:## Rdconv_dir_or_files_to_LaTeX OUTFILE DIR## Rdconv_dir_or_files_to_LaTeX OUTFILE FILES${verbose} $@out="${1}"shiftif test -d ${1}; thenif ${only_meta}; thenfiles=elsefiles=`ls ${1}/*.[Rr]d`if test -d ${1}/${OSdir}; thenfiles="${files} `ls ${1}/${OSdir}/*.[Rr]d`"fifiles=`LC_ALL=C ${echo} ${files} | sort`fielsefiles="${@}"fi${only_meta} || echo "Converting Rd files to LaTeX ..."for f in ${files}; do${echo} ${f}${R_CMD} Rdconv -t latex --encoding=${enc} ${f} >> ${out}done}Rd_DESCRIPTION_to_LaTeX () {## Typeset the contents of a DESCRIPTION file in a LaTeX description## list.## Usage:## Rd_DESCRIPTION_to_LaTeX FILEfields=`${SED} '/^[ ]/d; s/^\([^:]*\):.*$/\1/' $1`${echo} "\\begin{description}"${echo} "\\raggedright{}"## this throws warnings on Solaris sed as input is missing newlinefor f in `${echo} "${fields}" | ${SED} '/Package/d; /Bundle/d;'`; dotext=`get_dcf_field ${f} ${1} | \tr '\n' ' ' | \${SED} "s/\"\([^\"]*\)\"/\\\`\\\`\\1''/gs/\\\\\\\\/\\\\\\\\textbackslash /gs/{/\\\\\\\\{/gs/}/\\\\\\\\}/g" 2>/dev/null`ff=`echo ${f} | ${SED} s/_/\\\\\\\\_/g`${echo} "\\item[${ff}] \\AsIs{${text}}"done${echo} "\\end{description}"}is_bundle=nois_base_package=nofile_sed='s/[_$]/\\&/g'pkg_enc=toc="\\Rdcontents{\\R{} topics documented:}"if test -d "${1}"; thenif test -f ${1}/DESCRIPTION; thenif test -n "`grep '^Bundle:' ${1}/DESCRIPTION`"; thenecho "Hmm ... looks like a package bundle"is_bundle=yesbundle_name=`get_dcf_field Bundle "${1}/DESCRIPTION"`bundle_pkgs=`get_dcf_field Contains "${1}/DESCRIPTION"`title=${title-"Bundle \`${bundle_name}'"}elseecho "Hmm ... looks like a package"package_name=`get_dcf_field Package "${1}/DESCRIPTION"`title=${title-"Package \`${package_name}'"}dir=${1}/manfipkg_enc=`get_dcf_field Encoding "${1}/DESCRIPTION"`test -z "${output}" && output="`basename ${1}`.${out_ext}"elif test -f ${1}/DESCRIPTION.in && \test -n "`grep '^Priority: *base' ${1}/DESCRIPTION.in`"; thenis_base_package=yesecho "Hmm ... looks like a package from the R distribution"package_name=`get_dcf_field Package "${1}/DESCRIPTION.in"`title=${title-"Package \`${package_name}'"}dir=${1}/mantest -z "${output}" && output="`basename ${1}`.${out_ext}"elseif test -d ${1}/man; thendir=${1}/manelsedir=${1}fisubj0=`${echo} ${dir} | ${SED} -e ${file_sed}`subj="all in \\file{${subj0}}"fielseif test ${#} -gt 1 ; thensubj=" etc.";elsesubj=toc=if test -z "${output}"; thenoutput=`basename "${1}"`output="`echo ${output} | ${SED} 's/[Rr]d$//'`${out_ext}"fifisubj0=`${echo} ${1} | ${SED} -e ${file_sed}`subj="\\file{${subj0}}${subj}"fi## substitution went wrong under ashtitle1="\\R{} documentation}} \\par\\bigskip{{\\Large of ${subj}"title=${title-$title1}if test "${enc}"="unknown"; thenif test -n "$pkg_enc"; thenenc=${pkg_enc}${verbose} "using package encoding ${enc}"fifi## Prepare for building the documentation.if test -z "${output}"; thenoutput="Rd2.${out_ext}"fiif test -f ${output}; thenecho "file '${output}' exists; please remove first"exit 1fiif test -d ${build_dir}; thenrm -rf ${build_dir} || echo "cannot write to build dir" && exit 2fimkdir ${build_dir}## Rd2.tex part 1: headerif test ${batch}; thencat > ${build_dir}/Rd2.tex <<EOF\\nonstopmode{}EOFelsecat > ${build_dir}/Rd2.tex <<EOFEOFficat >> ${build_dir}/Rd2.tex <<EOF\\documentclass[${R_PAPERSIZE}paper]{book}\\usepackage[${R_RD4DVI-ae}]{Rd}\\usepackage{makeidx}\\usepackage[@ENC@]{inputenc}\\makeindex{}\\begin{document}EOFif test "${is_bundle}" = no; thencat >> ${build_dir}/Rd2.tex <<EOF\\chapter*{}\\begin{center}{\\textbf{\\huge ${title}}}\\par\\bigskip{\\large \\today}\\end{center}EOFif test -f ${1}/DESCRIPTION; thenRd_DESCRIPTION_to_LaTeX ${1}/DESCRIPTION >> ${build_dir}/Rd2.texfiif test "${is_base_package}" = yes; thenR_version=unknownif test -f ${1}/../../../VERSION; thenR_version=`cat ${1}/../../../VERSION`fiRd_DESCRIPTION_to_LaTeX ${1}/DESCRIPTION.in | \${SED} "s/@VERSION@/${R_version}/" >> ${build_dir}/Rd2.texfielsecat >> ${build_dir}/Rd2.tex <<EOF\\pagenumbering{Roman}\\begin{titlepage}\\strut\\vfill\\begin{center}{\\textbf{\\Huge ${title}}}\\par\\bigskip{\\large \\today}\\end{center}\\par\\bigskipEOFRd_DESCRIPTION_to_LaTeX ${1}/DESCRIPTION >> ${build_dir}/Rd2.texcat >> ${build_dir}/Rd2.tex <<EOF\\vfill\\vfill\\end{titlepage}EOFfi## Rd2.tex part 2: bodyif test "${is_bundle}" = no; then${only_meta} || ${echo} ${toc} >> ${build_dir}/Rd2.texRdconv_dir_or_files_to_LaTeX ${build_dir}/Rd2.tex ${dir-${@}}elsecat >> ${build_dir}/Rd2.tex <<EOF\\setcounter{secnumdepth}{-1}\\pagenumbering{roman}\\tableofcontents{}\\cleardoublepage{}\\pagenumbering{arabic}EOFfor p in ${bundle_pkgs}; do${echo} "Bundle package: '${p}'"${echo} "\\chapter{Package \`${p}'}" >> ${build_dir}/Rd2.texif test -f ${1}/${p}/DESCRIPTION.in; thenRd_DESCRIPTION_to_LaTeX ${1}/${p}/DESCRIPTION.in \>> ${build_dir}/Rd2.texfiRdconv_dir_or_files_to_LaTeX ${build_dir}/Rd2.tex ${1}/${p}/man${echo} "\\clearpage{}" >> ${build_dir}/Rd2.texdone${echo} "\\cleardoublepage{}" >> ${build_dir}/Rd2.texfi## Rd2.tex part 3: footercat >> ${build_dir}/Rd2.tex <<EOF\\printindex{}\\end{document}EOF## Look for encodingsENCS=`grep '^\\\\inputencoding' ${build_dir}/Rd2.tex | uniq |\${SED} -e 's/^\\\\inputencoding{\(.*\)}/\1/'`ENCS=`grep '^\\\\\inputencoding' ${build_dir}/Rd2.tex | uniq | \${SED} -e 's/^\\\\inputencoding{\(.*\)}/\1/' | \tr '\na-z0-9' ',a-z0-9' | ${SED} -e s/,$//`#echo "ENCS is ${ENCS}"## substitute for the encodings usedmv ${build_dir}/Rd2.tex ${build_dir}/Rd2.tex.preif test -z "${ENCS}"; then${SED} -e '/^\\usepackage\[@ENC@\]{inputenc}$/d' \${build_dir}/Rd2.tex.pre > ${build_dir}/Rd2.texelse${SED} -e s/^\\\\usepackage\\[@ENC@\\]/\\\\usepackage[${ENCS}]/ \${build_dir}/Rd2.tex.pre > ${build_dir}/Rd2.texfi## <FIXME>## Need to do something smarter about the exit status in batch mode.status=0## <FIXME>R_TEXOPTS=if test "${R_OSTYPE}" = "windows"; thenmiktex=`latex --version | grep ^MiKTeX | wc -l`if test "${miktex}" = "1"; thenR_TEXOPTS=--include-directory=${R_HOME}/share/texmffifiecho "Creating ${out_ext} output from LaTeX ..."cd ${build_dir}if test "${out_ext}" = pdf; then${R_PDFLATEXCMD} ${R_TEXOPTS} Rd2 || status=1if test $status -gt 0; thenecho "Error in running pdflatex command ('${R_PDFLATEXCMD}')"do_cleanupexit 1fiif test "${index}" != "false"; then## OK for R_MAKEINDEXCMD to fail.${R_MAKEINDEXCMD} Rd2${R_PDFLATEXCMD} ${R_TEXOPTS} Rd2 || status=1if test $status -gt 0; thenecho "Error in running pdflatex command ('${R_PDFLATEXCMD}')"do_cleanupexit 1fifi${R_PDFLATEXCMD} ${R_TEXOPTS} Rd2 || status=1if test $status -gt 0; thenecho "Error in running pdflatex command ('${R_PDFATEXCMD}')"do_cleanupexit 1fielse${R_LATEXCMD} ${R_TEXOPTS} Rd2 || status=1if test $status -gt 0; thenecho "Error in running latex command ('${R_LATEXCMD}')"do_cleanupexit 1fi## OK for R_MAKEINDEXCMD to fail.${R_MAKEINDEXCMD} Rd2${R_LATEXCMD} ${R_TEXOPTS} Rd2 || status=1if test $status -gt 0; thenecho "Error in running latex command ('${R_LATEXCMD}')"do_cleanupexit 1fifiif test ! -f Rd2.${out_ext}; thenecho "Error: no output file was created"do_cleanupexit 1ficd ${start_dir}echo "Saving output to '${output}' ..."cp ${build_dir}/Rd2.${out_ext} ${output}echo "Done"do_cleanup${preview} ${output}exit ${status}### Local Variables: ***### mode: sh ***### sh-indentation: 2 ***### End: ***