[Bioc-devel] BiocStyle on windows with spaces in path names

Henrik Bengtsson hb at biostat.ucsf.edu
Wed Oct 8 20:41:25 CEST 2014


On Mon, Oct 6, 2014 at 7:03 PM, Henrik Bengtsson <hb at biostat.ucsf.edu> wrote:
> On Mon, Oct 6, 2014 at 6:48 PM, Henrik Bengtsson <hb at biostat.ucsf.edu> wrote:
>> On Mon, Oct 6, 2014 at 5:33 PM, Martin Morgan <mtmorgan at fhcrc.org> wrote:
>>> On 10/06/2014 04:52 PM, Henrik Bengtsson wrote:
>>>>
>>>> Maybe you could use
>>>>
>>>> \RequirePackage{Bioconductor}
>>>>
>>>> and then set the TEXINPUTS environment variable via Sys.setenv().
>>>> Internally tools::texi2dvi() is used that that "listens to" TEXINPUTS.
>>>
>>>
>>> Thanks; I think that would require 'us' to run texi2dvi (otherwise the
>>> environment variable isn't seen by texi2dvi) and that sounds like writing a
>>> Sweave driver, or worse. latex() could be modified to be passed a flag or
>>> path indicating a TEXINPUTS directory where bioconductor.sty could be found,
>>> but that doesn't sound like a robust strategy (e.g., because the
>>> specially-installed sty file becomes out of sync with the version in the
>>> package). Hopefully there is a simpler solution.
>>
>> I haven't tried, but it's possible that if you do
>> Sys.setenv(TEXINPUTS=...) when the BiocStyle is loaded/attached that
>> it will stick/survive until the vignette is built.
>
> It works to set environment variables in either .onLoad() or
> .onAttach().  I verified with:
>
> .onLoad <- function(libname, pkgname) {
>   Sys.setenv(FOO="hello")
> }
>
> .onAttach <- function(libname, pkgname) {
>   Sys.setenv(BAR="world")
> }
>
> that both environment variables 'FOO' and 'BAR' are available to the
> vignette itself and have their values set as expected.  I've tried
> with vignette engines knitr::Rmd and R.rsp::rsp and in both cases the
> build and installed vignettes show FOO=hello and BAR=world.
>
> Given that this works, I would be surprised if you cannot set
> TEXINPUTS such that texi2dvi() et al. won't see it.

See attached latex.R (adopted from
https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/BiocStyle/R/latex.R).
A diff -C 3 (also attached) is:

*** latex_org.R 2014-10-08 11:34:15.949845400 -0700
--- latex.R 2014-10-08 11:33:31.932327700 -0700
***************
*** 1,15 ****
  latex <-
      function(..., width=90, short.fignames=FALSE, fig.path,
               error=FALSE, use.unsrturl=TRUE)
  {
      options(..., width=width)
!     cat(sprintf("\\RequirePackage{%s}\n\n",
!                 sub(".sty$", "", .bioconductor.sty)))

      if (use.unsrturl) {
!         bst <- file.path(system.file(package="BiocStyle", "resources",
!                                      "latex"), "unsrturl")
!         cat(sprintf("\\AtBeginDocument{\\bibliographystyle{%s}}\n", bst))
      }

      setPrefix = function(x) {
--- 1,43 ----
+ unique_path <-
+   function(path, sep=.Platform$path.sep, collapse=sep)
+ {
+     n <- length(path)
+     has_tail_sep <- (substring(path[n], nchar(path[n])) == sep)
+     path <- unlist(strsplit(path, split=sep, fixed=TRUE))
+     path <- unique(path)
+     path <- path[nchar(path) > 0L]
+     path <- path[sapply(path, function(.) file_test("-d", .))]
+     if (has_tail_sep) path <- c(path, "")
+     paste(path, collapse=collapse)
+ }
+
+ texinputs <-
+   function(new=NULL, name="TEXINPUTS")
+ {
+     current <- Sys.getenv(name)
+     if (length(new) > 0L) {
+         new <- normalizePath(new)
+         args <- list(unique_path(c(new, current)))
+         names(args) <-name
+         do.call(Sys.setenv, args)
+         current <- Sys.getenv(name)
+     }
+     invisible(current)
+ }
+
  latex <-
      function(..., width=90, short.fignames=FALSE, fig.path,
               error=FALSE, use.unsrturl=TRUE)
  {
      options(..., width=width)
!
!     texinputs(new=dirname(.bioconductor.sty))
!     cat("\\RequirePackage{Bioconductor}\n\n")

      if (use.unsrturl) {
!         bst_path <- system.file(package="BiocStyle", "resources", "latex")
!         texinputs(new=bst_path, name="BSTINPUTS")
!         cat("\\AtBeginDocument{\\bibliographystyle{unsrturl}}\n")
      }

      setPrefix = function(x) {

You may want to make those function local to latex().  I haven't
verified it works (won't have time), but I bet a beer that it will
work.

/Henrik


>
> /Henrik
>
>>
>> /Henrik
>>
>>>
>>> Martin
>>>
>>>
>>>>
>>>> Just FYI: I use this trick in
>>>> https://github.com/HenrikBengtsson/R.rsp/blob/master/R/compileLaTeX.R
>>>> to set/fix/update TEXINPUTS temporarily, but for somewhat different
>>>> reasons.  There you also see take extra precautions to drop duplicates
>>>> etc.
>>>>
>>>> /Henrik
>>>>
>>>> On Mon, Oct 6, 2014 at 3:21 PM, Martin Morgan <mtmorgan at fhcrc.org> wrote:
>>>>>
>>>>> On 10/6/2014 2:44 PM, James W. MacDonald wrote:
>>>>>>
>>>>>>
>>>>>> Hi Steffen,
>>>>>>
>>>>>> It looks like you are running R as an administrator, rather than as a
>>>>>> regular user (or you are on something really old like XP). By default R
>>>>>> should try to create a user-level library directory in your Documents
>>>>>> folder. It is probably not such a good idea to run R as administrator if
>>>>>> you are on a more modern version of Windows.
>>>>>>
>>>>>> Note that system.file (which BiocStyle::latex()  calls to find the
>>>>>> package
>>>>>> path) will in the case of base packages use .Library to construct the
>>>>>> path:
>>>>>>
>>>>>>> system.file()
>>>>>>
>>>>>>
>>>>>> [1] "C:/PROGRA~1/R/R-31~1.0/library/base"
>>>>>>
>>>>>> Which being an 8.1 path, will work for MikTex. But if I run as an
>>>>>
>>>>>
>>>>>
>>>>> It would be great for BiocStyle to return a functional path under all
>>>>> circumstances.
>>>>>
>>>>> I'm not sure that MikTex handles ~ in paths? or at least not the way
>>>>> BiocStyle currently uses this, as
>>>>>
>>>>>
>>>>> \RequirePackage{C:/PROGRA~1/R/R-31~1.0/library/BiocStyle/sty/Bioconductor}
>>>>>
>>>>> When I try to mock this up it looks like the ~ are being processed as
>>>>> latex
>>>>> -- there is a latex file not found error with the ~ replaced by
>>>>> \unhbox\voidb at x \penalty \@m \{}.
>>>>>
>>>>> I thought there might be some hints with the Sweave sty file use by all
>>>>> vignettes. This is found with
>>>>>
>>>>>          styfile <- file.path(R.home("share"), "texmf", "tex", "latex",
>>>>> "Sweave")
>>>>>          if (.Platform$OS.type == "windows")
>>>>>              styfile <- chartr("\\", "/", styfile)
>>>>>          if (length(grep(" ", styfile)))
>>>>>              warning(gettextf("path to %s contains spaces,\n",
>>>>> sQuote(styfile)),
>>>>>                      gettext("this may cause problems when running
>>>>> LaTeX"),
>>>>>                      domain = NA)
>>>>>
>>>>> but R.home() (eventually find.package()) uses .Library for the special
>>>>> case
>>>>> when the path to a single package from the base distribution is being
>>>>> sought
>>>>>
>>>>>> find.package("stats")
>>>>>
>>>>> [1] "C:/PROGRA~1/R/R-31~1.1/library/stats"
>>>>>>
>>>>>> find.package(c("stats", "stats"))[1]
>>>>>
>>>>> [1] "C:/Program Files/R/R-3.1.1/library/stats"
>>>>>
>>>>> So I'm not sure how to get at a working path to Bioconductor.sty in the
>>>>> face
>>>>> of spaces in the installed path name (the warning hints that R has
>>>>> similar
>>>>> problems).
>>>>>
>>>>>
>>>>>> administrator and put BiocStyle in my Program Files library, I get
>>>>>>
>>>>>>> latex()
>>>>>>
>>>>>>
>>>>>> \RequirePackage{C:/Program
>>>>>> Files/R/R-3.1.0/library/BiocStyle/sty/Bioconductor}
>>>>>>
>>>>>> \AtBeginDocument{\bibliographystyle{C:/Program
>>>>>> Files/R/R-3.1.0/library/BiocStyle/sty/unsrturl}}
>>>>>>
>>>>>> Which of course will fail. So the best option is to stop running R as an
>>>>>> administrator, and install packages in your Documents folder in a path
>>>>>> with
>>>>>> no spaces.
>>>>>>
>>>>>> Best,
>>>>>>
>>>>>> Jim
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Mon, Oct 6, 2014 at 4:34 PM, Neumann, Steffen <sneumann at ipb-halle.de>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> sometimes I am forced to R CMD check packages on windows,
>>>>>>> and my problem is that both the system-wide library and
>>>>>>> the personal library with BiocStyle contain spaces, so that
>>>>>>> BiocStyle::latex() results in:
>>>>>>> \RequirePackage{C:/Program
>>>>>>> Files/R/R-3.1.0/library/BiocStyle/sty/Bioconductor}
>>>>>>>
>>>>>>> which causes MiKTeX to fail with
>>>>>>> ! LaTeX Error: File
>>>>>>> `C:/ProgramFiles/R/R-3.1.0/library/BiocStyle/sty/Bioconductor.sty' not
>>>>>>> found.
>>>>>>> (This is with BiocStyles-1.3.15)
>>>>>>>
>>>>>>> What is the recommended solution here ? Installing R to a non-standard
>>>>>>> location ?
>>>>>>> Use texlive instead of miktex (does that make a difference ?) Or
>>>>>>> something
>>>>>>> else ?
>>>>>>>
>>>>>>> Yours,
>>>>>>> Steffen
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Bioc-devel at r-project.org mailing list
>>>>>>> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Dr. Martin Morgan, PhD
>>>>> Fred Hutchinson Cancer Research Center
>>>>> 1100 Fairview Ave. N.
>>>>> PO Box 19024 Seattle, WA 98109
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Bioc-devel at r-project.org mailing list
>>>>> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>>>
>>>
>>>
>>> --
>>> Computational Biology / Fred Hutchinson Cancer Research Center
>>> 1100 Fairview Ave. N.
>>> PO Box 19024 Seattle, WA 98109
>>>
>>> Location: Arnold Building M1 B861
>>> Phone: (206) 667-2793
-------------- next part --------------
*** latex_org.R	2014-10-08 11:34:15.949845400 -0700
--- latex.R	2014-10-08 11:33:31.932327700 -0700
***************
*** 1,15 ****
  latex <-
      function(..., width=90, short.fignames=FALSE, fig.path,
               error=FALSE, use.unsrturl=TRUE)
  {
      options(..., width=width)
!     cat(sprintf("\\RequirePackage{%s}\n\n",
!                 sub(".sty$", "", .bioconductor.sty)))
  
      if (use.unsrturl) {
!         bst <- file.path(system.file(package="BiocStyle", "resources",
!                                      "latex"), "unsrturl")
!         cat(sprintf("\\AtBeginDocument{\\bibliographystyle{%s}}\n", bst))
      }
  
      setPrefix = function(x) {
--- 1,43 ----
+ unique_path <-
+   function(path, sep=.Platform$path.sep, collapse=sep)
+ {
+     n <- length(path)
+     has_tail_sep <- (substring(path[n], nchar(path[n])) == sep)
+     path <- unlist(strsplit(path, split=sep, fixed=TRUE))
+     path <- unique(path)
+     path <- path[nchar(path) > 0L]
+     path <- path[sapply(path, function(.) file_test("-d", .))]
+     if (has_tail_sep) path <- c(path, "")
+     paste(path, collapse=collapse)
+ }
+ 
+ texinputs <-
+   function(new=NULL, name="TEXINPUTS")
+ {
+     current <- Sys.getenv(name)
+     if (length(new) > 0L) {
+         new <- normalizePath(new)
+         args <- list(unique_path(c(new, current)))
+         names(args) <-name
+         do.call(Sys.setenv, args)
+         current <- Sys.getenv(name)
+     }
+     invisible(current)
+ }
+ 
  latex <-
      function(..., width=90, short.fignames=FALSE, fig.path,
               error=FALSE, use.unsrturl=TRUE)
  {
      options(..., width=width)
! 
!     texinputs(new=dirname(.bioconductor.sty))
!     cat("\\RequirePackage{Bioconductor}\n\n")
  
      if (use.unsrturl) {
!         bst_path <- system.file(package="BiocStyle", "resources", "latex")
!         texinputs(new=bst_path, name="BSTINPUTS")
!         cat("\\AtBeginDocument{\\bibliographystyle{unsrturl}}\n")
      }
  
      setPrefix = function(x) {


More information about the Bioc-devel mailing list