X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=test%2Ftest17-priority.tex;h=241468e90b72347c9d99b3269d1e013a6b6dadc2;hb=26649839d59f6fb2d9517806a2850200a16895bc;hp=03c24eed5f6b59460a7bc5ce9cc4745bce156bf9;hpb=80bbcf52bf096105cf1797a4422a38d400b3fa05;p=luatex-ja%2Fluatexja.git diff --git a/test/test17-priority.tex b/test/test17-priority.tex index 03c24ee..241468e 100644 --- a/test/test17-priority.tex +++ b/test/test17-priority.tex @@ -1,142 +1,15 @@ %#!lualatex -%% 行末の句読点の位置によって,全角取りか半角取りかを自動的に調整する -%% 仕様:全調整量が二分以上なら,全角取りにする -\documentclass{article} -\usepackage{luatexja,luacode,xcolor} -\begin{luacode} -local id_hlist = node.id('hlist') -local id_glue = node.id('glue') -local id_glue_spec = node.id('glue_spec') -local attr_icflag = luatexbase.attributes['ltj@icflag'] -local PACKED = 2 -local PROCESSED_BEGIN_FLAG = 16 -local FROM_JFM = 4 -local KANJI_SKIP = 6 -local XKANJI_SKIP = 7 - -local function get_attr_icflag(p) - return (node.has_attribute(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG -end - --- box 内で伸縮された glue の合計値を計算 - -local function get_stretched(q, go, gs) - local qs = q.spec - if not qs.writable then return 0 end - if gs == 1 then -- stretching - if qs.stretch_order == go then return qs.stretch end - else -- shrinking - if qs.shrink_order == go then return qs.shrink end - end -end - -local function get_total_stretched(p) - local go, gf, gs = p.glue_order, p.glue_set, p.glue_sign - local res = { - other = 0, xkanji = 0, jfm = 0, kanji = 0, - glue_set = gf, glue_sign = gs - } - if go ~= 0 then return nil end - if gs ~= 1 and gs ~= 2 then return res end - for q in node.traverse_id(id_glue, p.head) do - local a, ic = get_stretched(q, go, gs), get_attr_icflag(q) - if ic == KANJI_SKIP then res.kanji = res.kanji + a - elseif ic == XKANJI_SKIP then res.xkanji = res.xkanji + a - elseif ic == FROM_JFM then res.jfm = res.jfm + a - else res.other = res.other + a - end - end - return res -end - -local function clear_stretch(p, ic) - for q in node.traverse_id(id_glue, p.head) do - if get_attr_icflag(q) == ic then - local qs = q.spec - if qs.writable then - qs.stretch_order, qs.shrink_order, qs.stretch, qs.shrink = 0, 0, 0, 0 - end - end - end -end - -local function set_stretch(p, after, before, ic) - if before > 0 then - print (ic, before, after) - local ratio = after/before - for q in node.traverse_id(id_glue, p.head) do - if get_attr_icflag(q) == ic then - local qs = q.spec - if qs.writable then - qs.stretch, qs.shrink = qs.stretch*ratio, qs.shrink*ratio - end - end - end - end -end - -function adjust_width(head) - if not head then return head end - for p in node.traverse_id(id_hlist, head) do - local res = get_total_stretched(p) - if res then - -- 調整量の合計 - local total = tex.round((res.other + res.xkanji + res.jfm + res.kanji) * res.glue_set) - print('before: ', p.glue_set, p.glue_sign, p.glue_order ) - print(total, res.other, res.xkanji, res.jfm, res.kanji) - if total <= res.other then -- 和文処理グルー以外で足りる - clear_stretch(p, KANJI_SKIP) - clear_stretch(p, XKANJI_SKIP) - clear_stretch(p, FROM_JFM) - local f = node.hpack(p.head, p.width, 'exactly') - f.head, p.glue_set, p.glue_sign, p.glue_order - = nil, f.glue_set, f.glue_sign, f.glue_order - node.free(f) - else - total = total - res.other - if total <= res.jfm then -- JFMグルーだけで良い - clear_stretch(p, KANJI_SKIP) - clear_stretch(p, XKANJI_SKIP) - set_stretch(p, total,res.jfm, FROM_JFM) - local f = node.hpack(p.head, p.width, 'exactly') - f.head, p.glue_set, p.glue_sign, p.glue_order - = nil, f.glue_set, f.glue_sign, f.glue_order - node.free(f) - else - total = total - res.jfm - if total <= res.xkanji then -- xkanjiskip まで - clear_stretch(p, KANJI_SKIP) - set_stretch(p, total,res.xkanji, XKANJI_SKIP) - local f = node.hpack(p.head, p.width, 'exactly') - f.head, p.glue_set, p.glue_sign, p.glue_order - = nil, f.glue_set, f.glue_sign, f.glue_order - node.free(f) - else - total = total - res.xkanji - if total <= res.kanji then -- kanjiskip まで - set_stretch(p, total,res.kanji, KANJI_SKIP) - local f = node.hpack(p.head, p.width, 'exactly') - f.head, p.glue_set, p.glue_sign, p.glue_order - = nil, f.glue_set, f.glue_sign, f.glue_order - node.free(f) - else - -- glue_set > 1 なので,どうしようもない - end - end - end - end - print('after: ', p.glue_set, p.glue_sign, p.glue_order ) - end - end - return head -end +\documentclass{ltjsarticle} +\usepackage{luatexja-fontspec,luatexja-adjust,xcolor,amsmath,amssymb} - -\end{luacode} - -\def\sq{\hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{ }\hss}} -\def\sb{\hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{■}\hss}} +\def\sq{% + \hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{% +  \hskip\dimexpr-.5\zw-.2pt\vrule width.4pt height.08\zw depth.12\zw% + \hskip\dimexpr.5\zw-.2pt\relax}\hss}} +\def\sb{\hbox to 1\zw{\hss\fboxsep=-.5\fboxrule\fbox{% + ■\hskip\dimexpr-.5\zw-.2pt\vrule width.4pt height.08\zw depth.12\zw% + \hskip\dimexpr.5\zw-.2pt\relax}\hss}} \newbox\gridbox \setbox\gridbox=\hbox to 20\zw{\sq\sq\sq\sq\sb\sq\sq\sq\sq\sb\sq\sq\sq\sq\sb\sq\sq\sq\sq\sb} \def\outbox#1{% @@ -144,23 +17,59 @@ end \textcolor{cyan!50!white}{\copy\gridbox}\hskip-20\zw\copy0\vrule\par } -\def\DisableCB{\directlua{luatexbase.remove_from_callback('post_linebreak_filter', 'Adjust width')}} -\def\EnableCB{\directlua{luatexbase.add_to_callback('post_linebreak_filter', adjust_width, 'Adjust width', 100)}} - +\ltjdisableadjust \long\def\testbox#1{% - \EnableCB\setbox0=\vbox{\hsize=20\zw\parfillskip0pt#1}\outbox{ON}\par - \DisableCB\setbox0=\vbox{\hsize=20\zw\parfillskip0pt#1}\outbox{OFF}\par + \textcolor{red!80!black}{\ltjenableadjust[priority=true, lineend=extended] + \setbox0=\vbox{% + \hsize=20\zw#1% + }\ltjdisableadjust\outbox{ON}}\par + \textcolor{black!90!white}{% + \ltjdisableadjust\setbox0=\vbox{% + \hsize=20\zw#1% + }\outbox{OFF}}\par\medskip } +\usepackage[textwidth=52\zw,lines=47,centering]{geometry} \parindent0pt \begin{document} -{\tt kanjiskip: \ltjgetparameter{kanjiskip} +\jfontspec[YokoFeatures={JFM=hang}]{ipam.ttf} + +\ltjsetparameter{kanjiskip=.0\zw plus .4pt minus .5pt} + +\twocolumn[{\tt kanjiskip: \ltjgetparameter{kanjiskip} -\ltjsetparameter{xkanjiskip=.25\zw plus .25\zw minus -.125\zw} +\ltjsetparameter{xkanjiskip=.25\zw plus .25\zw minus .125\zw} xkanjiskip: \ltjgetparameter{xkanjiskip}} +このテストでは,行末の句読点・中点類の位置調整を有効にした +\texttt{jfm-hang.lua}を用いている. +{\begin{itemize} +\item 句点は,調整量に合わせて,ぶら下げ,全角取りの2種類から選択される. +\item 読点は,調整量に合わせて,ぶら下げ,二分取り,全角取りの3種類から選択される. +\item 中点類は,行末に四分空きを追加することのみ対応. +詰める際の「直前の四分空きも取る」は未実装, + +\item \texttt{lineend=true}のときは,\TeX による行分割後に行末文字の位置調整が行われる. +行われる条件は, +\begin{description} +\item[最終行以外] 無限大の伸長度を持つグルーが関わっていない +\item[最終行] 無限大の伸長度を持つグルーは\texttt{\textbackslash parfillskip}のみで,かつ +\begin{align*} + \min\{(\hbox{許される最小の行末文字と行末の間}),0\} + &\leq(\hbox{\texttt{\textbackslash parfillskip}のこの行における実際の長さ})\\ + &\leq\max\{(\hbox{許される最大の行末文字と行末の間}),0\} +\end{align*} +となっている +\end{description} + +\item \texttt{lineend=extended}のときは,\TeX による行分割の時点で行末位置の文字調整を考慮 + する.但し,段落の最後の文字については例外的に行わず,代わりに +上の「\texttt{lineend=true}の場合」の最終行のときと同じ補正を行う. +\end{itemize}}] + \testbox{% -あいうえおかきくけこさしすせそたちつてと +◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ +%あいうえおかきくけこさしすせそたちつてと } \testbox{% @@ -168,7 +77,7 @@ xkanjiskip: \ltjgetparameter{xkanjiskip}} } \testbox{% -あいうえおかきA B C Dこさ\texttt{DO i=1,10}『 +あうえおかきAI M M Dこさ\texttt{DO i=1,10}『 } \testbox{% @@ -179,8 +88,184 @@ xkanjiskip: \ltjgetparameter{xkanjiskip}} あいうえおきくけこ「」さ123456そたちつて } +\typeout{あいうえお} + + \def\pTeX{p\kern-.2em\TeX} \testbox{% -日本では\pTeX,p\LaTeX がよく使われている。 +日本で\pTeX,p\LaTeX がよく使われている。 +} + +中点類の空き詰めは括弧類より優先 +\typeout{中点類の空き詰め} + +\testbox{% +あいうえおかきくけ・こさしすせそたち「「あ +} + +次の例では\verb+\parfillskip+を0にしている + +\testbox{% +あいうえおかきくけこさしすせそたちつて・ +} +\testbox{% +\parfillskip0ptあいうえおかきくけこさしすせそたちつて・ +} + +行末の句点 +\typeout{行末の句点} + +\testbox{% +あいうえおかきくけこさしすせそたちつて. +} +\testbox{% +あいうえおかきくけこさしすせそたちつ\vrule width .25\zw て. +} +\testbox{% +あいうえおかきくけこさしすせそたちつ\vrule width .5\zw て. +} +\testbox{% +あいうえおかきくけこさしすせそたちつ\vrule width .75\zw て. +} +\testbox{% +あいうえおかきくけこさしすせそたちつ\vrule width 1\zw て. +} + +行末の読点 +\typeout{行末の読点} + +\testbox{% +あいうえおかきくけこさしすせそたちつて, +} +\testbox{% +あいうえおかきくけこさしすせそたちつ\vrule width .25\zw て, +} +\testbox{% +あいうえおかきくけこさしすせそたちつ\vrule width .5\zw て, +} +\testbox{% +あいうえおかきくけこさしすせそたちつ\vrule width .75\zw て, +} +\testbox{% +あいうえおかきくけこさしすせそたちつ\vrule width 1\zw て, +} + + +伸び縮みで異なる優先度. + +以下の例では,「ぱ」と鍵括弧の間は自然長・伸び・縮み全部半角. +\texttt{kanjiskip}より伸びる時の優先度は高く, +縮むときの優先度は低い. + +{\ltjsetparameter{kanjiskip=0pt plus 1.5pt minus 1.5pt} +\testbox{% + \parfillskip0ptあいうえおかきくけこ\<\vrule width7.5\zw\<ぱ「 +} +\testbox{% + \parfillskip0ptあいうえおかきくけこ\<\vrule width9\zw\<ぱ「 } -\end{document} \ No newline at end of file +} + +次ページ以降の出典: + Wikisource日本語版「竹取物語」(一部),2016/08/11閲覧\\ +{\catcode`\%=11\texttt{https://ja.wikisource.org/wiki/%E7%AB%B9%E5%8F%96%E7%89%A9%E8%AA%9E}} + +\twocolumn +\def\USTCON{\hbox{USTCON}} +\small\newdimen\R \R=25\zw +\def\sample#1{\small\hsize=\R\jfontspec[YokoFeatures={JFM=hang}]{ipam.ttf} +{\centering\scriptsize\textbf{\ttfamily #1}\par}\parindent1\zw% +\ltjsetparameter{kanjiskip=.0\zw plus .4pt minus .5pt} +かやうにて、御心を互に慰め給ふほどに、三年ばかりありて、春の初より、かぐや姫月のおもしろう出でたるを見て、常よりも物思ひたるさまなり。ある人の「月の顔見るは忌むこと。」ゝ制しけれども、ともすればひとまには月を見ていみじく泣き給ふ。七月のもちの月にいで居て、切に物思へるけしきなり。近く使はるゝ人々、竹取の翁に告げていはく、「かぐや姫例も月をあはれがり給ひけれども、この頃となりてはたゞ事にも侍らざンめり。いみじく思し歎くことあるべし。よく〳〵見奉らせ給へ。」といふを聞きて、かぐや姫にいふやう、「なでふ心ちすれば、かく物を思ひたるさまにて月を見給ふぞ。うましき世に。」といふ。かぐや姫、「月を見れば世の中こゝろぼそくあはれに侍り。なでふ物をか歎き侍るべき。」といふ。かぐや姫のある所に至りて見れば、なほ物思へるけしきなり。これを見て、「あが佛何事を思ひ給ふぞ。思すらんこと何事ぞ。」といへば、「思ふこともなし。物なん心細く覺ゆる。」といへば、翁、「月な見給ひそ。これを見給へば物思すけしきはあるぞ。」といへば、「いかでか月を見ずにはあらん。」とて、なほ月出づれば、いで居つゝ歎き思へり。夕暗には物思はぬ氣色なり。月の程になりぬれば、猶時々はうち歎きなきなどす。是をつかふものども、「猶物思すことあるべし。」とさゝやけど、親を始めて何事とも知らず。八月十五日ばかりの月にいで居て、かぐや姫いといたく泣き給ふ。人めも今はつゝみ給はず泣き給ふ。これを見て、親どもゝ「何事ぞ。」と問ひさわぐ。かぐや姫なく〳〵いふ、「さき〳〵も申さんと思ひしかども、『かならず心惑はし給はんものぞ。』と思ひて、今まで過し侍りつるなり。『さのみやは。』とてうち出で侍りぬるぞ。おのが身はこの國の人にもあらず、月の都の人なり。それを昔の契なりけるによりてなん、この世界にはまうで來りける。今は歸るべきになりにければ、この月の十五日に、かのもとの國より迎に人々まうでこんず。さらずまかりぬべければ、思し歎かんが悲しきことを、この春より思ひ歎き侍るなり。」といひて、いみじく泣く。翁「こはなでふことをの給ふぞ。竹の中より見つけきこえたりしかど、菜種の大さおはせしを、我丈たち並ぶまで養ひ奉りたる我子を、何人か迎へ聞えん。まさに許さんや。」といひて、「我こそ死なめ。」とて、泣きのゝしることいと堪へがたげなり。かぐや姫のいはく、「月の都の人にて父母あり。片時の間とてかの國よりまうでこしかども、かくこの國には數多の年を經ぬるになんありける。かの國の父母の事もおぼえず。こゝにはかく久しく遊び聞えてならひ奉れり。いみじからん心地もせず、悲しくのみなんある。されど己が心ならず罷りなんとする。」といひて、諸共にいみじう泣く。つかはるゝ人々も年頃ならひて、立ち別れなんことを、心ばへなどあてやかに美しかりつることを見ならひて、戀しからんことの堪へがたく、湯水も飮まれず、同じ心に歎しがりけり。この事を帝きこしめして、竹取が家に御使つかはさせ給ふ。御使に竹取いで逢ひて、泣くこと限なし。この事を歎くに、髪も白く腰も屈り目もたゞれにけり。翁今年は五十許なりけれども、「物思には片時になん老になりにける。」と見ゆ。御使仰事とて翁にいはく、「いと心苦しく物思ふなるは、誠にか。」と仰せ給ふ。 + +} + + +\ltjenableadjust[lineend=extended, priority=true] +\setbox40000=\vtop{\sample{lineend=extended, priority=true}} +\ltjdisableadjust +\ltjenableadjust[lineend=true, priority=false, priority=true] +\setbox40002=\vtop{\sample{linened=true,priority=true}} +\ltjdisableadjust +\ltjenableadjust[lineend=false, priority=false, priority=true] +\setbox40004=\vtop{\sample{lineend=false,priority=true}} +\ltjdisableadjust +\ltjenableadjust[lineend=extended, priority=false] +\setbox40010=\vtop{\sample{lineend=extended, priority=false}} +\ltjdisableadjust +\ltjenableadjust[lineend=true, priority=false, priority=false] +\setbox40012=\vtop{\sample{linened=true,priority=false}} +\ltjdisableadjust +\ltjenableadjust[lineend=false, priority=false, priority=false] +\setbox40014=\vtop{\sample{lineend=false,priority=false}} +\ltjdisableadjust + +{\catcode`\#=12 +\directlua{% + function gb(a) + local t = tex.getbox(a) + local x = {} + for n in node.traverse_id(node.id('hlist'), t.head) do + local b = n.glue_order>0 and 0 or math.floor(100*math.pow(n.glue_set, 3)+0.5); + if b<=12 then x[#x+1]={2,b} % decent + elseif n.glue_sign==1 and b>=100 then x[#x+1]={0,b} %very loose + elseif n.glue_sign==1 then x[#x+1]={1,b} % loose + else x[#x+1]={3,b} end %tight + end + x[0]={2, 0} + local d = 0 + for i=1,#x do + d = d + math.floor(math.pow(tex.linepenalty + x[i][2], 2)+0.5) + if math.abs(x[i][1]-x[i-1][1])>=1 then d = d + tex.adjdemerits end + end + tex.sprint(-2,tostring(d) ) + end +}} +\protected\def\getbadness#1{\par\medskip\textcolor{blue}{\small demerits: \directlua{gb(#1)}}} + +\noindent +\vrule\copy40010\vrule\relax\getbadness{40010} + +\medskip +\noindent +\vrule\copy40012\vrule\relax\getbadness{40012} + +\newpage +\noindent +\vrule\copy40014\vrule\relax\getbadness{40014} + +\clearpage +\R28\zw +\ltjenableadjust[lineend=extended, priority=true] +\setbox40000=\vtop{\sample{lineend=extended, priority=true}} +\ltjdisableadjust +\ltjenableadjust[lineend=true, priority=false, priority=true] +\setbox40002=\vtop{\sample{linened=true,priority=true}} +\ltjdisableadjust +\ltjenableadjust[lineend=false, priority=false, priority=true] +\setbox40004=\vtop{\sample{lineend=false,priority=true}} +\ltjdisableadjust +\ltjenableadjust[lineend=extended, priority=false] +\setbox40010=\vtop{\sample{lineend=extended, priority=false}} +\ltjdisableadjust +\ltjenableadjust[lineend=true, priority=false, priority=false] +\setbox40012=\vtop{\sample{linened=true,priority=false}} +\ltjdisableadjust +\ltjenableadjust[lineend=false, priority=false, priority=false] +\setbox40014=\vtop{\sample{lineend=false,priority=false}} +\ltjdisableadjust + +\noindent +\vrule\copy40010\vrule\relax\getbadness{40010} + +\newpage +\noindent +\vrule\copy40012\vrule\relax\getbadness{40012} +\newpage +\noindent +\vrule\copy40014\vrule\relax\getbadness{40014} + + + + +\end{document}