15  (전자)책 출판

쿼토로 블로그 토막글, 보고서, 논문 등 다양한 형식 문서를 작성했다면 좀더 구조화되고 통합된 형태의 책 집필 및 도서출판에 대한 관심이 생길 수 있다. R마크다운 bookdown은 특히 복잡한 구조를 갖는 책이나 긴 문서를 효과적으로 작성하고 관리하기 위한 도구로 개발된 패키지다. R마크다운 bookdown을 활용하여 작성된 개별 문서들을 하나의 큰 프로젝트나 책으로 연결할 수 있으며, 교차 참조, 자동 번호 매기기, 목차 생성 등의 기능이 제공된다. 쿼토는 R마크다운 bookdown 기능을 별도 패키지 설치없이 내장하고 있으며 R 뿐만 아니라 파이썬, 줄리아 등 언어를 지원하며, HTML, PDF, ePub 등 다양한 출력 형식으로 책을 생성할 수 있다.

15.1 전자책 헬로 월드

쿼토에서 책을 저작하는 가장 간단한 방법은 RStudio 에서 우측 상단 ‘New Project’ 메뉴를 통해 ‘New Directory’ -> ’Quarto Book’을 선택하고 책을 집필할 디렉토리를 지정한다. 버전제어를 위해 Create a git repository를 선택할 것을 추천한다. 책 저작환경도 버전제어로 관리하고자 할 경우 Use renv with this project를 선택하고 소스 코드 방식으로 저작하고자 하면 Use visual markdown editor를 선택하지 않고 워드나 아래한글처럼 위지윅 방식 편집기를 사용하고자 하면 Use visual markdown editor를 선택한다. 그리고 나서 Create Project를 클릭하면 쿼토 책 저작환경이 구축된다.

책 저작을 위한 기본환경이 구축되어 있기 때문에 _quarto.yml 파일에 책 저작에 대한 모든 내용이 담겨져 있기 때문에 이를 유심히 살펴보면 대략 문서 구조를 이해할 수 있다. 그리고 나서 상단 Render 버튼을 클릭하면 웹사이트에 책이 생성된다.

그림 15.1: 쿼토 책(Book) 저작과정

15.2 한글 도서 출판

디지털 저작 언어인 마크다운을 사용하면, R과 파이썬으로 증거에 기반한 데이터 과학 글쓰기를 할 때 표나 그래프 같은 다양한 문서 요소들을 손쉽게 통합할 수 있다. 이 과정에서 인공지능 챗GPT를 이용한 글쓰기는 다른 저작 도구들과 비교해도 손색없이 통합적으로 글을 쓸 수 있게 해준다. 이는 저작 속도를 높이고 품질을 향상시키며 비용도 대폭 절감시킨다.

도서 집필이 마무리된 후에는 디지털 출판 과정이 이어진다. 영문 도서 출판에 초점이 맞춰진 쿼토(book)와 달리, 한국 R 사용자회가 개발한 bitPublish 도구를 활용하면 한글 출판에 필요한 거의 모든 요소를 포함하여 출판 시간을 크게 단축할 수 있다.

최종적으로 bitPublish를 사용하여 작품을 컴파일하면, 출판 준비가 완료된 .pdf 파일을 즉시 얻을 수 있다. 파일은 전자책 형태 또는 인쇄하여 대량으로 출판하는 데 즉시 사용할 수 있다. 한국 R 사용자회는 2023년 7월에 쿼토를 통해 “챗GPT 유닉스 쉘”을 출판함으로써 그 가능성을 확인했으며, 이후 축적된 경험을 바탕으로 2024년 2월 “챗GPT SQL”이라는 두 번째 책을 출판했다. 본서도 “챗GPT 유닉스 쉘”과 “챗GPT SQL”에 이어서 bitPublish를 활용하여 출판할 예정이다.

그림 15.2: 쿼토 도서 출판 작업흐름

15.2.1 환경설정

최신 Download Quarto CLI를 운영체제에 맞춰 설치하고, 도서출판을 위해서 PDF 엔진이 필요하기 때문에, tinytex를 설치한다. tinytex는 TeX Live를 기반으로 하는 경량의 크로스 플랫폼, 휴대성, 유지 관리가 용이한 라텍 배포판이다.

bitPublishquarto use template bit2r/bitPublish 명령어를 통해서 설치되면 _extensions/bit2r 디렉토리 아래 쿼토 확장프로그램으로 설치되어 디지털 도서출판을 위한 모든 사항이 준비된다.

$ quarto use template bit2r/bitPublish

Quarto templates may execute code when documents are rendered. If you do not
trust the authors of the template, we recommend that you do not install or
use the template.
 ? Do you trust the authors of this template (Y/n) » Yes
 ? Directory name: » publish
[>] Downloading
(/) Unzipping. : File C:\Users\statkclee\OneDrive\문서\WindowsPowerShell\profile.ps1 cannot be loaded because running scripts is disab
led on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
[>] Unzipping
    Found 1 extension.
[>] Copying files...

Files created:
 - chap_exams.qmd
 - chap_intro_bitpublish.qmd
 - chap_troubleshooting.qmd
 - chap_version.qmd
 - img
 - index.qmd
 - references.bib
 - references.qmd
 - _extensions
 - _quarto.yml
(base)

bitPublish는 크게 한글 도서출판을 위한 라텍 패키지와 한글식자를 위한 국문, 영문, 한자, 수식 글꼴로 구성되어 있다. bitPublish.tex 텍파일에 PDF 문서 생성을 위한 주요 기능들이 망라되어 필요한 경우 추가 수정을 통해 즉시 출판가능한 수준 PDF 문서 생성이 가능하다.

bitPublish 구성요소와 출판 생태계

bitPublish 구성요소와 출판 생태계

살펴보기

_extensions/ 디렉토리 아래 한국 R 사용자회 (bit2r)에서 개발한 bitPublish 템플릿이 포함되어 있어 이를 사용하여 다양하면 즉시 출판이 가능한 기반을 제공하고 있다. 저자는 _quarto.yml 파일에 등록된 .qmd 파일을 주석처리 혹은 수정하여 글쓰기 작업을 진행하면 된다.

## ../publish
## ├── chap_exams.qmd
## ├── chap_intro_bitpublish.qmd
## ├── chap_troubleshooting.qmd
## ├── chap_version.qmd
## ├── docs
## │   └── bitPublish를-이용하여-한글-책-조판하기.pdf
## ├── img
## │   ├── b5217f2a-f129-4bf9-90dc-c5b9783d0ea8_rw_1920.png
## │   └── pipeline.pdf
## ├── index.qmd
## ├── references.bib
## ├── references.qmd
## ├── _extensions
## │   └── bit2r
## │       └── bitPublish
## │           ├── bitPublish.tex
## │           ├── fonts
## │           │   ├── D2Coding
## │           │   │   ├── D2Coding-Ver1.3.2-20180524.ttf
## │           │   │   └── D2CodingBold-Ver1.3.2-20180524.ttf
## │           │   ├── KOPUBWORLD_OTF_FONTS
## │           │   │   ├── KoPubWorld Batang_Pro Bold.otf
## │           │   │   ├── KoPubWorld Batang_Pro Light.otf
## │           │   │   ├── KoPubWorld Batang_Pro Medium.otf
## │           │   │   ├── KoPubWorld Dotum_Pro Bold.otf
## │           │   │   ├── KoPubWorld Dotum_Pro Light.otf
## │           │   │   └── KoPubWorld Dotum_Pro Medium.otf
## │           │   ├── NanumSquare
## │           │   │   ├── NanumSquareB.otf
## │           │   │   └── NanumSquareR.otf
## │           │   ├── Nimbus Sans L
## │           │   │   ├── GNU General Public License.txt
## │           │   │   ├── NimbusSanL-Bol.otf
## │           │   │   ├── NimbusSanL-BolIta.otf
## │           │   │   ├── NimbusSanL-Reg.otf
## │           │   │   └── NimbusSanL-RegIta.otf
## │           │   └── STIXTwoText
## │           │       ├── STIXTwoMath-Regular.otf
## │           │       ├── STIXTwoText-Bold.otf
## │           │       ├── STIXTwoText-BoldItalic.otf
## │           │       ├── STIXTwoText-Italic.otf
## │           │       ├── STIXTwoText-Medium.otf
## │           │       ├── STIXTwoText-MediumItalic.otf
## │           │       ├── STIXTwoText-Regular.otf
## │           │       ├── STIXTwoText-SemiBold.otf
## │           │       └── STIXTwoText-SemiBoldItalic.otf
## │           ├── images
## │           │   ├── bomb-solid.svg
## │           │   ├── caution.png
## │           │   ├── circle-info-solid.svg
## │           │   ├── information.png
## │           │   ├── lightbulb-regular.svg
## │           │   └── triangle-exclamation-solid.svg
## │           ├── init_environments.R
## │           ├── style.css
## │           └── _extension.yml
## └── _quarto.yml

헬로월드

quarto preview 명령어로 미리보기, quarto render 명령어로 .pdf 파일을 생성하게 된다.

$ quarto preview --to bitPublish-pdf # 미리보기 
$ quarto render --to bitPublish-pdf  # pdf 파일 생성하기

quarto render --to bitPublish-pdf 명령어를 실행하게 되면 docs 폴더에 docs\bitPublish를-이용하여-한글-책-조판하기.pdf 문서 제목하고 동일한 bitPublish를-이용하여-한글-책-조판하기.pdf PDF 파일이 생성된다.

$ quarto render --to bitPublish-pdf

[1/6] index.qmd
[2/6] chap_exams.qmd


processing file: chap_exams.qmd
                                                                        ... <중간 생략> ...
                                                                        
running xelatex - 2
  This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023) (preloaded format=xelatex)
   restricted \write18 enabled.
  entering extended mode

running xelatex - 3
  This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023) (preloaded format=xelatex)
   restricted \write18 enabled.
  entering extended mode


Output created: docs\bitPublish를-이용하여-한글-책-조판하기.pdf

bitPublish 템플릿으로 지원되는 기능들이 PDF 파일에 담겨있다. 필요한 경우 이를 참조하여 글쓰기 외양에 신경쓰지 않고 오로지 글쓰기 본질에 집중하여 마음에 드는 책을 저작하여 일사천리로 출판할 수 있다.

15.2.2 bitPublish 소개

Quarto를 이용해서 책으로 만들 수 있는 포맷에는 HTML, PDF, MS Word, EPUB, AsciiDoc이 있습니다. bitPublish는 이중에서 PDF 포맷의 책을 생성합니다.

현재 bitPublish의 기본 설정에서는 \(4\times6\) 배판 판형을, 갖는 영어를 포함한 라틴계열 언어와 한국어, 중국어를 혼용한 책을 저작할 수 있습니다.

용지규격

현재 bitPublish의 기본 페이지 레이아웃 설정은 \(4\times6\) 배판으로 설계되었습니다. \(4\times6\) 배판 판형의 레이아웃 설정을 변경하려면, _extensions/bit2r/bitPublish/_extension.yml 파일의 다음 행들을 수정합니다. LaTeXgeometry 패키지를 사용합니다.

\(4\times6\) 배판

bitPublish 패키지에서 학습 및 참고서를 상정하고 기본 채택한 용지크기는 4x6 배판이다.

  geometry:       # 4x6 배판 도서를 위한 설정
    - paper=a4paper
    - layoutwidth=190mm
    - layoutheight=260mm
    - layouthoffset=10mm
    - layoutvoffset=18.5mm
    - showcrop
    - top=20mm
    - headsep=10mm             
    - bottom=30mm
    - footskip=15mm                 
    - left=25mm
    - right=25mm
    - centering   
  • 국배판(A4): 학원교재
  • 국배배판(A3): 포스터 등
  • 신국판: 소설, 수필, 자서전, 전문서적 등
  • 크라운판: 소설, 수필, 자서전, 전문서적 등
  • 레터(Letter): 해외대학 학위논문, 해외서적 등

글꼴

bitPublish는 전자책이 아닌 종이에 출력되는 책의 저작을 목적으로 만들어졌기 때문에, 폰트의 선택에서 TTF(True Type Font)가 아닌 OTF(Open Type Font)를 선택했다.

글꼴(폰트) 선정 기준
  • 출판 시 발생할 라이센스 이슈
    • 모든 글꼴을 상업적으로 이용이 가능한 글꼴로 선정
    • serif1 영문 글꼴인 Times New Roman 저작권 이슈
      • 가독성이 뛰어난 범용적인 세리프체로 영문 에세이와 학위 논문 표준 글꼴로 자리매김.
      • 상업용으로 쓸 땐 저작권 면책 조건이 필요함.
    • sans-serif2 영어 글꼴인 헬베티카(Helvetica) 저작권 이슈
      • 대표적인 산세리프 글꼴로 20세기 널리 쓰였음
  • 출판 인쇄물의 미적 완성도
    • 가독성, 심미성 등

저작권(copyright)은 저작물에 대한 권리를 원칙적으로 저작자에게 부여되는 것이고, 라이선스(license)는 저작권 일부를 타인에게 양도하거나 허용하는 계약이다.

분류 세부 분류 추천 글꼴 설명
한국어 글꼴 Serif 글꼴 KoPubWorld바탕체_Pro 한국어 본문 텍스트 적합
Sans-Serif 글꼴 KoPubWorld돋움체_Pro 한국어 UI 및 제목 적합
영어 글꼴 Serif 글꼴 STIX Two Text Times New Roman 대체 글꼴
Sans-Serif 글꼴 Nimbus Sans L Helvetica 대체 글꼴, 영어 UI 및 제목에 적합
한자 글꼴 KoPubWorld돋움체_Pro 한자 적합
코딩 글꼴 Mono Space 글꼴 D2Coding 영어/한국어 모두 동일 글꼴 사용, 자간 틀어짐 방지
수학 글꼴 STIX Two Math 수학식 적합
R 그래픽스 글꼴 한국어 글꼴 나눔스퀘어 R 그래픽 적합
영어 글꼴 Nimbus Sans L R 그래픽 적합
표 15.1: bitPublish 글꼴

표 15.1 는 각 분류별로 추천하는 글꼴을 요약하여 나타낸다. 이를 참고하여 문서나 프로젝트에 적합한 글꼴을 선택할 수 있다.

모든 글꼴은 _extensions/bit2r/bitPublish/fonts 디렉토리에 위치하기 때문에 별도 설치할 필요 없지만, 이미 설치된 글꼴도 중복으로 위치하게 된다. KoPubWorld바탕체_ProKoPubWorld돋움체_Pro 글꼴를 사용하기 위해서는 한국출판인회의 홈페이지인 https://forms.gle/aQU7b3EoaF53zMKaA에 사용자 정보를 등록 후 무료로 사용하실 수 있다. 서체 라이선스 문서 일독을 권장한다.

머리글 바닥글

머리글(header)과 바닥글(footer)는 fancyhdr 패키지를 사용해서 정의되었다.

머리글과 바닥글 적용 파일(홀수 및 짝수 페이지)

머리글과 바닥글 적용 파일(홀수 및 짝수 페이지)

_extensions/bit2r/bitPublish/_extension.yml 파일에 다음과 같이 설정되어 있습니다.

\usepackage{fancyhdr}
\pagestyle{fancy}

중간 생략

\fancyhf{}
\fancyhead[EL]{\changesize \numberfont --- bitPublish를 이용하여}
\fancyhead[OR]{\changesize \numberfont 한글 책 조판하기 ---}
\fancyfoot[EL]{{\pagefont\thepage}{\hskip4mm}{\changesize \leftmark}}
\fancyfoot[OR]{{\changesize \rightmark}{\hskip4mm}{\pagefont\thepage}}

만약에 머리글과 바닥글의 모양을 바꾸려면 직접 라텍 스크립트를 수정하면 한다. 책 제목을 바꾸기 위해서는 fancyheadELOR을 변경한다.

글줄 사이

줄간격, 행간 등으로 부르는 글줄 사이(line spacing)는 1.5로 설정되어있다. 수정이 필요하다면, _extensions/bit2r/bitPublish/bitPublish.tex 파일의 다음 행을 수정한다.

%% 줄간격 정의
\linespread{1.5}

bitPublish 서식

bitPublish는 본문에서 예제, 연습문제, 주의, 정보, 인용 등을 표현할 수 있는 여러 LaTeX 서식을 지원한다. 서식은 다음과 같은 구조의 라텍 환경(enviroment)으로 제공된다.

\begin{enviroment name}[optional argument]{main argument}
  text of enviroment
\end{enviroment name}

또한 다음과 같은 라텍 명령(command)으로도 제공된다.

\command name[optional argument]{main argument} 

이야기 박스

shadequote 환경을 이용하는데 이야기 박스 구문은 다음과 같다.

\begin{shadequote}[<alignment>]{<author>}
  text of quote
\end{shadequote}

다음처럼 괄호를 비우면, 저자 이야기를 표시한다.

\begin{shadequote}{}
나는 통계계산이 수리영역인 줄만 알았다. 그런데, 이제는 논리적인 사고도 필요한
논리영역임을 느낀다. 그래서 논리적 사고로 통계적 데이터 분석을 위한 성능 좋은
연장이 필요하기 시작했다.
\end{shadequote}

명사의 명언을 인용하여 이야기할 경우에는 화자의 이름을 첫째 괄호에 기입한다. 이 예제는 화자의 이름을 오른쪽 정렬하였습니다. 정렬은 l, c, r로 표기합니다. 각각 왼쪽, 가운데, 오른쪽 정렬을 의미합니다.

\begin{shadequote}[r]{안창호}
진실은 반드시 따르는 자가 있고, 정의는 반드시 이루는 날이 있다.
\end{shadequote}

타이틀 박스

앞의 예제에서 ’학습목표’를 정의한 박스 서식을 타이틀 박스라 부르기로 한다. 이유는 여러 용도로 사용될 수 있어 목적으로 이름을 특정할 수 없기 때문이다. 학습 시나리오, 학습의 목표든 상관없다. 다음과 같은 라텍 명령으로 제공된다.

\snbox{text of title}{title fill color}{box fill color}{text of box} 

다음 명령은 학습 목표라는 타이틀을 갖는 박스를 생성합니다.

\snbox{학습 목표}{blue!30}{blue!10}{데이터의 분류 체계로서의 척도를 이해하고, 
이를 기반으로 한 R 데이터 객체를 이해한다. CSV 파일을 읽고, 데이터 프레임 
객체로 CSV 파일을 생성할 수 있다.}

예제

example 환경을 이용하고 인용 구문은 다음과 같다.

\begin{example}{number of example}
  text of example
\end{example}

그러나 예제는 다음처럼 생각보다 복잡합니다.

  • 장(chapter)에서 여러 예제가 있어서, 번호를 매겨야 한다.
    • 번호는 자동으로 채번되어야 추가 및 제거 시 번호의 오류를 줄인다.
  • 예제를 본문이나 다른 예제에서 참조하는 경우가 있다.
    • 크로스-레퍼런스(cross-reference)를 지원해야 한다.

예제를 위해서 다음과 같이 장(chapter)의 시작부분에 환경변수를 정의해야 합니다. 장의 라벨과 예제의 순번을 위한 카운더를 설정했습니다.

\label{chap:bitpublish}                    % 장 라벨 정의
\newcounter{exam_num_bitpub}               % 새로운 카운터 생성
\setcounter{exam_num_bitpub}{0}            % 카운터 값 0으로 초기화

다음은 예제를 위한 환경 설정과 예제를 구현하는 예제입니다. 크로스-레퍼런스를 위해서 예제에 대해서 ex1이라는 라벨을 example 환경 안에서 정의한 것을 주의깊게 보십시오.

\addtocounter{exam_num_bitpub}{1}          % 예제를 위한 카운터 1 증가
\begin{example}{\ref{chap:bitpublish}.\arabic{exam_num_bitpub}}
\examplelabel{ex1}{\ref{chap:bitpublish}.\arabic{exam_num_bitpub}}
bitPublish의 서식 중에서 예제, 연습문제, 주의, 정보, 인용을 만들어 보아라.
\end{example}

ex1이라는 라벨을 레퍼런스하는 방법은 다음과 같다.

예제 \ref{ex1} 를 레퍼런스하기 위해서는 레퍼런스 명령 `\ref{}`를 사용합니다.

예제 2.1를 레퍼런스하기 위해서 레퍼런스 명령 \ref{}를 사용한다.

연습문제

기술서나 학습서의 경우에는 연습문제를 제공하는 경우가 많다. bitPublish에서 연습문제 서식은 Exercise 환경을 이용한다.

\begin{Exercise}
  text of exercise
\end{Exercise}

또한 연습문제의 내용을 위해서 tasks 환경과 task 명령을 사용할 수 있다.

\begin{tasks}[label](1)
 \task text of task
 \task text of task
\end{tasks}

다음 명령은 예제 장에서 사용한 연습문제를 기술한 라텍 스크립트다.

\begin{Exercise}\label{EX2}
\noindent 1. 다음의 데이터를 R의 객체로 만들어 보아라.
\begin{tasks}[label=(\arabic*)](1)
 \task 합격, 불합격, 불합격, 합격, 불합격
 \task 1등급, 2등급, 3등급, 2등급, 5등급, 3등급, 4등급, 4등급, 3등급, 3등급
 \task 12㎝, 23㎝, 32㎝, 22㎝, 19㎝, 21㎝, 20㎝
\end{tasks}

\noindent 2. 다음의 데이터 객체를 외부 파일로 출력해 보아라.
\begin{tasks}[label=(\arabic*)](1)
 \task R의 datas 패키지에 포함되어 있는 women 데이터 프레임을 women.csv 파일로 출력해 보아라.
 \task (1)의 파일을 다시 읽어 들여서 women2라는 이름의 데이터 프레임을 만들어라.
\end{tasks}
\end{Exercise}

만약에 연습문제를 별도의 페이지에서 시각하고 싶다면 \\clearpage 명령어를 사용하면 됩니다.

15.2.3 bitPublish 팁

bitPublishLaTeX 기반 솔루션이기 때문에, 좀더 유용하게 사용하기 위해서 LaTeX에 대한 지식과 R 환경에서는 knitr 패키지를 이용해서 쿼토 문서를 마크다운 문서로 랜더링하기 때문에 knitr 청크에 대한 지식도 필요하다. 하지만, 너무 걱정할 필요는 없다. 심도있는 지식이 아닌, 기초적인 지식으로도 충분하게 책을 저작할 수 있고 챗GPT에 책 저작과 관련된 요청사항을 프롬프트로 전달하면 대부분의 문제는 도움을 받을 수 있다. 필자가 책을 저작할 때 자주 사용되는 LaTeX 팁을 공유한다.

이미지 삽입

이미지 파일을 삽입하기 위해서는 다음처럼 knitr 패키지의 include_graphics() 함수를 사용하는 것을 추천한다. 이 때, knitr 청크는 다음과 같이 사용한다.

```{r}
#| label: fig-label
#| echo: false
#| out-width: "90%"
#| fig-align: "center"
#| fig-cap: "이미지 캡션"
#| fig-pos: "htb!"

knitr::include_graphics("이미지 파일이름.png")
```

이 예제는 다음과 같은 작업을 수행한다.

  • `이미지 파일이름.png’ 파일을 본문에 삽입하는데,
    • 이미지의 크기는 본문 너비의 90%에 해당하게 적용하며, 이미지는 가운데 정렬로 배치함
  • 이미지의 캡션은 “이미지 캡션”으로 정의하며,
  • 크로스-레퍼런스를 위한 라벨의 이름은 `fig-label’로 설정하는데, 라벨의 접두어 `fig-’를 사용한 `fig-라벨이름’의 포맷을 권장함
  • 이미지의 페이지 배치는
    1. 이미지를 정확히 해당 위치(here)에 일단 배치,
    2. 여의치 않으면, 그 다음 페이지 가장 윗부분에 배치,
    3. 만약 이것도 여의치 않으면, 그 다음 페이지 가장 아랫 부분에 배치.

이미지 페이지 배치는 다음과 같은 fig-pos(float?) 옵션으로 지정한다.

플로트 지정자 의미
h here의 약자로, 본문에 위치한 그 자리에 이미지 배치
t top의 약자로, 이미지가 위치한 페이지의 가장 윗부분에 배치. 크기가 맞지 않으면 다음 페이지의 가장 윗쪽에 배치
b bottom의 약자로, 이미지가 위치한 페이지 가장 아래에 이미지 배치. 크기가 맞지 않으면 다음 페이지의 가장 아래에 배치
p 이미지가 텍스트 없는 단독 페이지를 따로 만들어 배치
! 적절한 위치 결정을 위해, 적용한 지정자 재정의. 지정자가 나열된 순서에 따라 적절한 위치에 이미지 삽입

플로트 지정자 예제에서 사용한 “htb!”는 일단 이미지를 정확히 그 위치(h)에 배치하려 하고, 여의치 않으면 다음은 위(t)이기 때문에 그 다음 페이지 가장 윗부분에 배치한다. 만약 그것도 여의치 않으면 그 다음은 아래(b)이기 때문에 그 다음 페이지 가장 아랫 부분에 배치한다.

그런데 bitPublish에서 fig-pos 기본값3이 “htb!”로 설정되었기 때문에 이 설정을 생략해도 적당한 페이지에 이미지를 배치한다. fig-align 기본값도 “center”로 설정되어 있다.

fig-pos과 label

웹 페이지로 배포하는 문서는 페이지로 구분되지 않기 때문에 이미지는 항상 그(here) 자리에 출력되기 때문에 본문에서 “다음 그림처럼”과 같은 표현이 가능합니다만, 페이지가 구분되는 책에서는 이 표현은 적절하지 않다. 왜냐하면 페이지 상황에 따라 이미지가 다음 페이지로 넘어갈 수 있는 등 저작 과정에서는 예측이 불가능하다.

그래서 ’fig-pos’의 값을 “htb!”으로 설정하고 ’label’을 지정하여 크로스-레퍼런스를 이용해서, “그림 2.1처럼”과 같이 표현하는 것이 권장된다.

R 그래픽스

R 스크립트로 그리는 R 그래픽스는 knitr 청크(chunk)를 이용해서, R 스크립트를 실행하여 삽입한다.

```{r}
#| label: fig-hist
#| echo: false
#| fig-width: 6
#| fig-height: 4
#| out-width: "70%"
#| fig-cap: "정규분포 히스토그램"
set.seed(123)
hist(rnorm(500), col = "lightblue", main = "정규분포의 히스토그램")
```
그림 15.3: 정규분포 히스토그램

그런데 R 플롯에 한글이 포함될 경우에 그림 그림 15.3 처럼 한글이 출력되지 않는 문제가 발생된다.

한글을 정상적으로 출력하기 위해서는 문서의 맨 앞에 다음 스크립트를 추가한다.

```{r init, include=FALSE}
source(here::here("_extensions", "bit2r", "bitPublish", "init_environments.R"))
```

그런 후, R 플롯을 그리는 knitr 청크에 nanum 옵션의 값을 true로 추가한다. 이 설정은 나눔스퀘어 폰트를 사용해서 R 플롯을 시각화한다는 것을 의미한다. 다음 스크립트는 그림 [fig-hist2] 같은 R 그래픽스 플롯을 출력한다.

```{r}
#| label: fig-hist2
#| echo: false
#| fig-width: 6
#| fig-height: 4
#| out-width: "70%"
#| fig-cap: "정규분포 히스토그램"
#| nanum: true
set.seed(123)

hist(rnorm(500), col = "lightblue", main = "정규분포의 히스토그램")
```
그림 15.4: 정규분포 히스토그램

만약 한글이 포함되지 않은 플롯에서 라틴 문자에 사용할 글꼴로 Nimbus Sans L 글꼴을 사용하려면, nimbus 옵션의 값을 true로 추가하면 된다.

ggplot2 그래픽스

ggplot2 그래픽스도 별도의 설정없이 한글이 출력된다. 테마는 hrbrthemes 패키지의 theme_ipsum() 함수를 사용하며, 글꼴은 R 그래픽스와 동일한 방법으로 나눔스퀘어 글꼴을 사용할 수 있다.

다음 스크립트는 그림 [fig-hist3]같은 ggplot2 그래픽스 플롯을 출력한다.

```{r}
#| label: fig-hist3
#| echo: false
#| fig-width: 6
#| fig-height: 4
#| out-width: "70%"
#| fig-cap: "ggplot2 정규분포 히스토그램"
#| nanum: true
set.seed(123)
random_norm <- data.frame(rnd = rnorm(500))

ggplot(random_norm, aes(x = rnd)) +
  geom_histogram(color = "darkblue", fill = "lightblue") +
  labs(title = "ggplot2의 히스토그램",
       subtitle = "500개 정규분포 난수")
```
그림 15.5: ggplot2 정규분포 히스토그램

표 삽입

본문에 표를 삽입하는 방법에 다음처럼 3가지 방법을 사용할 수 있다.

  • 마크다운을 이용한 표
    • 캡션의 핸들링과 라벨의 지정에 취약해서 권하지 않음
    • 그러나, 캡션과 라벨을 사용하지 않을 때에는 유용함
  • LaTeX을 이용한 표
    • 가장 세밀하게 조정할 수 있으나, LaTeX에 대한 지식이 필요함
  • R을 이용한 표
    • R에 익숙하면 쉽게 사용할 수 있음
마크다운을 이용한 표

마크다운을 이용한 표 생성의 경우에는 캡션이 표 내부에 위치하고, 라벨을 지정할 수 없어서 표를 삽입하는 방법으로 적절하지 않다.

다음과 같이 표를 정의합니다. 캡션과 라벨을 사용하지 않을 때에는 유용합니다.

| 기본값  | 왼쪽 정렬 | 가운데 정렬 | 오른쪽 정렬 |
|---------|:----------|:-----------:|------------:|
|내용 1   |내용 2     |내용 3       |내용 4       |
|내용 5   |내용 6     |내용 7       |내용 8       |
|내용 9   |내용 10    |내용 11      |내용 12      |

Table: 마크다운 기반 표    
마크다운 기반 표
기본값 왼쪽 정렬 가운데 정렬 오른쪽 정렬
내용 1 내용 2 내용 3 내용 4
내용 5 내용 6 내용 7 내용 8
내용 9 내용 10 내용 11 내용 12
LaTeX을 이용한 표

LaTeX을 이용한 표를 삽입하는 방법은 LaTeX 스크립트를 기술하는 것이다. 다음처럼 테이블을 생성하는 LaTeX 스크립트를 기술한다.

\begin{table}[htb!]
\centering
\begin{tabular}[]{llcr}
\toprule
기본값  & 왼쪽 정렬 & 가운데 정렬 & 오른쪽 정렬 \\
\midrule
내용 1 & 내용 2  & 내용 3   & 내용 4    \\
내용 5 & 내용 6  & 내용 7   & 내용 8    \\
내용 9 & 내용 10 & 내용 11  & 내용 12   \\
\bottomrule
\end{tabular}
\caption{\label{tab-latex}LaTex 기반 표}
\end{table}
R을 이용한 표

R을 이용해서 표를 만드는 방법에 대표적인 것이 knitr 패키지 kable() 함수와 kableExtra 패키지 kable_styling() 함수를 사용하는 방법이다. 그러나 이 방법은 캡션의 위치가 표의 위에 위치하는 것과 아직 쿼토에서 크로스-레퍼런스가 지원되지 않는 관계로 gt 패키지 gt() 함수를 사용한다. 이 함수로 크로스-레퍼런스가 지원되지 않았으나, as_latex_with_caption() 함수가 이를 지원한다. 이 함수는 bitPublish에서 제공하는 사용자 정의 함수다.

다음은 표 [tab-r]생성한다.

```{r}
#| echo: false
tab <- tibble::tribble(
  ~기본값, ~`왼쪽 정렬`, ~`가운데 정렬`, ~`오른쪽 정렬`,
  "내용 1", "내용 2", "내용 3", "내용 4",
  "내용 5", "내용 6", "내용 7", "내용 8",
  "내용 9", "내용 10", "내용 11", "내용 12"
)

tab |> 
  gt::gt() |> 
  gt::cols_align(align = "left", columns = `왼쪽 정렬`) |> 
  gt::cols_align(align = "center", columns = `가운데 정렬`) |> 
  gt::cols_align(align = "right", columns = `오른쪽 정렬`) |>
  as_latex_with_caption(label = "tab-r", caption = "R 기반 표")
```

수식 입력

수식 입력은 Latex의 수학 공식을 입력하는 TeX 문법을 따른다.

인라인 수식의 경우에는 \$\$ 사이에서 수식을 정의하고, 한 라인 전체에 수식을 사용하기 위해서는 \$\$\$\$ 사이에서 수식을 정의한다.

데이터가 $x_1, x_2, x_3, \cdots, x_n$일 때, 도수분포표는 다음과 같이 만든다.

데이터가 \(x_1, x_2, x_3, \cdots, x_n\)일 때, 도수분포표는 다음과 같이 만든다.

누적상대도수: 
$$
C F_k=\sum_{i=1}^k f_i^R=\frac{F_k}{n}
$$

누적상대도수: \[ C F_k=\sum_{i=1}^k f_i^R=\frac{F_k}{n} \]

15.2.4 찾아보기 등록

LaTeX의 찾아보기(인덱싱) 기능을 활성화하기 위해, 이미 bitPublish는 프리엠블에 다음처럼 makeidx 패키지를 로드하고 있다.

\usepackage{makeidx}

또한 프리엠블에서는 찾아보기 기능을 활성화하기 위해서 다음의 명령을 포함했다.

\makeindex

그리고 문서에 찾아보기 색인을 표시하기 위한 다음의 명령어를 사용해야 하는데,

\printindex

이 명령어는 _extensions/bit2r/bitPublish/_extension.yml 파일에 다음과 같이 설정되어 있다.

include-after-body:  
  - text: |      
      \printindex  

그러므로 찾아보기에 색인 등록을 위해서는 저자가 작성할 본문에 다음 인덱스 명령을 사용하기만 하면 된다.

\index{key}

다음 예는 찾아보기 색인에 척도를 등록하고 LaTeX이 알아서 해당 문장이 위치한 페이지를 찾아보기 색인과 연결해 준다.

그 현상에 숫자를 부여한 것을 척도\index{척도}라 한다.
찾아보기에서의 언더라인의 표현 R마크다운 bookdown

LaTeX에서는 언더라인(_)은 특수문자로 인식된다. 그래서 문자로서 언더라인을 입력하려면 역슬래시(\)를 붙여야 한다. 그러므로 \index{key} 명령의 key 값에 언더라인이 있다면 다음처럼 역슬래시를 붙여 표현해야 한다.

\index{include\_graphics()}

자동조사 처리

예제, 그림, 표 등에 라벨을 지정해서 크로스-레퍼런스를 구현하면 저작자는 번호의 증감에 신경쓸 필요가 없다. 그림과 그림 사이에 또 하나의 그림을 삽입하거나, 또는 기존 그림을 제거함으로서 빠뀌게 될 참조 번호를 수정할 필요가 없다. LaTeX이 알아서 번호를 수정해주기 때문이다.

다음과 같이 출력되는 본문이 있다고 가정하자.

그림 2.3과 같이 정규분포를 따르는 히스토그램을 그린다.

그런데 앞 부분에 크로스-레퍼런스를 적용한 그림 하나를 추가하면 이 문장은 다음과 같이 바뀐다.

그림 2.4과 같이 정규분포를 따르는 히스토그램을 그린다.

그림에 크로스-레퍼런스를 적용해서 그림의 번호 3이 4로 정상적으로 변경되었는데, 조사가 어색하다. `그림 2.4과’가 아니라 `그림 2.4와’로 출력되야하기 때문이다. 왜냐하면 우리말 조사에는 다음과 같은 규칙이 있기 때문이다. 앞단어의 끝소리의 자소에 따라 다음처럼 조사가 결정되기 때문이다.(kim2007?)

앞단어 끝소리 와 / 과 을 / 를 이 / 가 은 / 는 (이)라 (으)로
리을(ㄹ) 이라
ㄹ 아닌 종성 이라 으로
중성

LaTeX이 크로스-레퍼런스에서 계산되는 아라비아 숫자의 한글 독음 끝소리 자소에 따라 자동으로 자동조사 처리를 하기 위해서는, 크로스-레퍼런스를 위한 \ref{} 명령에 붙는 조사에 역 슬래시(\)불여주면 된다.

다음은 크로스-레퍼런스에서 번호가 계산되었다는 전제로 자동조사 처리를 테스트한 사례다.

그림 2.3\와 그림 2.4\은 같이 정규분포를 따르는 히스토그램을 그린다. 
그림 2.3\과 그림 2.4\는 같이 정규분포를 따르는 히스토그램을 그린다.

그림 2.3\와 그림 2.4\은 같이 정규분포를 따르는 히스토그램을 그린다.

그림 2.3\과 그림 2.4\는 같이 정규분포를 따르는 히스토그램을 그린다.

참고문헌 등록

참고문헌(bibliography) 등록은 LaTeX의 biblatex 패키지를 이용한다. 이 패키지를 사용할 수 있는 설정은 이미 되어 있으니, ‘bitPublish를 이용하여 한글 책 조판하기’ 예제를 위한 다음의 `_quarto.yml’을 참고하여 참고문헌 등록을 적용한다.

book:
  title: "bitPublish를 이용하여 한글 책 조판하기"
  chapters:
    - index.qmd
    - chap_exams.qmd
    - chap_intro_bitpublish.qmd
    - references.qmd
bibliography: references.bib
link-citations: false

상기 YAML 헤더에서 chapters 옵션은 책에 장을 추가하는데 ‘references.qmd’ 파일이 참고문헌 등록에 해당하는 파일이다. 이 설정은 참고문헌을 나타내는 시작 페이지의 제목을 “참고문헌”으로 표기한다.

그림 15.6: bitPublish 참고문헌

그리고 참고문헌에 등록하기 위해서는 YAML 헤더에 bibliography 옵션에 기술된 ‘references.bib’ 파일에 참고문헌을 정의한다.

다음은 ‘references.bib’ 파일에 정의된 일부분으로 참고한 도서와 웹 사이트의 사례다.

@book{rstat,
  author = {유충현, 이상호},
  title = {R을 이용한 통계학 이해},
  year = {2013},
  publisher = {자유아카데미}
}

@misc{quarto,
  author = {posit},
  title = {Welcome to Quarto},
  howpublished = {\url{https://quarto.org/}},
  note = {Accessed: 2023-05-15}
}

‘references.bib’ 파일에 참고문헌을 정의했다고 `참고문헌’이라는 제목의 참고문헌에 등록되지 않는다. 참고문헌에 등록하기 위해서는, 참고한 본문 내용에 인용(citation) 명령을 적용해야 한다.

다음과 같은 LaTeX 인용 명령을 사용한다.

\cite{key}

다음의 \\cite{} 명령은 ‘참고 문헌’ 페이지에 참고한 문헌에 대한 정보를 기술하고, 인용된 본문에 링크를 연결해준다.

Quarto 홈페이지의 Quarto에 대한 소개\cite{quarto}는 다음과 같다. 이러쿵 저러쿵...

마크다운에도 인용을 위한 다음과 같은 명령이 있다.

[@key]

그러므로 다음은 앞에서의 LaTeX 명령과 동일한 작업을 수행한다.

Quarto 홈페이지의 Quarto에 대한 소개[@quarto]는 다음과 같다. 이러쿵 저러쿵...
그림 15.7: bitPublish 인용
\begin{shadequote}{}
인용의 경우에는 LaTeX 명령보다 마크다운 명령을 사용할 것을 권장합니다. 왜냐하면 bitPublish가 현재는 LaTeX 기반의 PDF 파일 포맷만 지원하지만, 향후 HTML, ePub 포맷과 같은 전자책 저작도 지원할 계획입니다. 호환을 위한 LaTeX 명령을 자제하는 것이 좋습니다.
\end{shadequote}

연습문제

객관식

  1. 쿼토로 제작된 책에서 사용할 수 있는 출력 형식은 무엇인가요?
    1. HTML
    2. PDF
    3. EPUB
    4. 모두 다
  1. 쿼토 책 출판의 주요 장점 중 하나는 무엇인가요?
    1. 빠른 인쇄 속도
    2. 고급 디자인 옵션
    3. 복잡한 프로그래밍 요구
    4. 코드, 데이터, 텍스트의 통합
  1. 쿼토 책 출판 시 고려해야 할 중요한 요소는 무엇인가요?
    1. 페이지 수
    2. 글꼴 크기
    3. 독자 대상
    4. 표지 디자인

서술형

  1. 쿼토를 사용하여 책을 출판하는 과정에서 고려해야 하는 내용의 구성 요소는 무엇인가요?
  1. 쿼토 책 출판에서 코드와 데이터의 통합이 중요한 이유는 무엇인가요?

  1. serif 폰트는 바탕체 폰트를 의미합니다. 글자의 획에서 부리처럼 날카롭게 튀어나온 부분을 세리프(serif)라 합니다. 영어는 로만체, 한국어의 경우에는 과거에 명조체라는 이름으로 통용되던 바탕체 서체를 의미합니다.↩︎

  2. sans-serif 폰트는 돋움체 폰트를 의미합니다. 프랑스어로 sans는 “~가 없이”라는 뜻으로, sans-serif는 세리프가 없는 서체입니다. 한국어의 경우에는 과거에 고딕체라는 이름으로 통용되던 돋움체 서체를 의미합니다.↩︎

  3. “htb!”을 기본값으로 설정하기 위해서는, 뒷부분에서 설명할 플롯에서의 한글 폰트 적용을 위한 init_environments.R 파일을 로드하는 설정을 전제로 한다.↩︎