15

I am playing with Tal's intro to producing word tables with as little overhead as possible in real world situations. (Please see for reproducible examples there - Thanks, Tal!) In real application, tables are to wide to print them on a portrait-oriented page, but you might not want to split them.

Sorry if I have overlooked this in the pandoc or pander documentation, but how do I control page orientation (portrait/landscape) when writing from R to a Word .docx file?

I maybe should add tat I started using knitr+markdown, and I am not yet familiar with LaTex syntax. But I'm trying to pick up as much as possible while getting my stuff done.

aae
  • 439
  • 7
  • 18
  • You can only change the global orientation of `docx` documents with Pandoc (by passing a custom `--reference-docx`). But if you want a pdf file generated by LaTeX and Pandoc (based on your last paragraph), it's definitely possible. – daroczig Apr 23 '13 at 19:21
  • Hm, I using a custom reference.docx already, but it had no effect. – aae Apr 25 '13 at 12:20
  • I should add: 1st @darocig: Thanks for your support! I tried: `system(paste0("pandoc --reference-docx=C:/Users/USER/AppData/Roaming/Pandoc/landscape.docx -o ", FILENAME, ".docx ", FILENAME, ".md"))` Did produce a docx file, but it's still formatted as letter, wide margins, portrait - all stuff I already changed in the reference file. Maybe I am just missing something really basic. I'll get back here if I figure out how to do it. – aae Apr 25 '13 at 12:45

2 Answers2

17

I am pretty sure the docx writer has no section breaks implemented, also as far as I understand --reference-docx allows for customizing styles and not the page layout (but I might also be wrong here), this is from pandocs guide on --reference-docx:

--reference-docx=FILE

Use the specified file as a style reference in producing a docx file. For best results, the reference docx should be a modified version of a docx file produced using pandoc. The contents of the reference docx are ignored, but its stylesheets are used in the new docx. If no reference docx is specified on the command line, pandoc will look for a file reference.docx in the user data directory (see --data-dir). If this is not found either, sensible defaults will be used. The following styles are used by pandoc: [paragraph] Normal, Title, Authors, Date, Heading 1, Heading 2, Heading 3, Heading 4, Heading 5, Block Quote, Definition Term, Definition, Body Text, Table Caption, Image Caption; [character] Default Paragraph Font, Body Text Char, Verbatim Char, Footnote Ref, Link.

Which are styles that are saved in the /word/styles.xml component of the docx document. The page layout on the other hand is saved in the /word/document.xml component in the <w:sectPr> tag, but pandoc's docx writer ignores this part as far as I can tell.

The docx writer builds by default a continuous document, with elements such as headers, paragraphs, simple tables and so on ... much like a html output.


Option #1 (doesn't solve the page orientation problem):

The only page layout option that you can define through styles is the pageBreakBefore which will add a page break before a certain style

Option #2 (seems elegant but hasn't been tested):

Recently the custom writer has been added that allows for a custom lua script, where you should be able to define how certain Pandoc blocks will be written into the output file ... meaning you could potentially define section breaks and page layout for a specific block inserting the sectPr tag into the document. I haven't tried this out but it would be worth investigating. On pandoc github you can check out a sample lua script file for custom html output.

However, this means, you have to have lua installed, learn the language, and it is up to you if you think its worth the time investment.

Optin #3 (a couple of clicks in Word might just do):

As you will probably spend quite some time setting up how to insert sections and what would be the right size, margins, and figuring how to fit the table to such a layout ... I recommend that you use pandoc to put write your document.docx, that you open in Word, and do the layout by hand:

  • select the table you want on the landscape page
  • go to Layout > Margins
    > select Apply to: Selected text
    > choose Page Setup > select Landscape

Now a new section with a landscape orientation should surround your table.

What you would anyway also probably want to do is styling the table and table caption a little (font-size,...), to achieve the best result (all text styling can be already applied with pandoc where --reference-docx comes handy).

Option #4 (in situation when you can just use pdf instead of docx):

As far as I could figure out is that with pandoc does a good job with tables in md -> docx (alignment, style, ... ), in tex -> docx it had some trouble sometimes. However if your option allows for a pdf output latex will be your greatest friend. For example your problem is solved as easily as just using

\usepackage{pdflscape}

and adding this around your table

\begin{landscape}
...
\end{landscape}

This are the options that I could think of so far.

I would always recommend using the pdf format for reports, as you can style it to your liking with latex and the layout will stay the way you want it to be.

However, I also know that for various reasons word documents are still the main way of reviewing manuscripts in many fields ... so i would most likely just go with my suggested option 3, mostly cause it is a lazy and quick solution and because I usually don't have many documents with tons of giant tables with awkward placement and styling.

Good luck ;-)

Martin Turjak
  • 20,896
  • 5
  • 56
  • 76
  • Thanks, that's quite exhaustive. I'll have a closer look on your answer later; currently I'll stick to manually changing page orientation (after adding section breaks) in Word. It's interesting pandoc seems to ignores the `` tag. This would mean everybody outside of the seven ['usual suspects' countries](http://en.wikipedia.org/wiki/Paper_size#A_series) also needs to intervene manually to follow ISO standards. I feel for people staring in puzzlement at an inactive printer which just has a DinA4 tray. – aae Apr 26 '13 at 13:51
  • 4
    For printing you also don't need a word doc file, right? You would use a pdf that had the layout and styling set to desired settings. – Martin Turjak Apr 26 '13 at 14:17
  • 3
    I tried to use `\usepackage{pdflscape}` and it doesn't work with pandoc to pdf. – Leosar Jan 02 '15 at 21:53
  • thanks for the lead - i ended up implementing this with a Lua filter! – setophaga Sep 11 '19 at 02:34
4

Based on Taleb's answer here and some officer package functions, I created a little gist that one can use like this:

---
title: "Example"
author: "Dan Chaltiel"
output: 
  word_document:
    pandoc_args:
     '--lua-filter=page-break.lua'
---

I'm in portrait

\endLandscape

I'm in landscape

\endPortrait

I'm in portrait again

With page-breaks.lua being the file hosted here: https://gist.github.com/DanChaltiel/e7505e62341093cfdc489265963b6c8f

This is far from perfect (for instance it won't work without the last portrait section), but it is quite useful sometimes.

Dan Chaltiel
  • 7,811
  • 5
  • 47
  • 92
  • Was hopeful I could get this to get my Word doc into landscape from RMarkdown but couldn't! Are there other pieces needed to get this to run? Getting this error ```Error running filter page-break.lua: page-break.lua: openBinaryFile: does not exist (No such file or directory) Error: pandoc document conversion failed with error 83 Execution halted``` – vb66 Jul 12 '20 at 01:15
  • 2
    @VickiB well, the error is pretty clear, it seems that you did not download the file, or did not put it at the right place – Dan Chaltiel Jul 12 '20 at 07:12
  • Apologies, I'm very much a rookie coder! I got it to run and it works awesome, thank you! Another very rookie question... How can I make the 1st page landscape vs portrait? – vb66 Jul 12 '20 at 13:54
  • 1
    @VickiB I think this would make a nice question, notice me (@) so I can see it, maybe I can find something – Dan Chaltiel Jul 12 '20 at 14:06
  • @DanChaltiel, what would be the right place then? Thanks. – MartineJ Aug 26 '20 at 13:59
  • 1
    @MartineJ depends on your configuration, usually, it is either at the root of the RStudio project or in the same folder as the `Rmd` file you are trying to knit – Dan Chaltiel Aug 26 '20 at 15:38
  • This works, but unfortunately the headers and footers are all being removed - any idea how to fix that? – Cocowalla Mar 02 '21 at 16:03
  • 1
    @Cocowalla no idea but this answer is a bit outdated. You should take a look at `officedown`. Here is an example: [link](https://github.com/rstudio/rmarkdown/issues/2034#issuecomment-774494900). – Dan Chaltiel Mar 02 '21 at 16:08