LaTeX ulem 下畫線斷線效果?
實現圖一中的效果 ulem宏包下畫線連續 如何實現斷開效果?
最新版本(v3.2.14)的 xeCJK 已經初步解決這個問題,基本可以保證線是斷開的。目前的效果如下
%!TeX encoding = UTF-8
%!TeX program = xelatex
documentclass[nofonts]{ctexart}
usepackage{xcolor}
usepackage{xeCJKfntef}[2014/11/05]
setCJKmainfont{MingLiU}
ewcommand*Book{CJKunderwave-}
ewcommand*Noun{CJKunderline-}
xeCJKsetup{underline/format}
egin{document}
如上所述,Book{中國文學史}原是Noun{復旦大學出版社}出版的,Book{中國文學史新著}則由Noun{上海文藝出版社}出版。現承Noun{復旦大學出版社}Noun{賀聖遂}先生的盛情和Noun{上海文藝出版總社}Noun{楊益萍}、Noun{何承偉}先生以及有關負責人Noun{陳鳴華}先生的高誼,此書增訂本改由兩社聯合出版。Noun{賀聖遂}先生並與Noun{杜榮根}副社長、Noun{韓結根}編審共同擔任此書的責任編輯。對上述諸位先生謹在這裡表示衷心的感謝。對Book{中國文學史新著}原版的責任編輯Noun{戴俊}先生(現為Noun{上海三聯書店}副總經理)也在此一併致謝。
Noun{與文學史的}Noun{應有任務}Noun{對文學發展過程}Noun{的內在聯繫的描述}Noun{還有很大的距離}Noun{至於距離的所在}Noun{本書原已有說明}Book{此不贅述}Book{為了對學術負責}Book{我們決定重寫一部並迅即出版}
Noun{南朝}Noun{梁}Noun{劉勰}Book{文心雕龍}Book{養氣}
Noun{鎌池和馬}Book{魔法禁書目錄}Book{某科學的超電磁砲}
Noun{西尾維新}Book{化物語}Book{偽物語}Book{貓物語}%
Book{傾物語}Book{囤物語}Book{鬼物語}Book{戀物語}Book{花物語}
Noun{岡田麿里}Book{我們仍未知道那天所看見的花的名字。}Book{絕園的暴風雨}
Noun{虛淵玄}Book{Fate/Zero}Book{PSYCHO-PASS}Book{ALDNOAH.ZERO}
Noun{劉海洋}Book{LaTeX 入門}
defNAME{%
x{御坂美琴}x{白井黑子}x{戰場原緋多木}x{阿良良木歷}%
x{宿海仁太}x{本間芽衣子}x{瀧川吉野}x{鎖部葉風}%
x{衛宮切嗣}x{言峰綺禮}x{常守朱}x{狡嚙慎也}%
x{界塚伊奈帆}x*{艾瑟依拉姆·沃斯·艾莉歐斯亞}}
letxNounNAME
letxBookNAME
end{document}
%!TeX encoding = UTF-8
%!TeX program = pdflatex
documentclass{article}
usepackage{CJK}
AtBeginDvi{input{zhwinfonts}}
usepackage{CJKfntef}
ewcommandProperNoun[1]{hskip.1emuline{kern-.1em#1kern-.1em}hskip.1em}
ewcommandsmallwave{group markoverwith{lower3.5pthbox{wavefont char58}}ULon}
fontwavefont=lasy5 at 4pt
ewcommandBook[1]{hskip.15emsmallwave{kern-.15em#1kern-.15em}hskip.15em}
egin{document}
egin{CJK*}{UTF8}{zhsong}
ProperNoun{南朝}ProperNoun{梁}ProperNoun{劉勰}%
Book{文心雕龍}Book{養氣}
clearpageend{CJK*}
end{document}
以上是 CJK 的解法。CJKfntef 本來定義了 varCJKunderline 來處理專名號的問題,不過預定義的值設計得不夠好,代碼也比這裡麻煩一些,這裡索性用同樣的原理重定義了。
書名號的浪線,因為是用符號拼起來的,而這個波浪符號又不足夠小,所以效果會稍稍難看一些。為了不過於難看,這裡已經把用來畫浪線的符號縮小了。如果希望效果更好可能要換原理畫曲線,這裡還不清楚怎麼做好。
xeCJK 處理這個問題的思路與此相同,不過因為 xeCJKfntef 的實現有點小問題,右側間距出不來,左右不對稱,暫時效果不如這個好。不是很嚴重的問題,臨時處理一下也容易,比如套個盒子定義成
ewcommandProperNoun[1]{hskip.1emuline{kern-.1emhbox{#1kern-.1em}}hskip.1em}
當然這挺丑的。還是看 @李清 怎麼修復就是了。我調了調參數,包括那個浪線符號的大小,暫時可以這樣用:
%!TeX encoding = UTF-8
%!TeX program = xelatex
documentclass{article}
usepackage{xeCJK}
setCJKmainfont{SimSun}
usepackage{xeCJKfntef}
ewcommandProperNoun[1]{hskip.1emuline{kern-.1emhbox{#1kern-.1em}}hskip.1em}
ewcommandsmallwave{group markoverwith{
aisebox{-1ex}{
esizebox{.3em}{.2em}{wavefontchar58}}}ULon}
fontwavefont=lasy5
ewcommandBook[1]{hskip.1emsmallwave{kern-.1emhbox{#1kern-.1em}}hskip.1em}
egin{document}
Huge
ProperNoun{南朝}ProperNoun{梁}ProperNoun{劉勰}%
Book{文心雕龍}Book{養氣}
end{document}
日本一系的解法我不熟,問問其他人。
------------------------------------------
補充:
純繪圖的方式也可以用來做這種事。原理性代碼可以看 Martin Scharrer 的代碼:
tikz pgf - Cool Text Highlighting in LaTeX大致思路是使用 zref 包硬記下文字起點和終點的 PDF 坐標(依賴輸出引擎的功能,如 pdfsavepos),然後將起點和終點坐標用 tikz 畫條波浪線連起來。換行通過一個固定間距的循環處理,分頁通過判斷頁碼對 output routine 單獨處理。整個過程很複雜,需要多趟編譯,換行分頁的處理方式也可能造成位置不準確,但好處是畫出來的線的效果非常隨意,對內容也沒什麼大要求。像 LuaTeX 那樣在斷行時有 hook 的,可能能做出更好的解來。距離題主提問已經過去近兩年了,不過還是做一點微小的補充。
一、CTAN 上「Topic underline」:
CTAN: Topic underline二、日本藤田眞作寫的宏包:
Fujita Shinsaku TeX/LaTeX Page三、最近我也要用到專名號和浪線式書名號,不過是在 plain (e)upTeX 或 plain ApTeX 中。xeCJK / xeCJKfntef 只能用於 XeLaTeX,且目前版本(v3.4.1,2016/08/27)中,雖然能斷開,但是仍然斷得不對稱,xeCJK 文檔中即如此,我自己試驗亦然。探索一番後,決定還是自己嘗試寫一個小宏包。
先上效果圖(舊字形細明體和微軟新細明體):
橫排:
豎排:
我的嘗試到目前為止,能做到的有(與題目相關的部份):為漢字或與漢字尺寸基本相等的字元(例如做成全形且不壓縮的間隔號)加上專名號或浪線式書名號,並且在它們連續出現時做出正確處理。連續出現時(這是事先就知道的),除了第一個外,其餘全部換用「修改版」命令,這樣的「修改版」命令可以做到:若恰好在接續處斷行,則不做額外處理(此時效果與相應「普通」版本命令一樣);若不在接續處斷行,則加不佔位的白色小塊使下劃線對稱斷開(漢字間距保持不變)。
但我的嘗試有個致命弱點:如前所述,只能用於漢字或與漢字尺寸基本相等的字元,對英文之類就無能為力了(其實主要是因為英文有 kerning、ligature、hyphenation 等等)。不過,英文之類,有 CTAN 上的宏包如 ulem、soul 等可用;而中英混合的,像前面李清前輩舉的例子《LaTeX 入門》,實際使用中應該也不會這麼用吧(?)……另外,雖然在 Xe(La)TeX 中也可用,但似乎有些問題,我對 XeTeX 的底層知識瞭解很少,暫時也不想再弄了。
這是我寫的宏包的鏈接(前邊註釋部份有命令說明):
(晚輩第一次嘗試寫宏包,請多指教!)請輸入提取碼提取碼:7958然後是上邊效果圖的代碼(使用 plain (e)upTeX 或 plain ApTeX 編譯):(默認使用 Windows 系統的新細明體;註釋掉第六行「mingliutrue」則使用舊字形細明體,這個字體需要自己下載安裝。)
% !TeX encoding = UTF-8
input upupm
ewififmingliu
mingliutrue
ifmingliu
special{pdf:mapline upmsl-h UniCNS-UTF16-H :0:mingliu.ttc}
special{pdf:mapline upmsl-v UniCNS-UTF16-V :0:mingliu.ttc}
else
special{pdf:mapline upmsl-h UniCNS-UTF16-H TingMing.ttf}
special{pdf:mapline upmsl-v UniCNS-UTF16-V TingMing.ttf}
fi
fontxmth=uptchrm-h at 10.5bp
fontxmtv=uptchrm-v at 10.5bp
defUPUPMtest{zmh{南朝}zmhx{梁}zmhx{劉勰}smhx{文心雕龍}smhx{養氣}}
xmth
UPUPMtest
vfilleject
ate
vsize=100mm
xmtv
UPUPMtest
ye
如果要在 Xe(La)TeX 中使用的話,大致是這樣的:
(數值未仔細調整,就不上效果圖了。)% !TeX encoding = UTF-8
% !TeX program = XeLaTeX
%documentclass{book}
%usepackage{xeCJK}% 只用 xeCJK 時
%linespread{1.3}
documentclass[UTF8,fontset=none]{ctexbook}% 使用 ctex 文檔類時
%setCJKmainfont{TingMing}
setCJKmainfont{MingLiU}
input{upupm}
% 補丁:處理 upupm 中用到非 Xe(La)TeX 命令的地方
ewififtdir% 判斷是否豎排
ewififydir% 判斷是否橫排
dirfalse
ydirtrue
UPUPMsetzh{em}
UPUPMsetzw{em}
UPUPMsetvzmhcor{0pt}% 此處似有問題,
UPUPMsethzmhcor{0pt}% 暫時直接設置為 0pt。
% 修改 upupm 默認設置
UPUPMsethsmhshift{-0.33em}% 數值未仔細調整
egin{document}
hzmh{南朝}hzmhx{梁}hzmhx{劉勰}hsmhx{文心雕龍}hsmhx{養氣}
zmh{南朝}zmhx{梁}zmhx{劉勰}smhx{文心雕龍}smhx{養氣}
end{document}
我原想在ulem包里找辦法,研究一番那些方法對中文無效。只做到變換浪線顏色及其與字體之間的距離。斷線的問題一直沒解決。ulem包有希望么? TeX - LaTeX Stack Exchange上發表不了問題。。。從中午整到凌晨,還被鎖在行政樓了。實在搞不出適合正文使用的浪線斷開了。綜合兩位大咖的建議方法,最終放棄斷開浪線。直線斷開為保證自動換行效果,採取了不美觀的辦法,只好如此了。直線斷開可以自動換行,放棄浪線斷開。
推薦閱讀:
※LuaTeX, XeTeX 和 ConTeXt 分別是什麼?它們有什麼異同優劣?
※LaTeX 里如何定義 9 個參數以上的變數?
※如何並排擺放一個tikzpicture和一個tabular,使得其底端在一條水平線上?
※LateX 生成的辭彙表 辭彙與其解釋間均如何控制?
※請問這個TeX Live的依賴關係是什麼呀?
TAG:LaTeX | LaTeX排版與設計 |