From 614b0fb9f3dc863125e3ee2a3534a81ca38873b6 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sat, 25 Jan 2020 19:04:35 -0800 Subject: [PATCH] cohere --- quad/qtest/test-breaks-tester.pdf | Bin 10616 -> 10893 bytes quad/quadwriter/layout.rkt | 23 ++++++++++++++--------- quad/quadwriter/render.rkt | 24 ++++++++++++------------ 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/quad/qtest/test-breaks-tester.pdf b/quad/qtest/test-breaks-tester.pdf index 721891869988b960eeaa0e3e50ea5ff22e9818f2..3957e93c82f9ebc796600600944001f1dd82d43f 100644 GIT binary patch delta 6956 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 KSzcWM^M3%C-~6Be delta 6717 zcmZWuWmJ?6x0UYh8gl3cfdLeT9zeRJyHk(>1Rg?=uAxJa4rwGrkPhh-h7OVL7Vv)e z{`u~D-}7sqz0cWeuk-iB>)-0s;h`a3pfMo|a9HU?^aP*DnaML*S-Tb|<&M~4Q-&tV z@;|d7#UyG}NB@I~Ee?SQLLkDT2u(b?|2A*%+)zcu5F2>xfDzo3T=~!1iqirA#~=RL zp2sVS{pp;}bvLSYg9)O0#9X-8<*B{=9M!sMo7%aUFDOaZ{N;7j0p; zN1*aPaetZbcU!(YS&I%I{jdFZKAvRQG1(fWS4;6aTl>gP))nm5tus$)kA1+5P{+TC zoiF`5Y`sSKZruT}**7D)JtSr4vQ*}oA<((j!U4WFrEn3H+kPk(hjMb*7H_Y1j zGKN-$OOlsObbk7)9gm@!_tDfbz~wFn1_BuAC96O`b!f3PCTAoin z+&ZjqYt}BPh{c94{DCEmH=ZY9vQ_by_93XToWIdy6GTl;Lq{nUjkigiPSb~PA1P=d zBA+!C2VjXrp4on*_89nZW;Y-l94AB8)hB{8%4RPt5&^SK$t+Q)L`=BaiV5Xpxs4{O z(;N)#FCssOR`&)pn12?h>%we+x(Z6g=8cV8%^1;1WxR6uT~Biu=!?>xWY)uP*SKJJ zXyFPO^yD4%3JIs*6jYY@ST%r?I|T7$ZB1V01l&b`_uqM=EKBfb=Zuf7+rJTW=gR1< z-Zb!TTc&mAYe`t@bKB|smGEY;b!!>tm<=8yHI|1GphcG{OEpR1gSG-Cnk2hK?SL{) zQniMLS`we4n|IOOhA1)j z0ip%G>rlixc`Fep<;|DVuUmb%hkyKYg9oZp%dsj^z-67$- zu8(z8hXhzXP)|X6)bEk?mWwB_uT z5%kF*|3WSD$WADkmS_yLo|C48iAPmYcS<@nbf+kd6RTRTN}Jy}e7-Q=kq(*QTaZ^y zd?bf8#q2}P09Bq6@}bX@<(T5~q0NIjOhJ4=X0lXMU>};tsE-9@yEFj_s|9PoBrs{B zkQ^7R3|Kzz5d44=*-A@U7v-{Pyg+i`<>uP;*3;|(N6bp3dHuST3KWI4(d~!*L`&4) zd+Pb0ynRJ=MA!W`Uf6{FBod^`8)tr~8eKDI_|jw(J&kAdxsh&u{NsIUr#iV285_U+ zFvbUXya>%Ber}B2nta1J=~D#!h*o27Hmn1&83&Y4wFB`P2RTk*fedS1;%9t;bZg!4 zGm!_(zmXKCk$?LD5*6ZZ1vbKB$*E*ypX@#{tCIpPg1wl_N$DkrMbb_&h8Hs*jAuGK z5M~Oan@(?HJ%V9PC;PDE!KkLwd{|dtMAL{%mJS%>bVh43iY*h30)UBN-gXgAiDM~> z#-fpzj;1z*pr8CabavQwya`e9vE08I(`(qXA2r;x)?@nNaAG~8G6$Y zW{XH;`|z2i3da9hem>S9)`ozg{A~f9aS`beZ|QYri+C!(WcYg3g=8nD1){e9=N5Ri zFUKG6WK?`h=J)sYoC`ibs!s4)jK>%-+`C<(SJsE;;N?n-U)&z=oO09*T z4Bu?Ny9m1N{6_be;)K7wl(yM@2w6W*pC6l2Jzs%{CqoznI+R+ymkcT1ha$P z1#2vzY7x02j!*k(-WhZg?om$m3G67kk14&?->m7$jzwl+v&N8_o*z;Av~SZK0qEbt zj^e-7_4h!rTQOXu?VPE1xTENUlCh0btHK@F!Ix2tf5C=Wv3CHx#ONwCr4$BV*hjO^ z`-*)1CZq3NO3^Fx&vAuCmmDCq`~F#rNycQ>rjL!qGM{D(CqVXvZa;hqCm73dQQ`3d zLeb3II-9Ow2Cn?#G{040kj$5jLuljf{@YMV?JZz+gy@*+Mkg+2CbQFR)VDXpb=g^~ zxYT3UQ8Gr@qkLwEZ)OW`w2J&=Hk)1Xw3gH7Th1pv9a^1yHL7$sh|_q%xFb`7pUlKvnhrj%V*N7o@uZD z?rS`CZe`?s^p&aB^WNM0>E7VfQrjDaAa&f&JDdV;Lp#o`_{Qs>#&q;W4zd5 zTmrV|PS+bo+!kM{T?k&Oqy$BvPG^*=G?4&{`rm?nfwtV*=TGjKFZ=;6J>7KNG3oq9EqzD=u893CO&mdkx~PQeoC64cI>KV_y<9NPx) zy#Dq3d8r)FYb zJa_twz^b!1@|M$et~Q-jYsOofjdcc4DviHYlwcxi8uUZilXqE^Dcdy~zctE=N3L@Z zzf5Uy`8`lFuUWdit!`$soP}ulnVUmeFWn5 zn=(I#m?X=*&{N6HD1a0$u(GlHeAYcdfM&CrzkC1fuAcfsUNbG;jJ0=jXchpda5}(^ zXdH&8-0LKkl*({LcRoI0GO+K}PWPcon@!7rR&}?J|Wbt;|^zjj;tyHJPXY zN8TGJUXAi99uD4bs~=3g8V<6a%G}NhcMFSkf5&{$O!etK>NRxA_qIP{%&|H;d_FUu zHLt+In`wKQ7>gTkE^HN)>u&fb-Qfo0WL)kQZd_j~KOyjF9B_Jh7Y1s(dC%1KUrl+p1cP{os-TZ9$)T@6Xdj zAU70FUJ`juzSx3b*jDJ3ZCNL=5&h}sr-_RP#~qDd%{%9>$>Eq84^ydvx6T&mq>7J= zyEN59e==YF9nOgy)$;+cW-89f^o-{#(Sl%y%J0;|37p>};3K$EOAWYqku%TukSTln zM9|+(2KP>0*X>o#X28uUO3|o88M-^QCH*!?dU}S}7~^YoQqv@hK*qe1b4`3DZ9T?$ z!EOARaaW0|1H3A^J`Pl!S$2T_d_ocVK@RPO;sJx7N0J1!rWTNEY@$u^qDc#zWRLeg z&(n|rLixh|N`W`UvI%4|D#nNdf#f)Iib z8h!|~-A{clC;BRVR^9EJX(5-u9EU0oj4b+)$3HWGJ@Juq`ENz?Qbn4HuW{t`s)x{Zjx%$K0Q%M|z4~oA44V7rUAuqk=e=!Z6gT;8ehs zw>O(Q7Be2Ra*{J{vHQ?ECbNAMZAa*$9T&depy8_AECMW9L`Vs_3b%)iStZsDE^wH> z7$5zz-MM{V*#!AJJ30j z^;e2&>yQwXR_sR^YrjUX$mH&cY1W|P_(ob@RiIg?a^Iu4k1$3LN^VF~WdI}fJb7DR zY#Y>$%mTXeuzQ|6pGaw5-A5Vhk}>e(>6B;}@-*g72w7OnGB;*8W_EfHKn1cbamN z*=|Ib&5Q?TsN_T7ioqM-ig!FLL-&C5Xp5usV;dQ!160%Am4G!arBaxGlCWT`h=(QA z5U;MzdE_wd2~1vv1)EH>6dx4Ds2#Q(wYG~s05wmP@hO-6Gwv*p)t)f8>h!Bd2E=ah zy8wZEgK38uE$9h2k>WCM&mDI1_SN)Q8tsDn$eki@&^0x=F3dTJw`%Yq@sN44M);sQ zA$E6>tm(?FITy!Zrcf&-sQiW;3X#j0@<%oEwa^mdILWy3sV<-uQ{&6u^{9O7)9L&h zz=Vp+PcFJPh0B_K)XrdZ{y9TMrCOP#7}lAoQ+;D}@G8lN1Khu2Ae*ntuYWyHKC6HA zOYPpxfSXDGf)YlRt3HFC?bWiy*Df<*GfLTv}X?WI0)9C z1l-LQu=c*fB!5Mbs;xErtRR`J3&bq}D8gz`%mQ=MDeLbNcSi?h2`uv_yVAKbR_)b( z8H5C9!?0ikwwj@QfpUoaO4NWkCJr2qL`F~{8<%b*0gbfhf_AoJiafag`XIvtcz2P6 z++D^@+|QYNOmRY!H20pUr307HYoz+f61@5HS`;(ld$AWYNka6t_a!~TaJzF#Ow9JC-wB`ie?{VLR+B`#}>9dR! zl-~N$WQ7zy%Jj(eQkNj>&b8JMamZ{Oh3rUshqeuwTJwv17fwx{ll~K~ohiJdxg$`T zJ2&bw&}?b8kp7uxDbj7E*=DH`V3_4SEZ(uAYUWvrzp@W9vhd|S7`*?^!Ngv7=87s6 zo##}>vYJesm4@EuES9k{;O+pglUkJXHKgFS<`j>k8;@Tf@C^1nXV!Y5j!reK=(W{` zV=CH`WYWjCBisgF*5Qve8K~YmZ|z-9hLfY0W3gGHUO~|&i6z373WOX1)a)>OU!;`; z^~J}4Qw$rZpvp5um#rWMTNqmszD@{5aae^VZ6=|8NR}mKCc#dKs3n>=R5BAwxGS*k z883Qlmvs_OdPoTq9xvKRH?Ai(J?8H&e@_%s^o%Y$PmDmKny`a)%vK!t(4}=kE$^=> z&9@leP-~$y+e{(EEK$rrsPtz{3{E*LBZhrT0wc2dNK7NF`H1{3%}+SlpD@HCUs>ud z;9p0$d$Q4E1QiI-<2@F9&l{k|>a{|Td#~+Dsva&TK~)pk=1E|R_p@8N733ar=gGQ^ z4)2j`#S6xQyXav^6HatroT7fi7U&*1#eD#oN62)!oJxMfI_bp%PH6%OfiRB(eBc8h zi;>t$! zDhH-1;sCxxlL?XH-NlLCE7O)1<@x$6w*)FK!(^uadNhq_2_Jei#S)!?ZK4^^I8fM< z(334m<>Yu=&`Jz~97@`zAFS}4AI^NHO5Aob>9?s!spr;i{r`$I4bY2p#ECTQR2$pW z!k#z?`Bpw{On#w7pY`0uLRaZXA(-{NUM4CFy9UHomGZIO53C#DQWWmyfb~%}&AjPM zjE1AkxL^GFK!VxJp7O3x_ZKVI7^XBHt0FXc*{xoiMjZJ`r|uhMI|9){U}@Q2ugIQH zyPGS+AL1E*B%#3)@$A$6A^J!=Ts2(*1BpETlFw5qaS$ z?i+ncZU#^RA+W zQ?2LtuTpm@g*6*jAr%dMYE2NeU!!k%8iAHvw=&vbl|K%Q0%py5-w&G@b-%kza2C%Y zR}H>qrkQ>QrnI$wn`nR8ecNFb^A#9rtEP3gcRKiBd2;e?;|m2~mr9U-BE7J8Fq<^Qse8$tN=MToft289hxkQ8 zIK4l-Z9h9+*|ado%19lTlC39mgMk)~J*aTgUeNBsNM7n4bi&DbaMWXCefJxrwhLqQ znzys8&nJs_Z!5^+t-RVw>$fb5%T2K~ZL~dX9UM`jY%gjsM`(wbWiKpEs_Itg^OzdgAV6JA?ZY zmh(enzkyN>k3`MfDUwD~;rOOyR9edN`?6NAzE7Hh!}64*e+uiblW2gmBmRhS`PI^p z86khgXkD|Gx$M>%WM{6!7<9>Q6 zU$B%wZvy4K(fNe4|C9si_LKJ%*QIS$Ep?TZ@rUeD*YXDRTn4)}t2Cu&8&<=e10ajo zOXUp%W$jUY=b|F#QWA>AsAlE8n=foXR-23-lQNd|T`o>k{E;onqzpP&K4)~B42m-d zxJHA8<3?{@Um{ZU{sU9x&UcEjjeVql)9PA5#pe6phEc+4lt{a=^5J_V!F`L8^t4hH zhu+IrD6=pZQ#KkxI62|^iu3MghC2T|5Z>pF3>=!|K7y_(-S(I9RJv$k zzaoG9mBlDQoE$9RNAf%wJx?W%e8+}Q^zL-(ug)V-O!74x;mXQ|`5LAJQ`17^uZ~%jJS{1uORe=6p%Slt8Xuw=KJ*FNXa(eR|l&$v#y=W!tb&k+py}#?{ zEY6^-a94j8x6kL&gbo5(k}qj;Y$05%WnW@E7V$EQyO+ne`hsk(WcAaCOFTkB95ORI zPy&WE-VUnT1-f^IV}teadDn-_;y11wUtjHKlOG5k!+=(YDUp(?uWowlW1=462bF&L z47#8LeC3qz%_*E=^93@FIX9!XCB2no&HIcU*^-ZjuTX@|W`2KJM*D&9`RtH&dmY!a z9W@to2pfx24a1VNJME_K_p=2&YDrh01(dEM?KHS!k6{fd{)kWjhoI{UN^i_nYvGeI z>fPfdI0y6#B+xd}c*A_|wBr1iy-CD`2SY}IF9uH^Vbj* zWD@+}VsdA~{Xg&@PD1RToUpLazd1pO#6RbRAP^BmHzzAp5F#!r@-J0P?B5&DpZ_a? zkf^9A;uRN|8v=p+(?d`KBJ?j#9D?xS^3{DVCjL)JSX}I177`Ld|B40?6#3UKL_}N= T@q$|kS5QO@7YtU^RKooqymW{@ diff --git a/quad/quadwriter/layout.rkt b/quad/quadwriter/layout.rkt index f075e143..7217fbaf 100644 --- a/quad/quadwriter/layout.rkt +++ b/quad/quadwriter/layout.rkt @@ -123,15 +123,16 @@ (define-syntax (define-break-types stx) (syntax-case stx () [(_ ALL-BREAKS-ID . TYPES) - (with-syntax ([((TYPE-BREAK TYPE-STR Q:TYPE-BREAK) ...) + (with-syntax ([((TYPE-BREAK TYPE-STR Q:TYPE-BREAK BREAK-TYPE) ...) (for/list ([type (in-list (syntax->list #'TYPES))]) (list (format-id #'TYPES "~a-break" type) (symbol->string (syntax->datum type)) - (format-id #'TYPES "q:~a-break" type)))]) + (format-id #'TYPES "q:~a-break" type) + (format-id #'TYPES "~a-break-quad" type)))]) #'(begin (define TYPE-BREAK '(q ((break TYPE-STR)))) ... - (define ALL-BREAKS-ID (list (cons TYPE-STR Q:TYPE-BREAK) ...))))])) + (define ALL-BREAKS-ID (list (cons TYPE-STR BREAK-TYPE) ...))))])) (define-break-types all-breaks para line page column hr section) @@ -141,9 +142,13 @@ ;; Because typed quads have their own predicates, ;; it's faster to find them in wrapping operations ;; (instead of, say, using `equal?`) - (cond - [(assoc (quad-ref q :break) all-breaks) => cdr] - [else q])) + (match (assoc (quad-ref q :break) all-breaks) + [#false q] + [(cons _ break-quad-type) (make-quad #:type break-quad-type + #:attrs (quad-attrs q))])) + +(module+ test + (check-equal? (quad-ref (convert-break-quad (qexpr->quad '(q ((break "page") (foo "bar"))))) 'foo) "bar")) (define (convert-draw-quad q) (quad-update! q @@ -189,7 +194,7 @@ h)] [size #:parent quad (pt layout-width layout-height)])) -(define (do-string-quad q) +(define (convert-string-quad q) ;; need to handle casing here so that it's reflected in subsequent sizing ops (define cased-str (and (pair? (quad-elems q)) @@ -208,11 +213,10 @@ (define (generic->typed-quad q) (cond - [(break-quad? q) q] [(quad-ref q :break) (convert-break-quad q)] [(quad-ref q :draw) (convert-draw-quad q)] [(quad-ref q :image-file) (convert-image-quad q)] - [else (do-string-quad q)])) + [else (convert-string-quad q)])) (define (draw-debug q doc [fill-color "#f99"] [stroke-color "#fcc"] [stroke-width 0.5]) (when (draw-debug?) @@ -767,6 +771,7 @@ https://github.com/mbutterick/typesetter/blob/882ec681ad1fa6eaee6287e53bc4320d96 (define col-spacer (quad-copy q:column-spacer [size (pt column-gap (and 'arbitrary-irrelevant-value 100))])) (add-between cols col-spacer)) +(verbose-quad-printing? #t) (define ((page-wrap-finish make-page-quad path) cols q0 q page-idx) (define page-quad (make-page-quad (+ (section-pages-used) page-idx))) (define elems diff --git a/quad/quadwriter/render.rkt b/quad/quadwriter/render.rkt index f58ac375..7425e8ec 100644 --- a/quad/quadwriter/render.rkt +++ b/quad/quadwriter/render.rkt @@ -149,18 +149,18 @@ :font-size (number->string default-font-size) :line-height (number->string (floor (* default-line-height-multiplier default-font-size)))) qexpr))) (setup-font-path-table! base-dir) - (define atomized-qs (atomize the-quad - #:attrs-proc handle-cascading-attrs - #:missing-glyph-action 'fallback - #:fallback "fallback" - #:emoji "fallback-emoji" - #:math "fallback-math" - #:font-path-resolver resolve-font-path!)) - (define hyphenated-qs (time-log hyphenate (handle-hyphenate atomized-qs))) - (define typed-quads (map generic->typed-quad hyphenated-qs)) - (define trimmed-qs (drop-leading-breaks typed-quads)) - (define indented-qs (insert-first-line-indents trimmed-qs)) - indented-qs) + (let* ([qs (atomize the-quad + #:attrs-proc handle-cascading-attrs + #:missing-glyph-action 'fallback + #:fallback "fallback" + #:emoji "fallback-emoji" + #:math "fallback-math" + #:font-path-resolver resolve-font-path!)] + [qs (time-log hyphenate (handle-hyphenate qs))] + [qs (map generic->typed-quad qs)] + [qs (drop-leading-breaks qs)] + [qs (insert-first-line-indents qs)]) + qs)) (define (setup-margins qs page-width page-height) ;; if only left or right margin is provided, copy other value in preference to default margin