For years I have been reading Chinese/Japanese novels on Kindle and Google Play Book. While most Japanese books were formatted to scroll from right to left and display texts vertically like real books, literally none of the Chinese books I have read do the same thing. The more I am used to reading physical books, the more this bugs me.
In this post, I demonstrating how to convert Chinese EPUB ebook from horizontal left-to-right to vertical right-to-left layout.
If want to follow this step-by-step guide, you can download a sample EPUB here. Althought using advanced EPUB editors like Sigil or Calibre will make your life easier, the ZIP archiver and text editors that came with your system will work just as well.
Structure of an EPUB file
A EPUB file is essentially a ZIP archive containing HTML files, CSS stylesheets, images and some files with metadata for the ebook.
Because EPUB is based on the widely adopted ZIP format, its content can be easily extracted with ZIP archiver that bundles with most operating systems. You may try to extract the content from my sample EPUB file by:
$ unzip horizontal.epub
Archive: horizontal.epub
extracting: mimetype
inflating: OEBPS/toc.ncx
inflating: OEBPS/Text/Section001.xhtml
inflating: OEBPS/Style/style.css
inflating: OEBPS/content.opf
inflating: META-INF/container.xml
The file mimetype, as the name suggests, specifies the MIME type of
the ebook. toc.ncx serves as a table of content.
META-INF/container.xml indicates the path to the root file
content.opf. content.opf contains a list of all resources (like
HTML/CSS files) in the ebook and a <spine> tag helps specifying page
direction.
Purposes of files in OEBPS/Text and OEBPS/Style are self-explanatory.
CSS rules for vertical layout
One CSS rules that decides the printing behavior of a
document is writing-mode.
writing-mode can have these values: horizontal-tb (this is the initial value),
vertical-rl and vertical-lr. To print characters vertically from
right to left, writing-mode should be set to vertical-rl.
Now open OEBPS/Style/styles.css and modify rules in the html
selector to the following.
/* OEBPS/Style/styles.css */
@charset "utf-8";
html {
-epub-writing-mode: vertical-rl;
writing-mode: vertical-rl;
}
/* ... */
Since we are simply dealing with HTML and CSS files, we can go ahead and
open OEBPS/Text/Section001.xhtml in a browser and see the change.
If the EPUB you are editing does not have a style.css file, you
must add it inside <head> of each .html and .xhtml file, and add the file path to
<manifest> tag in content.opf yourself.
<!-- OEBPS/content.opf -->
<?xml version="1.0" encoding="UTF-8" ?>
<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="PrimaryID">
...
<manifest>
...
<item id="stylesheet" href="./Style/style.css" media-type="text/css" />
...
</manifest>
...
</package>
<!-- OEBPS/Text/Section001.xhtml -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
...
<link rel="stylesheet" href="../Style/style.css" type="text/css" />
</head>
<body>
...
</body>
</html>
Note that writing-mode in EPUB 3 standard adopted the -epub- prefix, which
borrows properties from CSS Writing Modes 2011-04-28 because when EPUB 3
was out, CSS Writing Modes was still a W3C working draft. The rule might
have changed, or will change in the future, yet -epub- prefix guarantees
behavior consistent to when EPUB 3 standard was defined.
Scrolling from right to left
Most reading systems render the pages from left to right, but there’s an optional attribute that can reverse the page direction.
In OEBPS/content.opf there is a tag <spine>. You can set its
page-progression-direction attribute to rtl to make the pages scroll
from right to left.
<!-- OEBPS/content.opf -->
<?xml version="1.0" encoding="UTF-8" ?>
<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="PrimaryID">
...
<spine toc="..." page-progression-direction="rtl">
...
</spine>
...
</package>
To test this, you will have to load the EPUB file into your ebook reader or use an ebook reader because this is a EPUB behavior, not HTML/CSS which we saw in last section.
Packing up a EPUB file
EPUB files are ZIP archives. You can use a ZIP archiver to pack up the files into a EPUB file. In Linux you can do this.
$ zip -0 vertical.epub mimetype
$ zip -r vertical.epub META-INF OEBPS
First mimetype is added to a ZIP archive with file extension .epub,
then META-INF and OEBPS are added because mimetype should appear
at the beginning of the EPUB file.
Now you can add the EPUB file into your favorite ebook reader and enjoy your document in a vertical, right-to-left layout.
You can find the outcome of the example file here.
References
This post is inspired by or has referenced to these pages:
