pandocとsedでlatex原稿をwordに変換する


はじめに

latexのファイルは、microsoft Wordよりも流通が良くない。また、Wordは履歴や文章校正の機能などが高機能である。そのため、英文校正に出したかったり、共著者とWordの履歴機能を使いたかったり、そもそもlatexを使わない共著者がいたりすると、latexの原稿をWordに変えたいときがある。ここでは、pandocを使って、latex 原稿をWordファイルに変換にする方法を検討する。

ここで、特に気にしている点などを述べると、

  1. pandocを利用すると、図のラベルを\label{fig:ex1}として、\ref{fig:ex1}と本文で利用した時に、\ref{fig:ex1}は番号に置き換わらず、[fig:ex1]という名前のハイパーリンクになる。これをFigure 1 にしたい。この事情は、表や数式でも同様である。

  2. \left< \right>などは使えない。\left\langなどを利用する必要がある。

これらの点などをsedなどを利用し適当に解決しながら、それらしいアウトプットを作るスクリプトを作成した。

スクリプトとコメントなど

作ったスクリプト

(wsl2のubuntuで動かしています。)

#/bin/bash
if [ ! $#  -eq 1 ] ; then
    echo "need input file name"
    exit -1
fi
input=$1
sed -e '/^%/d'             \
 -e "s/\\\notag//g"        \
 -e "s/citenum/cite/g"     \
 -e "s/Fig.~//g"           \
 -e "s/Figs.~//g"          \
 -e "s/Figure~//g"         \
 -e "s/Figures~//g"        \
 -e "s/Eq.~//g"        \
 -e "s/Eqs.~//g"        \
 -e "s/Table~//g"          \
 -e "s/Tables~//g"         \
 -e "s/pdf/png/g"          \
 -e "s/left</left\\\langle/g"     \
 -e "s/right>/right\\\rangle/g"   \
 -e "s/left </left\\\langle/g"    \
 -e "s/right >/right\\\rangle/g"  \
 -e "s/{table\*}/{table}/g"       \
 -e "s/{figure\*}/{figure}/g"     \
$input  > tmp.tex

grep   "\\label{fig"    $input | grep -e   "{fig:[0-z]*}"   -o |uniq > figlst.txt
grep   "\\label{table"  $input | grep -e   "{table:[0-z]*}" -o |uniq > tbllst.txt
grep   "\\label{eq:"    $input | grep -e   "{eq:[0-z]*}"    -o |uniq > eqlist.txt

countF=0
for each in `cat figlst.txt ` ; do
    countF=$((countF+1))
    sed -i -e "s/$each/{Figure $countF}/" tmp.tex
done
countT=0
for each in `cat tbllst.txt ` ; do
    countT=$((countT+1))
    sed -i -e "s/$each/{Table $countT}/" tmp.tex
done
countEq=0
for each in `cat eqlist.txt ` ; do
    countEq=$((countEq+1))
    sed -i -e "s/$each/{Eq. $countEq}/" tmp.tex
done

cp tmp.tex tmp2.tex

for each in `seq 1 ${countF}` ; do
    string='s/\(\\caption{\)\(.*\) \\label{Figure '"${each}"'}/\1Figure '"${each}: "'\2/g'
    sed  -i  -e "$string" tmp2.tex
done

for each in `seq 1 ${countT}` ; do
    string='s/\(\\caption{\)\(.*\) \\label{Table '"${each}"'}/\1Table '"${each}: "'\2/g'
    sed  -i  -e "$string" tmp2.tex
done
for each in `seq 1 ${countEq}` ; do
    string='s/label{Eq. '"${each}"'}/text{     (Eq. '"${each}"')}/'
    sed  -i  -e "$string" tmp2.tex
done

pandoc.exe -s tmp2.tex -o tmp3.md              #--citeproc --bibliography=citation.bib   #--csl=jacs.csl
sed -i -e 's/\\\[//'  -e 's/\\\]//' tmp3.md
pandoc.exe -s tmp3.md -o output.docx           #--citeproc --bibliography=citation.bib   #--reference-doc=my_styles2.docx --csl=physical-review-letters.csl
exit

実行例をしめす。
もとの、texfileとして

\RequirePackage{plautopatch}
\documentclass[12pt,dvipdfmx]{jarticle}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{bm}
\title{ {\LaTeX} test}
\author{tnagai-github}
\date{\today}
\begin{document}
\maketitle


\section{はじめに}
\subsection{数式のテスト}

\begin{align}
    \bm{f} = m\bm{a} \label{eq:Newton}
\end{align}

\begin{align}
    \frac{1}{2}mv^2  + U = \text{constant} \label{eq:ConsLow}
\end{align}

Eq.~\ref{eq:Newton}とEq.~\ref{eq:ConsLow}を書いた。

\subsection{図のテスト}
フリー素材は、ぱくたそやいらすとやから(Figures~\ref{fig:pakutaso} and \ref{fig:illustoya}\begin{figure}
    \includegraphics[width=0.5\textwidth]{001.png}
    \caption{``Uno'' \label{fig:pakutaso}}
\end{figure}

\begin{figure}
    \includegraphics[width=0.5\textwidth]{002.png}
    \caption{Darwin \label{fig:illustoya}}
\end{figure}
\end{document}

に対して、実行すると、

といった感じで、それなりの雰囲気で数式も図の番号も出る。
(図の幅に関する命令は無視されちゃうんだなぁ。。。)
細かい調整は必要かもしれないが、校正に出したり、共著者に呼んで貰う分には十分なクオリティであろう。

改善の余地

  • 元々は英語原稿向けのスクリプトとして作ったので、日本語用には少し書き換える必要があるだろう(今の実装だと、図のキャプションで日本語は多分使えない。)
  • 正規表現は余り凝って書いていない。\label{fig:xxx}は、captionの一番最後になければならず、また、captionの途中で改行は許されない。
  • 図は、\label{fig:xxx}、表は、\label{table:xxx}、式は、\label{eq:xxx}の形しか許されない。章番号には対応していない。
  • また、行中の途中のカラムからのコメントアウトは考慮できていないように思う。
  • Figures 1 and 2 は、Figure 1 and Figure 2と変換されてしまう。大抵は前者のスタイルが、ほぼ義務的に、好まれると思う。

その他

  • 参考文献はbibtexの形式で利用できる。
    pandocに-citeproc --bibliography=citation.bibをオプションで渡せば良い。また、投稿先に合わせてスタイルも変更できる。1
  • また、--reference-doc で渡すdocxファイルを適切に編集することで、フォントや形式などを制御することができる。2
  1. https://qiita.com/ishigaki/items/aed5872fe24f732d021a

  2. https://niszet.hatenablog.com/entry/2020/01/03/080000;