Claude CodeでMarkdownを縦書き日本語PDFに変換する手順
Claude Codeに縦書きPDFを直接出力する機能はありません。LaTeXの日本語文書クラスjlreqのソースを書かせ、ローカルのTeX環境でコンパイルさせる手順を解説します。
Claude Codeで縦書きPDFを作るとは
Claude Code自体には、縦書きの日本語PDFを直接出力する機能はありません。Claude Codeはファイルを編集しコマンドを実行するコーディングエージェントです。縦書きPDFが手に入るのは、LaTeXのソースを書かせ、手元のTeX環境でコンパイルまで走らせるからです。
手順は3段階です。Markdownをjlreq形式のTeXに変換させ、lualatexでPDFにし、できたPDFをClaude Codeに読ませて直します。
必須なのはTeX環境です。popplerが要るのは、PDFをページ範囲指定で読ませるときだけです。10ページ以下のPDFなら、popplerなしで丸ごと読めます。TeXを入れずに済ませたいなら、Typstで日本語PDFを組む手順もあります。縦書きにこだわらず横書きのPDFやdocxへ変換するだけなら、Pandocでの変換設定が近道です。
つまり実態は「LaTeXを書かせて変換する」手順であり、Claude Code固有の変換エンジンが動いているわけではありません。この区別を押さえておくと、うまくいかないときの切り分けが楽になります。詰まったときは、Claude Codeへの指示より先にTeX環境側を疑うと、切り分けが早くなります。
日本語の縦書き組版を担うのは、LaTeXの文書クラスjlreqです。W3Cの日本語組版処理の要件(JLReq)を実装した文書クラスで、platex・uplatex・lualatexの3エンジンに対応しています。クラスオプションにtateを渡すと縦組みに切り替わります。
必要な準備 — TeX環境と実行場所
コンパイルには、日本語組版に対応したTeX環境がローカルに要ります。CTANのjlreqのページには、TeX LiveとMiKTeXの両方に収録されていると書かれています。macOSでGUIなしのフル版を入れるなら、Homebrewのmactex-no-guiが使えます。この名前のcaskは「Full TeX Live distribution without GUI applications」と説明されています。
brew install --cask mactex-no-guiエンジンは、lualatexコマンド1つでPDFまで完結するLuaLaTeXが手数の少ない選択です。TeXが無ければlualatexコマンド自体が見つからず、jlreqが無ければjlreq.clsが見つからないというエラーになります。どちらも環境の問題なので、環境構築だけは先に済ませておきます。
実行場所にも条件があります。Claude Codeにはターミナル・IDE拡張・デスクトップアプリ・Webの4つの入口があります。TeXコマンドを叩くには、手元のマシンのシェルで動くセッションが必要です。Webのセッションはクラウド側の環境で動くため、手元にインストールしたTeXはそのままでは使えません。
ひな型を書かせてコンパイルする
最初は短い文書で通します。Claude Codeに次のように依頼します。
jlreqクラスを使い、tateオプションで縦書きのLaTeX文書(sample.tex)を作成してください。
タイトルは「縦書きサンプル」、本文に3段落程度のダミーの日本語文章を入れてください。
エンジンはlualatexを想定してください。jlreqのREADMEには、エンジンは自動判定されるものの、指定したいときはクラスオプションにplatex・uplatex・lualatexのどれかを渡すとあります。したがって\documentclass[tate,lualatex]{jlreq}のように書いても、\documentclass[tate]{jlreq}だけでも成立します。ソースに明記しておくと、あとでコンパイルコマンドとずれたときに原因を見つけやすくなります。
続けてコンパイルも依頼します。コマンドは次の1本です。
lualatex sample.texsample.pdfができれば成功です。エラーが出たら、ログをそのまま貼って「このエラーを解消してsample.texを直してください」と頼みます。LaTeXは.logファイルにエラー箇所を書き出すため、Claude Codeはそこを読んで原因を絞れます。
既存のMarkdownを縦書き文書に流し込む
すでにMarkdownの原稿がある場合は、jlreq形式のLaTeXへの変換もClaude Codeに任せられます。
draft.mdの内容を、jlreqクラス(tateオプション)のLaTeX文書に変換してください。
見出しは\section、\subsectionに、箇条書きはitemize環境に変換してください。
変換後にlualatexでコンパイルし、エラーが出たら自分で修正してください。「変換後にコンパイルし、エラーは自分で直す」まで1回の依頼に入れるのがコツです。変換、コンパイル、ログ確認、修正の往復をClaude Codeが自分で回すので、人間が途中でコマンドを打つ場面が減ります。
jlreqの\sectionは、見出しの下に副題を付けられるよう拡張されています。\section*[running head]{Heading}[Subtitle]の形で、\chapterや\subsectionなども同様です。Markdownの見出しに副題があるなら、変換の依頼に「副題は角括弧の第2引数に入れてください」と添えると、構造を保ったまま移せます。
LuaLaTeXとupLaTeXのどちらで組むか
upLaTeXで組みたい場合も、jlreqは対応しているので、依頼文でエンジンを指定すれば足ります。違いはコンパイルの手数と、ルビやフォントに使うパッケージです。
エンジンごとの違い
LuaLaTeX
lualatex sample.texだけでPDFができます。ルビはLuaTeX-jaに含まれるluatexja-ruby、フォント指定はluatexja-fontspecかluatexja-presetです。
upLaTeX
uplatex sample.texでDVIを作り、dvipdfmx sample.dviでPDFにします。ルビはPXrubrica、フォント指定はPXchfonです。
どちらを選んでも、ソース内で指定したエンジンと実際に叩くコマンドは必ず一致させます。依頼文には「エンジンはlualatexで統一し、uplatexは使わないでください」と書いておくと、Claude Codeが途中で別のコマンドに切り替える事故を防げます。
jlreqの主なクラスオプション
狙った版面に近づけるには、依頼文にオプション名を書くのが近道です。READMEに載っている主なものは次のとおりです。
| オプション | 効果 | 指定例 |
|---|---|---|
tate | 効果縦書きに切り替える | 指定例\documentclass[tate]{jlreq} |
book / report | 効果article相当をbook/report相当に変える | 指定例\documentclass[tate,book]{jlreq} |
paper=<用紙名> | 効果用紙サイズを指定する | 指定例paper=b5paper |
jafontsize=<寸法> | 効果和文のフォントサイズを欧文と別に指定する | 指定例jafontsize=10Q |
number_of_lines=<自然数> | 効果1ページあたりの行数を固定する | 指定例number_of_lines=20 |
paperに渡せるのは、a0paperからa10paper、b0paperからb10paper(ISOのB系列)、b0jからb10j(JIS B系列)、letterpaper・legalpaper・executivepaperです。{幅,高さ}で寸法を直接指定する書き方もあります。
既定値も押さえておくと指示が楽になります。1行の長さは文字の進む方向で用紙の0.75倍、行送りは和文フォントサイズの1.7倍が既定です。number_of_linesの既定は、行の進む方向で用紙の0.75倍に収まる行数です。見た目が詰まって感じるときは、number_of_linesやbaselineskipで上書きします。
設定の置き場は2つあります。クラスオプションと、プリアンブル専用の\jlreqsetup{}です。どちらで指定するかは項目ごとに決まっています。クラスオプションでは通るはずの入力が通らないときは、スペースを取り除くと解決することが多いと、READMEにあります。
注記・縦中横・割注はコマンドで頼む
縦組みの実務文書では、注記まわりのコマンドが効きます。依頼文には、実現したい見た目とコマンド名をセットで書きます。
\warichu{}: 本文中に2行に分けて入れる割注です。改行位置は自動計算され、確定するまで複数回のコンパイルが必要です。位置を自分で決めるなら\warichu*を使います。\sidenote{}: 傍注です。既定の基本版面では傍注の幅が0なので、このコマンドは未定義です。クラスオプションのsidenote_lengthで幅を正にして初めて使えます。\tatechuyoko{}: 縦書きの中で数字や英字を横向きに並べる縦中横です。縦組みでない場所で使うとエラーになり、\tatechuyoko*ならそのまま出力されます。
傍注の見せ方は\jlreqsetupで変えられます。sidenote_type=symbolを指定すると、注を付ける語と注の本文を対応させる記号形式になり、\sidenote{対象の語}{注の本文}の形で書きます。
\jlreqsetupの項目名は数が多く、Claude Codeが記憶だけで書くと存在しない名前を作る恐れがあります。「傍注を記号形式にしてください。項目名はjlreqのREADMEで調べてから使ってください」のように、結果と調べ先を一緒に伝えると外れにくくなります。
よくあるつまずき
つまずきやすいのは、環境・フォント・組版コマンドの3か所です。
症状から探す
クラスが見つからない
jlreq.clsが見つからないというエラーは、TeXシステムがクラスを探せていない状態です。kpsewhich jlreq.clsでパスが出るかを見ます。出なければ、TeX Liveのtlmgr install jlreqで入れるか、フル版のTeX Liveを入れ直します。縦中横がうまく出ない
西暦や桁数の多い数字は、依頼文に「数字は
\tatechuyokoで囲んでください」と書いておくと安定します。フォントが思った見た目にならない
jlreq自体にはフォントを設定する機能がなく、エンジン別のパッケージで指定します。名前でフォントを指定した場合、そのフォントが入っていない環境ではコンパイルが通らないことがあります。
ルビや圏点もjlreqは提供していません。ルビ付きの縦書き原稿は、エンジンに合うルビ用パッケージを依頼文で指定します。
仕上がりをClaude Codeに見せて直す
コンパイルが通っても、版面が意図どおりとは限りません。ログにエラーが出ないことと、ページが美しく収まっていることは別の話です。Claude CodeはPDFを読めるので、確認の一部は任せられます。
コンパイル後の確認の流れ
- 1
ログでエラーの有無を見る
lualatexの出力と.logを読ませ、Overfull \hboxのような行のはみ出し警告も拾わせます。 - 2
PDFをClaude Codeに読ませる
「sample.pdfの1〜3ページを見て、縦書きの流れと句読点の位置に違和感がないか教えてください」のように頼みます。10ページを超えるPDFは、
pages指定で1回20ページまで読みます。 - 3
人間の目で最終判断する
ページ順とめくり方向、見開きの余白は、ビューアーで開いて確かめます。
PDFのページ範囲指定の読み込みには、poppler-utilsのpdftoppmが要ります。macOSならbrew install poppler、DebianやUbuntuならapt-get install poppler-utilsで入ります。未導入だとpdftoppm is not installedというエラーになります。10ページ以下の短いPDFは丸ごと読めます。
ビューアー側の差にも注意が要ります。縦書き文書は文字が右から左へ流れるので、見開き表示や自動スクロールの挙動がビューアーによって違います。ブラウザ内蔵のビューアーで違和感が出たら、別のPDFビューアーで開き直して比べます。
まとめ
縦書きPDFの品質は、Claude Codeへの依頼文よりも、TeX環境とエンジン指定の一貫性で決まります。最初の1本は短い文書でコンパイルまで通し、動いた構成を土台にMarkdownの原稿を流し込むと、失敗の原因を1か所ずつ潰せます。
手書きノートの数式をLaTeX化する用途ではClaudeで手書きノートをLaTeX教材に変換する方法が近い作業を扱っており、LaTeXソースを書かせる依頼の出し方は共通して参考になります。日本語処理そのものの精度傾向はClaudeの日本語精度を公式データとベンチマークで読む、多言語ベンチマークの詳細はClaudeの多言語性能を言語別データで見るで読めます。