bookdown

bookdown 是什么

bookdownHadly Wickham写的一个R包,它的主要目的是用来使rmarkdown的各种调用更加方便。它会定制一些格式(主要是tex和html)的输出参数。该包的源码在这里

关于r-pkgs

r-pkgs是一本书的rmd源码,该书书名为R Packages。这本书的写作过程是在github上使用rmd完成的。 最终通过bookdown来生成的一本书。通过git clone https://github.com/hadley/r-pkgs.git克隆这本书到本地。可以看到一个脚本叫book/build-book.r。通过R在项目的 根目录运行这个r文件会报错,错误原因是找不到pandoc_latex_engine_args函数。目前也不知道这个函数到底在哪里?通过删除这个函数的调用(bookdown包中charpter.R的43行,修改方法见下一节),这个脚本可以运行完毕,并可以生成书的pdf文件。但是格式上有些问题。

接下来需要知道这个函数到底在哪里?格式问题是什么原因导致的。

关于修改bookdown包

pandoc_latex_engine_args这个函数的调用位于bookdown包中,要修改这个包的内容,首先可以克隆这个包到本地,然后直接修改chapter.R文件,然后使用R CMD build bookdown生成bookdown_0.1.tar.gz,接下来使用R CMD INSTALL ./bookdown_0.1.tar.gz 就可以更新这个包的内容了。

我刚刚试着安装了bookdown依赖的包(rmarkdown,RJSONIO,yaml,stringr),如果不修改bookdown本身还是不能运行build-book.r1

关于插图

在rmd文档中,常可以看到这样的代码

    ```{r, echo = FALSE}
    bookdown::embed_png("screenshots/git-config-2.png", dpi = 220)
    ```

这段代码是什么意思呢? 首先,这里的代码会被knitr运行。运行时会调用bookdown::embed_png函数。而这个函数是这样写的:(源码)

screenshot <- function(path, dpi = NULL) {
  meta <- png_meta(path)
  dpi <- dpi %||% meta$dpi[1] %||% stop("Unknown dpi", call. = FALSE)

  if (is_latex()) {
    width <- round(meta$dim[1] / dpi, 2)

    knitr::asis_output(paste0(
      "\\includegraphics[",
      "width=", width, "in",
      "]{", path, "}"
    ))
  } else {
    knitr::asis_output(paste0(
      "<img src='", path, "'",
      " width='", round(meta$dim[1] / (dpi / 96)), "'",
      " height='", round(meta$dim[2] / (dpi / 96)), "'",
      " />"
    ))
  }
}

#' @export
#' @rdname screenshot
embed_png <- screenshot

png_meta <- function(path) {
  attr(png::readPNG(path, native = TRUE, info = TRUE), "info")
}

从这里看出,embed_png会先读取png文件的信息,然后判断当前rmarkdown的转换参数(通过is_latex),在不同的情况下给出不同的图片输出。(跟直接写![]()这样的图片链接比起来,这种写法只是多出了一个图片大小的控制,但是在严谨的排版处理中,这个图片的大小是重要的)

生成pdf书籍

这里想法是:一本书有多章组成,每章为一个md/rmd文件。现在要把这些md文件生成一个靠谱的pdf书籍。

利用pandoc为每个md生成tex文件

注意这里的pandoc调用,必须含有--chapters参数,这样生成的文档以\chapter{}开始。下面的命令行可供参考:

`pandoc -f markdown -t latex --latex-engine=xelatex --chapters -o output.tex input.md`

该命令行生成的部分tex文件为:

\chapter{包的元数据}\label{ux5305ux7684ux5143ux6570ux636e}

\texttt{DESCRIPTION}(描述文件)的作用是存储包中重要的元数据。
当你第一次开发包时,会使用这个文件记录你的包运行时所需要的包。
然而,随着时间的流逝,当你开始与他人分享包时

...

利用rmarkdown通过bookdown将rmd文件变成tex文件

如果文件中需要插图,那么你可能就需要在其中加入bookdown::embed_png()函数的调用,此时,要生成tex文件,你需要rmarkdown的支持。调用的方法为:

rmarkdown::render("input.rmd", bookdown::tex_chapter())

这将生成input.tex文件

将这些tex文件合成一本书

可以使用一个tex文件来把这些章节都包在一起,并且在书的最前面生成目录。以下是生成书籍时使用的模板,实际使用中,只需要把rpkg1等换成你生成的每个tex文件的名字即可。(注意不要带.tex扩展名,并且这些tex文件和这个模板文件在同一个目录下)

这个模板中,含有对中文的支持。使用到的字体是KaiTi_GB2312,FangSong_GB2312,SimHei。关于字体的安装可以参考这里: http://www.bagualu.net/wordpress/archives/5396

假设该模板文件为mybook.tex,那么生成pdf文件的命令行为

xelatex -interaction=batchmode mybook

如果没有错误,一个pdf书籍就生成了。

附:生成书籍的latex模板


\documentclass[]{book}
\usepackage{lmodern}
\usepackage{amssymb,amsmath}
\usepackage{ifxetex,ifluatex}
\usepackage{fixltx2e} % provides \textsubscript
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
  \usepackage[T1]{fontenc}
  \usepackage[utf8]{inputenc}
\else % if luatex or xelatex
  \ifxetex
    \usepackage{mathspec}
    \usepackage{xltxtra,xunicode}
  \else
    \usepackage{fontspec}
  \fi
  \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
  \newcommand{\euro}{€}
    \setmainfont{KaiTi_GB2312}
    \setsansfont{FangSong_GB2312}
    \setmonofont[Mapping=tex-ansi]{SimHei}
    \XeTeXlinebreaklocale "zh"
\renewcommand\labelitemi{\ensuremath{\bullet}}
\fi
% use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
% use microtype if available
\IfFileExists{microtype.sty}{%
\usepackage{microtype}
\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
}{}
\usepackage[a4paper, centering, scale=0.8]{geometry}
\usepackage{color}
\usepackage{fancyvrb}
\newcommand{\VerbBar}{|}
\newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
% Add ',fontsize=\small' for more characters per line
\newenvironment{Shaded}{}{}
\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}}
\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}}
\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}}
\newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
\newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}}
\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}}
\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}}
\newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}}
\newcommand{\RegionMarkerTok}[1]{{#1}}
\newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}}
\newcommand{\NormalTok}[1]{{#1}}
\ifxetex
  \usepackage[setpagesize=false, % page size defined by xetex
              unicode=false, % unicode breaks when used with xetex
              xetex]{hyperref}
\else
  \usepackage[unicode=true]{hyperref}
\fi
\hypersetup{breaklinks=true,
            bookmarks=true,
            pdfauthor={},
            pdftitle={},
            colorlinks=true,
            citecolor=blue,
            urlcolor=blue,
            linkcolor=magenta,
            pdfborder={0 0 0}}
\urlstyle{same}  % don't use monospace font for urls
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt plus 2pt minus 1pt}
\setlength{\emergencystretch}{3em}  % prevent overfull lines
\setcounter{secnumdepth}{0}

\date{}

\begin{document}

{
\hypersetup{linkcolor=black}
\setcounter{tocdepth}{2}
\tableofcontents
}

\include{rpkg1}
\include{rpkg2}
\include{rpkg7}
\include{rpkg5}
\include{rpkg19}
\include{rpkg9}
\include{rpkg12}
\include{rpkg4}
\include{rpkg11}
\include{rpkg10}
\include{rpkg18}
\include{rpkg13}
\include{rpkg15}
\include{rpkg14}
\include{rpkg17}
\include{rpkg16}

\end{document}

版本记录

xuyang@ubuntu15:~/tuling/tex$ pandoc --version
pandoc 1.13.2.1
Compiled with texmath 0.8.2.2, highlighting-kate 0.5.12.
Syntax highlighting is supported for the following languages:
    abc, actionscript, ada, agda, apache, asn1, asp, awk, bash, bibtex, boo, c,
    changelog, clojure, cmake, coffee, coldfusion, commonlisp, cpp, cs, css,
    curry, d, diff, djangotemplate, dockerfile, dot, doxygen, doxygenlua, dtd,
    eiffel, email, erlang, fasm, fortran, fsharp, gcc, glsl, gnuassembler, go,
    haskell, haxe, html, idris, ini, isocpp, java, javadoc, javascript, json,
    jsp, julia, latex, lex, lilypond, literatecurry, literatehaskell, lua, m4,
    makefile, mandoc, markdown, mathematica, matlab, maxima, mediawiki,
    metafont, mips, modelines, modula2, modula3, monobasic, nasm, noweb,
    objectivec, objectivecpp, ocaml, octave, opencl, pascal, perl, php, pike,
    postscript, prolog, pure, python, r, relaxng, relaxngcompact, rest, rhtml,
    roff, ruby, rust, scala, scheme, sci, sed, sgml, sql, sqlmysql,
    sqlpostgresql, tcl, tcsh, texinfo, verilog, vhdl, xml, xorg, xslt, xul,
    yacc, yaml, zsh
Default user data directory: /home/xuyang/.pandoc
Copyright (C) 2006-2014 John MacFarlane
Web:  http://johnmacfarlane.net/pandoc
This is free software; see the source for copying conditions.
There is no warranty, not even for merchantability or fitness
for a particular purpose.

xuyang@ubuntu15:~/tuling/tex$ xelatex --version
XeTeX 3.14159265-2.6-0.99992 (TeX Live 2015/Debian)
kpathsea version 6.2.1
Copyright 2015 SIL International, Jonathan Kew and Khaled Hosny.
There is NO warranty.  Redistribution of this software is
covered by the terms of both the XeTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the XeTeX source.
Primary author of XeTeX: Jonathan Kew.
Compiled with ICU version 55.1; using 55.1
Compiled with zlib version 1.2.8; using 1.2.8
Compiled with FreeType2 version 2.5.5; using 2.5.5
Compiled with Graphite2 version 1.2.4; using 1.2.4
Compiled with HarfBuzz version 1.0.1; using 1.0.1
Compiled with libpng version 1.6.17; using 1.6.17
Compiled with poppler version 0.32.0
Compiled with fontconfig version 2.11.1; using 2.11.1

  1. 最近查看了rmarkdown包的文档,发现pandoc_latex_engine_args这个函数是在rmarkdown包中定义的。因此这个问题应该是可以修复的。



本文地址: http://www.bagualu.net/wordpress/archives/5394 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注