When setting Japanese papers or books, the js-family classes are what you reach for instead of the standard article and book. The starting point is Haruhiko Okumura’s jsclasses (jsarticle and friends), the de-facto standard for pLaTeX/upLaTeX. ltjsclasses is the LuaLaTeX port, and ZR’s BXjscls goes further, letting one source compile on any engine. All of them keep the feel of the standard classes while fixing Japanese spacing and the line grid. This page covers the three families and how to choose between them.
jsclasses — the pLaTeX/upLaTeX standard
jsclasses is a set of classes that Haruhiko Okumura built on LaTeX3’s classes.dtx and ASCII Corporation’s jclasses.dtx; it is now maintained by the Japanese TeX Development Community on GitHub (texjporg/jsclasses). It provides three classes — jsarticle (papers and reports), jsbook (books), and jsreport (reports) — plus jspf (for a certain society journal) and kiyou (for bulletins). jsreport is relatively new: it splits out into its own class what used to be done with jsbook’s report option.
The biggest difference from the standard classes is that the body is designed around 10.5 pt (≈ 13 Q) and Japanese is set with the JIS font metrics (jis.tfm, jisg.tfm, by Hajime Kobayashi of Tokyo Shoseki Printing). This gives full-width character widths and line spacing suited to Japanese typesetting. The class inherits the standard-class interface as-is — commands like \section, and options for paper, columns, and two-sided layout — so if you know the standard classes you can use it right away (see Standard classes).
To use it under upLaTeX, add the **uplatex class option (it comes from Takuji Tanaka’s upLaTeX-support patch). Because the route goes through DVI, it is standard to also specify dvipdfmx** as the PDF driver.
\documentclass[uplatex,dvipdfmx]{jsarticle}
\begin{document}
こんにちは、\LaTeX! これは jsarticle で組んだ日本語の文書です。
\end{document}The main class options are inherited from the standard classes — paper sizes such as a4paper (the default) and b5paper, plus twocolumn, twoside, landscape, titlepage, and draft; and in jsbook/jsreport, openright/openleft/openany decide where chapters open. There is also mingoth to revert the Japanese TFM to the old min10/goth10, and disablejfam to avoid registering Japanese fonts as math fonts.
Font sizes and the magnification story (nomag)
jsclasses offers a richer set of font-size options than the standard classes. On top of the usual 10pt/11pt/12pt, it adds 8pt, 9pt, 14pt, 17pt, 21pt, 25pt, 30pt, 36pt, and 43pt (chosen to form a geometric series), plus the Q-unit options 12Q/14Q and the 10ptj-style real-size options.
The mechanism behind this has a historical twist. Originally, jsclasses set the body at 10 pt and then **scaled the whole result up or down with TeX’s \mag primitive** to reach the requested size (×1 for 10 pt, ≈ ×1.095 for 11 pt, and so on). \mag applies one uniform zoom to the entire document — convenient because it scales glyphs and dimensions together, but fragile because some tools do not understand it and the result depends on how dvipdfmx/dvips handle it downstream.
So in 2016 the **nomag** option was added: instead of \mag, it scales the various dimensions directly. A companion option, **nomag*, goes further and also adjusts the optical size** by patching the font-selection system (NFSS). The option that restores the old \mag-based behavior is **usemag**.
| Option | Behavior |
|---|---|
usemag | The old way — scale everything with \mag. The default in jsclasses |
nomag | Avoid \mag; scale the layout dimensions instead |
nomag* | Like nomag, plus patch NFSS to adjust the optical size too |
jsclasses defaults to usemag, but if you want to sidestep the quirks that come with \mag, choosing nomag* is a good idea. The ratio of Japanese character size to the requested size (1 zw ÷ requested size) is held in the real-valued macro **\Cjascale** (default 0.924715), which corresponds to the design value of 13 Q ≈ 10.5 pt.
ltjsclasses — the LuaLaTeX port
ltjsclasses adapts jsclasses for LuaLaTeX (luatexja) and is maintained by the LuaTeX-ja project. It provides ltjsarticle, ltjsbook, and ltjsreport (plus ltjspf and ltjskiyou), corresponding one-to-one with jsclasses as the names suggest. Japanese uses luatexja’s standard metrics (jfm-ujis.lua), and it outputs PDF directly without going through DVI.
The big difference from jsclasses is how scaling is handled. Because **LuaTeX can no longer use \mag for PDF output (since beta-0.87.0)**, ltjsclasses does not use the \mag approach; instead **nomag* is the default** (specifying usemag triggers a warning). The uplatex and autodetect-engine options are also removed (they are unnecessary here) and will error if given. To change the Japanese fonts, pair it with luatexja-fontspec.
% lualatex でコンパイル
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont{Noto Serif CJK JP} % 明朝
\begin{document}
こんにちは、\LaTeX! ltjsclasses は LuaLaTeX 専用です。
\end{document}BXjscls — works on any engine
BXjscls (Takayuki Yato, known as ZR) extends the jsclasses design so it can be used on any engine. It provides bxjsarticle, bxjsbook, bxjsreport, and bxjsslide; whereas jsclasses is for (u)pLaTeX only, BXjscls can set Japanese under pdfLaTeX, XeLaTeX, and LuaLaTeX as well.
The key is the **engine=** option. Set it to one of pdflatex, xelatex, lualatex, platex, or uplatex (or autodetect-engine to detect automatically), and the class loads the right Japanese package for that engine. The **ja=** option (the ja-driver, formerly jadriver) then picks the Japanese-handling scheme; with the default standard you can write Japanese immediately with no extra setup (others are minimal, modern, and pandoc).
| engine= | Main Japanese package loaded (ja=standard) |
|---|---|
platex / uplatex | Uses the native Japanese support of (u)pLaTeX |
lualatex | luatexja (LuaTeX-ja) |
xelatex | zxjatype (built on xeCJK) |
pdflatex | bxcjkjatype (built on CJK) |
The base text size is set with base= and the Japanese base with jbase=, and the Japanese scale ratio is held in **\jsScale** (default 0.924715, changed via the scale= option). The \mag-style scaling is chosen with magstyle=, taking usemag, nomag, or nomag*. Since LuaTeX v0.87 cannot use \mag, that environment automatically behaves like nomag*.
% 同じ原稿を engine= だけ変えれば各エンジンで通る
\documentclass[engine=lualatex,ja=standard]{bxjsarticle}
\begin{document}
こんにちは、\LaTeX! engine= を platex に変えれば pLaTeX でも組めます。
\end{document}Which to choose
With the js family, the logic is to pick your engine first, then choose the class that fits it. Even for the same “jsarticle-style” look, the class you use changes with the engine.
- Using pLaTeX/upLaTeX (existing assets, journal requirements)? jsclasses. Under upLaTeX,
\documentclass[uplatex,dvipdfmx]{jsarticle}is the standard. - Mostly LuaLaTeX? ltjsclasses. System OpenType fonts and direct PDF output;
nomag*is the default. - Don’t want to fix the engine, or distributing across engines? BXjscls. Switch
engine=alone to move between pdfLaTeX, XeLaTeX, LuaLaTeX, and (u)pLaTeX. - Want a clean, JLReq-compliant class? jlreq is worth considering too (a separate lineage from the js family, with engine auto-detection).
Whichever you pick, each one layers Japanese typesetting rules on top of the standard-class command set, so the way you write the body itself does not change. For how to assemble the preamble and options, see “Document class & preamble” as well.