5 \def\@fornoop#1\@@#2#3{}%
6 \long\def\@for#1:=#2\do#3{%
7 \expandafter\def\expandafter\@fortmp\expandafter{#2}%
8 \ifx\@fortmp\@empty \else
9 \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}
11 \long\def\@forloop#1,#2,#3\@@#4#5{%
16 \else#5\@iforloop #3\@@#4{#5}
19 \long\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
20 \expandafter\@fornoop \else
21 #4\relax\expandafter\@iforloop\fi#2\@@#3{#4}}%
22 \def\@tfor#1:={\@tf@r#1 }%
23 \long\def\@tf@r#1#2\do#3{\def\@fortmp{#2}\ifx\@fortmp\space\else
24 \@tforloop#2\@nil\@nil\@@#1{#3}\fi}%
25 \long\def\@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
26 \expandafter\@fornoop \else
27 #4\relax\expandafter\@tforloop\fi#2\@@#3{#4}}%
28 \long\def\@ifnextchar#1#2#3{%
32 \futurelet\@let@token\@ifnch}
34 \ifx\@let@token\@sptoken
35 \let\reserved@c\@xifnch
37 \ifx\@let@token\reserved@d
38 \let\reserved@c\reserved@a
40 \let\reserved@c\reserved@b
44 \def\:{\let\@sptoken= } \: % this makes \@sptoken a space token
45 \def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@token\@ifnch}
47 \ifx\xguji@defined\@undefined
48 \def\xguji@defined{\relax}
49 %% punctuation prohibition testing module
50 \def\linestartforbid{,.!?'、。,.:;!?’”〕)]}〉》〗】」』}
51 \def\lineendforbid{`‘“〔([{〈《〖【「『}
52 \ifx\testinset\@undefined
54 \long\def\testinset#1#2{% return whether #1 is in the set of #2, result stored in \ifisinset
58 \expandafter\@tfor\expandafter\testinset@member
59 \expandafter:\expandafter=#2\do{%
60 \if\testinset@member #1%
66 \def\testcharinset#1#2{% test whether character #1 is in #2, not using tfor
67 \def\t@ctest##1{\expandafter\t@ct@st ##1#1\t@ctest\t@ct@st}%
68 \def\t@ct@st##1#1##2##3\t@ct@st{\ifx\t@ctest##2\isinsetfalse
69 \else\isinsettrue\fi}%
70 \t@ctest{\noexpand #2}%
73 \def\getlastelem#1#2{% return the last tfor element of #1, stored in #2
74 \expandafter\@tfor\expandafter\getlastelem@member\expandafter:\expandafter=#1\do{%
75 \edef#2{\getlastelem@member}%
78 \def\testbreak#1#2#3{% #1: \output #2: \lasttext #3:\nowchar return \output if breakable
83 \getlastelem{#2}\lastchar
84 \testinset\lastchar\lineendforbid
85 \ifisinset % \lastchar is a line-end prohibition, which cannot be at the end of line
88 \testinset\lastchar\linestartforbid
89 \ifisinset % \lastchar is a line-start prohibition, which cannot appear at the start of line
90 \testinset{#3}\linestartforbid
91 \ifisinset % \nowchar is a line-start prohibition, which should be appended after \lasttext
93 \else % \nowchar is not a line-start prohibition. Can break after \lasttext
97 \else % \lastchar is a normal char
98 \testinset{#3}\linestartforbid
99 \ifisinset % \nowchar is a line-start prohibition, which make the place after \lasttext unbreakable
101 \else % \nowchar is not a line-start prohibition. Can break after \lasttext
109 %% list manipulation module
110 \def\getnumofelem#1#2{% return the num of element of #1, stored in counter #2
112 \if!#1!% test whether #1 is non-empty
114 \expandafter\@for\expandafter\getnumofelem@member
115 \expandafter:\expandafter=#1\do{%
120 \ifx\getforitem\@undefined
121 \newcount\getforitem@tmpcount
122 \def\getforitem#1#2#3{% #1: for list #2: index #3: output macro
123 \getforitem@tmpcount=0
124 \expandafter\@for\expandafter\getitem@member\expandafter:\expandafter=#1\do{%
125 \ifnum\getforitem@tmpcount = #2%
126 \edef#3{\getitem@member}%
128 \advance\getforitem@tmpcount by 1
133 \input ltj-warichu-hsplit.sty
136 \newdimen\guji@hoffset
137 \newdimen\guji@twolineraise
139 \newskip\guji@hanzisep
142 \newif\ifguji@heavydebug
143 \newdimen\guji@tmpdim
144 \newdimen\guji@tmpdil
145 \newcount\guji@tmpcount
148 \newtoks\guji@everytwolinemode
149 \newtoks\guji@everycommand
151 \guji@heavydebugfalse
152 \guji@hanzisep=0pt plus 0.1em minus 0.1em
153 \guji@twolineraise=-.3ex
155 \guji@everytwolinemode={\fiverm\baselineskip=6pt}
156 \guji@everycommand={\parindent=2em\indent}
159 \ifdefined\eh@everypar\let\everypar\eh@everypar\fi% temporary disable everyhook package
160 \everypar{\guji@iterate}%
161 \everyvbox{\everypar{}}%
165 \rightskip=0pt plus 0.1em minus 0.1em
167 \def\guji@lasttext{}%
169 \guji@adjustsectioncmd
172 \def\guji@adjustcmd#1#2{%
176 %\def#1{{\ifvmode\vskip -\baselineskip\vskip -\parsep\fi}\leavevmode #2}%
177 \def#1{\leavevmode #2}%
180 \def\guji@adjustsectioncmd{%
181 \guji@adjustcmd\part\guji@oldpart
182 \guji@adjustcmd\chapter\guji@oldchapter
183 \guji@adjustcmd\section\guji@oldsection
184 \guji@adjustcmd\subsection\guji@oldsubsection
185 \guji@adjustcmd\subsubsection\guji@oldsubsubsection
186 \guji@adjustcmd\paragraph\guji@oldparagraph
191 \gdef\guji@makespecials{%
197 \@ifnextchar[{\guji@sp@cial}{\guji@twolinemode}% ]
199 \def\guji@sp@cial[#1]#2{% #1 is a comma-seperated list of command names
201 \message{special \meaning #1 \meaning #2}%
207 \getnumofelem{#1}\guji@tmpcount%
208 \ifcase\guji@tmpcount
210 \message{Zero}% just a local group
212 \def\guji@lasttext{{#2}}%
216 \message{One}% a command that applies to the entire #2
218 \def\guji@lasttext{{\csname #1\endcsname{#2}}}%
222 \message{Two}% execute the first command, then apply the second to #2
225 \def\guji@lasttext{{\csname #1\endcsname{#2}}}%
229 \message{Three}% #1,#2,#3, apply #1 #2 #3 to the first, middle, last char
231 % if #1 empty, #1<-#2; if #3 empty, #3<-#2
232 \def\guji@sp@docmd##1##2{%
233 \def\guji@lasttext{{##1{##2}}}%
237 \guji@sp@cial@three[#1]#2\end
239 \errmessage{guji@sp@cial: Unsupported option #1.}%
241 \global\guji@tmpdim=\guji@hoffset
244 \guji@hoffset=\guji@tmpdim
245 \guji@iterate % continue to iterate
247 \def\guji@sp@cial@three[#1,#2,#3]#4#5\end{%
248 \expandafter\let\expandafter\guji@sp@middle\csname #2\endcsname
250 \let\guji@sp@first=\guji@sp@middle
252 \expandafter\let\expandafter\guji@sp@first\csname #1\endcsname
255 \let\guji@sp@last=\guji@sp@middle
257 \expandafter\let\expandafter\guji@sp@last\csname #3\endcsname
260 \message{first is #4 by \meaning\guji@sp@first}%
262 \guji@sp@docmd\guji@sp@first{#4}%
263 \def\guji@sp@midtext{}%
264 \def\guji@sp@lasttext{}%
265 \@tfor\guji@sp@member:=#5\do{%
266 \edef\guji@sp@midtext{\guji@sp@lasttext}%
267 \edef\guji@sp@lasttext{\guji@sp@member}%
268 \ifx\guji@sp@midtext\empty
270 \expandafter\guji@sp@docmd\expandafter\guji@sp@middle
271 \expandafter{\guji@sp@midtext}%
273 \message{middle is \guji@sp@midtext by \meaning\guji@sp@middle}%
277 \expandafter\guji@sp@docmd\expandafter\guji@sp@last
278 \expandafter{\guji@sp@lasttext}%
280 \message{last is \guji@sp@lasttext by \meaning\guji@sp@last}%
283 \def\guji@twoline@sp@cial[#1]#2{% #1 is a comma-seperated list of command names
285 \message{special \meaning #1 \meaning #2}%
287 \getnumofelem{#1}\guji@tmpcount%
288 \ifcase\guji@tmpcount
290 \message{Zero}% just a local group
292 \setbox\guji@savebox=\hbox{\unhbox\guji@savebox{#2}\allowbreak\hskip\guji@hanzisep}%
295 \message{One}% a command that applies to the entire #2
297 \setbox\guji@savebox=\hbox{\unhbox\guji@savebox{{\csname #1\endcsname{#2}}}\allowbreak\hskip\guji@hanzisep}%
300 \message{Two}% execute the first command, then apply the second to #2
303 \setbox\guji@savebox=\hbox{\unhbox\guji@savebox{{\csname #1\endcsname{#2}}}\allowbreak\hskip\guji@hanzisep}%
306 \message{Three}% #1,#2,#3, apply #1 #2 #3 to the first, middle, last char
308 % if #1 empty, #1<-#2; if #3 empty, #3<-#2
309 \def\guji@sp@docmd##1##2{%
310 \setbox\guji@savebox=\hbox{\unhbox\guji@savebox{##1{##2}}\allowbreak\hskip\guji@hanzisep}%
312 \guji@sp@cial@three[#1]#2\end
314 \errmessage{guji@twoline@sp@cial: Unsupported option #1.}%
316 \guji@twoline@iterate % continue to iterate
318 \def\guji@twolinemode#1{%
322 \the\guji@everytwolinemode
323 \let\guji@sp@cial\guji@twoline@sp@cial % no nest allowed
324 \let\guji@twolinemode\guji@twoline@iterate % no nest allowed
325 \setbox\guji@savebox=\hbox{}%
326 \hfuzz=\maxdimen\hbadness=\@M
328 \guji@twoline@iterate
329 #1\guji@twoline@enditer
330 \global\guji@tmpdim=\guji@hoffset
332 \guji@hoffset=\guji@tmpdim
333 \guji@iterate % continue to iterate
335 \def\guji@twoline@iterate#1{%
336 %\message{iterating \meaning#1}%
337 \ifx #1\guji@twoline@enditer
338 \guji@twoline@enditer
340 \let\guji@twoiter@next\guji@twoline@iterate
343 \let\guji@twoiter@next\guji@special
345 \testbreak\guji@oktext\guji@lasttext{#1}%
346 \ifx\guji@oktext\empty
348 %\setbox\guji@tmpbox=\hbox{\unhcopy\guji@savebox[\guji@oktext]\allowbreak}%
349 \setbox\guji@tmpbox=\hbox{\unhcopy\guji@savebox\guji@oktext\allowbreak\hskip\guji@hanzisep}%
350 \guji@tmpdim=\wd\guji@tmpbox
351 \divide\guji@tmpdim by 2
352 \advance\guji@tmpdim by \guji@hoffset
353 \advance\guji@tmpdim by -\guji@hfuzz
354 \ifdim\guji@tmpdim > \guji@hsize % a break is required
355 \guji@tmpdim=\guji@hsize
356 \advance\guji@tmpdim by -\guji@hoffset
358 %\setbox\guji@savebox=\hbox{\guji@oktext\allowbreak\hskip\guji@hanzisep}%
359 \setbox\guji@savebox=\hbox{\unhbox\guji@savebox\guji@oktext\allowbreak\hskip\guji@hanzisep}%
361 %\setbox\guji@savebox=\hbox{\unhbox\guji@savebox[\guji@oktext]\allowbreak}%
362 \setbox\guji@savebox=\hbox{\unhbox\guji@savebox\guji@oktext\allowbreak\hskip\guji@hanzisep}%
366 \expandafter\guji@twoiter@next
369 \def\guji@twoline@flush{% \guji@tmpdim is required to be presetted
373 \setbox\guji@tmpboy=\copy\guji@savebox % make a backup of savebox
374 \let\guji@twoline@break\relax
375 \hsplit\guji@savebox\to\guji@tmpdim\into\guji@tmpbox
376 \guji@tmpdil=\wd\guji@tmpbox
377 \advance\guji@tmpdil by -\guji@tmpdim
378 \ifdim\guji@tmpdil > \guji@hfuzz
379 %\showbox\guji@tmpboy
380 \guji@tmpdim=\wd\guji@tmpbox
382 % \advance\guji@tmpdim by \wd\guji@tmpbox
383 % \divide\guji@tmpdim by 2
385 \ifdim\guji@tmpdim < \wd\guji@savebox % the second box is longer than the first, should be truncated
386 \setbox\guji@tmpbox=\hbox to \guji@tmpdim{\unhbox\guji@tmpbox}%
387 \hsplit\guji@savebox\to\guji@tmpdim\into\guji@tmpboy
388 \setbox\guji@tmpboy=\hbox to \guji@tmpdim{\unhbox\guji@tmpboy\hss}%
390 \advance\guji@tmpdim by \guji@hoffset
391 \ifdim\guji@tmpdim > \guji@hsize % at the end of line, should break in advance
392 \let\guji@twoline@break\break
394 \else % the first box is longer than the second
396 \advance\guji@tmpdim by \guji@hoffset
397 \ifdim\guji@tmpdim > \guji@hsize % at the end of line, should break in advance
399 \let\guji@twoline@break\break
400 \advance\guji@tmpdim by -\guji@hoffset
401 \advance\guji@tmpdim by -2\guji@hfuzz
402 \setbox\guji@savebox=\hbox{\allowbreak\unhcopy\guji@tmpboy}%
403 \hsplit\guji@savebox\to\guji@tmpdim\into\guji@tmpbox
404 \guji@tmpdim=\wd\guji@tmpbox
405 %\showbox\guji@tmpbox
406 % now the first box should be shorter than the second. if not, just go on.
407 %\setbox\guji@tmpbox=\hbox to \guji@tmpdim{\unhbox\guji@tmpbox}%
408 \guji@tmpdil=\wd\guji@savebox
409 \advance\guji@tmpdil by -\guji@tmpdim
410 \ifdim\guji@tmpdil < 0pt
411 \guji@tmpdil=-\guji@tmpdil
413 \ifdim\guji@tmpdil > \guji@hfuzz
414 \setbox\guji@savebox=\hbox{\allowbreak\unhcopy\guji@savebox}%
415 \hsplit\guji@savebox\to\guji@tmpdim\into\guji@tmpboy
416 \setbox\guji@tmpboy=\hbox to \guji@tmpdim{\unhbox\guji@tmpboy\hss}%
418 \advance\guji@tmpdim by \wd\guji@savebox
419 \divide\guji@tmpdim by 2
420 \setbox\guji@tmpbox=\hbox to \guji@tmpdim{\unhbox\guji@tmpbox}%
421 \setbox\guji@tmpboy=\hbox to \guji@tmpdim{\unhbox\guji@savebox\hss}%
422 %\setbox\guji@savebox=\hbox{}%
424 %\showbox\guji@tmpboy
425 %\showbox\guji@savebox
427 \advance\guji@tmpdim by -\guji@hoffset
428 \setbox\guji@tmpbox=\hbox to \guji@tmpdim{\unhbox\guji@tmpbox}%
429 \setbox\guji@tmpboy=\hbox to \guji@tmpdim{\unhbox\guji@savebox\hss}%
430 %\setbox\guji@savebox=\hbox{}%
435 \setbox\guji@tmpbox=\hbox to \guji@tmpdim{\unhbox\guji@tmpbox}%
436 \setbox\guji@tmpboy=\hbox to \guji@tmpdim{\unhbox\guji@savebox\hskip 0pt plus 1fil}%
437 %\setbox\guji@savebox=\hbox{}%
439 \setbox\guji@tmpbox=\hbox to \guji@tmpdim{\vbox{\hsize=\guji@tmpdim
440 \nointerlineskip\box\guji@tmpbox\box\guji@tmpboy}}%
442 \raise\guji@twolineraise\box\guji@tmpbox
444 \advance\guji@hoffset by \guji@tmpdim
445 \ifx\guji@twoline@break\break
446 \penalty -9999 % issue a break
449 \guji@tmpdim=\guji@hoffset
450 \advance\guji@tmpdim by \guji@hfuzz
451 \ifdim\guji@tmpdim > \guji@hsize
452 \penalty -9999 % issue a break
457 \def\guji@twoline@enditer{%
459 \edef\guji@oktext{\guji@lasttext}%
460 \def\guji@lasttext{}%
461 \setbox\guji@savebox=\hbox{\unhcopy\guji@savebox\guji@oktext\hskip\guji@hanzisep}%
462 \guji@tmpdim=\wd\guji@savebox
463 \divide\guji@tmpdim by 2
464 % search to find a proper hbox width to break
467 \setbox\guji@tmpboy=\copy\guji@savebox
468 \hsplit\guji@tmpboy\to\guji@tmpdim\into\guji@tmpbox
470 \guji@tmpdil=\wd\guji@tmpbox
471 \ifdim\guji@tmpdil < \wd\guji@tmpboy % failed
472 \global\advance\guji@tmpdim by 0.5ex
475 %\showbox\guji@tmpbox
478 %\message{iteration ended}%
480 \def\guji@docommand{%
482 \message{Starting do command \meaning\guji@whatcmd}%
484 \def\guji@whatparam{}%
485 \futurelet\guji@nextchar\guji@d@command
487 \def\guji@d@command{%
488 \ifcat\noexpand\guji@nextchar\bgroup
489 \let\guji@docmd@next\guji@docmd@saveparam
491 \let\guji@docmd@next\guji@docomm@nd
492 \ifx\guji@whatcmd\unhbox
493 \ifx\guji@whatparam\empty
494 \let\guji@docmd@next\guji@docmd@saveparam
500 \long\def\guji@docmd@saveparam#1{%
502 \message{Param #1 saved}%
504 \edef\guji@whatparam{\guji@whatparam{#1}}%
505 \futurelet\guji@nextchar\guji@d@command
507 \def\guji@docomm@nd{%
509 \message{Now doing command}%
511 \ifx\guji@whatcmd\unhbox
512 \expandafter\def\expandafter\guji@whatparam\guji@whatparam
514 \def\guji@tmpparam{\voidb@x}%
515 \ifx\guji@whatparam\guji@tmpparam
516 % the command is leavevmode. just execute it
517 \expandafter\guji@whatcmd\guji@whatparam
521 \the\guji@everycommand
522 \expandafter\guji@whatcmd\guji@whatparam
529 \long\def\guji@iterate#1{%
530 %\message{ITERATing \meaning#1}%
539 \let\guji@iterate@next\guji@iterate
542 \let\guji@iterate@next\guji@special
544 \ifcat\noexpand#1\relax % test if it's a command
546 \let\guji@whatcmd=#1%
547 \let\guji@iterate@next\guji@docommand
549 \testbreak\guji@oktext\guji@lasttext{#1}%
550 \ifx\guji@oktext\empty
552 %\message{oktext \meaning\guji@oktext}%
553 \setbox\guji@tmpbox=\hbox{\guji@oktext\hskip\guji@hanzisep}%
554 \guji@tmpdim=\wd\guji@tmpbox
555 \advance\guji@tmpdim by \guji@hoffset
556 \ifdim\guji@tmpdim > \guji@hsize % a break is required
558 \guji@hoffset=\wd\guji@tmpbox
561 \advance\guji@hoffset by \wd\guji@tmpbox
562 \unhbox\guji@tmpbox\relax
567 \expandafter\expandafter\expandafter\guji@iterate@next
573 \edef\guji@oktext{\guji@lasttext}%
574 \def\guji@lasttext{}%
575 \ifx\guji@oktext\empty
577 \setbox\guji@tmpbox=\hbox{\guji@oktext\hskip\guji@hanzisep}%
578 \guji@tmpdim=\wd\guji@tmpbox
579 \advance\guji@tmpdim by \guji@hoffset
580 \ifdim\guji@tmpdim > \guji@hsize % a break is required
582 \guji@hoffset=\wd\guji@tmpbox
585 \advance\guji@hoffset by \wd\guji@tmpbox
588 %\showbox\guji@tmpbox