js 기반 클래스

일본어 논문이나 책을 조판할 때는 표준 article·book 대신 js 계열 클래스를 사용합니다. 출발점은 오쿠무라 하루히코의 jsclasses(jsarticle 등)로, pLaTeX/upLaTeX의 사실상 표준입니다. LuaLaTeX용 이식판이 ltjsclasses이고, ZR의 BXjscls는 한 원고가 어느 엔진에서도 통과하도록 더 확장한 것입니다. 모두 표준 클래스의 사용감을 유지하면서 일본어 자간과 행 그리드를 정돈합니다. 이 페이지에서는 세 계열의 차이와 선택 방법을 살펴봅니다.

jsclasses — pLaTeX/upLaTeX의 정석

jsclasses는 LaTeX3의 classes.dtx와 ASCII Corporation의 jclasses.dtx를 바탕으로 오쿠무라 하루히코가 만든 클래스 모음이며, 현재는 일본어 TeX 개발 커뮤니티가 GitHub(texjporg/jsclasses)에서 유지 관리합니다. 제공되는 것은 jsarticle(논문·보고서용), jsbook(책용), jsreport(보고서용) 세 가지와, 학회지용 jspf, 기요용 kiyou입니다. jsreport는 비교적 새로우며, 예전에는 jsbookreport 옵션으로 대신하던 것을 독립 클래스로 나눈 것입니다.

표준 클래스와 가장 큰 차이는 본문을 10.5 pt(약 13Q) 기준으로 설계하고, 일본어를 JIS 폰트 메트릭(jis.tfm, jisg.tfm, 도쿄쇼세키인쇄의 고바야시 하지메 제작)으로 조판한다는 점입니다. 이로써 전각 글자 폭과 행간이 일본어 조판에 맞게 정돈됩니다. 클래스는 \section 같은 명령과 용지·단 구성·양면 옵션 등 표준 클래스의 인터페이스를 그대로 이어받으므로, 표준 클래스를 알고 있으면 바로 사용할 수 있습니다(Standard classes 참조).

upLaTeX에서 사용할 때는 클래스 옵션에 uplatex 를 붙입니다(다나카 다쿠지의 upLaTeX 지원 패치에서 유래). DVI를 거치므로 PDF화 드라이버로 dvipdfmx 도 함께 지정하는 것이 보통입니다.

latex
\documentclass[uplatex,dvipdfmx]{jsarticle}
\begin{document}
こんにちは、\LaTeX! これは jsarticle で組んだ日本語の文書です。
\end{document}

주요 클래스 옵션은 표준 클래스에서 물려받은 것으로, a4paper(기본), b5paper 같은 용지, twocolumn, twoside, landscape, titlepage, draft가 있으며, jsbook/jsreport에서는 장의 시작 방식을 정하는 openright/openleft/openany를 사용할 수 있습니다. 일본어 TFM을 예전의 min10/goth10으로 되돌리는 mingoth, 일본어를 수식 글꼴로 등록하지 않는 disablejfam도 있습니다.

글자 크기와 확대율 이야기(nomag)

jsclasses는 표준 클래스보다 더 다양한 글자 크기 옵션을 제공합니다. 일반적인 10pt/11pt/12pt에 더해, 등비수열이 되도록 선택된 8pt, 9pt, 14pt, 17pt, 21pt, 25pt, 30pt, 36pt, 43pt, 그리고 Q 단위 옵션 12Q/14Q, 10ptj 계열의 실치수 옵션을 사용할 수 있습니다.

이것을 실현하는 방식에는 역사적인 사정이 있습니다. jsclasses는 원래 본문을 10pt로 조판한 결과를 TeX의 \mag primitive로 전체 확대·축소하여 지정한 글자 크기에 맞췄습니다(10pt는 1배, 11pt는 약 1.095배...). \mag는 문서 전체에 균일한 줌을 거는 기능이라 글자와 치수를 함께 확대할 수 있어 편리하지만, 일부 도구가 \mag를 이해하지 못하고 뒤 단계의 dvipdfmx/dvips 처리에 의존한다는 약점이 있었습니다.

그래서 2016년에 \mag를 쓰지 않고 각종 치수 자체를 스케일하는 옵션 nomag 가 추가되었습니다. 이어서 글꼴 선택 시스템 NFSS에 패치를 적용해 optical size도 조정하는 nomag* 가 마련되었습니다. \mag를 쓰던 기존 동작으로 되돌리는 옵션이 usemag 입니다.

옵션동작
usemag\mag로 전체를 확대·축소하는 기존 방식. jsclasses의 기본값
nomag\mag를 쓰지 않고 레이아웃의 각종 치수를 스케일
nomag*nomag에 더해 NFSS를 패치해 optical size도 조정

jsclasses의 기본값은 usemag이지만, \mag와 관련된 문제를 피하고 싶다면 nomag*를 고르는 것이 좋습니다. 일본어 크기와 지정 크기의 비율(1 zw ÷ 요청 크기)은 실수 매크로 \Cjascale(기본값 0.924715)이 보관하며, 13Q ≈ 10.5pt라는 설계값에 대응합니다.

ltjsclasses — LuaLaTeX용 이식판

ltjsclasses는 jsclasses를 LuaLaTeX(luatexja) 용으로 개조한 클래스 모음이며 LuaTeX-ja 프로젝트가 유지 관리합니다. ltjsarticle, ltjsbook, ltjsreport(그 밖에 ltjspf, ltjskiyou)를 제공하고, 이름 그대로 jsclasses와 일대일로 대응합니다. 일본어는 luatexja 표준 메트릭(jfm-ujis.lua)을 사용하며, DVI를 거치지 않고 PDF를 직접 출력합니다.

jsclasses와의 큰 차이는 확대율 처리입니다. LuaTeX은 beta-0.87.0 이후 PDF 출력 시 \mag를 사용할 수 없게 되었기 때문에, ltjsclasses는 \mag 방식을 쓰지 않고 nomag*가 기본값입니다(usemag를 지정하면 경고가 납니다). 또한 uplatex 옵션이나 autodetect-engine 옵션은 필요 없으므로 삭제되어 있으며, 지정하면 오류가 납니다. 일본어 글꼴을 바꿀 때는 luatexja-fontspec을 함께 사용합니다.

latex
% lualatex でコンパイル
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont{Noto Serif CJK JP}   % 明朝
\begin{document}
こんにちは、\LaTeX! ltjsclasses は LuaLaTeX 専用です。
\end{document}

BXjscls — 어느 엔진에서도 동작

BXjscls(야토 다카유키, 통칭 ZR)는 jsclasses의 설계를 어느 엔진에서도 사용할 수 있도록 확장한 클래스 모음입니다. bxjsarticle, bxjsbook, bxjsreport, bxjsslide를 제공하며, jsclasses가 (u)pLaTeX 전용인 데 비해 BXjscls는 pdfLaTeX, XeLaTeX, LuaLaTeX에서도 일본어를 조판할 수 있습니다.

핵심은 engine= 옵션입니다. pdflatex, xelatex, lualatex, platex, uplatex 중 하나(또는 자동 판별의 autodetect-engine)를 지정하면, 그 처리계에 맞는 적절한 일본어 패키지가 읽힙니다. 또한 ja=(ja 드라이버, 예전 이름 jadriver)로 일본어 처리 방식을 고르며, 기본값 standard라면 별도 설정 없이 바로 일본어를 쓸 수 있습니다(그 밖에 minimal, modern, pandoc).

engine=읽어 들이는 주요 일본어 패키지(ja=standard)
platex / uplatex(u)pLaTeX 본체의 일본어 기능을 그대로 사용
lualatexluatexja(LuaTeX-ja)
xelatexzxjatype(xeCJK 계열)
pdflatexbxcjkjatype(CJK 계열)

문자 크기의 기준은 base=, 일본어 기준은 jbase=로 지정할 수 있으며, 일본어 스케일 비율은 \jsScale(기본 0.924715, scale= 옵션으로 변경)이 보관합니다. \mag 주변의 확대 방식은 magstyle=로 고르며 usemag, nomag, nomag*를 취할 수 있습니다. LuaTeX v0.87 이후는 \mag를 사용할 수 없으므로 그 환경에서는 자동으로 nomag* 상당이 됩니다.

latex
% 同じ原稿を engine= だけ変えれば各エンジンで通る
\documentclass[engine=lualatex,ja=standard]{bxjsarticle}
\begin{document}
こんにちは、\LaTeX! engine= を platex に変えれば pLaTeX でも組めます。
\end{document}

무엇을 고를까

js 계열에서는 먼저 엔진을 정하고, 그에 맞는 클래스를 고르는 것이 순서입니다. 같은 “jsarticle풍 체재”라도 엔진마다 사용하는 클래스가 달라집니다.

  • pLaTeX/upLaTeX를 쓴다면(기존 자산, 학회 지정 등) jsclasses. upLaTeX에서는 \documentclass[uplatex,dvipdfmx]{jsarticle}가 정석입니다.
  • LuaLaTeX 중심이라면 ltjsclasses. OS의 OpenType 글꼴을 사용할 수 있고 PDF가 직접 나오며, nomag*가 기본값입니다.
  • 엔진을 고정하고 싶지 않거나 여러 엔진으로 배포한다면 BXjscls. engine=만 바꾸면 pdfLaTeX, XeLaTeX, LuaLaTeX, (u)pLaTeX를 오갈 수 있습니다.
  • 깔끔한 JLReq 준수 클래스가 필요하다면 jlreq 도 검토할 만합니다(js 계열과는 별도 계통이며 엔진 자동 판별).

무엇을 고르든 표준 클래스의 명령 체계 위에 일본어 조판 규칙을 올린 것이므로 본문을 쓰는 방식 자체는 바뀌지 않습니다. 프리앰블과 옵션을 구성하는 방법은 “Document class & preamble”도 함께 참고하세요.

제출용 템플릿으로 구체화하기

일본어 문서에서는 클래스를 정했다고 곧바로 본문을 쓰기 시작하지 말고, 먼저 “엔진, 클래스, PDF화 경로”를 한 세트로 고정합니다. upLaTeX라면 uplatexdvipdfmx, LuaLaTeX라면 ltjsarticle와 글꼴 설정, 여러 엔진으로 배포한다면 BXjscls의 engine=을 프로젝트 README나 빌드 설정에도 같은 이름으로 적어 둡니다. 이렇게 하면 공동 저자나 CI가 다른 경로로 처리해 깨뜨리는 사고를 막을 수 있습니다.

latex
% upLaTeX で提出する日本語レポートの固定例
\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle}

% LuaLaTeX へ移すなら、クラスとフォント設定をセットで見直す
% \documentclass[a4paper]{ltjsarticle}
% \usepackage{luatexja-fontspec}

nomag이나 magstyle 같은 확대 방식 옵션은 겉모양뿐 아니라 뒤따르는 도구가 치수를 해석하는 방식에도 영향을 줍니다. 보통은 클래스 기본값에서 시작하고, 그림 배치, geometry, PDF 후처리에서 실제 치수 차이가 나타날 때만 매뉴얼을 보며 nomag*magstyle=nomag*를 검토합니다. 처음부터 모든 옵션을 넣기보다 제출물의 재현성을 지키는 것을 우선하세요.

로그에서 경로 확인하기

js 계열 클래스에서는 소스 첫 줄만 봐서는 실제 처리 경로를 착각할 수 있습니다. jsarticle은 (u)pLaTeX용, ltjsarticle은 LuaLaTeX용, bxjsarticleengine= 지정에 따르므로, 빌드 후에는 .log 앞부분에서 클래스명, 엔진명, 읽힌 일본어 패키지를 확인합니다. 공동 집필에서는 “PDF가 나왔다”만이 아니라 “지정한 경로로 PDF가 나왔다”를 확인하는 것이 중요합니다.

선택로그에서 볼 것어긋나면
jsarticlepLaTeX / upLaTeXdvipdfmx 경로빌드 레시피를 uplatex + dvipdfmx로 고정
ltjsarticleLuaLaTeX와 LuaTeX-ja클래스는 그대로 둔 채 엔진만 되돌리는 것은 피함
bxjsarticleengine=ja=의 실제값README와 CI 명령의 값과 맞춤