Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

破折號、日文重複記號 豎排 kerning(或 ligature)問題 #18

Open
yuanhao-chen-nyoeghau opened this issue Jan 8, 2020 · 27 comments
Assignees
Milestone

Comments

@yuanhao-chen-nyoeghau
Copy link

yuanhao-chen-nyoeghau commented Jan 8, 2020

Screenshot 2020-01-08 at 19 00 10

用 LaTeX 豎排之破折號中間有明顯斷裂,與橫排 behaviour 不同;同樣配置試用了一些日本字體是沒問題的。

另外,豎排的「くの字点」(〳〵;〴〵)似乎沒有連字成(〱;〲)。默認字距時「〳〵」看起來就像「〱」,但如果豎排有時要增加字距,就會出現斷裂。
Screenshot 2020-01-08 at 19 10 55

@yuanhao-chen-nyoeghau
Copy link
Author

yuanhao-chen-nyoeghau commented Jan 8, 2020

破折號因爲使用頻繁,希望可以優先解決。實現代碼:

% !TEX program = lualatex

\documentclass[11pt]{ltjtarticle}

\usepackage{luatexja}
\usepackage{luatexja-fontspec}

\begin{document}

\jfontspec{I.Ming}
——

\end{document}

大槪可以視作 #11 的豎排版本?

@yuanhao-chen-nyoeghau
Copy link
Author

yuanhao-chen-nyoeghau commented Jan 8, 2020

另附產生〳〵問題的代碼(其中\zw表示空了多少個字位),Noto 系列對比:

% !TEX program = lualatex

\documentclass[11pt]{ltjtarticle}

\usepackage{luatexja}
\usepackage{luatexja-fontspec}

\begin{document}
\ltjsetparameter{kanjiskip=0.4\zw}

\jfontspec{I.Ming}

取り〴〵

\jfontspec{NotoSerifCJKkr-Regular}

取り〴〵

\end{document}

Screenshot 2020-01-08 at 19 44 47

@RuixiZhang42
Copy link

豎排的 U+2E3A 還沒有做吧。橫排可以連在一起是有計劃把兩個連續出現的 U+2014 變成 U+2E3A。

@yuanhao-chen-nyoeghau
Copy link
Author

@RuixiZhang42 製作字體時使用 OpenType 的 Vertical Alternates 特性卽可。卽,做一個 U+2E3A 在縱書時的替換字形。

包括小書假名(ァ、ㇽ、ャ 之類)、長音記號(ー)等衆多日本字符已經在運用這個技術。

如果使用Glyphs製作的話,只需做一個名爲 uni2E3A.vert (卽調用 U+2E3A 的 Vertical Alternates 特性) 的字符。

@SyaoranHinata
Copy link
Contributor

抱歉還是看得不太明白……^^;;;;;
我們也沒有$_$購買Glyphs啊……嗚……

@RuixiZhang42
Copy link

@SyaoranHinata
我來簡單解釋一下吧。排版的時候,橫排直排出現的破折號,如果輸入形式是 <U+2014 U+2014>,那麼應該禁止這兩個字符分離。同樣道理,直排出現的「日文重複符號」,如果輸入形式是 <U+3033 U+3035> 或是 <U+3034 U+3035>,也應該禁止字符之間分離。

具體到數位排版的實現,就可以從兩個方向入手。一個是字型軟體,另一個是排版軟體。

字型軟體方面:

  1. 在 OpenType 以前,字廠一般就是單純地把 U+2014 做成「撐滿字框」或者甚至「兩端超出字框」的形態。同樣地,字廠會把 U+3033U+3034 的下面做「超出字框底部」,把 U+3035 的上面做「超出字框頂部」。這樣一來,在「密排」的狀態下,就可以「看起來沒有分離」。
  2. 在 OpenType 以後,更優的解決方法是用「GSUB(字形替換)」特性,把「分開輸入的字符」先替換成「已經畫好的單個字符」(這裡我們不討論編碼的問題),替換完成之後再交給排版軟體去排。

上面第二種方法當然能夠處理更多的情況,這就是 @edward-martyr 提到的「增大正常字距」的「疏排」。如果增大了字距,字型軟體的第一種方法就不能保證字符能夠連在一起,字距拉得太大,一定會把兩個字符拉開。而第二種方法,因為已經事先替換成單個字形了,所以無論如何改變字距,都不會拉開這些禁止分離的符號。

目前「一點明體」對「橫排破折號」就是採用第二種方案,而「直排破折號」與「直排日文重複符號」則是保持「IPA 字型」的第一種方案。「思源」家族字型都是用第二種方案。

@RuixiZhang42
Copy link

@edward-martyr @SyaoranHinata
如果「一點明體」學「思源」,那麼字型檔案裡面就會出現「兩個字高」的字形,那麼也就不可避免會出現「行高異常」的問題。參見

所以我的觀點是「一點明體還是不要學思源了吧」,233……

話說回來,@edward-martyr 給的例子,應該不難從「排版軟體」的方向解決問題吧。在我看來,應該是 luatexja-ja 沒有正常生成、載入 ltj-kinsoku_make.tex(標點禁則)的結果。正常情況下,應該是默認保證了 <U+2014 U+2014><U+3033 U+3035><U+3034 U+3035> 中間不分離才對啊。

@RuixiZhang42
Copy link

@edward-martyr
luatexja 的話,疏排不是可以用 \inhibitglue 嗎?

% !TEX program = lualatex

\documentclass[11pt]{ltjtarticle}

\usepackage{luatexja}
\usepackage{luatexja-fontspec}

\begin{document}
\ltjsetparameter{kanjiskip=0.4\zw}

\jfontspec{I.Ming}

取り〴\inhibitglue\end{document}

是不是可以去 https://osdn.net/projects/luatex-ja/ticket/ 開個 issue……

@yuanhao-chen-nyoeghau
Copy link
Author

@RuixiZhang42
謝謝你對這個問題的關注。你的代碼在我使用 Noto Sans CJK 的時候是沒問題的,符號沒有斷開,不過一點明朝(以及IPA明朝)還是不行。相似的 behavior 在其他軟件如 Pages 上也有,所以應該是一點明朝基於的IPA明朝的設計問題。
不知 @SyaoranHinata 使用什麼程式製作字體?我用 Glyphs 基於 6.11 版本試作了一份字體,將豎排的文字高度和橫排的文字高度設置分開,應該不會有前述字符過高的問題。目前我在 Pages 和 LuaTeXja 中都測試無誤。

@SyaoranHinata
Copy link
Contributor

我們團隊都是窮人,有人只能用FontForge,有人辛苦地買過Font Creator舊版或Fontlab Studio 5至今一直使用,但沒有人能有Glyphs吧。

我們不久前剛討論了,參考了Ruixi兄的解說,決定是不處理的。首先我們之所以這字型,主力是推廣弘揚傳承字形。符號甚麼的可以有不同解決方法,但弘揚傳承字形,明明傳承字形每天在生活中存在,偏偏許多人都不去珍惜,有些字型製作者只片面地擷取,有些只知吃力不討好地盲從臺標,弘揚傳承字形的工作就沒多少人肯做。我們做傳承字形的事都已吃不消,卻找不到多少人一同幫忙,然後接連來收到的要求都跟傳承字形無關的,實在非常分薄我們的人力。其次,編程甚麼的我們完全不懂,連在軟件中設定豎排文字標點或者兩個碼位合文的OpenType轉換甚麼,我和一些團隊成員嘗試了很久都是失敗,幸而還有一兩個成員成功。現在這個版本的標點處理,至少已超出我和好些成員的應付能力,再要修改甚麼就更混亂了。

當然我們很歡迎大家幫助甚至協作,我們求之不得。目前我們打算推出「擴展區G」對應版本,推出後歡迎大家給我們幫助甚至跟我們合作,生成一些改良了某些地方同時不會引起別的問題(例如不會使平時的行距崩壞,或者不會使字型檔再用FontForge、Font Creator編輯後出別的岔子)的字型檔。若大家不吝賜予援手,屆時有勞各位共襄盛擧了。

@SyaoranHinata
Copy link
Contributor

By the way,不知有沒有在Word、Photoshop、Illustrator、InDesign、Powerpoint、Publisher、Excel裏測試啊?畢竟它們的使用者太多,要是在它們裏崩了,肯定會投訴一大堆吶^^;;;;;;

@yuanhao-chen-nyoeghau
Copy link
Author

謝謝你詳盡的回覆!說來我更是窮人了🤣一介高中生而已。我也是因爲偶有需要纔下載了試用版的 Glyphs;既然下載了,不如試着解決一下自己之前在使用其他字體時發現的問題。不過我想類似的連字功能,開源軟件 fontforge 等也應有提供。

我非常認可和欽佩一點明朝的理念和在字形方面取得的成果;一點明朝也是我瞭解字形區別以來用得最放心的採用傳統字形的字體。不過私以爲中文字體在滿足不同使用者對字形的要求之上,對標點的使用習慣同樣不能忽略(所以一點明朝的標點置中版本也很重要),畢竟現代中文行文主要就是漢字與標點,闕一不可。連續輸入兩個破折號而得到斷開的字形是西文字體的表現;而中文自採用標點以來都使用着連體、佔兩個字位的破折號。

所以如果 @SyaoranHinata 兄有意向的話,我樂意試着爲現在的四個字體文件加上豎排的破折號。考慮長遠的可維護性,會嘗試全程使用開源軟件。字體測試方面,我不用Adobe系列,但可以測試一下微軟的套件,雖然我主要使用LaTeX輸出。不過我想 Adobe 的高級排印軟件甚至可能在當前版本 6.11 就能夠輸出正確的豎排破折號,因爲它會自動地把 two-em dash 轉九十度,而不需要依賴vert特性。

@SyaoranHinata
Copy link
Contributor

明白,也謝謝閣下包容在下這番有點失態的話,現在回看還覺得有點兒抱歉m(_ _)m。標點方面,一來我們已經長期被技術困擾(直至Ver 5.0才解決了豎排標點位置和旋轉90度角等問題,然後因爲異體和兩種標點,已經變成四個檔案,更新時常會不愼有錯。但惡夢還未完,大家又不斷問我們依不同的想法去改標點,比如問我們依後出的Type is beauty上的方案,但怎麼不幫幫忙問Type is beauty宣揚一下傳承字形方案啊……抱歉都是個人心裏不適當的吐嘈),編程甚麼的我們又看不明白,要進一步嘗試的話眞的需要各位慷慨協助了。那麼我先增補一點兒漢字吧,補字後的步驟就有勞了,感謝!

@yuanhao-chen-nyoeghau
Copy link
Author

沒問題,那就先靜候佳音,等待一點明朝增補漢字。

@aikahiiragi
Copy link

說一些個人感想,首先,一件事情並不是一兩個人的努力,我們在字形上努力過,既然是以開源方式回饋出來,大家自然可以協力,在標點排版等方面建立fork版本,幫助開枝散葉,發揚光大。

另外,也希望各位可以協助,向其他字型的組織或團體宣揚傳承字形,促成有更多符合傳承字形的字型誕生,或者讓一些提倡字體排印新標準或習慣的團體協助宣揚傳承字形的重要性。

要是能夠這樣,就不會讓我們感到遠遠近近都沒多少人明白傳承字形了。

@i-font
Copy link
Member

i-font commented Apr 2, 2020

感謝各位的關注,目前已更新了6.12版,歡迎大家製作衍生版本並進行測試,成品良好的話,我們也可以考慮融合進下一個版本。除了 @edward-martyr 上述的問題外,過往 @RuixiZhang42 也熱心爲我們提供標點的意見和測試標點改作。限於我們團隊內的人手和技術,恐怕餘下的改進無法由我們親自完成。若各位能以開源精神改作,經測試證實效果良好,而且我們團隊使用手上的舊版字型製作軟件也能支援的話,也可以考慮融合進下一個版本。謝謝各位。

yuanhao-chen-nyoeghau added a commit to yuanhao-chen-nyoeghau/I.Ming that referenced this issue Apr 14, 2020
Generate ttc files which greatly help save disk space and fix ichitenfont#18
@yuanhao-chen-nyoeghau
Copy link
Author

我已基於6.12版本試修復該issue。fontforge能夠導出兩個字高的glyph,但不能正確設定豎排行距。遂以fonttools手動修復 head (參數 -1843, -2092, 7787, 1876)與 vhea 表,解決問題。

另外,使用該工具輸出了幾個ttc文檔,移除了四個字體的重疊部分,可大幅節約硬盤空間(36.8 MB 的ttc包括了四個24 MB左右的ttf文檔)。

@NightFurySL2001
Copy link

@edward-martyr @RuixiZhang42 目前已经合并了 yuanhao-chen-nyoeghau@66b826f 到 beta 测试版 7.090,请测试看看是否已经解决了你们的问题,也麻烦测试看看与现在正式版 7.01 有没有排版上的行距差异,避免类似思源的撑行距问题出现。

I.Ming-vert2em.zip

@yuanhao-chen-nyoeghau
Copy link
Author

I.Ming-vert2em 的表现和我的 Fork 还是不一样,竖破折号只有一个字高

@NightFurySL2001
Copy link

NightFurySL2001 commented Mar 5, 2021

@edward-martyr 请问能帮忙确认看看是什么问题吗?使用ttx检查,该字符的vmtx高度是4096(为2048×2),软件内设置也正确。

<mtx name="uni2E3A.vert" height="4096" tsb="202"/>

下图为 Adobe InDesign CC2018 测试图,并未见一个字高问题。
image

P/S: 请确认使用的字体版本是否正确,可能覆盖了但并未更新。

@yuanhao-chen-nyoeghau
Copy link
Author

@NightFurySL2001 那可能是 luaotfload 调用字体信息的方式有点问题吧。我的代码:

% !TEX program = lualatex

\documentclass[
    tate
]{jlreq}

\ltjdefcharrange{10}{"2E3A}
\ltjsetparameter{jacharrange={-1, +2, +3, -4, -5, +6, +7, -8, +9, +10}}

\usepackage{luatexja-fontspec}

\begin{document}

\jfontspec[TateFeatures={JFM=propv}, YokoFeatures={JFM=prop}]{I.Ming} % my fork
破折號哪能⸺可以𠲎

\jfontspec[TateFeatures={JFM=propv}, YokoFeatures={JFM=prop}]{I.Ming-vert2em.ttf}
破折號哪能⸺可以𠲎

\end{document}

效果:
スクリーンショット 2021-03-06 13 50 49

当然,这也可以通过在 JFM 里强制指定为两个字宽来解决,但这就不是调用字体的metrics了。

@NightFurySL2001
Copy link

NightFurySL2001 commented Mar 7, 2021

我已让朋友协助测试LaTeX排版系统,发现如下:
image
于lualatex测试时发现除了U+2E3A竖排只占一个字符高度,还有U+3031, U+3032移上半个em的情况。U+3031, U+3032的情况是为了方便横排对齐高度,还有尽可能避免思源的撑行高问题出现,因此选择移上半个em以对齐横排汉字。我的猜测为lualatex已经将几个字符的参数写死,如果字体不符合lualatex参数则无法正常排版。另外,U+2014 U+2014的连字并未在lualatex内替换,呈现断裂状态。

朋友也在uptex内测试,效果正常,如下:
image

不知您可以在其他TeX系统测试看看有这个问题吗?以下附上朋友提供的文件,main.pdf是lualtex,main2.pdf是uptex。

https://we.tl/t-VJXudiamFX

@RuixiZhang42
Copy link

@NightFurySL2001 问题应该不只出现在 LuaTeX(底层引擎),XeTeX 也有相似的问题:https://sourceforge.net/p/xetex/bugs/162/ (2020年1月报告的……)在 XeTeX 中,直排连用两个 U+2014 可以连字(因为思源的 ccmp 默认开启)、连字能够正确地占据两个字身、但是位置向上偏移半个字身。另外,在 XeTeX 中,直排若直接输入一个 U+2E3A,则只占据一个字身。

由此推断,两种引擎(LuaTeX、XeTeX)对直排的支持非常粗糙,对于每个需要被「旋转 90 度」的 CJK 字符仅仅做了简单的旋转处理(加上标点符号的字形替换)。但是对于每个输入的码位,一律视其 horizontal advance 为 1em,完全无视 vertical metrics 或 vertical positions 等字体信息。

P.S. LuaTeX、XeTeX 不用字体提供的行高参数进行排版。

@NightFurySL2001
Copy link

@RuixiZhang42 所以已经确认是 LuaTex, XeTeX 支援不足,并非本字体的问题对吗?若无问题,我们将会合并该字型,关于TeX系统无法排版的问题我则会尽量转接其他仓库提Issue。

P/S: @edward-martyr @RuixiZhang42 朋友推荐可以试看 UpTeX,设置步骤在同一个7z文件的readme内。

@RuixiZhang42
Copy link

@NightFurySL2001 「一点明体」本身应该是没有问题的。

LuaTeX、XeTeX、upTeX 三大引擎原生支持 Unicode,但它们对于 OpenType 的支持都不完善。

  1. LuaTeX 对 OpenType 的支持来自 luaotfload(主要面向 non-CJK),OpenType+CJK 的本地化、优化则来自 luatexja
  2. XeTeX 对 CJK 排版的支持主要通过宏代码实现。老牌宏包有 xeCJKxetexko,新宏包有本人尚在开发的 newxeCJK
  3. upTeX 对日文排版的支持是基于 pTeX 对 TFM(TeX Font Metric 文件)的拓展,它依靠 TFM 获得排版参数,似乎也无视 OpenType 字体本身提供的参数。7z文件里也说了,要对 TFM 文件打补丁才可以正确使用「一点明体」。

@NightFurySL2001
Copy link

@RuixiZhang42 好的,没问题。下一版将会合并上述更新。

P/S: 如果要学习TeX应如何下手?望邮件回复。

@NightFurySL2001 NightFurySL2001 self-assigned this Mar 9, 2021
@RuixiZhang42
Copy link

RuixiZhang42 commented Mar 16, 2021 via email

@SyaoranHinata SyaoranHinata added this to the done milestone Sep 5, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants