문자를 모아 책을 찍어내어 엮는 머나먼 여정으로의 소개 책 쓰고 찍어내는 법 Terran Publishing 시험판 책이란 무엇인가

본 견본은 책 조판 언어의 예시를 위해 제작되었다.

책이란 정말 무엇인가

책 조판 시스템에서 책이란 페이지 번호와 그림과 하이퍼링크와 같은 요소를 포함하여 가독성 좋게 편집된 글의 뭉치를 말한다.

책은 ‘엮인’ 글로 취급되어 두 페이지가 한번에 보여진다.

타자기를 사용한 집필

타자기는 글 쓰기의 시작을 빠르고 편리하게 해 준다. 타자기를 클릭하면 바로 작성이 가능하다.

하지만 타자기를 사용할 때는 여러 문자 사용 불가, 사진 첨부 불가, 하이퍼링크 사용 불가, 너덜너덜해 못생긴 문단과 같은 크나큰 단점이 따라온다.

타자기로 찍은 문서는 ‘엮이지 않은’ 글로 취급되어 한번에 한 페이지만 보여진다.

위와 같은 이유로 타자기로는 책다운 책을 만들 수 없다.

출판사와 인쇄소를 이용한 집필

출판사를 통하면 진짜배기 책의 모든 장점을 담은 책다운 책을 고작 한 권도 아닌 여러 권을 원하는 만큼 찍어낼 수 있다.

책을 인쇄하려면 원고를 출판사로 보내야 한다. 책을 찍어내기 위한 원고는 이라는 특수한 언어로 작성되어야 한다.

을 통하며 책 전체의 생김새를 간단히 기술할 수 있다. 사용할 수 있는 스타일은 조판 시스템이 지원하는 범위 안에서 제약이 없다. 타자기로 찍어낸 듯한 글도 원한다면 얼마든지 인쇄되도록 할 수 있다.

소개

(발음: [비ː텍])은 과 유사하게 설계된 XML 기반의 마크업 언어이다. 은 세세한 스타일 정의문과 조판 설정을 추상화하여, 글을 쓰면서 매크로를 디버깅하는 등의 일 없이 글쓰기에 집중할 수 있도록 설계되었다. 다만 이러한 이유로 미리 정의된 스타일을 뜯어고치는 것은 어렵다.

문서는 다음의 다섯 부분으로 나뉘어진다: 스타일 정의문·표지 정의문·목차 정의문·원고·색인 페이지. 이 중 스타일 정의문과 원고는 필수로 존재하여야 하는 부분이다.

스타일 정의문

스타일 정의문은 문서의 가장 첫 부분이다. 스타일 정의문의 구조는 다음과 같다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE btexdoc SYSTEM "btexdoc.dtd">
<btexdoc cover="hardcover" inner="standard" papersize="standard">

btexdoc 태그는 다음의 속성을 지원한다.

표지 정의문

cover 태그는 책의 표지를 지정한다. 표지가 없는 책이라면 이 부분은 생략 가능하다. 표지 정의문의 구조는 다음과 같다.

<cover hue="358">
<title>책 제목&zwsp;</title>
<subtitle>필요한 경우 부제목&zwsp;</subtitle>
<author>누가 이 책을 집필하였는가&zwsp;</author>
<edition>필요한 경우 판본 정보&zwsp;</edition>
</cover>

이 중 title 태그만이 필수 태그이다. 표지의 문구는 글자간 간격이 넓게 인쇄된다. 책 제목은 두배 큰 크기로 인쇄된다.

표지의 색깔은 hue 속성을 사용하여 바꿀 수 있다. 0에서 360 사이의 숫자를 사용할 수 있다.

목차 정의문

목차 페이지의 내용은 원고를 읽어 자동으로 채워진다. 목차 정의문의 구조는 다음과 같다.

<tocpage title="목차 혹은 필요한 다른 제목">&zwsp;<tableofcontents/>&zwsp;</tocpage>

title 속성은 목차 페이지의 장제목을 지정한다. 지정하지 않았으면 “Table of Contents”가 인자된다.

<tableofcontents/> 태그는 조판 시스템이 내부적으로 사용하는 태그이다.

원고

원고는 책의 진짜 본문이 담긴 부분을 말한다. 본문에는 다음의 태그를 사용할 수 있다.

스스로 닫는 태그는 하위 내용을 담을 수 없다. 스스로 닫는 태그는, 예를 들어 tagname이라는 태그가 있으면, 다음과 같이 쓴다: <tagname/>.

장·절 제목 스타일

부와 장·절은 type 속성을 사용하여 번호가 찍히는 스타일을 지정할 수 있다. 지원하는 스타일은 다음과 같다.

기본값은, 부는 로마 숫자 대문자, 장·절은 아라비아 숫자를 사용한다. 부의 경우 영어로 “Part I”과 같이 찍히고, 이를 “제1절”로 변경하는 등의 심화된 스타일은 매크로 정의문에서 정의할 수 있다.

문단 스타일

pcallout 태그는 align 속성을 지원한다. 지원하는 스타일은 다음과 같다.

p, span, callout 태그는 추가로 class="code" 속성을 지원한다. 이 속성이 적용된 문구는 코드꼴(code font)을 사용하여 인자된다.

하이퍼링크

하이퍼링크는 indexa 태그를 사용하여 적용할 수 있다.

그림

외부 이미지는 스스로 닫는 img 태그를 사용해 넣을 수 있다. 그림은 세로로는 현재 줄에서부터, 가로로는 페이지의 중앙에 인쇄된다. 페이지에 남아 있는 줄보다 이미지의 높이가 더 크다면, 이미지는 새로운 페이지에 인쇄된다. img 태그의 구조는 다음과 같다.

<img src="http(s)나 file URL" height="8"/>
<img fromgame="basegame:gui/small.png" height="4"/>

height 속성은 이미지의 높이를 픽셀 단위가 아닌 줄의 개수로 지정하어야 한다. 이미지의 너비는 자동으로 계산되며, 텍스트의 너비보다 넓다면 오류가 발생한다. 이미지 하단에 문구를 출력하려면 caption 속성을 사용할 수 있다.

지원하는 이미지 포맷: JPEG·PNG·BMP·TGA

색인 페이지

색인 페이지의 내용은 원고를 읽어 자동으로 채워진다. 문서에 사용된 모든 index 태그가 이 페이지에 인쇄된다. 색인 페이지의 구조는 다음과 같다.

<indexpage title="색인 혹은 필요한 다른 제목">&zwsp;<tableofindices/>&zwsp;</indexpage>

title 속성은 색인 페이지의 장제목을 지정한다. 지정하지 않았으면 “Index”가 인자된다.

<tableofindices/> 태그는 조판 시스템이 내부적으로 사용하는 태그이다.

문서 끝맺기

문서는 btexdoc 태그로 시작되었으니, 반드시 같은 태그로 끝나야 한다. </btexdoc>을 써 넣어 문서를 마무리하자.

마무리

으로 작성된 최종 원고는 출판사에 도착한 후 인쇄가 시작된다. 원고에 오류가 없다면 주문한 부수대로 책이 인쇄되어 합리적인 영업일 내에 우편으로 배송된다. 즐거운 글쓰기가 되길!

고급 매크로 매크로 정의문

여기서는 조판 시스템이 사용하는 태그를 설명하고, 이 태그를 조작하여 조금이나마 미리 정의된 스타일을 변경하는 법을 기술한다.

매크로는 cover 앞에 macrodef태그를 두어 정의할 수 있다. 매크로 정의문의 구조는 다음과 같다.

<macrodef>
  <pair key="매크로 이름" value="매크로 값"/>
  <pair key="또다른 매크로" value="또다른 값"/>
</macrodef>
매크로 키

내부적으로 부와 장 제목은 매크로를 사용하여 인자된다. 매크로의 값을 바꾸면 번호가 인자되는 스타일을 변경할 수 있다. 매크로의 이름과 기본값은 다음과 같다.

매개변수인 %1$s는 각 제목의 type 속성에 따라 적절한 숫자로 치환된다.

이 매크로는 장제목을 원하는 언어의 스타일로 변경하는 데에 사용될 수 있다. 예를 들면 한국어 환경에서는 다음과 같은 정의가 바람직할 것이다.

<macrodef>
  <pair key="thepart" value="제%1$s부"/>
  <pair key="parttype" value="1"/>
  <pair key="thechapter" value="%1$s장"/>
</macrodef>
외부 변수 인자하기

편지의 보내는 사람과 받는 사람과 같이 인자될 문구를 조판 시스템 외부에서 정의하는 것이 바람직한 경우가 있다. 이러한 문구는 스스로 닫는 v 태그를 사용하여 추가할 수 있다. 이 태그는 또한 게임 내에 정의된 문자열을 가져오는 데에 사용될 수도 있다.

외부 변수를 인자하려면 id 속성을 사용하여야 한다. 게임 내 문자열을 가져오려면 fromgame 속성을 사용하라. 두 속성은 서로 상충되므로 하나의 속성만을 사용하여야 한다.

게임 내 화폐 단위 인자하기

“총액: 1234”와 같은 문구를 인쇄하려면 bucks 태그 내부에 v 태그를 넣어서 사용할 수 있다. 예시 코드는 다음과 같다.

<p>총액: <bucks><v id="invoice_total_amount"/></bucks></p>

외부변수 invoice_total_amount너무많음이라는 문자열이 선언되어 있다면, 위 코드는 “총액: 너무많음”을 인쇄할 것이다.

한국어 전용 태그

v 태그의 조사 처리를 위해서는 아래의 태그를 사용할 수 있다. 조사 처리 태그는 v 태그처럼 변수를 인자하는데, 치환된 단어에 적절한 조사를 같이 붙여 인자한다.

태그 쌍 중에서는 아무거나 사용해도 무방하다. 어느 쪽이든 알맞는 조사를 추가할 것이다. 달리 말하면, veunvneun은 완전히 동일한 태그이다.

이 태그들은 다음과 같은 상황에 쓰일 수 있다. 아래와 같은 문서가 있다면,

[en] Send your <v fromgame="GAME_ITEM_HOLOTAPE"/> that contains the manuscript to the publisher via mail to have your books printed.
[koKR] 원고가 담긴 <veul fromgame="GAME_ITEM_HOLOTAPE"/> 출판사로 우편을 통해 보내야 책이 인쇄됩니다.

변수는 현재 게임 언어에 따라 대입되고, 그 다음 조사처리가 진행된다. 조판이 완료된 문구는 다음과 같다. (파란색은 해당 단어가 태그에 의해 대입되었음을 뜻한다)

[en] Send your Holotape that contains the manuscript to the publisher via mail to have your books printed.
[koKR] 원고가 담긴 홀로테이프를 출판사로 우편을 통해 보내야 책이 인쇄됩니다.
일반인 출입금지 왜 책이 인쇄될 때까지 기다려야 하나요? 인쇄기를 직접 사용할 수는 없나요?

엔진은 빠른 물건이 아니다. 책을 하나 조판하려면 최소 몇 초가 필요하다. “대기 시스템”은 별도의 스레드 풀에서 (멀티스레딩으로 작동함) 책이 인쇄되도록 하여 게임플레이를 방해하지 않도록 도입되었다. 이것이 없다면 책이 한번 인쇄될 때마다 게임이 ‘응답 없음’ 상태가 될 것이고, 이는 인게임 경험에 매우 부정적으로 작용한다.

인쇄 프로세스가 오류 없이 종료되었다면, 우편 시스템을 통해 플레이어에게 완성된 책을 배송한다. 오류가 있다면 오류 정보를 담은 우편이 대신 배송된다.

상기와 같은 이유로 “인쇄기”는 플레이어에게 직접적으로 제공되지 않고, “출판사”와 우편을 통해 간접적으로 이용하는 형태로 제공된다.

이 페이지는 의도적으로 비워 두었습니다