보관

TXT → EPUB 목차 만들기 과정

마존 2024. 6. 11. 21:48
 

"EPUB(이펍)을 만들어보자!" 2022 05 21 에 올라온 게시글
팁 게시판 "이펍"으로 검색해도 있는 글입니다.
( Link : https://1412.live/info/12227971 )
해당 게시글의 도움을 많이 받았습니다. 

— — — — — — — — — — — — — — — — — — — —

사용하는 프로그램

TextPad, NotePad++, Python, Sigil(epub 편집 프로그램)
— — — — — — — — — — — — — — — — — — — —

sigil이 편집 프로그램이지만 실질적인 편집은 notepad++에서 주로 합니다. sigil은 목차, 표지 넣는 용도로만 사용해요.
TXT → EPUB 엔터 기호를 이펍형식으로 바꾸는데 편리한게 notepad++ 라서 그렇습니다. 프로그램이 가볍기도 하고요.
sigil 플러그인으로 TXT파일을 불러와서 EPUB을 만들 수 있긴 한데, 목차를 만들려면 소제목 부분을 건들어야합니다.
소제목이 20개~30개정도면 수작업으로 금방 하겠지만 200화가 넘어가는 장편소설은 수작업으로 가능이야 하겠지만 비효율적이에요.
그걸 위해서 소제목에 무슨 규칙이 있는지 찾아야하는게 최우선순위 입니다.

— — — — — — — — — — — — — — — — — — — —
경우 1

소제목은 있는데 몇화인지 적혀져 있지 않은경우  (예시: 악(惡)의등교)

— — — — — — — — — — — — — — — — — — — —

경우 2+3

소제목 있으나 규칙으로 검색하면 중복이 생기는 경우

< (\d+)화 (.*) > 과  < (\d+)화 (.*) > 끝 

이렇게 두 개가 찾아지는겁니다. 

일부 규칙이 다른경우

 해당 규칙은 〈 (\d+)화 〉 인 규칙입니다.

아주 사소하게 다릅니다.  368화가 다른데요. 띄어쓰기 하나때문에 나중에 규칙으로 검색하면 저게 누락됩니다. 

고치는거야 손으로 고친다지만 찾는방법을 설명드릴겁니다.

이런식으로 나오는건 처음 텍스트 제작자가 실수한 것 이거나 만드는사람이 여러사람의 손을 거쳐서 다른거라고 생각합니다. 

사람마다 제목 넣는 규칙이 다를테니까요.

— — — — — — — — — — — — — — — — — — — —

경우 4

어디서 회차가 끊어지는지 나와있지 않은경우

제일 난감한 경우입니다. 사실 이건 해결이 불가능한게 맞아요.

 

해당 내용은 천하제일인의 소꿉친구 입니다. 같은 부분을 캡쳐해 왔습니다.

 

밑은 제가 돈주고 보면서 몇회차인지 다 적었습니다. 이런식으로 소제목이랑 어디서 나뉘는지 아예 적어놓지 않은경우는 해결 불가능한게 맞습니다. 

아니면 소제목을 적어놓은게 올라올 때 까지 기다려야합니다. 

고치면서 느낀건데요. 예시로 올려놓은 천하제일인의 소꿉친구는 0화부터 시작해서 +1씩 되어야하는건데 하나씩 밀린줄 알고 그 이후부터 소제목을 적어놓지 않은거로 보입니다. 실제로는 밀린것도 없고 빠진 내용도 없었어요 (느낌입니다.) 1부 541회차까지 고치면서 봤는데 회차가 나뉘는 부분만 깔끔하게 엔터로(공백으로) 싹 날아갔더라구요. 일부러 날린게 맞는거같습니다. 

 

경우 4를 제외하고 목차를 지정하는 방법을 알려드리겠습니다. 

— — — — — — — — — — — — — — — — — — — —

경우 1

소제목은 있는데 몇화인지 적혀져 있지 않은경우  (예시: 악(惡)의등교)

( 소제목에 1화, 2화, ⋯⋯ n화 같은 게 없어도 된다 하시는 분들은 안보셔도 됩니다. )

 

소제목은 있으나 앞에 몇화인지 적어넣고 싶은 경우에는 TextPad를 사용 합니다.
경우 3이랑 이어지는데요. 컴퓨터는 띄어쓰기가 다르다는걸 인식하기 때문에 (\d+)\. (.*) 와 (\d+)\.(.*) 이 다르다고 구분합니다.
눈으로 차이가 느껴지시나요? 구분하기 힘들 수 있습니다. 띄어쓰기가 달라요.

일치하는 검색 결과도 다르지요. 3153번째 줄인 3대 1. 이라는 제목과 관련없는 내용도 들어가지구요

 

중요한건 이게 아니고 앞에 몇 화인지 집어넣는게 목표이기 때문에 위 사진에 나온 200개 일치 항목으로 나온 검색어 (\d+)\. (.*)를 바꾸기를 합니다.
우선 앞에 변수를 집어넣는데요. 변수는 여러가지를 사용할 수 있지만 저는 〈 i 〉 를 선호합니다.

(예시로 사용한 악의등교는 에필로그 부분의 규칙이 다르기 때문에 손으로 넣어줍니다.)

203화 완결인데 결과는 205 일치라고 뜨죠? 두 개가 잘못들어갔다는 소립니다. notepad++를 사용하는 이유가 이겁니다. 사진에서도 계속 나오지만 찾기 결과물이 나오고 해당 위치로 이동 할 수 있거든요.

여기가 잘못들어가졌네요. 지워줍니다.

해당되는 두 개를 지우면 딱 203으로 1화부터 203화까지의 변수가 만들어진겁니다.
이 〈 i 〉를 다시 〈 (<EndToEndId>)i(</EndToEndId>) 〉 로 바꿔줍니다. i 만 바꿔준거에요. 
처음부터 이렇게 하면 되는거 아니냐고 물으신다면 그렇게 하셔도 됩니다만 사진으로 올려드렸듯 잘못 들어간게 분명히 있을 수도 있기 때문에 두번 확인한다 생각하고 나중에 바꾸는겁니다.
(<EndToEndId>) (</EndToEndId>) 는 TXT Pad에서만 적용되는 정규식입니다. NotePad++에는 변수로 숫자 올라가는게 없더라구요.
제목과 Textpad에서 정규식으로 적용되는 규칙으로 바꾼 이 텍스트 전체를 TextPad에 복사합니다.

 

TextPad에서

찾기를 (<EndToEndId>).*?(</EndToEndId>) 으로

바꾸기를 (<EndToEndId>)\i화(</EndToEndId>) 으로 해줍니다.

정규식 체크 해주시고요

모두 바꾸기를 해준 뒤
(<EndToEndId> 와 </EndToEndId>) 를 지워줍니다. 소괄호 열림, 닫힘이 다릅니다. 주의하세요.

 

— — — — — — — — — —

2023 08 27 00:10 수정

TextPad에서 숫자 증가하는 변수로 사용하는 정규식은 굳이 (<EndToEndId>)(</EndToEndId>) 넣지 않고 i 라는 문자만 넣으시고 

바꿀 내용 : \i 만 하셔도 숫자 증가 합니다. 

https://community.notepad-plus-plus.org/topic/19414/replace-text-with-incremented-counter

https://sublimetext.userecho.com/communities/1/topics/1216-generate-a-sequence-of-numbers-increment-replace

외국 사이트 에서 봤던 거 그대로 했던건데  저 글들이 10년쯤 전이라서 그런가 편의성 업데이트 같은게 있었나봐요

저렇게 넣지 않아도 됩니다.

또한, 특정 숫자부터 증가하는 방법도 있더라구요

\i{시작할 숫자,증가량}

이렇게 하시면 됩니다. 중괄호에요 외국 글들은 소괄호로 소개했던데 중괄호입니다.

— — — — — — — — — —

 

지워진거를 다시 NotePad++로 가져옵니다.
결과물

203화 완결까지 앞에 1화부터 203화까지 깔끔하게 붙었습니다. 저 정규식이 i 라는 변수를 1씩 증가하게 해주는 정규식입니다. 

 

EPUB 형식으로 NotePad++에서 바꿔줍니다.

찾을 내용 : 〈 (\d+)화 〉(.*)
바꿀 내용 : <hr class="sigil_split_marker" />\n<h2>〈 \1화 〉\2</h2>
찾기 모드 : 정규 표현식

\n은 NotePad++에서 줄바꿈으로 사용되는 엔터와 같은 정규식으로 사용되는 기호입니다. 쓰셔도 되고 안쓰셔도 됩니다. 나중에 Sigil에 붙여넣고 html정리 하면 알아서 줄바꿈이 되긴 하거든요.

 

제목 넣는건 취향차이인데요. h1으로 넣기도 하고 h2로 넣기도 합니다.
저는 h2를 주로 사용해요. h1은 소설 이름, 마지막 작가 후기, 1부,2부 나뉘는부분 같은데에 쓰거든요. 만드는 사람마다 다릅니다.
그리고 제목에 상자를 만들고 싶은경우에는 css로 적용하면됩니다. 글 밑에 설명 드릴게요.
<hr class="sigil_split_marker" /> 은 sigil에서 페이지 나누는 용도로 씁니다. 200화가 넘어가는 장편소설을 달랑 줄 하나로 구분지을 수 있긴 하지만 아무래도 페이지가 넘어가는게 낫지 않겠습니까.
sigil → 편집 → 장 나누기 표시 분할 누르면 <hr class="sigil_split_marker" /> 덕분에 알아서 페이지가 나눠지는 겁니다.

저는 저렇게 제목을 구분한 다음에 이펍에서 읽는 형태인 문단기호 형식으로 바꿉니다. 텍스트의 제일 첫부분에 커서를 놓고
찾을 내용 : \r\n
바꿀 내용 : </p>\n<p>
찾기 모드 : 정규 표현식

 

수 십만 줄의 문장 시작과 끝을 전부 바꾸는 것이기 때문에 PC사양에 따라 다르지만 상당히 오래걸립니다. 저는 보통 2분~3분정도 걸리더라구요.
바꿔진 후에 <p></p>로 비어있는 줄에도 들어가진내용들도 전부 지워줍니다. (안해도 되는건데 보기 불편해서 저는 다 지워요.)

 

제목을 바꿔놨던것도 <p><hr class="sigil_split_marker" />~~~</h2></p> 이런식으로 바꿔질겁니다.

찾을 내용 : <p><hr class="sigil_split_marker" />
바꿀 내용 : <hr class="sigil_split_marker" />
찾기 모드 : 일반

 

찾을 내용 : </h2></p>
바꿀 내용 : </h2>
찾기 모드 : 일반

 

이러면 끝납니다. 텍스트파일 전체가 EPUB형식으로 만들어진거에요. 
이 텍스트파일을 sigil에 복사하시고
sigil → 편집 → 장 나누기 표시 분할
sigil → 도구 → 차례 → 차례 만들기 하시면 됩니다.

메타데이터 편집하는거나 표지 넣는건 따로 설명하진 않겠습니다. 해당 글은 목차 넣는게 목적이니까요.

— — — — — — — — — — — — — — — — — — — —

경우 2 + 3
소제목은 있으나 규칙으로 검색하면 중복이 생기는 경우 또는 일부가 규칙이 다른경우

 

괴력 난신의 소제목이 17화부터 좀 다릅니다. 안타깝지만 이런건 EPUB을 만들으시는분이 통일되게 고치셔야합니다. 

이런식으로 74화에서 갑자기 86화로 넘어가지는 빠진 내용이 있죠. 

(빠진내용입니다. 띄어쓰기가 다른 모습입니다.)

보통 여러사람의 손을 거친 TXT파일은 이런거 같습니다. 각자 제목 짓는 방식이 다를테니까요. 제목 안넣고 내용만 넣는 사람도 있을테고요

일관되게 수정한 모습입니다. 어디가 빠져있는지 알고 있고

규칙1  (\d+)화 (.*)

규칙2 < (\d+)화 (.*) >

규칙3 <(\d+)화 (.*)>

이 세가지 규칙이 있는 걸 알고있기 때문에 고칠 수 있는겁니다.

규칙 2랑 규칙3은 띄어쓰기 하나가 다른겁니다. 그래서 못찾은거에요.

 

괴력 난신이야 다행히 1화 (1) ⋯⋯ n화 (n) 이런식으로 넣어 중복이 많아서 파이썬을 쓰지 않고 찾아냈습니다만

 

처음부터 끝까지 오름차순으로 1화, 2화 ⋯⋯ n화 라고 되어있는데 빠진게 있다고 생각해봐요. 500줄 가까이 되는걸 눈으로 다 쳐다보고 뭐가 빠져있는지 찾아내는건 굉장히 힘듭니다. 눈도 아프고요.

 

가장 최근에 만들었던 〈 내가 넣어주면 SSS급 〉 이라는게  소제목 있고, 오름차순으로 회차 구분되어있고, 제목 규칙에서 띄어쓰기가 잘못된게 있습니다. 아주 적절한 예시라서 가져왔어요.

〈 (\d+) 〉 으로 찾으면 575회차 완결까지 잘 적용이 되어있습니다.

근데 띄어쓰기를 넣으면

534  일치. 자그마치 41개가 날아갔습니다.   〈 (\d+) 〉 (.*) 로 찾았을 때  534개중에 마지막은 538화이니 뭐가 빠졌는지부터 찾아야겠죠? 

이걸 눈으로 찾는건 너무 시간낭비입니다. 그러니 파이썬을 사용해봅니다.

 

먼저 숫자만 남게

줄 **** 〈 (\d+)화 〉 (.*) 내용중 

 

이런식으로 바꾸기를 하시면 한 줄에  숫자만 남게 됩니다. (바꾸기 하나 다른건 맨 마지막 538은 엔터(\r\n)가 아니기 때문입니다. )

처음 1 에 대괄호를 열고 마지막인 538에 대괄호를 닫아줍니다.

[1, 2, 3, ⋯⋯538]

 

파이썬을 사용해서 빠진 숫자가 뭔지 찾아봅니다.

 

 

data = [ ]

check_list=range(1,끝나는 수+1)
for i in check_list:
    if i not in data:
        print('빠진수 : %d '%i)

 

 

 

파이썬의 코드는 이렇습니다.  python IDLE을 사용합니다.

538이 마지막이므로 range(1,539)를 입력합니다. 
그러면 결과가

4개가 빠져있네요. 글 초반부에 규칙이 바뀌면 누락된다는 말이 있습니다.  그게 이겁니다. 이런식으로 찾는거에요.

이 빠져있는 4개의 회차와 539화~575화는 띄어쓰기가 빠져있다는 말이니 일괄변환 해주면 됩니다. 

〈 (\d+)화 〉는 같고, 띄어쓰기가 저 빠져있는 4개+36개(539화~575화)로 41개 

찾을 내용 : 〈 (\d+)화 〉(.*)

바꿀 내용 : 〈 \1화 〉 \2

찾기 모드 : 정규식

 

좀 어렵습니다. 그래도 눈으로 보고 손으로 고치는것보단 무조건 빠릅니다. 놓치는것도 없구요. 

 

— — — — — — — — — — — — — — — — — — — —

 

제목이나 문단에 상자 넣기

 

최근에 만들려고 했던 로그인 무림 퀘스트 창의 박스형태의 css입니다. 

TXT로 너무 깔끔하게 올라온게 있어서 안 만들려구요 

 

 

이런식인데요. 어떻게 작성하는건지 알려드리겠습니다. 

(해당 내용은 https://pop1012.tistory.com/152 의 글을 참고했습니다.)

우선 css에 box를 지정해줍니다.

.box 2 {

{

border-radius : 0;  /* ← 박스의 귀퉁이를 0em만큼 돌려 깎는다. (직사각형입니다. 동글동글하게 만들려면 숫자를 점차 늘리시면 됩니다.) */

border : solid 1px;  /* ←  1px 두께의 선으로 */ 

padding : 1em;  /* ← 1em 만큼 패딩을 준다. */

}

/* */은 주석입니다. 그대로 css에 입력하셔도 인식하지 못합니다.

그리고 박스 안에 넣을 내용을 

<div class="box2">

(내용)

</div>

입력하시면 됩니다.

 

 

제목은 더 간단한데요.

제목으로 지정하는 h1 태그 뒤에 class="box1">으로 지정해주면 됩니다. 

기울임체랑 중앙으로 오는건 

제목 태그의 css설정 때문에 그렇습니다.

h1{
display: block;
font-size : 1.5em;
font-style : italic;
font-weight : bold;
line-height: 2em;
margin : 1em;
text-align : center;
text-indent : 1em;
padding-left : 0;
padding-right : 0;
padding-top : 0;
}

font-style, font-weight, text-align 세 개 때문에 그래요.별도로 지정하지 않으면 왼쪽으로 나옵니다.

 

— — — — — — — — — — — — — — — — — — — —

사진도 많고 깔끔하게 정리되지 않은 느낌이긴한데 도움이 되셨으면 좋겠습니다.

 

제일 중요한건데

sigil (EPUB) 에서 <> (Shift + ,)(Shift + .) (부등호)와 〈 〉(홑화살괄호) 은 다릅니다. 유니코드도 달라요.

< → &lt; , > → &gt; 로 일괄적으로 싹 바꿔주셔야 sigil에서 오류가 안납니다.

 

EPUB 버전이 2가 있고 3이 있습니다. 3으로 만들면 리디, 마루에서 목차가 지정되지 않습니다. EPUB2로 만드세요. 

'보관' 카테고리의 다른 글

문리더+ tts 필터Ⅱ  (0) 2024.11.23
ABBYY 소소한 팁  (0) 2024.07.08
파일 리스트를 얻는 법  (0) 2024.07.08
EXE파일 아이콘 바꾸기  (0) 2022.02.12
바탕화면에 윈도우 버전을 표시하는 방법  (0) 2022.01.21