jlreq는 조판 도중에 “행간 값이 규격의 권장 범위를 벗어났다”고 지적해 주는, 아마도 유일한 LaTeX 도큐먼트 클래스입니다. 아베 노리유키가 2017년에 공개한 이 클래스는 W3C 기술 문서 「일본어 조판 처리의 요건」(JLReq / Requirements for Japanese Text Layout) 을 LaTeX에서 구현하려는 시도이며, 이름도 거기서 왔습니다. 소스 안에는 요건의 조항 번호를 인용한 주석이 서른 곳 넘게 있고, jlreq_notes 옵션을 붙이면 그 조항을 곁들인 조언이 로그에 나옵니다. 이 페이지에서는 jlreq가 js 계열 클래스와 무엇을 달리하는지, 판면을 어떻게 수치로 설계하는지, 그리고 세로쓰기나 행두 괄호 위치 같은 일본어 고유의 지정을 어떻게 다루는지 살펴봅니다.
JLReq란 무엇이고 클래스는 그것을 어떻게 구현하는가
JLReq는 일본어를 올바르게 조판하려면 무엇이 필요한지 W3C가 정리한 기술 문서입니다. 일본 산업 규격 JIS X 4051(일본어 문서의 조판 방법)을 토대로, CSS나 전자책 같은 기술이 지켜야 할 규칙을 조항 번호와 함께 늘어놓습니다. 행두·행말에 와서는 안 되는 글자, 일본어와 라틴 문자 사이의 간격, 주석과 제목의 처리, 판면을 정하는 방법 등입니다. jlreq 클래스 파일 첫머리에는 구현이 근거로 삼은 판이 2020년 8월 11일의 W3C Note 라고 명시되어 있습니다. 정확히 말하면 명세서 하나를 도큐먼트 클래스로 번역한 것입니다.
구현이 얼마나 깊은지는 클래스가 자체 일본어 폰트 메트릭(JFM) 을 가지고 있다는 데서 잘 드러납니다. jsclasses가 JIS 메트릭을 빌려 쓰는 데 비해, jlreq는 jlreq.tfm, jlreqg-v.tfm, jlreq-jidori.tfm 같은 전용 TFM과 LuaTeX-ja용 jfm-jlreq.lua, jfm-jlreqv.lua를 배포합니다. 구두점과 괄호 주위의 간격은 클래스 매크로가 아니라 메트릭 안에서 정해집니다. 요건이 조판 엔진의 가장 아래층에 새겨져 있는 셈입니다. pLaTeX, upLaTeX, LuaLaTeX 중 무엇으로 처리되는지는 클래스가 스스로 판별해 로그에 jlreq guessed engine: uplatex 처럼 적습니다(XeLaTeX은 대상이 아닙니다). 명시하려면 platex, uplatex, lualatex를 클래스 옵션으로 넘깁니다.
jlreq와 jsclasses의 차이
한마디로 하면, jsclasses는 완성된 체재를 건네고 jlreq는 체재를 만드는 눈금을 건넵니다. 오쿠무라 하루히코의 jsarticle는 잘 다듬어진 기본값을 그대로 받아 쓰는 설계라, 아무 생각 없이도 읽을 만한 일본어 문서가 나옵니다. jlreq의 발상은 반대입니다. 본문 크기, 한 줄 자수, 한 페이지 행수, 행간, 그리고 천·지·노도·고구치 여백을 직접 수치로 준다는 것을 전제로 합니다. 그래서 둘은 경쟁 관계가 아닙니다. 논문을 서둘러 단정하게 내야 한다면 jsclasses, 판형과 자수가 먼저 정해져 있다면 jlreq입니다.
또 하나의 차이는 규격에 맞추기 위한 세밀한 판단이 명시적인 옵션으로 드러나 있다는 점입니다. 예를 들어 narrow_kanjiskip을 붙이면 일본어 글자 사이의 간격(kanjiskip)이 jsarticle과 같은 설정으로 돌아갑니다. “jlreq로 옮겼더니 자면의 밀도가 달라졌다”는 느낌에 대한 가장 짧은 답이 이 옵션입니다. 기본 JFM은 요건에 맞는 간격을 잡으므로, jsclasses로 짠 원고를 그대로 jlreq로 옮기면 같은 자수라도 행의 인상이 조금 달라집니다. 이전할 계획이라면 한 페이지를 먼저 비교한 뒤 본문에 착수하세요.
기본 옵션 — 문서 종류·용지·글자 크기
jlreq에는 클래스가 하나뿐입니다. 문서 종류는 대괄호 옵션으로 전환합니다. 기본값은 article 상당이고, report를 넘기면 \chapter를 가진 보고서, book을 넘기면 책이 됩니다. jsclasses처럼 종류별로 클래스 이름이 나뉘지 않는다는 점에 주의하세요. 세로쓰기는 tate를 더합니다. 그 밖에 twocolumn, twoside, titlepage, landscape, draft, openright/openany, disablejfam 같은 표준 클래스에서 익숙한 철자를 그대로 쓸 수 있습니다.
용지는 paper=로 줍니다. paper=a4, paper=a5 외에 paper={148mm,210mm}처럼 폭과 높이를 직접 쓸 수도 있습니다. 여기에 함정이 하나 있습니다. paper=b5는 ISO의 B5(176×250 mm)이지, 일본에서 B5라고 부르는 JIS의 182×257 mm가 아닙니다. 클래스는 이를 조용히 넘기지 않고 Class jlreq Warning: The option 'b5' means the papersize in the ISO B-series, not in the JIS B-series. This behavior was changed from jlreq version 2021-11-05. Use 'paper=b5j' for the JIS-B-series. 라고 경고합니다. 동인지나 일본 인쇄소 입고라면 거의 확실히 paper=b5j 가 정답입니다.
글자 크기는 라틴 문자와 일본어를 나누어 생각합니다. fontsize=가 라틴 문자 기준 크기(기본 10pt), jafontsize=가 일본어 크기이고, 둘의 비율을 직접 주는 것이 jafontscale=(기본 1, 곧 같은 크기)입니다. jlreq는 출판에서 쓰는 급(Q)과 치(H) 를 치수 단위로 받아들이므로 fontsize=13Q처럼 그대로 쓸 수 있습니다(1 Q = 1 H = 0.25 mm). 일본어 원고 지정은 거의 급으로 오기 때문에, 환산 없이 그대로 옮겨 적을 수 있다는 점은 실무에서 꽤 큰 이점입니다.
| 옵션 | 의미 | 기본값 |
|---|---|---|
article / report / book | 문서 종류 전환(장 유무, 체재) | article 상당 |
tate | 세로쓰기로 조판 | 가로쓰기 |
platex / uplatex / lualatex | 엔진을 명시. 지정하지 않으면 클래스가 판별해 로그에 적음 | 자동 판별 |
paper= | 용지: a4, a5, b5j(JIS B5), {폭,높이}. 그냥 b5는 ISO B5 | a4 |
fontsize= / jafontsize= | 라틴 문자 / 일본어 기준 크기. pt 외에 Q, H도 가능 | 10pt / 라틴 문자와 동일 |
jlreq_notes | 요건에서 벗어난 설정에 대해 조항 번호를 붙인 조언을 로그에 출력 | off |
판면을 수치로 설계하기
판면, 곧 본문을 조판하는 사각형 영역은 안에서 밖으로 또는 밖에서 안으로 정합니다. 안에서 밖으로란 한 줄 길이 line_length=, 한 페이지 행수 number_of_lines=, 행간 baselineskip=을 주고 남는 것이 여백이 되게 하는 방식입니다. 밖에서 안으로란 천 head_space=, 지 foot_space=, 노도 gutter=, 고구치 fore_edge=(fore-edge=도 가능)를 주고 남는 것이 판면이 되게 하는 방식입니다. 입고 지정이 “한 줄 38자, 한 페이지 18행”으로 오면 안에서부터, “천 20 mm, 노도 18 mm”로 오면 밖에서부터 쓰면 되고, 도중에 섞을 필요는 없습니다.
치수에는 전용 단위를 쓸 수 있습니다. zw 는 전각 한 글자의 폭, zh 는 전각 한 글자의 높이여서, 자수와 행간을 “글자 몇 개분” 그대로 쓸 수 있습니다. line_length=40zw는 한 줄 40자, baselineskip=1.75zw는 전각 1.75글자분의 행간입니다. 행간은 linegap=으로도 줄 수 있는데, 이쪽은 “전각 한 글자 + 지정한 틈”으로 셉니다. 아무것도 지정하지 않으면 line_length는 용지의 문자 방향 길이의 0.75배, number_of_lines는 행 방향 0.75배 안에 들어가는 행 수, baselineskip은 일본어 크기의 1.7배, 단 사이 column_gap은 2zw 입니다. head_space와 foot_space를 생략하면 판면은 상하 중앙에 놓입니다.
| 옵션 | 의미 | 기본값 |
|---|---|---|
line_length= | 한 줄 길이(자수) | 용지의 문자 방향 길이의 0.75배 |
number_of_lines= | 페이지당 행 수 | 행 방향 0.75배 안에 들어가는 행 수 |
baselineskip= / linegap= | 행간. linegap=은 “전각 한 글자 + 이 틈”으로 셈 | 일본어 크기의 1.7배 |
gutter= / fore_edge= | 노도(제본 쪽)와 고구치(반대쪽) 여백 | — |
head_space= / foot_space= | 천과 지의 여백 | 생략 시 상하 중앙 |
column_gap= | 2단 조판에서 단 사이 간격 | 2zw |
일본어 고유의 지정 — 괄호 위치, 매달기, 세로중가로
여기가 jlreq에서 가장 특징적인 영역입니다. open_bracket_pos= 는 행두에 여는 괄호가 왔을 때의 배치를 정합니다(JLReq 3.1.5). 값은 zenkaku_tentsuki(기본), zenkakunibu_nibu, nibu_tentsuki 셋으로, 괄호를 전각 그대로 행두에 붙일지, 이분(반각만큼) 당길지를 고릅니다. hanging_punctuation 을 붙이면 행말의 구두점을 판면 밖으로 매다는 조판이 됩니다(3.8.2 주 1). 둘 다 웹과 DTP에서 늘 논의되는 선택지지만, 클래스 옵션 한 단어로 전환할 수 있는 것은 jlreq 정도입니다.
본문 쪽에도 일본어 도구가 갖추어져 있습니다. 세로쓰기 안에 숫자를 바로 세워 넣는 \tatechuyoko, 정해진 자수 틀에 글자를 배분하는 \jidori, 본문 행 안에 작은 두 줄 주석을 넣는 \warichu, 방주의 \sidenote, 후주의 \endnote, 일본어 자간을 일시적으로 넓히는 \akigumi가 그것입니다. 날짜에도 작법이 있어서, \和暦 을 선언한 뒤 \today를 쓰면 연호가 붙은 날짜가 되고, 세로쓰기에서는 숫자가 한자 숫자로 나옵니다. 클래스는 쇼와·헤이세이·레이와의 경계(1989년 1월 8일과 2019년 5월 1일)를 자기 코드에 담고 있으며, 개원 때의 변경 이력에는 그대로 “새 연호”라고 기록되어 있습니다.
세로쓰기 예와 엔진 고르기
다음은 A5판 세로쓰기로, 판면을 안쪽에서부터 설계한 예입니다. tate로 세로쓰기, paper=a5로 판형을 정하고, 나머지는 판면을 수치로 밝힙니다. 일본어 13급, 한 줄 40자, 한 페이지 17행, 행간 전각 1.75글자분입니다. 본문에 아무것도 더하지 않아도 이 한 줄로 출판물 체재가 정해집니다. 같은 \documentclass 줄 그대로, upLaTeX으로 처리하면 DVI를 거쳐, LuaLaTeX으로 처리하면 OS 글꼴을 써서 PDF가 바로 나옵니다. 가로쓰기로 하려면 tate만 빼면 됩니다.
\documentclass[
tate, % vertical writing
paper=a5,
fontsize=13Q, % 1 Q = 0.25 mm
line_length=40zw, % 40 characters per line
number_of_lines=17,
baselineskip=1.75zw,
]{jlreq}
\begin{document}
\title{雪国}
\author{川端康成}
\maketitle
国境の長いトンネルを抜けると雪国であった。
\end{document}여기에 DVI 경로에서만 생기는 함정이 하나 있습니다. jlreq는 용지 치수를 \special로 DVI에 써 넣지 않습니다. 그래서 paper=a5라고 쓴 원고를 upLaTeX으로 조판해 dvipdfmx에 넘기면, PDF는 dvipdfmx의 기본 용지(TeX Live 표준 설정에서는 A4)로 나옵니다. 해결책은 둘입니다. 프리앰블에 \usepackage{bxpapersize}를 더하거나, dvipdfmx -p a5처럼 변환 쪽에서 지정하는 것입니다. LuaLaTeX이라면 페이지 치수가 PDF에 직접 기록되므로 이 문제가 생기지 않습니다.
클래스에게 설계를 검산시키기(jlreq_notes)
클래스 옵션에 jlreq_notes 를 더하면 jlreq는 주어진 수치를 요건과 맞춰 보고, 벗어난 것을 로그에 적어 냅니다. 예를 들어 baselineskip=1.2zw로 조판하면 JLReq 머리말이 붙은 줄로 “행간은 이분 이상 전각 이하가 바람직하다(2.4.2.d 주3)”는 취지의 안내가 나옵니다. 방주의 행 길이가 너무 짧을 때, 세로쓰기에서 판면과 하시라 사이 여백이 부족할 때도 각각 해당 조항 번호를 곁들여 알려 줍니다. 조판 자체는 멈추지 않습니다. 조언이지 강제가 아니기 때문입니다. 강제되는 것은 물리적으로 성립하지 않는 경우뿐이어서, 행간이 글자 크기보다 작으면 ! Class jlreq Error: The baselineskip is less than fontsize. 로 멈춥니다.
\jlreqsetup으로 제목과 주석 다듬기
판면 치수는 클래스 옵션으로 정하지만, 주석·인용·목록·제목의 세부는 프리앰블에서 \jlreqsetup{...} 에 key=value를 나열해 다듬습니다. 각주·방주·와리추·후주의 표시 방식, 인용의 들여쓰기(quote_indent=), 제목의 행 배정 등이 여기에 모여 있습니다. 제목 자체를 다시 설계하고 싶다면 \NewBlockHeading이나 \ModifyHeading을 씁니다. 이 분업에는 이유가 있습니다. 판면은 페이지를 펼치는 순간 눈에 들어오는 치수이고, \jlreqsetup은 요소별 동작을 맡는다는 역할 분담입니다. 전부를 단번에 외울 필요는 없습니다. 먼저 \documentclass로 판형·자수·행수를 정하고, 필요해진 만큼 \jlreqsetup에 더해 가면 충분합니다. 정확한 목록은 texdoc jlreq로 열리는 부속 매뉴얼(아베가 쓴 일본어 문서)에 있습니다.
판면을 정했으면 한 페이지로 검사한다
jlreq 설정은 강력한 만큼 수치를 잘못 넣어도 PDF는 나와 버립니다. 실제 본문을 쓰기 전에 한 페이지분 더미 텍스트와 제목·각주·인용·작은 그림이나 표를 넣어 빌드하고, 자수·행수·노도·고구치를 직접 재 보세요. 특히 세로쓰기에서는 지면 위의 “행 방향”과 “자간 방향”이 가로쓰기와 뒤바뀌므로, line_length와 number_of_lines를 뒤바꿔 쓰지 않았는지 먼저 봅니다. 톰보가 필요하다면 클래스 옵션이 아니라 jlreq-trimmarks 패키지를 씁니다. tombow를 넘기면 The option 'tombow' is not supported by jlreq class. Please use the jlreq-trimmarks package 라는 경고가 나옵니다.
- 자수 — 구두점이 어디 떨어지는지만 보지 말고 본문에서 전각 글자 수를 셉니다.
- 행수 — 일반 페이지와 제목이 있는 페이지 양쪽에서 본문 행을 셉니다.
- 여백 — 제본할 원고는 노도 쪽을 넓게, PDF 제출만이라면 과도한 제본 여백을 피합니다.
- 용지 — DVI 경로라면 완성된 PDF 실치수를 잽니다.
bxpapersize나dvipdfmx -p를 잊으면 A4로 나옵니다. - 엔진 — upLaTeX과 LuaLaTeX에서 글꼴이 달라진다면 선택한 경로의 PDF만 기준으로 삼습니다.