ANTNEST BLOG

主にモデリングとかVRC関連

Rのgt表をpandoc-crossrefで相互参照してPDFにした(修論)

 この記事は修論でRのgtパッケージで出力した表をMarkdownに貼り付け、pandoc-crossrefを使って相互参照された状態のPDFを出力したときの備忘録です。ピンポイントすぎる気はしますが、同じようなことでハマっている人の役に立ったら幸いです。

はじめに

筆者のレベル

  • Markdownちょっとわかってきた(この記事もMarkdownで書いています)。
  • pandocがんばってる。
  • LaTeXマジでなんもわからん。1ミリもわからん。名前は知ってるぜ!


やりたいこと

Markdown修論を書いて、pandocでPDFにして提出したい!


 基本的にはこれらの記事を見てやれてます。ありがたや…

yurkth.hateblo.jp

qiita.com


問題

 卒業論文に限らず、論文の類を書くときは図表の「相互参照」をしなければなりません。(W●rdにも相互参照機能はありますが、卒論の時にそれをぐちゃぐちゃにされてしまったトラウマがあるので二度とW●rdで執筆したくありませんが、それはまた別のお話)。

 Markdown+pandocで相互参照をするときは、pandoc-crossrefを使いますが、ここで問題発生。「図」は図なので画像でいいのですが、どうやら表はMarkdown形式かLaTeX形式でテキストとして書かないと(図とは区別された)「表」として認識してくれないらしい(画像のままいける方法あれば誰か教えてください)。Rのgtパッケージで画像ファイルとして出力したものを貼り付ける想定でいた私はまずそこでちょっと困りました。

 ただ、調べてみるとgtパッケージで作った表はLaTeX形式(.tex拡張子)でもエクスポートできるらしいのでほっと一息。


 ここからは実際にコード書いて説明していきます。せっかくなので、前記事で作った表をベースにやっていきましょう。

 基本的に前記事と同じコードですが、最後に表に「タイトル」をつけていることに注意してください。(gtの使い方については調べてください)

library(janitor) #janitorパッケージ読み込み
library(tidyverse) #tidyverseパッケージ読み込み
library(gt) #gtパッケージ読み込み

df <- warpbreaks #サンプルデータ読み込み

cross <- tabyl(df, wool, tension) #クロス集計表を作る
cross_rate <- adorn_percentages(cross, "row") #行(横)割合に換算
cross_rate_P <- adorn_pct_formatting(cross_rate, digits = 2) #%に換算

tidy_df <- gather(cross_rate_P, key=tension, value=percent, -wool) #整然データに

#gt表を作る
Table <- gt(
  tidy_df,
  rowname_col = "tension",
  groupname_col = "wool"
) %>%
  tab_header(title="テスト") #タイトル
Table

#.texで保存
gtsave(Table,"Table.tex")


 こうしてできたTable.texをメモ帳等、文字化けせずプレーンテキストで読めるテキストエディタで開いて、Markdown文書にコピペします。

---
tableTitle: "表 "
tblPrefix: "表."

header-includes:
  - \usepackage{longtable}
  - \usepackage{booktabs}
---

# 表の相互参照がしたい!

\captionsetup[table]{labelformat=empty,skip=1pt}
\begin{longtable}{ll}
\caption*{
{\large テスト}
} \\ 
\toprule
 & percent \\ 
\midrule
\multicolumn{1}{l}{A} \\ 
\midrule
L & 33.33\% \\ 
M & 33.33\% \\ 
H & 33.33\% \\ 
\midrule
\multicolumn{1}{l}{B} \\ 
\midrule
L & 33.33\% \\ 
M & 33.33\% \\ 
H & 33.33\% \\ 
 \bottomrule
\end{longtable}

[@tbl:test]を見てください!

 ここで違和感。なんか参考にした記事LaTeX表と見た目違うくない?(特に上の方)


 とりあえず出力してみます。

pandoc test.md -o test.pdf -F pandoc-crossref --pdf-engine=lualatex -V CJKmainfont=msgothic.ttc

※文字化けとか対策にlualatex使ったりフォント指定をしたりしています。


結果

f:id:antnestin:20220107010425p:plain

 お!なんかちゃんと表は出力できたっぽい!しかしうまくいってないところもある。

  • \label{tbl:levels}を挿入する場所がわからない
  • 本来なら「表1. 」が「テスト」というタイトルの前に挿入されるはずなのだけど、そうなってない

 これらを解決するため、LaTeXなんもわからんなりに色々弄って調べました。


解決

結論

  • \captionsetup[table]{labelformat=empty,skip=1pt}という行が(おそらくgtのおせっかいで)入っているせいで「表1. 」が挿入されなくなっているので、消去する。

    参考:captionの「図」の文字を消す[Latex]

  • \label{tbl:levels}はタイトルテキストの直前に挿入するとうまくいく。

  • captionのところががちゃがちゃした書き方になっていてそれもなんかうまくいかない要因になってるっぽいので、シンプルにする。

    参考:LaTeX表組

f:id:antnestin:20220107010520p:plain

 こんな感じでヘッダーをこちょこちょします。


結果

f:id:antnestin:20220107010507p:plain

 やったー! 相互参照ができた!!! めでたし。


 これで修論を書くことができますね! あと1ヵ月しかねえぞ! 

 がんばります。それでは。


Algo_Ayugon