용어집과 기호표

문서 끝에 “약어와 용어 목록”이나 “기호표”를 붙이고 싶을 때가 있습니다. 그것도 본문에 실제로 나온 항목만 자동으로 정렬해서 말입니다. 이런 표를 손으로 만들면 용어 하나를 추가할 때마다 다시 정렬하고 번호를 맞춰야 합니다. LaTeX에는 이를 위한 전용 도구가 두 계열 있습니다. 용어와 약어의 용어집 을 만드는 glossaries package(그리고 현대적인 후속 glossaries-extra)와 수식 기호의 기호표 에 특화된 nomencl 입니다. 둘 다 색인과 상호 참조처럼 본문에서 항목을 표시하고, 외부 프로그램으로 정렬한 뒤, 추가 컴파일에서 본문으로 불러오는 흐름으로 동작합니다.

용어집 — glossaries 기본

glossaries는 용어, 표기, 약어를 프리앰블에서 한 번 정의 하고, 본문에서는 짧은 명령으로 호출하는 방식입니다. 먼저 package를 불러온 뒤 \makeglossaries 를 씁니다. 이 줄이 용어집 파일을 열겠다는 선언이며, 빠뜨리면 용어집은 전혀 출력되지 않습니다. 주의할 점은 hyperref를 쓸 경우 glossarieshyperref 뒤에 불러와야 한다 는 것입니다. 보통 “hyperref는 마지막”이라는 규칙의 예외입니다.

용어는 \newglossaryentry{key}{name=..., description=...} 로 정의합니다. 첫 번째 인수 key는 참조용 label(임의 문자열)이고, 두 번째 인수는 key=value 설정 목록으로, 주로 name(표시명)과 description(설명)을 넣습니다. 본문에서 사용할 때는 \gls{key} 를 씁니다. 이는 name을 삽입하는 동시에 그 용어를 용어집에 실을 항목으로 기록합니다.

latex
\usepackage{glossaries}
\makeglossaries

\newglossaryentry{set}{%
  name={set},
  description={a collection of distinct objects}%
}
\newglossaryentry{matrix}{%
  name={matrix},
  plural={matrices},% 不規則な複数形を明示 / irregular plural
  description={a rectangular array of numbers}%
}

\begin{document}
本文で \gls{set}\glspl{matrix} に言及する。
\printglossary
\end{document}

\gls에는 대문자화와 복수형 변형이 있으며, 명령 앞부분 글자만 바꿔 구분합니다. name에서 자동으로 만들어지는 복수형은 단순히 끝에 “s”를 붙인 것이므로 matrices 같은 불규칙형은 plural key로 명시해야 합니다. 표시명과 참조 시 표기를 다르게 하고 싶으면 text, 관련 기호는 symbol key에 넣습니다.

명령출력용도
\gls{set}set일반 소문자 참조
\Gls{set}Set문장 처음에서 첫 글자 대문자
\glspl{matrix}matrices복수형
\Glspl{matrix}Matrices복수형 + 첫 글자 대문자
\glsdesc{set}a collection of distinct objectsdescription 필드를 삽입

약어 — 처음 나올 때 펼치기

약어에는 전용 명령 \newacronym{key}{short}{long} 이 있습니다. short는 약어(예: SVM), long은 전체 이름(예: support vector machine)입니다. 이를 \gls{key}로 호출하면 처음에는 “전체 이름(약어)”, 두 번째 이후에는 약어만 자동으로 표시됩니다. 즉 약어가 처음 등장할 때 풀네임을 보여 주는 관례를 기계가 지켜 줍니다. 약어를 별도 목록으로 모으려면 package를 \usepackage[acronym]{glossaries}로 불러옵니다.

latex
\usepackage[acronym]{glossaries}
\makeglossaries

\newacronym{svm}{SVM}{support vector machine}

\begin{document}
\gls{svm} は強力だ。% 初出: support vector machine (SVM)
その後も \gls{svm} を使う。% 2回目以降: SVM
\end{document}

첫 사용 플래그는 문서 전체에서 항목별로 관리됩니다. “여기부터 다시 전체 이름으로” 표시하고 싶다면 \glsreset{key}를, 모든 항목을 한꺼번에 reset하려면 \glsresetall을 씁니다. 설명이 여러 문단에 걸칠 만큼 길다면 \newglossaryentry 대신 \longnewglossaryentry 를 사용합니다.

빌드 — makeglossaries가 필요함

색인과 마찬가지로 용어집도 한 번의 컴파일로는 나타나지 않습니다. LaTeX는 \gls 등이 기록한 용어를 보조 파일에 쓸 뿐, 정렬하거나 서식을 만들지 않습니다. 그래서 외부 프로그램 makeglossaries 를 실행합니다. 이는 Perl 스크립트로, 문서 설정을 보고 내부에서 makeindex 또는 xindy 를 적절히 호출해 정렬된 용어집을 만듭니다. 절차는 다음 세 단계입니다.

terminal
pdflatex mydoc      # 用語をファイルへ書き出す / write the recorded terms
makeglossaries mydoc # 整列・整形(拡張子なし)/ sort & format (no extension)
pdflatex mydoc      # 用語集を本文へ流し込む / pull the glossary into the document

Perl이 없는 환경(Windows 등)에서는 Lua로 작성된 makeglossaries-lite 가 같은 역할을 합니다. makeglossaries 호출을 잊고 두 번째 pdflatex만 실행하면 용어집은 빈 채로 남습니다. 색인에서 makeindex를 잊는 것과 똑같은 함정입니다. Overleaf에서는 필요한 처리가 뒤에서 자동으로 실행되므로 이 절차를 거의 의식할 필요가 없습니다.

현대적인 방식 — glossaries-extra와 bib2gls

같은 저자 Nicola Talbot의 glossaries-extraglossaries를 확장한 상위 package이며 현재 권장되는 구성입니다. 여기에 맞는 최신 빌드 방식이 bib2gls 입니다. 생각은 문헌 관리의 biber와 비슷합니다. 용어를 .bib 파일 에 모아 두면 bib2gls가 본문에서 실제로 사용된 용어만 골라 정렬해 가져옵니다. 즉 하나의 프로그램이 makeindex / xindy의 역할인 선택과 정렬을 맡습니다.

사용하려면 package를 record 옵션과 함께 \usepackage[record]{glossaries-extra} 로 불러옵니다. 이것이 bib2gls 연동의 핵심으로, makeindex / xindy indexing을 비활성화하고 대신 .aux 파일에 기록을 씁니다. .bib 파일의 각 항목은 @entry(용어), @abbreviation(약어), @symbol(기호) 같은 type으로 작성합니다.

terms.bib
@entry{set,
  name = {set},
  description = {a collection of distinct objects}
}

@abbreviation{svm,
  short = {SVM},
  long = {support vector machine}
}

문서 쪽에서는 \input 대신 \GlsXtrLoadResources[src={terms}].bib를 읽습니다(src는 확장자 없는 파일 이름). 용어 사용은 그대로 \gls{set}를 쓰지만, 이미 정렬된 항목을 출력하므로 \printunsrtglossary 를 사용합니다. unsrt는 unsorted로, bib2gls가 이미 정렬했으니 그대로 내보낸다는 뜻입니다.

latex
\usepackage[record]{glossaries-extra}
\GlsXtrLoadResources[src={terms}]% terms.bib を読む / load terms.bib

\begin{document}
\gls{set}\gls{svm} を本文で使う。
\printunsrtglossary
\end{document}

빌드에서는 makeglossaries 대신 bib2gls를 호출합니다. --group 옵션은 항목을 첫 글자 그룹별 제목으로 나누며, pdflatexxelatexlualatex로 바꿔도 됩니다.

terminal
pdflatex mydoc
bib2gls --group mydoc   # .aux を読み .glstex を書き出す / read .aux, write .glstex
pdflatex mydoc

기호표 — nomencl package

논문 앞부분에 “이 글에서 쓰는 기호 목록”을 보이고 싶을 때 glossaries로도 작성할 수 있지만, 기호만 필요하다면 가벼운 nomencl package가 편리합니다. 프리앰블에 \usepackage{nomencl}\makenomenclature 를 두고, 기호가 처음 등장하는 곳에서 \nomenclature{symbol}{description} 으로 표시한 다음, 목록을 내고 싶은 위치에 \printnomenclature 를 씁니다. 기호는 수식이므로 $...$로 감쌉니다.

document.tex
\documentclass{article}
\usepackage{nomencl}
\makenomenclature

\begin{document}
重力加速度を $g$ とする。%
\nomenclature{$g$}{gravitational acceleration}%
質量 $m$ の物体には $F = mg$ が働く。%
\nomenclature{$m$}{mass of the object}%
\nomenclature{$F$}{force}%

\printnomenclature
\end{document}

\nomenclature 바로 앞 줄 끝에는 불필요한 공백이나 줄바꿈이 끼지 않도록 % 를 붙이는 것이 관례입니다. 기호 앞뒤에 공백이 들어가면 정렬이 어긋납니다. 순서를 세밀하게 제어하려면 선택 인수로 정렬 key를 줄 수 있습니다. \nomenclature[<prefix>]{symbol}{description} 에서 <prefix>가 정렬 기준으로 쓰입니다. 예를 들어 그리스 문자 \sigma는 앞의 백슬래시 때문에 먼저 정렬될 수 있으므로 \nomenclature[g-sigma]{$\sigma$}{...}처럼 prefix로 위치를 조정합니다.

nomencl 빌드와 조정

nomencl은 내부에서 makeindex를 사용합니다. \makenomenclature를 쓰면 LaTeX는 기호 정보를 .nlo 파일에 기록합니다. 다음 명령은 이를 nomencl에 포함된 style nomencl.ist 로 정렬하고 출력 .nls 를 만듭니다. 마지막으로 한 번 더 컴파일하면 .nls가 읽혀 기호표가 나타납니다.

terminal
pdflatex mydoc
makeindex mydoc.nlo -s nomencl.ist -o mydoc.nls
pdflatex mydoc

제목은 기본적으로 영어 “Nomenclature”입니다. 예를 들어 \renewcommand{\nomname}{List of Symbols}처럼 바꿀 수 있습니다. 목차에 넣고 싶다면 package를 \usepackage[intoc]{nomencl}로 불러옵니다. 각 항목에 자동 주석을 붙이는 옵션도 있습니다. refpage 는 “, page n”을, refeq 는 “, see equation (n)”을 덧붙입니다. 기호를 물리량, 변수 등 그룹으로 나누고 싶다면 sort prefix와 \nomgroup 재정의를 함께 사용해 제목이 있는 작은 그룹을 만들 수 있습니다.

  • 용어와 약어의 glossary라면 glossaries / glossaries-extra를 사용합니다. 첫 사용 펼침, 복수형, 대문자화가 모두 자동입니다.
  • 새로 시작한다면 glossaries-extra + bib2gls를 사용합니다. 항목을 .bib에 쓰고, \printunsrtglossary가 사용된 용어만 이미 정렬된 상태로 출력합니다.
  • 수식 기호 목록만 필요하다면 nomencl을 사용합니다. 가볍고, \nomenclature로 표시한 뒤 makeindex 한 번이면 됩니다.
  • 모두 추가 컴파일이 필요합니다. 외부 프로그램(makeglossaries / bib2gls / makeindex)을 끼우고 LaTeX를 다시 실행합니다.