Report the LaTeX error from stderr when build_manual() fails#2637
Report the LaTeX error from stderr when build_manual() fails#2637hadley merged 7 commits intor-lib:mainfrom
Conversation
This parses the stderr text for the "LaTeX Error:" line and reports it if it's found.
R/build-manual.R
Outdated
| @@ -17,7 +17,10 @@ build_manual <- function(pkg = ".", path = NULL) { | |||
| ), fail_on_status = TRUE, stderr = "2>&1", spinner = FALSE), | |||
There was a problem hiding this comment.
I guess the forwarding from stderr to stdout is not working here?
There was a problem hiding this comment.
It seems so, e$stdout is NULL.
Here's what I get when printing e$stderr:
e$stderr
[1] "Hmm ... looks like a package\nConverting Rd files to LaTeX ....\nCreating pdf output from LaTeX ...\nError in texi2dvi(file = file, pdf = TRUE, clean = clean, quiet = quiet, : \n Running 'texi2dvi' on 'Rd2.tex' failed.\nLaTeX errors:\n! LaTeX Error: File `inconsolata.sty' not found.\n\nType X to quit or <RETURN> to proceed,\nor enter new name. (Default extension: sty)\n\n! Emergency stop.\n<read *> \n \nl.326 ^^M\n \n! ==> Fatal error occurred, no output PDF file produced!\nOutput:\nThis is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2025/dev/Debian) (preloaded format=pdflatex)\n restricted \\write18 enabled.\nentering extended mode\nLaTeX2e <2024-11-01> patch level 2\nL3 programming layer <2025-01-18>\n(./Rd2.tex\n(/usr/share/texlive/texmf-dist/tex/latex/base/book.cls\nDocument Class: book 2024/06/29 v1.4n Standard LaTeX document class\n(/usr/share/texlive/texmf-dist/tex/latex/base/bk10.clo))\n(/usr/share/R/share/texmf/tex/latex/Rd.sty\n(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty)\n(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/bm.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/verbatim.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty\nFor additional information on amsmath, use the `?' option.\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty))\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty))\n(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/jknapltx/mathrsfs.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty)\n\n! LaTeX Error: File `inconsolata.sty' not found.\n\nType X to quit or <RETURN> to proceed,\nor enter new name. (Default extension: sty)\n\nEnter file name: \n! Emergency stop.\n<read *> \n \nl.326 ^^M\n \n! ==> Fatal error occurred, no output PDF file produced!\nTranscript written on Rd2.log.\nError in texi2dvi(file = file, pdf = TRUE, clean = clean, quiet = quiet, : \n Running 'texi2dvi' on 'Rd2.tex' failed.\nLaTeX errors:\n! LaTeX Error: File `inconsolata.sty' not found.\n\nType X to quit or <RETURN> to proceed,\nor enter new name. (Default extension: sty)\n\n! Emergency stop.\n<read *> \n \nl.326 ^^M\n \n! ==> Fatal error occurred, no output PDF file produced!\nOutput:\nThis is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2025/dev/Debian) (preloaded format=pdflatex)\n restricted \\write18 enabled.\nentering extended mode\nLaTeX2e <2024-11-01> patch level 2\nL3 programming layer <2025-01-18>\n(./Rd2.tex\n(/usr/share/texlive/texmf-dist/tex/latex/base/book.cls\nDocument Class: book 2024/06/29 v1.4n Standard LaTeX document class\n(/usr/share/texlive/texmf-dist/tex/latex/base/bk10.clo))\n(/usr/share/R/share/texmf/tex/latex/Rd.sty\n(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty)\n(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/bm.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/verbatim.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty\nFor additional information on amsmath, use the `?' option.\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty))\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty))\n(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/jknapltx/mathrsfs.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty)\n\n! LaTeX Error: File `inconsolata.sty' not found.\n\nType X to quit or <RETURN> to proceed,\nor enter new name. (Default extension: sty)\n\nEnter file name: \n! Emergency stop.\n<read *> \n \nl.326 ^^M\n \n! ==> Fatal error occurred, no output PDF file produced!\nTranscript written on Rd2.log.\nError in running tools::texi2pdf()\n"
And this if I remove stderr = "2>&1":
[1] "Converting Rd files to LaTeX ....\nError in texi2dvi(file = file, pdf = TRUE, clean = clean, quiet = quiet, : \n Running 'texi2dvi' on 'Rd2.tex' failed.\nLaTeX errors:\n! LaTeX Error: File `inconsolata.sty' not found.\n\nType X to quit or <RETURN> to proceed,\nor enter new name. (Default extension: sty)\n\n! Emergency stop.\n<read *> \n \nl.326 ^^M\n \n! ==> Fatal error occurred, no output PDF file produced!\nOutput:\nThis is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2025/dev/Debian) (preloaded format=pdflatex)\n restricted \\write18 enabled.\nentering extended mode\nLaTeX2e <2024-11-01> patch level 2\nL3 programming layer <2025-01-18>\n(./Rd2.tex\n(/usr/share/texlive/texmf-dist/tex/latex/base/book.cls\nDocument Class: book 2024/06/29 v1.4n Standard LaTeX document class\n(/usr/share/texlive/texmf-dist/tex/latex/base/bk10.clo))\n(/usr/share/R/share/texmf/tex/latex/Rd.sty\n(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty)\n(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/bm.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/verbatim.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty\nFor additional information on amsmath, use the `?' option.\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty))\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty))\n(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/jknapltx/mathrsfs.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty)\n\n! LaTeX Error: File `inconsolata.sty' not found.\n\nType X to quit or <RETURN> to proceed,\nor enter new name. (Default extension: sty)\n\nEnter file name: \n! Emergency stop.\n<read *> \n \nl.326 ^^M\n \n! ==> Fatal error occurred, no output PDF file produced!\nTranscript written on Rd2.log.\nError in texi2dvi(file = file, pdf = TRUE, clean = clean, quiet = quiet, : \n Running 'texi2dvi' on 'Rd2.tex' failed.\nLaTeX errors:\n! LaTeX Error: File `inconsolata.sty' not found.\n\nType X to quit or <RETURN> to proceed,\nor enter new name. (Default extension: sty)\n\n! Emergency stop.\n<read *> \n \nl.326 ^^M\n \n! ==> Fatal error occurred, no output PDF file produced!\nOutput:\nThis is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2025/dev/Debian) (preloaded format=pdflatex)\n restricted \\write18 enabled.\nentering extended mode\nLaTeX2e <2024-11-01> patch level 2\nL3 programming layer <2025-01-18>\n(./Rd2.tex\n(/usr/share/texlive/texmf-dist/tex/latex/base/book.cls\nDocument Class: book 2024/06/29 v1.4n Standard LaTeX document class\n(/usr/share/texlive/texmf-dist/tex/latex/base/bk10.clo))\n(/usr/share/R/share/texmf/tex/latex/Rd.sty\n(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty)\n(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/bm.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/tools/verbatim.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty\nFor additional information on amsmath, use the `?' option.\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty))\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty))\n(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/jknapltx/mathrsfs.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty)\n(/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty)\n\n! LaTeX Error: File `inconsolata.sty' not found.\n\nType X to quit or <RETURN> to proceed,\nor enter new name. (Default extension: sty)\n\nEnter file name: \n! Emergency stop.\n<read *> \n \nl.326 ^^M\n \n! ==> Fatal error occurred, no output PDF file produced!\nTranscript written on Rd2.log.\nError in running tools::texi2pdf()\n"
There was a problem hiding this comment.
Feels like we should probably just report the whole string? Looks like that was the intent of the cat(). If you want to put it in the string, you'll need something like this to suppress cli's default wrapping:
# Supress cli wrapping
no_wrap <- function(x) {
x <- gsub(" ", "\u00a0", x, fixed = TRUE)
x <- gsub("\n", "\f", x, fixed = TRUE)
x
}(just stick that in utils.R)
|
With that the output looks like the one in the collapsed paragraph there's a fair amount of repetition and probably unnecessary details, but at least we are not hiding information that could be potentially useful in other cases. Generated error message |
|
I'd forgotten how terrible the latex error messages are 😬 |
This parses the stderr text for the "LaTeX Error:" line and reports it if it's found, producing this output:
If no match is found, the output remains the same as the current one:
Fixes #2586.