82943


初めまして。  
初心者です。よろしくお願いします。  
Jupyter Notebookで書いた文書をpdfに書き出したいと思い、以下のHPを参照して、TeX
LiveとInkscapeをインストールし、メニューからFile > Download as > PDF via LaTex
(.pdf)と選択して、日本語でpdfに書き出すことはどうにか成功しました。

<https://mana.bi/wiki.cgi?page=Jupyter+Lab%A4%AB%A4%E9%C6%FC%CB%DC%B8%ECPDF%A4%F2%BD%D0%CE%CF%A4%B9%A4%EB2021#p4>

このノートの中で、マークダウンで以下のような構造の表を書きました（実際の内容は異なります）。

[code]

    | 野菜の名前 | 旬の季節 | おいしい食べ方 |
    | :--- | :--- | :---| 
    | キャベツ | 春から秋 | お好み焼き、焼きそば、ロールキャベツ、茹でキャベツ、 キャベツ炒め、無限キャベツ、回鍋肉、ちゃんぽん| 
    | 大根 | 冬から春 | ふろふき大根、お鍋、肉大根、大根ステーキ、刺身のつま、大根おろし、雪見鍋、大根ステーキ、おでん | 
    | トマト | 春から秋 | トマトサラダ、トマトソーススパゲティ、ラタトゥイユ、トマト鍋、トマトと卵炒め、ピザ、カプレーゼ |
    
    
[/code]

3列目の”おいしい食べ方”の欄に割と長い文を書いたところ、pdfに書き出すと、表の右端が文書の外側にはみ出してしまいました。

[![pdfに出力した表](https://i.stack.imgur.com/shWvs.png)](https://i.stack.imgur.com/shWvs.png)

そこで、"おいしい食べ方"列の文中に`<br>`コードを入れて以下のようにセル内改行してみました。

[code]

    | 野菜の名前 | 旬の季節 | おいしい食べ方 |
    | :--- | :--- | :---| 
    | キャベツ | 春から秋 | お好み焼き、焼きそば、ロールキャベツ、<br>茹でキャベツ、 キャベツ炒め、無限キャベツ、回鍋肉、ちゃんぽん| 
    | 大根 | 冬から春 | ふろふき大根、お鍋、肉大根、大根ステーキ、<br>刺身のつま、大根おろし、雪見鍋、大根ステーキ、おでん | 
    | トマト | 春から秋 | トマトサラダ、トマトソーススパゲティ、<br>ラタトゥイユ、トマト鍋、トマトと卵炒め、ピザ、カプレーゼ |
    
[/code]

すると、以下のように、ノートブック上ではきちんと表示されました。

野菜の名前 | 旬の季節 | おいしい食べ方  
---|---|---  
キャベツ | 春から秋 | お好み焼き、焼きそば、ロールキャベツ、  
茹でキャベツ、 キャベツ炒め、無限キャベツ、回鍋肉、ちゃんぽん  
大根 | 冬から春 | ふろふき大根、お鍋、肉大根、大根ステーキ、  
刺身のつま、大根おろし、雪見鍋、大根ステーキ、おでん  
トマト | 春から秋 | トマトサラダ、トマトソーススパゲティ、  
ラタトゥイユ、トマト鍋、トマトと卵炒め、ピザ、カプレーゼ  
  
ところが、pdfに書き出すと、`<br>`が無視されてしまうようで、やはり一行で表示され、表の右端がはみ出してしまいます。

pdfに書き出した時に表がはみ出ないようにするには、またはセル内改行をするには、どうしたらよいのか教えていただけないでしょうか。

また、ついでなのですが、表に`<br>`を入れると、pdfに書き出す際に"505: Internal Server
Error"となって失敗することがあります。なぜなのかご存じでしたら教えてください。

よろしくお願いします。


CC BY-SA 4.0
2021-09-27T05:42:39.157
82710
2021-10-07T11:46:12.453
2021-09-28T01:38:45.067
48376
48376
question
jupyter-notebook pdf latex markdown
Jupyter Notebookをpdfに書き出すと、マークダウンの表の中のセル内改行が反映されない


texlive-xetex の XeLatex (もしくは LuaLaTeX)で PDFを作成する場合, 内部で Pandasを使用してるようだけど,
pipe_tables だと自動改行になにか問題がありそうです。

grid_tables での作表なら大丈夫そう。ただし …

  * fixed-width font のはず
  * Jupyterではプレビューできない

[code]

    | 野菜の名前 | 旬の季節 | おいしい食べ方 |
    | :--- | :--- | :---| 
    | キャベツ | 春から秋 | Pandocは、あるマークアップ形式から他の形式へ変換する Haskell ライブラリと、そのライブラリを用いたコマンドラインツールです。
    | キャベツ | 春から秋 | お好み焼き、焼きそば、ロールキャベツ、茹でキャベツ、 キャベツ炒め、無限キャベツ、回鍋肉、ちゃんぽん| 
    | 大根 | 冬から春 | ふろふき大根、お鍋、肉大根、大根ステーキ、刺身のつま、大根おろし、雪見鍋、大根ステーキ、おでん | 
    | トマト | 春から秋 | トマトサラダ、トマトソーススパゲティ、ラタトゥイユ、トマト鍋、トマトと卵炒め、ピザ、カプレーゼ |
    
    ---
    
    +---------------+---------------+----------------------------------------------------------------------------------------------------+
    | 野菜の名前    | 旬の季節      | おいしい食べ方                                                                                     |
    +===============+===============+====================================================================================================+
    | キャベツ      | 春から秋      | お好み焼き、焼きそば、ロールキャベツ、茹でキャベツ、 キャベツ炒め、無限キャベツ、回鍋肉、ちゃんぽん|
    +---------------+---------------+----------------------------------------------------------------------------------------------------+
    | 大根          | 冬から春      | ふろふき大根、お鍋、肉大根、大根ステーキ、刺身のつま、大根おろし、雪見鍋、大根ステーキ、おでん     |
    +---------------+---------------+----------------------------------------------------------------------------------------------------+
    | トマト        | 春から秋      | トマトサラダ、トマトソーススパゲティ、ラタトゥイユ、トマト鍋、トマトと卵炒め、ピザ、カプレーゼ     |
    +---------------+---------------+----------------------------------------------------------------------------------------------------+
    
[/code]

* * *

以下は, colabでの処理(PDF変換)結果

  * 中くらいの横線より上は, 英単語と SPCを含む行を追加することで, 改行は行われるが無駄な改行が多い (あまりに長いので下の部分だけ)
  * 中くらいの横線より下は, grid_tables により作表した場合の出力

[![PDFスクショ](https://i.stack.imgur.com/wgdd3.png)](https://i.stack.imgur.com/wgdd3.png)

* * *

#### 追記

[pipe_tables](https://pandoc.org/MANUAL.html#extension-
pipe_tables)で記述しておいて通常はそのまま。  
PDF生成時は加工して [grid_tables](https://pandoc.org/MANUAL.html#extension-
grid_tables) で … も, 可能かも

[code]

    from IPython.display import Markdown
    md = '''
    ここに Markdown table 記述
    '''
    out = !echo "$md" |pandoc --from markdown --to markdown-simple_tables-pipe_tables-multiline_tables
    Markdown(out.n) # ⇐ 通常は md を指定しておく
    
[/code]


CC BY-SA 4.0
2021-09-30T14:37:55.760
82780
2021-10-03T04:39:05.593
2021-10-03T04:39:05.593
43025
43025
82710
answer


Markdown code を PDF に変換する場合、実際には `jupyter-nbconvert` や `pandoc` で `Markdown
code -> LaTeX code -> PDF` へと変換されています。

問題と見做されている件のテーブルですが、`LaTeX` コードでは以下の様に変換されています。

[code]

    \begin{longtable}[]{@{}lll@{}}
    \toprule
    野菜の名前 & 旬の季節 & おいしい食べ方\tabularnewline
    \midrule
    \endhead
    キャベツ & 春から秋 &
    お好み焼き、焼きそば、ロールキャベツ、茹でキャベツ、
    キャベツ炒め、無限キャベツ、回鍋肉、ちゃんぽん\tabularnewline
    大根 & 冬から春 &
    ふろふき大根、お鍋、肉大根、大根ステーキ、刺身のつま、大根おろし、雪見鍋、大根ステーキ、おでん\tabularnewline
    トマト & 春から秋 &
    トマトサラダ、トマトソーススパゲティ、ラタトゥイユ、トマト鍋、トマトと卵炒め、ピザ、カプレーゼ\tabularnewline
    \bottomrule
    \end{longtable}
    
[/code]

`tabular` 環境の column alignment は `lll` となっていて、これは 1, 2, 3列目の配置を左寄せ(left-
justified)するという意味になります。コメントにも書きましたが、`LaTeX` では以下の様な「仕様」になっています。

[LaTeX/Tables: Text wrapping in
tables](https://en.wikibooks.org/wiki/LaTeX/Tables#Text_wrapping_in_tables)

> LaTeX's algorithms for formatting tables have a few shortcomings. One is
> that **it will not automatically wrap text in cells, even if it overruns the
> width of the page**. For columns that will contain text whose length exceeds
> the column's desired width, it is recommended that **you use the`p`
> attribute and specify the desired width of the column** (although it may
> take some trial-and-error to get the result you want).

つまり、これはバグではなく、PDF へ変換する手段として `LaTeX` を利用した故の必然的な結果と言えます。

以降、対処の一例を述べます( **あくまでも一例です** )。

### `LuaLaTeX` を利用して `LaTeX` コードを PDF に変換

デフォルトでは `XeLaTeX` で変換が行われますが、今回は `LuaLaTeX` を使います。これは `LuaLaTeX` の機能(`Lua`
code の実行)を利用するためです。`jupyter_notebook_config.py` に以下の設定を追加します。

##### jupyter_notebook_config.py

[code]

    c.PDFExporter.latex_command = [u"lualatex", u"{filename}", "-quiet"]
    
[/code]

※ 手元の環境の Ubuntu Linux では `jupyter_notebook_config.py` は `$HOME/.jupyter/`
にあります。もしくは `jupyter notebook --generate-config` を実行して新規に作成します。

### [tabulary](https://www.ctan.org/tex-archive/macros/latex/contrib/tabulary)
を利用してテーブルをレンダリング

[longtable](https://www.ctan.org/pkg/longtable) とは異なって、`tabulary.sty`
ではカラムの幅を適当に計算してくれます。例えば左寄せで折り返しを行う場合には `L` を指定します(右寄せ `r -> R`, センタリング `c ->
C` をそれぞれ指定)。

#### `longtable` の場合

[code]

    \begin{longtable}[]{@{}lllp{30em}@{}}
    
[/code]

#### `tabulary` の場合

[code]

    \begin{tabulary}[]{@{}llL@{}}
    
[/code]

### `nbconvert` のテンプレートファイルに変換用のコードを追加

質問文中の記事 [Jupyter
Labから日本語PDFを出力する2021](https://mana.bi/wiki.cgi?page=Jupyter+Lab%A4%AB%A4%E9%C6%FC%CB%DC%B8%ECPDF%A4%F2%BD%D0%CE%CF%A4%B9%A4%EB2021#p4)
の「nbconvertテンプレートの改変」で言及されている `index.tex.j2` に以下のコードを追加します。

[code]

    %===============================================================================
    % Latex Article
    %===============================================================================
    
    ((*- block docclass -*))
    \documentclass[a4paper,lualatex,ja=standard]{bxjsarticle}
    
    \usepackage{longtable}
    \usepackage{tabulary}
    \usepackage{luacode}
    
    \renewenvironment{longtable}[2][]{
     \tabulary{\textwidth}{#2}
    }{\endtabulary}
    \renewcommand{\endhead}{}
    
    \begin{luacode}
      luatexbase.add_to_callback('process_input_buffer',
        function (buf)
          return buf:gsub(
            '^%s*(\\begin%{longtable%}%[.*%].*@%{%})(.*)(.)(@%{%}.*)$',
            function (a, b, c, d)
              return a..b..c:upper()..d
            end)
        end, 'wrap text at last column in table')
    \end{luacode}
    
    ((*- endblock docclass -*))
    
[/code]

特に説明はしませんが、`longtable` 環境を `tabulary`
環境に置き換えて、テーブルの最後のカラムで自動折り返しを行う様に変更する処理を行っています。

[code]

    \begin{longtable}[]{@{}lll@{}}
    
    =>
    
    \begin{tabulary}[]{@{}llL@{}}
    
[/code]

上記の変更を行って、`Download as > PDF via LaTex (.pdf)` を選択した結果が以下になります。

[![PDF](https://i.stack.imgur.com/cgUt7.png)](https://i.stack.imgur.com/cgUt7.png)


CC BY-SA 4.0
2021-10-07T11:46:12.453
82943
2021-10-07T11:46:12.453
47127
82710
answer