5.3 テキスト出力の幅を制御する

R コードから表示されたテキスト出力の幅が広すぎることがたまにあります. 出力文書のページ幅が固定 (例えば PDF 文書) ならばテキスト出力がページ余白をはみ出すことがあります. その例が図5.1です.

R グローバルオプションの width は R 関数からのテキスト出力の印字幅を制御するのに使うことができます. デフォルトが大きすぎるなら, 値を小さくしてみてください. このオプションは典型的には, おおまかに1行ごとの文字数を表しています (東アジア言語は例外です). 例えばこのように.

このチャンクの出力は幅広すぎる

```{r}
options(width = 300)
matrix(runif(100), ncol = 20)
```

このチャンクの出力のほうが良い

```{r}
options(width = 60)
matrix(runif(100), ncol = 20)
```

全ての R 関数が width オプションを尊重しているわけではありません. このオプションが動作しないなら, 唯一の選択は長いテキスト行を折り返しすることです. 実際これは html_document 出力フォーマットのデフォルトの挙動です. あなたの使っている HTML 出力フォーマットが長い行の折返しをしないのなら, 以下の CSS コード を適用してみてください (解説は7.1節を参照).

pre code {
  white-space: pre-wrap;
}

PDF 出力では, 行の折返しはよりトリッキーになります. 解決策の1つは, Pandoc 引数の --listing を使うことで有効になる LaTeX パッケージの listings を使うことです. そうしたなら, このパッケージに対するオプションを設定しなければならず, またその設定コードは外部 LaTeX ファイルに含めることができます (方法は6.1節参照) 例えばこのように.

---
output:
  pdf_document:
    pandoc_args: --listings
    includes:
      in_header: preamble.tex
---

preamble.tex 内では, listings パッケージのオプションを設定しています.

\lstset{
  breaklines=true
}

listings によるコードブロックの見た目が気に入らないなら, \lstset{} で他の listings オプションを設定することができます. 例えば basicstyle=\ttfamily でフォントファミリを変更できます. このパッケージのより詳細な情報はドキュメント https://ctan.org/pkg/listings で見つけることができます.

5.1 は長い行のあるデフォルトの pdf_document 出力で, ページ余白をはみ出しています. 図5.2listings パッケージでテキストを折り返したときの PDF 出力です.

幅が広すぎる通常のテキスト出力

図 5.1: 幅が広すぎる通常のテキスト出力

listings パッケージで折り返されたテキスト出力

図 5.2: listings パッケージで折り返されたテキスト出力

訳注

listings には多くのオプションがありますが, それだけでデフォルトのシンタックスハイライトを再現するのは難しいです. コードブロックの折返しは knitrstyler オプションである程度制御できます. Pandoc は出力ブロックをほとんど表示オプションのない verbatim 環境として出力し, これが問題の主な原因です. フィルタや LaTeX マクロを使うなどしてこの環境を置き換えればデフォルトのシンタックスハイライトと折返しを両立することができます.