-
Notifications
You must be signed in to change notification settings - Fork 0
/
dw_book.qmd
1277 lines (1009 loc) · 46.1 KB
/
dw_book.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
---
output: html_document
editor_options:
chunk_output_type: console
editor:
markdown:
wrap: 72
---
# 쿼토 책
## 작업흐름
디지털 저작 언어 마크다운(markdown)를 기반으로 하면 증거기반 데이터 과학
글쓰기를 R과 파이썬으로 표, 그래프 등 다양한 문서 요소 통합이 수월하다.
이 과정에서 인공지능 챗GPT를 활용한 글쓰기도 다른 저작도구와 비교해도
무리없이 통합적인 글쓰기가 가능해져 저작 속도도 빨라지고, 품질은
높아지며, 대폭 비용은 절감된다.
챗GPT 디지털 글쓰기 작업이 마무리된 후 디지털 출판 과정이 이어진다. 한국
R 사용자회가 개발한 [bitPublish](https://github.com/bit2r/bitPublish)
도구를 활용하면 한글 출판에 필요한 모든 요소를 대부분 담고 있어 출판
시간을 크게 단축시킬 수 있다.
최종적으로 [bitPublish](https://github.com/bit2r/bitPublish)를 이용하여
작품을 컴파일시키면 출판 준비가 완료된 `.pdf` 파일을 즉시 얻을 수 있어,
전자책 형태로, 또는 인쇄를 통한 대량 출판으로도 즉시 활용이 가능하다.
![쿼토 도서 출판 작업흐름](images/bitPublish_workflow.jpg)
## 환경설정
최신 [Download Quarto CLI](https://quarto.org/docs/get-started/)를
운영체제에 맞춰 설치하고, 도서출판을 위해서 `PDF` 엔진이 필요하기
때문에, [`tinytex`](https://yihui.org/tinytex/)를 설치한다. `tinytex`는
TeX Live를 기반으로 하는 경량의 크로스 플랫폼, 휴대성, 유지 관리가
용이한 라텍 배포판이다.
[bitPublish](https://github.com/bit2r/bitPublish)는
`quarto 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](https://github.com/bit2r/bitPublish)는 크게 한글 도서출판을
위한 라텍 패키지와 한글식자를 위한 국문, 영문, 한자, 수식 글꼴로
구성되어 있다. `bitPublish.tex` 텍파일에 PDF 문서 생성을 위한 주요
기능들이 망라되어 필요한 경우 추가 수정을 통해 즉시 출판가능한 수준 PDF
문서 생성이 가능하다.
![`bitPublish` 구성요소와 출판 생태계](images/publishing_toolchain.jpg)
### 살펴보기
`_extensions/` 디렉토리 아래 한국 R 사용자회 (`bit2r`)에서 개발한
[bitPublish](https://github.com/bit2r/bitPublish) 템플릿이 포함되어 있어
이를 사용하여 다양하면 즉시 출판이 가능한 기반을 제공하고 있다. 저자는
`_quarto.yml` 파일에 등록된 `.qmd` 파일을 주석처리 혹은 수정하여 글쓰기
작업을 진행하면 된다.
``` bash
## ../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 파일이 생성된다.
``` bash
$ quarto render --to bitPublish-pdf
[1/6] index.qmd
[2/6] chap_exams.qmd
processing file: chap_exams.qmd
output file: chap_exams.knit.md
[3/6] chap_intro_bitpublish.qmd
processing file: chap_intro_bitpublish.qmd
|... | 6% (unnamed-chunk-3) |.................... | 39% (unnamed-chunk-20) |............................... | 61% (fig-hist2) |................................................ | 94% (unnamed-chunk-50)
output file: chap_intro_bitpublish.knit.md
There were 44 warnings (use warnings() to see them)
[4/6] chap_troubleshooting.qmd
Starting python3 kernel...Done
Executing 'chap_troubleshooting.ipynb'
[5/6] chap_version.qmd
|
processing file: chap_version.qmd
output file: chap_version.knit.md
[6/6] references.qmd
pandoc
to: latex
output-file: index.tex
standalone: true
toc: true
number-sections: true
top-level-division: chapter
pdf-engine: xelatex
variables:
graphics: true
tables: true
default-image-extension: pdf
cite-method: biblatex
metadata
crossref:
chapters: true
fig-title: 그림
tbl-title: 표
documentclass: book
papersize: letter
block-headings: true
geometry:
- 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
fig-cap-location: bottom
tbl-cap-location: bottom
toc-title: 목차
linkcolor: highlight
urlcolor: highlight
lang: ko-KR
bibliography:
- references.bib
link-citations: false
title: bitPublish를 이용하여 한글 책 조판하기
running xelatex - 1
This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023) (preloaded format=xelatex)
restricted \write18 enabled.
entering extended mode
Re-compiling document for index
This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023) (preloaded format=xelatex)
restricted \write18 enabled.
entering extended mode
making index
This is makeindex, version 2.17 [TeX Live 2023] (kpathsea + Thai support).
Scanning input file index.idx....done (99 entries accepted, 0 rejected).
Sorting entries....done (682 comparisons).
Generating output file index.ind....done (163 lines written, 0 warnings).
Output written in index.ind.
Transcript written in index.ilg.
generating bibliography
INFO - This is Biber 2.19
INFO - Logfile is 'index.blg'
INFO - Reading 'index.bcf'
INFO - Found 7 citekeys in bib section 0
INFO - Processing section 0
INFO - Looking for bibtex file 'references.bib' for section 0
INFO - LaTeX decoding ...
INFO - Found BibTeX data source 'references.bib'
INFO - Overriding locale 'korean' defaults 'variable = shifted' with 'variable = non-ignorable'
INFO - Overriding locale 'korean' defaults 'normalization = NFD' with 'normalization = prenormalized'
INFO - Sorting list 'nty/global//global/global' of type 'entry' with template 'nty' and locale 'korean'
INFO - No sort tailoring available for locale 'korean'
INFO - Writing 'index.bbl' with encoding 'UTF-8'
INFO - Output to index.bbl
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](https://github.com/bit2r/bitPublish) 템플릿으로 지원되는
기능들이 PDF 파일에 담겨있다. 필요한 경우 이를 참조하여 글쓰기 외양에
신경쓰지 않고 오로지 글쓰기 본질에 집중하여 마음에 드는 책을 저작하여
일사천리로 출판할 수 있다.
```{r}
#| echo: false
library(magick)
bitpublish_pdf <- magick::image_read_pdf("data/bitPublish_sample.pdf")
bp_front_pdf <- bitpublish_pdf[1:4]
bp_back_pdf <- bitpublish_pdf[5:8]
bp_front_stack <- bp_front_pdf |>
image_resize(geometry = "500x") |>
image_crop(geometry = "500x625+45+10") |>
image_crop(geometry = "-0+0") |>
image_border("blue", "0.5x0.5") |>
image_append(stack=FALSE)
bp_back_stack <- bp_back_pdf |>
image_resize(geometry = "500x") |>
image_crop(geometry = "500x625+45+30") |>
image_crop(geometry = "-0+0") |>
image_border("blue", "0.5x0.5") |>
image_append(stack=FALSE)
image_append(c(bp_front_stack, bp_back_stack), stack=TRUE)
```
## [bitPublish](https://github.com/bit2r/bitPublish) 소개
`Quarto`를 이용해서 책으로 만들 수 있는 포맷에는 `HTML`, `PDF`,
`MS Word`, `EPUB`, `AsciiDoc`이 있습니다. `bitPublish`는 이중에서 `PDF`
포맷의 책을 생성합니다.
현재 bitPublish의 기본 설정에서는 $4\times6$ 배판 판형을, 갖는 영어를
포함한 라틴계열 언어와 한국어, 중국어를 혼용한 책을 저작할 수 있습니다.
### 용지규격
현재 bitPublish의 기본 페이지 레이아웃\index{페이지 레이아웃} 설정은
$4\times6$ 배판으로 설계되었습니다. $4\times6$ 배판 `판형`\index{판형}의
레이아웃 설정을 변경하려면,
`_extensions/bit2r/bitPublish/_extension.yml` 파일의 다음 행들을
수정합니다. `LaTeX`의 `geometry`\index{geometry} 패키지를 사용합니다.
::: callout-note
### $4\times6$ 배판
`bitPublish` 패키지에서 학습 및 참고서를 상정하고 기본 채택한 용지크기는
4x6 배판이다.
```{yaml}
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`)\index{TTF}\index{True Type Font}가 아닌
`OTF`(`Open Type Font`)\index{OTF}\index{Open Type Font}를 선택했다.
::: callout-warning
#### 글꼴(폰트) 선정 기준
- 출판 시 발생할 라이센스 이슈
- **모든 글꼴을 상업적으로 이용이 가능한 글꼴로 선정**
- serif[^dw_book-1] 영문 글꼴인 Times New
Roman\index{Times New Roman} 저작권 이슈
- 가독성이 뛰어난 범용적인 세리프체로 영문 에세이와 학위 논문
표준 글꼴로 자리매김.
- 상업용으로 쓸 땐 저작권 면책 조건이 필요함.
- sans-serif[^dw_book-2] 영어 글꼴인
헬베티카(Helvetica)\index{Helvetica} 저작권 이슈
- 대표적인 산세리프 글꼴로 20세기 널리 쓰였음\
- 출판 인쇄물의 미적 완성도
- 가독성, 심미성 등
저작권(copyright)은 저작물에 대한 권리를 원칙적으로 저작자에게 부여되는
것이고, 라이선스(license)는 저작권 일부를 타인에게 양도하거나 허용하는
계약이다.
:::
[^dw_book-1]: serif 폰트는 바탕체 폰트를 의미합니다. 글자의 획에서
부리처럼 날카롭게 튀어나온 부분을
`세리프`(`serif`)\index{세리프}\index{serif}라 합니다. 영어는
`로만체`, 한국어의 경우에는 과거에 `명조체`라는 이름으로 통용되던
`바탕체`\index{바탕체} 서체를 의미합니다.
[^dw_book-2]: serif 폰트는 `돋움체`\index{돋움체} 폰트를 의미합니다.
프랑스어로 sans는 "\~가 없이"라는 뜻으로,
`sans-serif`\index{sans-serif}는 세리프가 없는 서체입니다. 한국어의
경우에는 과거에 `고딕체`라는 이름으로 통용되던
`돋움체`\index{돋움체} 서체를 의미합니다.
| 분류 | 세부 분류 | 추천 글꼴 | 설명 |
|:--------------:|:--------------:|:--------------:|--------------------------|
| 한국어 글꼴 | 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 그래픽 적합 |
: bitPublish 글꼴 {#tbl-bitpublish-fonts}
@tbl-bitpublish-fonts 는 각 분류별로 추천하는 글꼴을 요약하여 나타낸다.
이를 참고하여 문서나 프로젝트에 적합한 글꼴을 선택할 수 있다.
모든 글꼴은 `_extensions/bit2r/bitPublish/fonts` 디렉토리에 위치하기
때문에 별도 설치할 필요 없지만, 이미 설치된 글꼴도 중복으로 위치하게
된다. `KoPubWorld바탕체_Pro`와 `KoPubWorld돋움체_Pro` 글꼴를 사용하기
위해서는 `한국출판인회의` 홈페이지인
<https://forms.gle/aQU7b3EoaF53zMKaA>에 사용자 정보를 등록 후 무료로
사용하실 수 있다. [서체 라이선스
문서](https://www.kopus.org/wp-content/uploads/2021/04/서체_라이센스.pdf)
일독을 권장한다.
### 머리글 바닥글
`머리글`(`header`)\index{머리글}\index{header}과
`바닥글`(`footer`)\index{바닥글}\index{footer}는
`fancyhdr`\index{fancyhdr} 패키지를 사용해서 정의되었다.
![머리글과 바닥글 적용 파일(홀수 및 짝수
페이지)](images/footer_header.jpg)
`_extensions/bit2r/bitPublish/_extension.yml` 파일에 다음과 같이
설정되어 있습니다.
```{tex}
\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}}
```
만약에 머리글과 바닥글의 모양을 바꾸려면 직접 라텍 스크립트를 수정하면
한다. 책 제목을 바꾸기 위해서는 `fancyhead`\index{fancyhead}의
`EL`\index{EL}과 `OR`\index{OR}을 변경한다.
### 글줄 사이
줄간격, 행간 등으로 부르는 글줄 사이\index{글줄 사이}(line
spacing\index{line spacing})는 1.5로 설정되어있다. 수정이 필요하다면,
`_extensions/bit2r/bitPublish/bitPublish.tex` 파일의 다음 행을 수정한다.
```{tex}
%% 줄간격 정의
\linespread{1.5}
```
### `bitPublish` 서식
`bitPublish`는 본문에서 예제, 연습문제, 주의, 정보, 인용 등을 표현할 수
있는 여러 LaTeX 서식을 지원한다. 서식은 다음과 같은 구조의 라텍
`환경`\index{환경}(`enviroment`\index{enviroment})으로 제공된다.
```{tex}
\begin{enviroment name}[optional argument]{main argument}
text of enviroment
\end{enviroment name}
```
또한 다음과 같은 라텍 `명령`(`command`)으로도 제공된다.
```{tex}
\command name[optional argument]{main argument}
```
### 사용자 정의 블록
bitPublish 서식의 대표적인 기능에
`커스텀 블록`(`custom blocks`)\index{사용자 정의 블록}\index{custom blocks}[@rmcook]이
있다. 사용자 정의 블록은 보고서나 책의 일부 콘텐츠를 블록으로 정의하여
본문보다 돋보이게 하여 독자가 핵심 포인트를 쉽게 이해할 수 있도록
주목도를 높이는 서식이다.
사용자 정의 블록은 `팬독`의 `fenced Div blocks` 기능을 사용하고, 이
기능은 Div 블록을 HTML과 LaTeX 모두로 변환시키는 역할을 한다.
::: column-page
::: columns
::: {.column width="33%"}
다음의 `팬독` 사용자 정의 블록은,
```{md}
::: {.verbatim data-latex=""}
We show some _verbatim_ text here.
:::
```
:::
::: {.column width="34%"}
LaTeX 출력일 경우에는 다음과 같이 변환
```{tex}
\begin{verbatim}
We show some \emph{verbatim} text here.
\end{verbatim}
```
:::
::: {.column width="33%"}
HTML 출력일 경우에는 다음과 같이 변환
```{html}
<div class="verbatim">
We show some <em>verbatim</em> text here.
</div>
```
:::
:::
:::
### 정보 블록
정보 블록\index{정보 블록}은 멀티 아웃 포맷을 지원하는데, 다음과 같은 네
개의 유형을 지원한다. 네 개의 유형은 HTML과 LaTeX에서 우주 똑같은 모양은
아니지만, 거의 유사한 모습으로 출력된다.
| | 정보 | 주의 | 경고 | 팁 |
|:--------:|:-----------:|:-------:|:-------:|:---:|
| 정보블록 | information | caution | warning | tip |
멀티 아웃 포맷을 지원하기 위한 `팬독` 사용자 정의 블록의 구문은 다음과
같습니다. 그리고 정보 블록에 들어갈 내용은 마크다운 문법으로 기술해야
합니다.
```{md}
::: {.infobox .<type> data-latex="{<type>}{<title>}"}
text of infobox
:::
```
네가지 정보블록 중 "정보 블록"만 지면관계상 살펴보자.
본문에서 서술하는 것보다 **유용한 정보**를 기술하는 데 사용하는
`정보`(`information`) `블록`\index{정보 블록!정보 블록} 블록은 다음과 같이
사용한다.
블록 청크의 옵션 중에 `data-latex`는 LaTeX에 전달하는 인수입니다.
정보(information)를 의미하는 .information와 {information}가 중복으로
기술된 것은, 멀티 아웃 포맷을 위한 것이므로 반드시 이 형식을 따라야
한다.
::: column-page
::: columns
::: column
```{md}
::: {.infobox .information data-latex="{information}{information의 용도}"}
information은 독자에게 전하고 싶은 정보나 아이디어를 기술하는 데 사용합니다.
짙은 회색 테두리에 정보를 나타내는 아이콘을 배치하여 주위를 환기시킵니다.
환경의 내부에는 **Markdown**으로 문장을 기술합니다.
:::
```
:::
::: column
<br>
![](images/infobox_01_title.jpg)
:::
:::
:::
다음은 정보 블록에서 제목을 생략한 예제다.
::: column-page
::: columns
::: column
```{md}
::: {.infobox .information data-latex="{information}{}"}
information은 독자에게 전하고 싶은 정보나 아이디어를 기술하는 데 사용합니다.
짙은 회색 테두리에 정보를 나타내는 아이콘을 배치하여 주위를 환기시킵니다.
환경의 내부에는 **Markdown**으로 문장을 기술합니다.
:::
```
:::
::: column
<br>
![](images/infobox_01_notitle.jpg)
:::
:::
:::
### 이야기 박스
`shadequote` 환경을 이용하는데 이야기 박스 구문은 다음과 같다.
```{tex}
\begin{shadequote}[<alignment>]{<author>}
text of quote
\end{shadequote}
```
다음처럼 괄호를 비우면, 저자 이야기를 표시한다.
```{tex}
\begin{shadequote}{}
나는 통계계산이 수리영역인 줄만 알았다. 그런데, 이제는 논리적인 사고도 필요한
논리영역임을 느낀다. 그래서 논리적 사고로 통계적 데이터 분석을 위한 성능 좋은
연장이 필요하기 시작했다.
\end{shadequote}
```
명사의 명언을 인용하여 이야기할 경우에는 화자의 이름을 첫째 괄호에
기입한다. 이 예제는 화자의 이름을 오른쪽 정렬하였습니다. 정렬은 l, c,
r로 표기합니다. 각각 왼쪽, 가운데, 오른쪽 정렬을 의미합니다.
```{tex}
\begin{shadequote}[r]{안창호}
진실은 반드시 따르는 자가 있고, 정의는 반드시 이루는 날이 있다.
\end{shadequote}
```
![](images/quote_ahn.jpg)
### 타이틀 박스
앞의 예제에서 '학습목표'를 정의한 박스 서식을 타이틀 박스라
부르기로 한다. 이유는 여러 용도로 사용될 수 있어 목적으로 이름을 특정할 수 없기
때문이다. 학습 시나리오, 학습의 목표든 상관없다.
다음과 같은 라텍 `명령`으로 제공된다.
```{tex}
\snbox{text of title}{title fill color}{box fill color}{text of box}
```
다음 명령은 `학습 목표`라는 타이틀을 갖는 박스를 생성합니다.
```{tex}
\snbox{학습 목표}{blue!30}{blue!10}{데이터의 분류 체계로서의 척도를 이해하고,
이를 기반으로 한 R 데이터 객체를 이해한다. CSV 파일을 읽고, 데이터 프레임
객체로 CSV 파일을 생성할 수 있다.}
```
![](images/titlebox.jpg)
### 예제
`example` 환경을 이용하고 인용 구문은 다음과 같다.
```{tex}
\begin{example}{number of example}
text of example
\end{example}
```
그러나 예제는 다음처럼 생각보다 복잡합니다.
- 장(chapter)에서 여러 예제가 있어서, 번호를 매겨야 한다.
- 번호는 자동으로 채번되어야 추가 및 제거 시 번호의 오류를 줄인다.
- 예제를 본문이나 다른 예제에서 참조하는 경우가 있다.
- `크로스-레퍼런스`\index{크로스-레퍼런스}(`cross-reference`)\index{cross-reference}를
지원해야 한다.
예제를 위해서 다음과 같이 장(chapter)의 시작부분에 환경변수를 정의해야
합니다. 장의 라벨과 예제의 순번을 위한 카운더를 설정했습니다.
```{tex}
\label{chap:bitpublish} % 장 라벨 정의
\newcounter{exam_num_bitpub} % 새로운 카운터 생성
\setcounter{exam_num_bitpub}{0} % 카운터 값 0으로 초기화
```
다음은 예제를 위한 환경 설정과 예제를 구현하는 예제입니다.
크로스-레퍼런스를 위해서 예제에 대해서 `ex1`이라는 라벨을 `example` 환경
안에서 정의한 것을 주의깊게 보십시오.
![](images/example.jpg)
```{tex}
#| label: ex1
\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`이라는 라벨을 레퍼런스하는 방법은 다음과 같다.
```{tex}
예제 \ref{ex1} 를 레퍼런스하기 위해서는 레퍼런스 명령 `\ref{}`를 사용합니다.
```
예제 `2.1`를 레퍼런스하기 위해서 레퍼런스 명령 `\ref{}`를 사용한다.
### 연습문제
기술서나 학습서의 경우에는 연습문제를 제공하는 경우가 많다.
bitPublish에서 연습문제 서식은 `Exercise` 환경을 이용한다.
```{tex}
\begin{Exercise}
text of exercise
\end{Exercise}
```
또한 연습문제의 내용을 위해서 `tasks` 환경과 `task`\index{tasks} 명령을
사용할 수 있다.
```{tex}
\begin{tasks}[label](1)
\task text of task
\task text of task
\end{tasks}
```
다음 명령은 예제 장에서 사용한 연습문제를 기술한 라텍 스크립트다.
![](images/exercise.jpg)
```{tex}
\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`
명령어를 사용하면 됩니다.
## bitPublish 팁
`bitPublish`는 `LaTeX` 기반 솔루션이기 때문에, 좀더 유용하게 사용하기
위해서 `LaTeX`에 대한 지식과 R 환경에서는 `knitr` 패키지를
이용해서 쿼토 문서를 마크다운 문서로 랜더링하기 때문에 `knitr`
청크에 대한 지식도 필요하다. 하지만, 너무 걱정할 필요는 없다.
심도있는 지식이 아닌, 기초적인 지식으로도
충분하게 책을 저작할 수 있고 챗GPT에 책 저작과 관련된 요청사항을
프롬프트로 전달하면 대부분의 문제는 도움을 받을 수 있다.
필자가 책을 저작할 때 자주 사용되는 `LaTeX` 팁을 공유한다.
### 이미지 삽입
이미지 파일을 삽입하기 위해서는 다음처럼 `knitr`\index{knitr} 패키지의
`include_graphics()`\index{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` 기본값[^dw_book-3]이 "htb!"로
설정되었기 때문에 이 설정을 생략해도 적당한 페이지에 이미지를
배치한다. `fig-align` 기본값도 "center"로 설정되어 있다.
[^dw_book-3]: "htb!"을 기본값으로 설정하기 위해서는, 뒷부분에서 설명할
플롯에서의 한글 폰트 적용을 위한 init_environments.R 파일을 로드하는
설정을 전제로 한다.
::: {.callout-note}
### 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 = "정규분포의 히스토그램")
```
```{r}
#| label: fig-hist
#| message: false
#| warning: false
#| echo: false
#| fig-width: 6
#| fig-height: 6
#| out-width: "70%"
#| fig-cap: "정규분포 히스토그램"
set.seed(123)
hist(rnorm(500), col = "lightblue", main = "정규분포의 히스토그램")
```
그런데 R 플롯에 한글이 포함될 경우에 그림 @fig-hist 처럼 한글이 출력되지
않는 문제가 발생된다.
한글을 정상적으로 출력하기 위해서는 문서의 맨 앞에 다음 스크립트를
추가한다.
```` md
```{r init, include=FALSE}`r ''`
source(here::here("_extensions", "bit2r", "bitPublish", "init_environments.R"))
```
````
그런 후, R 플롯을 그리는 `knitr`\index{knitr} 청크에 `nanum` 옵션의 값을
true로 추가한다. 이 설정은 `나눔스퀘어` 폰트를 사용해서 R 플롯을
시각화한다는 것을 의미한다. 다음 스크립트는 그림 \ref{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 = "정규분포의 히스토그램")
```
```{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 = '정규분포의 히스토그램')
```
만약 한글이 포함되지 않은 플롯에서 라틴 문자에 사용할 글꼴로
`Nimbus Sans L` 글꼴을 사용하려면, `nimbus` 옵션의 값을 true로 추가하면
된다.
### ggplot2 그래픽스
ggplot2 그래픽스도 별도의 설정없이 한글이 출력된다. 테마는
`hrbrthemes`\index{hrbrthemes} 패키지의
`theme_ipsum()`\index{theme\_ipsum()} 함수를 사용하며, 글꼴은 R
그래픽스와 동일한 방법으로 `나눔스퀘어` 글꼴을 사용할 수 있다.
다음 스크립트는 그림 \ref{fig-hist3}\과 같은 `ggplot2`\index{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개 정규분포 난수")
```
```{r}
#| label: fig-hist3
#| echo: false
#| fig-width: 6
#| fig-height: 4
#| out-width: "70%"
#| fig-cap: "ggplot2 정규분포 히스토그램"
#| nanum: tru
library(tidyverse)
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개 정규분포 난수")
```
### 표 삽입
본문에 표를 삽입하는 방법에 다음처럼 3가지 방법을 사용할 수 있다.
- 마크다운을 이용한 표
- 캡션의 핸들링과 라벨의 지정에 취약해서 권하지 않음
- 그러나, 캡션과 라벨을 사용하지 않을 때에는 유용함
- LaTeX을 이용한 표
- 가장 세밀하게 조정할 수 있으나, LaTeX에 대한 지식이 필요함
- R을 이용한 표
- R에 익숙하면 쉽게 사용할 수 있음
#### 마크다운을 이용한 표
마크다운\index{마크다운}을 이용한 표 생성의 경우에는 캡션이 표 내부에
위치하고, 라벨을 지정할 수 없어서 표를 삽입하는 방법으로 적절하지
않다.
다음과 같이 표를 정의합니다. 캡션과 라벨을 사용하지 않을 때에는
유용합니다.
``` md
| 기본값 | 왼쪽 정렬 | 가운데 정렬 | 오른쪽 정렬 |
|---------|:----------|:-----------:|------------:|
|내용 1 |내용 2 |내용 3 |내용 4 |
|내용 5 |내용 6 |내용 7 |내용 8 |
|내용 9 |내용 10 |내용 11 |내용 12 |
Table: 마크다운 기반 표
```
| 기본값 | 왼쪽 정렬 | 가운데 정렬 | 오른쪽 정렬 |
|--------|:----------|:-----------:|------------:|
| 내용 1 | 내용 2 | 내용 3 | 내용 4 |