不努 发表于 2025-4-28 22:08

Python制作epub的CSS拼音字宽问题

尝试用Python+AI写个制作epub电子书的程序,实现中文带拼音标注。我希望每个字的间距是一样的,但由于上方拼音长度不同,所以如何调控排版就成了问题。翻来覆去问了不同的AI,似乎都没能运行出想要的效果。
def create_ebook(book_data: dict):
    book = epub.EpubBook()
    book.set_identifier('id123456')
    book.set_title(book_data['title'])
    book.set_language('zh')

    epub_chapters = []
    toc = []
    chapter_counter = 1

    for chapter in book_data["chapters"]:
      content = f"""
      <div class="chapter">
            <h1>{chapter.title['full_text']}</h1>
            <div class="author">
                {chapter.author['full_text']}
            </div>
            <div class="content">
                <div class="line">
                  {chapter.content['full_text']}
                </div>
            </div>
      </div>
      """

      c = epub.EpubHtml(
            title=chapter.title['characters'],
            file_name=f'chapter_{chapter_counter}.xhtml',
            lang='zh'
      )
      c.content = content
      book.add_item(c)
      epub_chapters.append(c)
      chapter_counter += 1

    if epub_chapters:
      toc = [(epub.Section('章节'), epub_chapters)]

    # Add CSS
    style = '''
      @namespace epub "http://www.idpf.org/2007/ops";
      body {
            font-family: "Noto Sans CJK SC", "Source Han Sans CN", SimSun, serif;
            line-height: 2;
            text-align: justify;
      }
      .chapter {
            margin: 2em;
      }
      ruby {
            display: inline-block;
            position: relative;
            align-items: center;
            vertical-align: top;
            width: 3.6em;
            margin: 0 0.1em;
            text-align: center;
      }
      rt {
            display: block;
            font-size: 0.6em;
            letter-spacing: 0.05em;
            height: 1.2em;
            line-height: 1.2;
            overflow: visible;
            white-space: nowrap;
            }
      rb {
            display: block;
            font-size: 1.2em;
            padding-top: 0.2em;
            }
      rt::before {
            content: "";
            display: inline-block;
            width: 3.6em;
            height: 0;
            }
      .line {
            margin: 1.5em 0;
            line-height: 2.5;
            display: block;/* Changed from flex to block */
      }
      /* New punctuation styling */
      .line > *:not(ruby) {
            display: inline-block;
            vertical-align: bottom;
            font-size: 1.2em;
            line-height: 1;
            margin: 0 0.2em;
            padding-bottom: 1.2em;/* Align with characters */
      }
      .author {
            font-style: italic;
            margin: 1em 0 2em 0;
      }
    '''


    nav_css = epub.EpubItem(uid="style_nav",
                           file_name="style/nav.css",
                           media_type="text/css",
                           content=style)
    book.add_item(nav_css)

    # Set the table of contents
    book.toc = toc

    # Add default NCX and Nav file
    book.add_item(epub.EpubNcx())
    book.add_item(epub.EpubNav())

    # Create spine
    book.spine = ['nav'] + epub_chapters

    # Write epub file
    output_filename = f"{book_data['title']}.epub"
    epub.write_epub(output_filename, book)
    print(f"Created {output_filename}")


每次得到的结果都长这样,拼音特别长的字(比如霜)两边的空隙就特别大。按我的设想,所有字的拼音都按6个字母宽度来排,这样每两个汉字中线之间的距离应该就是平均的6个字母,但AI怎么改CSS也做不出这个效果。




最后还使了笨办法,把每个拼音都填充空格到6个字母长,得到的效果依旧没有变化。

chapter.title['full_text'] = "<ruby>声<rt>shēng </rt></ruby><ruby>律<rt>lǜ</rt></ruby><ruby>启<rt>qǐ</rt></ruby><ruby>蒙<rt> méng </rt></ruby><ruby>·<rt>·   </rt></ruby><ruby>十<rt> shí</rt></ruby><ruby>五<rt>wǔ</rt></ruby><ruby>删<rt> shān </rt></ruby>"
chapter.author['full_text'] = "<ruby>〔<rt>    </rt></ruby><ruby>清<rt> qīng </rt></ruby><ruby>〕<rt>    </rt></ruby><ruby>车<rt> chē</rt></ruby><ruby>万<rt> wàn</rt></ruby><ruby>育<rt>yù</rt></ruby>"
chapter.content['full_text'] = "<ruby> <rt>    </rt></ruby><ruby> <rt>    </rt></ruby><ruby>兴<rt> xīng </rt></ruby><ruby>对<rt> duì</rt></ruby><ruby>废<rt> fèi</rt></ruby><ruby>,<rt>    </rt></ruby><ruby>附<rt>fù</rt></ruby><ruby>对<rt> duì</rt></ruby><ruby>攀<rt> pān</rt></ruby><ruby>,<rt>    </rt></ruby><ruby>露<rt>lù</rt></ruby><ruby>草<rt> cǎo</rt></ruby><ruby>对<rt> duì</rt></ruby><ruby>霜<rt>shuāng</rt></ruby><ruby>菅<rt> jiān </rt></ruby><ruby>,<rt>    </rt></ruby><ruby>歌<rt>gē</rt></ruby><ruby>廉<rt> lián </rt></ruby><ruby>对<rt> duì</rt></ruby><ruby>借<rt> jiè</rt></ruby><ruby>寇<rt> kòu</rt></ruby><ruby>,<rt>    </rt></ruby><ruby>习<rt>xí</rt></ruby><ruby>孔<rt> kǒng </rt></ruby><ruby>对<rt> duì</rt></ruby><ruby>希<rt>xī</rt></ruby><ruby>颜<rt> yán</rt></ruby><ruby>。<rt>    </rt></ruby><ruby>山<rt> shān </rt></ruby><ruby>垒<rt> lěi</rt></ruby><ruby>垒<rt> lěi</rt></ruby><ruby>,<rt>    </rt></ruby><ruby>水<rt> shuǐ </rt></ruby><ruby>潺<rt> chán </rt></ruby><ruby>潺<rt> chán </rt></ruby><ruby>,<rt>    </rt></ruby><ruby>奉<rt> fèng </rt></ruby><ruby>璧<rt>bì</rt></ruby><ruby>对<rt> duì</rt></ruby><ruby>探<rt> tàn</rt></ruby><ruby>镮<rt> huán </rt></ruby><ruby>。<rt>    </rt></ruby><ruby>礼<rt>lǐ</rt></ruby><ruby>由<rt> yóu</rt></ruby><ruby>公<rt> gōng </rt></ruby><ruby>旦<rt> dàn</rt></ruby><ruby>作<rt> zuò</rt></ruby><ruby>,<rt>    </rt></ruby><ruby>诗<rt> shī</rt></ruby><ruby>本<rt> běn</rt></ruby><ruby>仲<rt>zhòng </rt></ruby><ruby>尼<rt>ní</rt></ruby><ruby>删<rt> shān </rt></ruby><ruby>。<rt>    </rt></ruby><ruby>驴<rt>lǘ</rt></ruby><ruby>困<rt> kùn</rt></ruby><ruby>客<rt>kè</rt></ruby><ruby>方<rt> fāng </rt></ruby><ruby>经<rt> jīng </rt></ruby><ruby>灞<rt>bà</rt></ruby><ruby>水<rt> shuǐ </rt></ruby><ruby>,<rt>    </rt></ruby><ruby>鸡<rt>jī</rt></ruby><ruby>鸣<rt> míng </rt></ruby><ruby>人<rt> rén</rt></ruby><ruby>已<rt>yǐ</rt></ruby><ruby>出<rt> chū</rt></ruby><ruby>函<rt> hán</rt></ruby><ruby>关<rt> guān </rt></ruby><ruby>。<rt>    </rt></ruby><ruby>几<rt>jǐ</rt></ruby><ruby>夜<rt>yè</rt></ruby><ruby>霜<rt>shuāng</rt></ruby><ruby>飞<rt> fēi</rt></ruby><ruby>,<rt>    </rt></ruby><ruby>已<rt>yǐ</rt></ruby><ruby>有<rt> yǒu</rt></ruby><ruby>苍<rt> cāng </rt></ruby><ruby>鸿<rt> hóng </rt></ruby><ruby>辞<rt>cí</rt></ruby><ruby>北<rt> běi</rt></ruby><ruby>塞<rt> sài</rt></ruby><ruby>;<rt>    </rt></ruby><ruby>数<rt> shù</rt></ruby><ruby>朝<rt> zhāo </rt></ruby><ruby>雾<rt>wù</rt></ruby><ruby>暗<rt>àn</rt></ruby><ruby>,<rt>    </rt></ruby><ruby>岂<rt>qǐ</rt></ruby><ruby>无<rt>wú</rt></ruby><ruby>玄<rt> xuán </rt></ruby><ruby>豹<rt> bào</rt></ruby><ruby>隐<rt> yǐn</rt></ruby><ruby>南<rt> nán</rt></ruby><ruby>山<rt> shān </rt></ruby><ruby>。<rt>    </rt></ruby>"
求前端专业网友指点迷津

atomicink 发表于 2025-4-29 09:06


Qwen3-235B-A22B测试结果

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>声律启蒙</title>
    <style>
      body {
            font-family: "KaiTi", "KaiTi_GB2312", "华文楷体", serif;
            padding: 20px;
            background-color: #f9f7f3;
            line-height: 1.8;
      }
      
      .line-container {
            margin: 1.5em 0;
            display: flex;
            justify-content: center;
            gap: 0.3em;
            flex-wrap: wrap;
      }
      
      .word-block {
            display: flex;
            flex-direction: column;
            align-items: center;
            min-width: 2em;
            position: relative;
      }
      
      .pinyin {
            font-size: 0.6em;
            color: #666;
            margin-bottom: 0.1em;
            width: 6ch;
            text-align: center;
            font-family: Consolas, monospace;
            white-space: pre;
      }
      
      .hanzi {
            font-size: 1.8em;
            font-weight: normal;
            position: relative;
            z-index: 1;
      }
    </style>
</head>
<body>

    <div class="line-container">
      <div class="word-block"><div class="pinyin">xīng</div><div class="hanzi">兴</div></div>
      <div class="word-block"><div class="pinyin">duì</div><div class="hanzi">对</div></div>
      <div class="word-block"><div class="pinyin">fèi</div><div class="hanzi">废</div></div>
      <div class="word-block"><div class="pinyin">fù</div><div class="hanzi">附</div></div>
      <div class="word-block"><div class="pinyin">duì</div><div class="hanzi">对</div></div>
      <div class="word-block"><div class="pinyin">pān</div><div class="hanzi">攀</div></div>
    </div>

    <div class="line-container">
      <div class="word-block"><div class="pinyin">lù</div><div class="hanzi">露</div></div>
      <div class="word-block"><div class="pinyin">cǎo</div><div class="hanzi">草</div></div>
      <div class="word-block"><div class="pinyin">duì</div><div class="hanzi">对</div></div>
      <div class="word-block"><div class="pinyin">shuāng</div><div class="hanzi">霜</div></div>
      <div class="word-block"><div class="pinyin">jiān</div><div class="hanzi">菅</div></div>
    </div>

</body>
</html>

页: [1]
查看完整版本: Python制作epub的CSS拼音字宽问题