LaTeXのlongtable環境内でmidruleを使うときにはrelaxしよう

January 24, 2020 by Yuta Urushiyama

結論から先に述べると,longtable環境内でmidruleを使うときには\midrule\relaxとすべき.

目次

参考文献

きっかけ

TA業務のためにJupyter NotebookファイルのPDF変換スクリプトをnbconvertコマンドを利用する形で書いているのだが,中間出力のLaTeXファイルのタイプセットがエラーになる事例があった. “Undefined control sequence"エラーが発生しており,エラー箇所は下記の3行目であった.

\begin{longtable}[]{@{}ll@{}}
\toprule
(a) & (b) \tabularnewline
\midrule
% :
% :
\end

原因と対策

参考文献のStack Overflowによると,booktabsパッケージが丸括弧をオプションの指定に用いているため,表の中身に丸括弧が含まれると上記エラーを吐く, とのことだった. CTANにてbooktabsパッケージのドキュメントを確認したところ,\cmidruleのオプション指定に丸括弧を用いていることがわかった. \toprule\midruleにはオプション指定のために丸括弧を用いていないが,何かしら実装に問題があるのだろう.

「表の中には丸括弧を使わない」とすれば全く問題ないものの,Jupyter Notebookファイルを作成するのはTAがやることではなく,教員がテンプレートを作成して受講生が記入するので,記述方法を矯正することは困難である. そこで,参考文献のStack Overflowにならい,nbconvertコマンドが出力するLaTeXファイルをsedのパイプを通して修正することにした.

nbconvert ... \
    | sed -e 's/\\toprule/\\toprule\relax/g' \
    | sed -e 's/\\midrule/\\midrule\relax/g'

具体的には,\topruleおよび\midruleのあとに続けて\relaxをつけることにより,booktabsパッケージの丸括弧を定義する環境から続く表の中身を切り離している.

\begin{longtable}[]{@{}ll@{}}
\toprule\relax
(a) & (b) \tabularnewline
\midrule\relax
% :
% :
\end

あとがき

nbconvertコマンドはPandocを介して変換しているので,Pandocでも同様の問題が発生する可能性がある.

© 2018-2020 urushiyama | Powered by Hugo with HUCORE theme.

Privacy Policy  |  LICENSE