[R] post_processor in rmarkdown not working

Duncan Murdoch murdoch.duncan at gmail.com
Fri Sep 8 13:55:38 CEST 2017


On 08/09/2017 3:56 AM, Thierry Onkelinx wrote:
> That is strange. Another function in the same package 
> (INBOmd::inbo_rapport) uses the same trick. 

I think the issue there is that the LaTeX code is valid before the 
post-processor is run, it just re-orders things.  So rmarkdown::render 
runs Pandoc, then LaTeX (via Latexmk), then the post-processor, then 
LaTeX again.

This suggests a solution to the rsos_article problem:  somehow make sure 
that the LaTeX is valid from the start, e.g. by defining dummy versions 
of the missing macros.

Duncan Murdoch


I actually started by
> copying the post_processor() from that function. INBOmd::inbo_rapport() 
> works both with and without BibTex. Working examples are 
> source/inbo_rapport and source/inbo_rapport_basic from 
> https://github.com/inbo/inbomd_examples. Note that you need some extra 
> work after installing INBOmd to inbo_rapport() to run. See the README at 
> https://github.com/inbo/INBOmd
> 
> I've created an issue https://github.com/rstudio/rmarkdown/issues/1138
> 
> ir. Thierry Onkelinx
> Instituut voor natuur- en bosonderzoek / Research Institute for Nature 
> and Forest
> team Biometrie & Kwaliteitszorg / team Biometrics & Quality Assurance
> Kliniekstraat 25
> 1070 Anderlecht
> Belgium
> 
> To call in the statistician after the experiment is done may be no more 
> than asking him to perform a post-mortem examination: he may be able to 
> say what the experiment died of. ~ Sir Ronald Aylmer Fisher
> The plural of anecdote is not data. ~ Roger Brinner
> The combination of some data and an aching desire for an answer does not 
> ensure that a reasonable answer can be extracted from a given body of 
> data. ~ John Tukey
> 
> 2017-09-07 21:18 GMT+02:00 Duncan Murdoch <murdoch.duncan at gmail.com 
> <mailto:murdoch.duncan at gmail.com>>:
> 
>     On 07/09/2017 2:04 PM, Duncan Murdoch wrote:
> 
>         On 07/09/2017 10:11 AM, Thierry Onkelinx wrote:
> 
>             Dear Duncan,
> 
>             Thanks for chiming in. Could you explain how you set debug() on
>             post_processor()? I've tried adding debug(post_processor) to
>             rsos_article() or adding debug(post_processor) when after
>             post_processor
>             was defined in the debugger. Neither work for me.
> 
> 
>         Not working for me either right now for some reason or other. 
>         What I
>         was doing was manually running debug(post_processor) in the debugger
>         after single stepping past its definition.
> 
>         What does show it is running is that at that same point I can
>         execute
> 
>         post_processor <- function() stop()
> 
>         and it stops.
> 
>         The end of the console log looks like this:
> 
> 
>         /Applications/RStudio.app/Contents/MacOS/pandoc/pandoc +RTS
>         -K512m -RTS
>         skeleton.utf8.md <http://skeleton.utf8.md> --to latex --from
>         markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash
>         --output skeleton.tex --template
>         /Library/Frameworks/R.framework/Versions/3.3/Resources/library/INBOmd/rmarkdown/templates/rsos_article/resources/template.tex
>         --natbib --bibliography sample.bib
>         Latexmk: This is Latexmk, John Collins, 19 Jan. 2017, version:
>         4.52c.
>         Error in output_format$post_processor(yaml_front_matter, utf8_input,
>         output_file,  :
>              unused arguments (yaml_front_matter, utf8_input,
>         output_file, clean,
>         !quiet)
>         Called from: output_format$post_processor(yaml_front_matter,
>         utf8_input,
>         output_file,
>                clean, !quiet)
> 
>         so we see pandoc being run, then Latexmk, then the
>         post_processor call.
>         It seems a little odd that Latexmk is being run.  Is that
>         something you
>         are doing, or is it pandoc asking for that?  If the latter, can
>         you tell
>         pandoc not to do so?
> 
> 
>     I've done some debugging in rmarkdown::render.  Apparently if you
>     need Bibtex (as your example does), it runs Latexmk before the
>     post-processor.
> 
>     I don't know if there's a way around this...
> 
>     Duncan Murdoch
> 
> 
> 
> 
> 
>             All supporting files are available within the package. The
>             code below
>             should be reproducible on your machine.
> 
>             remove.packages("INBOmd")
>             devtools::install_github("inbo/INBOmd at post_processor")
>             setwd(system.file("rmarkdown/templates/rsos_article/skeleton",
>             package =
>             "INBOmd"))
>             debug(INBOmd::rsos_article)
>             rmarkdown::render("skeleton.Rmd")
> 
> 
>         I'm not sure you would normally have write access in that
>         directory, so
>         it may not be typical of what you'd see in a user directory.  I
>         certainly see something different when I copy the skeleton.Rmd
>         file (and
>         nothing else) to my own temp directory.
> 
> 
> 
>             The sign that post_processor() fails when the tex file still
>             contains
>             \EndFirstPage resulting in the compilation error "Undefined
>             control
>             sequence. l.128 \EndFirstPage"
> 
> 
>         That certainly indicates it isn't doing what you want, but it
>         might be
>         running and doing something else.
> 
>         Duncan Murdoch
> 
> 
>             I still get the error with the current version of the code.
>             Running the
>             post_processor manually works.
> 
>             eval(parse(
>                  text = readLines(
>                   
>             "https://raw.githubusercontent.com/inbo/INBOmd/post_processor/R/rsos_article.R
>             <https://raw.githubusercontent.com/inbo/INBOmd/post_processor/R/rsos_article.R>"
>                  )[72:92]
>             ))
>             post_processor(output_file = "skeleton.tex")
>             system("pdflatex skeleton.tex")
> 
>             Best regards,
> 
> 
>             ir. Thierry Onkelinx
>             Instituut voor natuur- en bosonderzoek / Research Institute
>             for Nature
>             and Forest
>             team Biometrie & Kwaliteitszorg / team Biometrics & Quality
>             Assurance
>             Kliniekstraat 25
>             1070 Anderlecht
>             Belgium
> 
>             To call in the statistician after the experiment is done may
>             be no more
>             than asking him to perform a post-mortem examination: he may
>             be able to
>             say what the experiment died of. ~ Sir Ronald Aylmer Fisher
>             The plural of anecdote is not data. ~ Roger Brinner
>             The combination of some data and an aching desire for an
>             answer does not
>             ensure that a reasonable answer can be extracted from a
>             given body of
>             data. ~ John Tukey
> 
>             2017-09-07 12:14 GMT+02:00 Duncan Murdoch
>             <murdoch.duncan at gmail.com <mailto:murdoch.duncan at gmail.com>
>             <mailto:murdoch.duncan at gmail.com
>             <mailto:murdoch.duncan at gmail.com>>>:
> 
>                   On 06/09/2017 5:41 AM, Thierry Onkelinx wrote:
> 
>                       Dear all,
> 
>                       I'm trying to write a post_processor() for a
>             custom rmarkdown
>                       format. The
>                       goal of the post_processor() is to modify the
>             latex file before
>                       it is
>                       compiled. For some reason the post_processor() is
>             not run. The
>                       post_processor() does work when I run it manually
>             on the tex file.
> 
>                       Any suggestions on what I'm doing wrong? Below is
>             the relevant
>                       snippet of
>                       the code. The full code is available at
>             https://github.com/inbo/INBOmd/blob/post_processor/R/rsos_article.R
>             <https://github.com/inbo/INBOmd/blob/post_processor/R/rsos_article.R>
>                     
>               <https://github.com/inbo/INBOmd/blob/post_processor/R/rsos_article.R <https://github.com/inbo/INBOmd/blob/post_processor/R/rsos_article.R>>
>             https://github.com/inbo/INBOmd/blob/post_processor/inst/rmarkdown/templates/rsos_article/skeleton/skeleton.Rmd
>             <https://github.com/inbo/INBOmd/blob/post_processor/inst/rmarkdown/templates/rsos_article/skeleton/skeleton.Rmd>
>                     
>               <https://github.com/inbo/INBOmd/blob/post_processor/inst/rmarkdown/templates/rsos_article/skeleton/skeleton.Rmd <https://github.com/inbo/INBOmd/blob/post_processor/inst/rmarkdown/templates/rsos_article/skeleton/skeleton.Rmd>>
>                       is an Rmd is a MWE that fails compile because the
>                       post_processor() is not
>                       run.
> 
> 
>                   I installed it and tried running it using
> 
>                   debug(INBOmd::rsos_article)
>                   rmarkdown::render("skeleton.Rmd")
> 
>                   then after post_processor was defined, I set it to
>             debug as well,
>                   and could see that the post_processor was being run.
> 
>                   I didn't get useful output, because the LaTeXing
>             failed (I don't
>                   have the rsos.cls), but perhaps you've already fixed
>             this problem,
>                   or perhaps it is intermittent?
> 
>                   Duncan Murdoch
> 
>                       Best regards,
> 
>                       Thierry
> 
>                           post_processor <- function(
>                             metadata, input_file, output_file, clean,
>             verbose
>                           ) {
>                             text <- readLines(output_file, warn = FALSE)
> 
>                             # set correct text in fmtext environment
>                             end_first_page <- grep("\\\\EndFirstPage",
>             text) #nolint
>                             if (length(end_first_page) == 1) {
>                               maketitle <- grep("\\\\maketitle", text)
>             #nolint
>                               text <- c(
>                                 text[1:(maketitle - 1)],
>                                 "\\begin{fmtext}",
>                                 text[(maketitle + 1):(end_first_page - 1)],
>                                 "\\end{fmtext}",
>                                 "\\maketitle",
>                                 text[(end_first_page + 1):length(text)]
>                               )
>                               writeLines(enc2utf8(text), output_file,
>             useBytes = TRUE)
>                             }
>                             output_file
>                           }
> 
>                           output_format(
>                             knitr = knitr_options(
>                               opts_knit = list(
>                                 width = 60,
>                                 concordance = TRUE
>                               ),
>                               opts_chunk = opts_chunk,
>                               knit_hooks = knit_hooks
>                             ),
>                             pandoc = pandoc_options(
>                               to = "latex",
>                               latex_engine = "xelatex",
>                               args = args,
>                               keep_tex = keep_tex
>                             ),
>                             post_processor = post_processor,
>                             clean_supporting = !keep_tex
>                           )
> 
> 
> 
>                       ir. Thierry Onkelinx
>                       Instituut voor natuur- en bosonderzoek / Research
>             Institute for
>                       Nature and
>                       Forest
>                       team Biometrie & Kwaliteitszorg / team Biometrics
>             & Quality
>                       Assurance
>                       Kliniekstraat 25
>                       1070 Anderlecht
>                       Belgium
> 
>                       To call in the statistician after the experiment
>             is done may be
>                       no more
>                       than asking him to perform a post-mortem
>             examination: he may be
>                       able to say
>                       what the experiment died of. ~ Sir Ronald Aylmer
>             Fisher
>                       The plural of anecdote is not data. ~ Roger Brinner
>                       The combination of some data and an aching desire
>             for an answer
>                       does not
>                       ensure that a reasonable answer can be extracted
>             from a given
>                       body of data.
>                       ~ John Tukey
> 
>                                [[alternative HTML version deleted]]
> 
>                       ______________________________________________
>             R-help at r-project.org <mailto:R-help at r-project.org>
>             <mailto:R-help at r-project.org <mailto:R-help at r-project.org>>
>             mailing list
>                       -- To UNSUBSCRIBE and more, see
>             https://stat.ethz.ch/mailman/listinfo/r-help
>             <https://stat.ethz.ch/mailman/listinfo/r-help>
>                       <https://stat.ethz.ch/mailman/listinfo/r-help
>             <https://stat.ethz.ch/mailman/listinfo/r-help>>
>                       PLEASE do read the posting guide
>             http://www.R-project.org/posting-guide.html
>             <http://www.R-project.org/posting-guide.html>
>                       <http://www.R-project.org/posting-guide.html
>             <http://www.R-project.org/posting-guide.html>>
>                       and provide commented, minimal, self-contained,
>             reproducible code.
> 
> 
> 
> 
> 
>



More information about the R-help mailing list