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

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,不然可能令人困惑。
                        9 天 后

                        dapengde

                        1. 第一行最好是一段话(<p>),列表或其它类型的元素目前不支持。超链接问题我刚修正了,段落里面可以用超链接。
                        2. 第二页以及后面的页上可以写边栏内容,参见图 3.2:https://pagedown.rbind.io
                        3. 年份现在可以用 N/A 了(抄送问过我同样问题的 @earowang )。

                          yihui 朋友圈被《啥是佩奇》刷屏了,赶紧把佩奇党发布了吧,我好写《啥是佩奇党》。