結論から先に述べると,longtable環境内でmidruleを使うときには\midrule\relaxとすべき.
参考文献
- booktabs - “Undefined control sequence” on left parenthesis after midrule in longtable - TeX - LaTeX Stack Exchange
- CTAN: Package booktabs
きっかけ
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でも同様の問題が発生する可能性がある.