• 新鲜事R语言
  • 新包 pagedown 求测试:另一条通向(PDF)奴役之路

关于通向 PDF 之路,我一直想用网页技术取代 LaTeX。半年前我抛出过一个前传,现在万里长征走完了第一步,求各位莽撞人帮忙测试一下并提提反馈意见:https://github.com/rstudio/pagedown

这包现在还没有发到 CRAN 上,还请不要帮忙在社交平台上宣传。文档几乎不存在,我这两天打算写一写,不过我也想看看在没有文档的情况下,用户是否能上手。现在已有的输出格式都在 README 中展示了(普通分页文档、海报、简历、名片、信函)。如果用 RStudio 的话,可以在创建新 R Markdown 文档时从模板(From Template)中选择 pagedown 包里的模板。编出的 HTML 文档可以在 Google Chrome 中打印为 PDF。剩下的我觉得就没啥要说的了。

    yihui 好,佩奇挡终于来了!然而, “想看看在没有文档的情况下,用户是否能上手,”这话为啥听着这么耳熟……

    tctcab 这让我想起当年我上大学的时候,学生每人一个学生证、饭卡、公交卡、图书证、银行卡……后来推广“一卡通”,当年的十大新闻就是,“一卡通让每个学生从此多了一张卡”。

      tctcab 我也经常引用这幅漫画,比如 blogdown 书的脚注 23。pagedown 不是建立新标准,而是挖掘现有技术的潜力(CSS),我觉得 CSS 玩起来实在比 LaTeX 好玩多了,比如那个 poster_jacobs() 海报就是我在上上周六徒手写出来的,只有一百来行 CSS,样式质量应该很逼近 LaTeX 了。很多 CSS 能一行搞定的事情在 LaTeX 中拼老命也搞不定。

      dapengde 我经常做这种底线测试,让用户一脸懵圈去试一个新产品,看他们会走怎样的弯路,再有针对性地写文档。理想情况是最好我不需要写文档,当然这基本是不可能的。上一次我让你们测试 tinytex 也是让你们自行上路:https://d.cosx.org/d/419672

        dapengde

        一卡通替代学生证饭卡图书证啥的算是化繁为简大势所趋,我大学里出门就带钥匙手机+一卡通就够了。佩奇党可能还不一样。要看佩奇党能不能干得过latex的话,其实比较的是:

        • 学习成本(markdown+css+html+js), 这个其实在我看来佩奇党的语法复杂度并不低于latex
        • 功能:据我了解,html+css+js这个框架下还是有好多坑的,(比如之前@Cloud2016 碰到的mathjax显示问题,最后也不知道为啥…,比如xaringan输出pdf,现在使用的是decktape)
        • 便利性:latex包很笨重,然而浏览器是机器必备,佩奇党完胜。

        目前看来我觉得还有很长的路要走,不过待我试试这个包再说

          tctcab 佩奇党我觉得是个过渡。大势所趋应该是无纸化。到那个时候,谁还用 pdf 这种老古董。

          推行校园一卡通的过程并不容易,当年怨声载道,我们直到毕业也没通。所谓的大势所趋,我觉得都是马后炮,成王败寇。无数事先声称大势所趋的,中途不都挂掉了嘛,比如——某某科技的炸弹工作站。

          时势造英雄,英雄也造时势。至于凡人,只要玩得开心就好啦。

          yihui 将来如果用CSS彻底代替LaTeX不知道是一个什么场景?Rmd->md->html->其他格式?

            yihui

            pagedown 测试报告

            测试环境:

            > sessionInfo()
            R version 3.5.1 (2018-07-02)
            Platform: x86_64-w64-mingw32/x64 (64-bit)
            Running under: Windows 7 x64 (build 7601) Service Pack 1
            
            Matrix products: default
            
            locale:
            [1] LC_COLLATE=Chinese (Simplified)_People's Republic of China.936 
            [2] LC_CTYPE=Chinese (Simplified)_People's Republic of China.936   
            [3] LC_MONETARY=Chinese (Simplified)_People's Republic of China.936
            [4] LC_NUMERIC=C                                                   
            [5] LC_TIME=Chinese (Simplified)_People's Republic of China.936    
            
            attached base packages:
            [1] stats     graphics  grDevices utils     datasets  methods   base     
            
            loaded via a namespace (and not attached):
             [1] compiler_3.5.1   rsconnect_0.8.12 htmltools_0.3.6  tools_3.5.1      yaml_2.2.0       Rcpp_1.0.0       rmarkdown_1.11.2
             [8] knitr_1.21       pagedown_0.0.26  xfun_0.4         digest_0.6.18    packrat_0.5.0    evaluate_0.12   

            预览工具:Google Chrome Version 71.0.3578.98 (Official Build) (64-bit)

            安装

            安装正常,只是结束时出现警告信息:

            Warning messages:
            1: In untar2(tarfile, files, list, exdir) :
              skipping pax global extended headers
            2: In untar2(tarfile, files, list, exdir) :
              skipping pax global extended headers
            3: In untar2(tarfile, files, list, exdir) :
              skipping pax global extended headers
            4: In untar2(tarfile, files, list, exdir) :
              skipping pax global extended headers
            5: In untar2(tarfile, files, list, exdir) :
              skipping pax global extended headers
            6: In untar2(tarfile, files, list, exdir) :
              skipping pax global extended headers

            此外,RStudio 起初我没安装预览版,可能导致在菜单里没找到 pagedown 模板。升级到最新预览版就好了。

            意外的惊喜是,内置的 Viewer 在预览版里终于好用了。我终于可以用上无限月读了。喜大普奔。

            生成 html

            六个自带模板,测试结果如下:

            | template | RStudio Viewer | Chrome | print to pdf |
            | --------------------------------- | --------------------- |----------- | ------------ |
            | Business Card | good | good | good |
            | HTML letter | good | bad | N.A. |
            | HTML Resume | good | bad | N.A. |
            | Poster | good | good | good |
            | HTML Poster | good | good | good |
            | Paged HTML documents | N.A. | N.A. | N.A. |

            说明:

            1. Paged HTML documents 在菜单的模板列表里没找到,安装路径 pagedown\rmarkdown\templates\ 下也没有。

            2. 五个模板的编译和在 RStudio Viewer 里的预览很完美。尤其是简历模板,惊艳。

            3. HTML Letter 和 Resume 生成的 html 文件,用 chrome 打开时闪一下,然后一片空白,什么都没有显示。禁用全部插件后依旧。用 IE 能打开看到内容,但比较难看,占满了宽度。

            4. chrome 里打印成 pdf 时,要勾选 Options - Background graphics,否则有些效果出不来。

            建议

            poster 模板里的一级标题用的是双实线标记:

            ================================================================================

            我试了一下,改为 # 也能正常编译。既然如此,如果没有其他原因的话,建议示例用 #表示一级标题,跟其他包的示例文档相一致。(我的私心是为了 mindr 包方便从中生成思维导图。)

            本论坛不支持上面测试结果表格的 markdown 语法?

              作为不看说明书成员组的一员,我忽略了readme里关于pandoc的版本提醒。

              目前发现的问题是pagedown::poster_relaxed 这个模版生产的海报在 Safari 跟 Chrome 下预览是正常的,在火狐下就跑偏了,估计需要对不同浏览器进行支持。其余模版没有问题。

              另外 remotes 包竟然有 install_github 了,比 devtools 包轻多了。

                tctcab CSS 确实也容易砸到脚:https://slides.yihui.name/2018-blogdown-rstudio-conf-Yihui-Xie.html#33 但 CSS 砸到脚的前提是它足够复杂。多数 CSS 库确实也是有够复杂的,但如果我们能从 Markdown 出发,那么 CSS 就有简化的可能性。我用别人的一个复杂 CSS 库做了一张海报之后(poster_relaxed),心想这货应该不至于那么复杂吧,于是本着极简原则,一天时间就写了另一个海报模板(poster_jacobs),也挺像模像样的。

                CSS/JS 社区应该比 LaTeX 大多了,所以要是遇到问题能得到的帮助资源也会多一些。现代浏览器的开发者工具(Developer Tools)也让调整 CSS 变得很便利,不用像 LaTeX 那样调一次就得重编一次 PDF。

                老实说,这条路的确会很长,坑也不少。要看目标是什么了,只要不求完美的精致,用网页生成的粗糙 PDF 可能多数时候也够用了。

                chuxinyuan 是的。目前的“其它格式”主要是 PDF,当然我觉得转 Word 或电子书等其它格式也不是不可能。

                dapengde 谢谢详细测试。你给取的中文名“佩奇党”将来可能会招来小猪佩奇的小粉丝(就像 COS 招来 cosplay 的人一样)。

                1. Paged HTML documents 我忘了写模板。不过任意 R Markdown 文档里指定输出格式为 pagedown::html_paged 应该就可以。

                2. 简历模板是一份真简历,要是有读博士的机会可以跟简历主人联系。

                3. 这是因为在浏览器中浏览这些页面的时候需要一个服务器,比如无限月读(它会开启一个本地服务器)。

                4. 是的,我会在文档提醒这个。

                双实线标记是为了视觉上更好地分块。一个井号太不显眼了。为了严谨支持 Markdown 的话,我还是建议通过 Pandoc 来解析文档(system2('pandoc', c('-f', 'markdown', '-t', 'json'), stdout = TRUE) 之后再用 jsonlite::fromJSON() 提取标题),而不要用正则表达式。

                本论坛应该是不支持表格语法吧。

                yufree 目前先以 Chrome 支持为主,因为只有它家支持通过命令行打印 PDF,虽然这支持力度也不咋地),别的浏览器都没测试。

                devtools 包的确是千斤重,我一直在呼吁他们把 install_github 这种函数抽离出去,现在 remotes 包中的这个函数基本已经跟 devtools 里的等价了。我平时用 devtools 其实也就用两个功能,一个是这个 install_github(),另一个是 load_all()

                  yihui 其实我的本意是“佩奇挡”,谁挡谁是猪……然而立刻被tctcab 讹作“党”,不知道这样是不是违法。

                  哦,忘了说 pandoc。我主要是想减少依赖,缩短工具链,免得被依赖的工具逼着去没完没了地维护包,同时为了练习正则表达式。不过,既然 pandoc 基本人手一份,确实应该加上这个选择,安全省事。

                    dapengde
                    不违法,现在我单方面认定你为党代表,以后fork一下这个包并找到三个合作者的话可以酌情成立党支部

                      测试报告

                      环境

                      > sessionInfo()
                      R version 3.5.1 (2018-07-02)
                      Platform: x86_64-pc-linux-gnu (64-bit)
                      Running under: Ubuntu 18.04.1 LTS
                      
                      Matrix products: default
                      BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
                      LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so
                      
                      locale:
                       [1] LC_CTYPE=en_US.UTF-8      
                       [2] LC_NUMERIC=C              
                       [3] LC_TIME=en_US.UTF-8       
                       [4] LC_COLLATE=en_US.UTF-8    
                       [5] LC_MONETARY=en_US.UTF-8   
                       [6] LC_MESSAGES=en_US.UTF-8   
                       [7] LC_PAPER=en_US.UTF-8      
                       [8] LC_NAME=C                 
                       [9] LC_ADDRESS=C              
                      [10] LC_TELEPHONE=C            
                      [11] LC_MEASUREMENT=en_US.UTF-8
                      [12] LC_IDENTIFICATION=C       
                      
                      attached base packages:
                      [1] stats     graphics  grDevices utils     datasets 
                      [6] methods   base     
                      
                      loaded via a namespace (and not attached):
                       [1] Rcpp_1.0.0      bookdown_0.8    later_0.7.5    
                       [4] digest_0.6.18   R6_2.2.2        magrittr_1.5   
                       [7] evaluate_0.12   xaringan_0.8.5  stringi_1.2.4  
                      [10] promises_1.0.1  rstudioapi_0.8  rmarkdown_1.11 
                      [13] tools_3.5.1     servr_0.11      stringr_1.3.1  
                      [16] rsconnect_0.8.8 httpuv_1.4.5    xfun_0.4       
                      [19] yaml_2.2.0      compiler_3.5.1  htmltools_0.3.6
                      [22] pagedown_0.0.27 knitr_1.21     
                      • 估计是预览版,没碰到安装没问题
                      • 6个自带模板,不过paged html documents没有出现在 template的列表里,测试了其他五个

                      问题

                      1. 总的问题: 网页里缩放页面之后布局变动很大,输出pdf时按照当前网页的缩放比例,如果像我一样在chrome里预览-print to pdf的话这是一个随机的不可控因素,感觉不大好,特别是海报的话,缩放看整体布局是必要的,具体的话:

                        • pagedown::html_letters 在25%时4页变7页
                        • pagedown::html_resume 2页变6页
                        • pagedown::poster_jacobs 目测没变化
                        • pagedown::poster_relaxed authors栏,文字出框了
                      2. html_letterself contained 的问题,

                        • pagedown::html_letter 默认self_contained为false时,knit之后可以在Rstudio里看到,但没有分页,但在chrome里预览失败(,报错信息:
                              paged.js:23887 Fetch API cannot load file:///home/tc/GIT/cosx_exps/test82_files/paged-0.0.27/css/default.css. URL scheme must be "http" or "https" for CORS request.
                              add @ paged.js:23887
                              paged.js:23887 Fetch API cannot load file:///home/tc/GIT/cosx_exps/test82_files/paged-0.0.27/css/letter.css. URL scheme must be "http" or "https" for CORS request.
                              add @ paged.js:23887
                              paged.js:23887 Uncaught (in promise) TypeError: Failed to fetch
                                  at Polisher.add (paged.js:23887)
                                  at Previewer.preview (paged.js:26907)
                                  at paged.js:26976
                          但是可以inf_mr()来预览,没问题
                      3. references的问题

                        • 示例文档的YAML里见到references项,感觉手动编辑reference很麻烦,塞进YAML里也显得臃肿,是不支持.bib吗?在poster_relaxed里还.bib和references都有这就更奇怪了。
                      4. poster_relaxed的布局问题

                        • 各个版块布局的顺序很难控制
                        • 看了一下示例文档,加了一个区域或删除一个版块后所有版块的整体布局都乱套了,
                        • poster_relaxed是漂亮,但摇摇欲坠的感觉,没有poster_jacobs稳定

                      附图

                        tctcab 要是不违法,那就可以甩开膀子撒欢儿大干一场了:

                        • rmarkdown: 二马党
                        • bookdown: 补课党
                        • blogdown: 部落党
                        • pagedown: 佩奇党
                        • thesisdown: 瑟曦党
                        • huskydown: 哈狗党
                        • wildcatdown: 野猫党
                        • bulldown:公牛党
                        • beaverdown: 河狸党

                        @yihui 的工作:建党大业

                        tctcab
                        第 1 个问题,网页缩放导致布局变动,对我来说不算个大问题,因为如果想打印到纸上,那么打印前预览的必然是成品 pdf,而非 html。 ctrl + 0 显示原始大小再打印成 pdf 就行了。

                        第 4 个问题,摇摇欲坠的感觉,我认为只是因为缺少个边框。

                          dapengde
                          第四relaxed poster,看图,加了一个版块之后布局就乱了…

                          其实我总担心chrome老更新,pagedown是不是得不停的更新?

                            tctcab 缺的那个模板我现在加上了。

                            1. 页面布局的确对缩放很敏感,这一点不是很好控制。poster_relaxed 是导入的别人的样式,后来我觉得太复杂,于是自己写了一个 poster_jacobs,背后的样式表轻便许多,所以更稳定一点(但也不能缩小太多,否则也会乱)。如 dapengde 所说,打印的时候恢复 100% 就好了。

                            2. self_contained: false 的时候需要一个网页服务器才能让背后的 Paged.js 库正常读取 CSS 并完成排版工作,因为正常情况下浏览器不允许 JS 读取本地文件(安全问题)。无限月读会创建一个网页服务器。

                            3. 有时候我只是懒得写一个外部的 .bib 文件,所以就偷懒把参考文献以 references 的形式写在 Rmd 文档里了。references 和 bibliography 这两项 Pandoc 都支持,也可以混用。

                            4. 海报布局是写死的,如果要增删版块的话,需要了解 CSS 网格布局并自行修改 CSS:https://css-tricks.com/snippets/css/complete-guide-grid/ 如果有兴趣,不妨看一眼 poster_jacobs 的 CSS 源码,它是我这个门外汉写出来的:https://github.com/rstudio/pagedown/blob/master/inst/resources/css/poster-jacobs.css 里面除了那个标题底线(实际上是个很扁的椭圆)略有点伎俩之外,剩下的代码都很笨拙。

                            谢谢!

                            chuxinyuan Chrome 的更新对 CSS 带来的影响应该是微乎其微,这一点不必太担心,它的伤害值应该不会比 LaTeX 包的更新带来的伤害值大。

                              yihui

                              self_contained的话,只有html_letter在false时会出现问题,而其他几个模板也有self_contained又都没问题,感觉会让用户感到困扰,如果有这样的问题的话那是不是可以都统一使用月读,或者只有html_letter的self_contained改为true。

                              24 天 后

                              最近更新自己的简历,进一步体验了一下 pagedown 的 Resume 模板,有三个不解之处,望各位赐教:

                              1. markdown 的基本语法在有些地方没有得到完全支持。例如,每个项目下的第一行里(例如默认模板的 B.S. in Information and Computing Sciences一行)如果使用超级链接 []() 和项目列表 -,在得到的 html 里没有显示出来。在每个项目下第四行里是可以显示的。
                              2. Aside 里的内容只能在第一页的右边栏显示。其他页右侧的阴影栏是空的。我试图在 Aside 里填写更多的内容,然而溢出的部分并没有顺延到后续页。如果简历总共就两页,这样的布局尚好,然而如果有四五页,除第一页之外的其他页右栏空着似乎有点奇怪。
                              3. 简历的每个项目下面第二行和第三行默认是地点和年份。如果该项目缺少地点信息,用 N/A 即可,然而如果缺少年代信息,用 N/A 就不行了,空格也不行,空着也不行。我找到的方法是用全角空格,行了。我觉得最好跟地点信息一致,缺少的话也用 N/A,不然可能令人困惑。