OSDN Git Service

test/zh/warichu-test: an example in LaTeX
[luatex-ja/luatexja.git] / test / zh / warichu-test / ltj-warichu.sty
1 \catcode`@=11
2 \ifx\LaTeX\@undefined
3 \def\@nnil{\@nil}%
4 \def\@empty{}%
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}
10   \fi}%
11 \long\def\@forloop#1,#2,#3\@@#4#5{%
12   \def#4{#1}
13   \ifx #4\@nnil \else
14        #5\def#4{#2}
15     \ifx #4\@nnil 
16       \else#5\@iforloop #3\@@#4{#5}
17     \fi
18   \fi}%
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{%
29   \let\reserved@d=#1%
30   \def\reserved@a{#2}%
31   \def\reserved@b{#3}%
32   \futurelet\@let@token\@ifnch}
33 \def\@ifnch{%
34   \ifx\@let@token\@sptoken
35     \let\reserved@c\@xifnch
36   \else
37     \ifx\@let@token\reserved@d
38       \let\reserved@c\reserved@a
39     \else
40       \let\reserved@c\reserved@b
41     \fi
42   \fi
43   \reserved@c}
44 \def\:{\let\@sptoken= } \:  % this makes \@sptoken a space token
45 \def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@token\@ifnch}
46 \fi % end if
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
53 \newif\ifisinset
54 \long\def\testinset#1#2{% return whether #1 is in the set of #2, result stored in \ifisinset
55   \isinsetfalse
56   \ifx#1\par
57   \else
58     \expandafter\@tfor\expandafter\testinset@member
59     \expandafter:\expandafter=#2\do{%
60       \if\testinset@member #1%
61         \isinsettrue
62       \fi
63     }%
64   \fi
65 }
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}%
71 }
72 \fi
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}%
76   }%
77 }
78 \def\testbreak#1#2#3{% #1: \output  #2: \lasttext  #3:\nowchar  return \output if breakable
79   \def#1{}%
80   \ifx\@empty#2%
81     \edef#2{#3}%
82   \else
83     \getlastelem{#2}\lastchar
84     \testinset\lastchar\lineendforbid
85     \ifisinset   % \lastchar is a line-end prohibition, which cannot be at the end of line
86       \edef#2{#2#3}%
87     \else
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
92           \edef#2{#2#3}%
93         \else       % \nowchar is not a line-start prohibition. Can break after \lasttext
94           \edef#1{#2}%
95           \edef#2{#3}%
96         \fi
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
100           \edef#2{#2#3}%
101         \else       % \nowchar is not a line-start prohibition. Can break after \lasttext
102           \edef#1{#2}%
103           \edef#2{#3}%
104         \fi
105       \fi
106     \fi
107   \fi
108 }
109 %%  list manipulation module
110 \def\getnumofelem#1#2{%  return the num of element of #1, stored in counter #2
111   #2=0
112   \if!#1!% test whether #1 is non-empty
113   \else
114     \expandafter\@for\expandafter\getnumofelem@member
115     \expandafter:\expandafter=#1\do{%
116       \advance#2 by 1
117     }%
118   \fi
119 }
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}%
127     \fi
128     \advance\getforitem@tmpcount by 1
129   }%
130 }
131 \fi
132
133 \input ltj-warichu-hsplit.sty
134
135 \newdimen\guji@hsize
136 \newdimen\guji@hoffset
137 \newdimen\guji@twolineraise
138 \newdimen\guji@hfuzz
139 \newskip\guji@hanzisep
140 \newbox\guji@savebox
141 \newif\ifguji@debug
142 \newif\ifguji@heavydebug
143 \newdimen\guji@tmpdim
144 \newdimen\guji@tmpdil
145 \newcount\guji@tmpcount
146 \newbox\guji@tmpbox
147 \newbox\guji@tmpboy
148 \newtoks\guji@everytwolinemode
149 \newtoks\guji@everycommand
150 \guji@debugtrue
151 \guji@heavydebugfalse
152 \guji@hanzisep=0pt plus 0.1em minus 0.1em
153 \guji@twolineraise=-.3ex
154 \guji@hfuzz=0.4em
155 \guji@everytwolinemode={\fiverm\baselineskip=6pt}
156 \guji@everycommand={\parindent=2em\indent}
157 \def\guji{%
158   \begingroup
159   \ifdefined\eh@everypar\let\everypar\eh@everypar\fi% temporary disable everyhook package
160   \everypar{\guji@iterate}%
161   \everyvbox{\everypar{}}%
162   \guji@hsize=\hsize
163   \parindent=0pt
164   \guji@hoffset=0pt
165   \rightskip=0pt plus 0.1em minus 0.1em
166   \def\guji@oktext{}%
167   \def\guji@lasttext{}%
168   \guji@makespecials
169   \guji@adjustsectioncmd
170   \endgraf
171 }
172 \def\guji@adjustcmd#1#2{%
173   \ifx#1\@undefined
174   \else
175     \let#2=#1%
176     %\def#1{{\ifvmode\vskip -\baselineskip\vskip -\parsep\fi}\leavevmode #2}%
177     \def#1{\leavevmode #2}%
178   \fi
179 }
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
187 }
188 {\catcode`\|=\active
189 %\catcode`\<=\active
190 %\catcode`\>=\active
191 \gdef\guji@makespecials{%
192   \catcode`\|=\active
193   \let|\guji@special
194 }%
195 }
196 \def\guji@special{%
197   \@ifnextchar[{\guji@sp@cial}{\guji@twolinemode}% ]
198 }
199 \def\guji@sp@cial[#1]#2{% #1 is a comma-seperated list of command names
200   \ifguji@debug
201     \message{special \meaning #1 \meaning #2}%
202   \fi
203   %\leavevmode
204   \begingroup
205   \everypar={}%
206   \leavevmode
207   \getnumofelem{#1}\guji@tmpcount%
208   \ifcase\guji@tmpcount
209     \ifguji@debug
210       \message{Zero}% just a local group
211     \fi
212     \def\guji@lasttext{{#2}}%
213     \guji@flush
214   \or
215     \ifguji@debug
216       \message{One}%  a command that applies to the entire #2
217     \fi
218     \def\guji@lasttext{{\csname #1\endcsname{#2}}}%
219     \guji@flush
220   \or
221     \ifguji@debug
222       \message{Two}% execute the first command, then apply the second to #2
223     \fi
224     \csname #1\endcsname
225     \def\guji@lasttext{{\csname #1\endcsname{#2}}}%
226     \guji@flush
227   \or
228     \ifguji@debug
229       \message{Three}%  #1,#2,#3, apply #1 #2 #3 to the first, middle, last char
230     \fi
231     % if #1 empty, #1<-#2; if #3 empty, #3<-#2
232     \def\guji@sp@docmd##1##2{%
233       \def\guji@lasttext{{##1{##2}}}%
234       \guji@flush
235     }%
236     \guji@hanzisep=0pt
237     \guji@sp@cial@three[#1]#2\end
238   \else
239     \errmessage{guji@sp@cial: Unsupported option #1.}%
240   \fi
241   \global\guji@tmpdim=\guji@hoffset
242   \endgroup
243   \hskip\guji@hanzisep
244   \guji@hoffset=\guji@tmpdim
245   \guji@iterate % continue to iterate
246 }
247 \def\guji@sp@cial@three[#1,#2,#3]#4#5\end{%
248   \expandafter\let\expandafter\guji@sp@middle\csname #2\endcsname
249   \if!#1!% #1 is empty
250     \let\guji@sp@first=\guji@sp@middle
251   \else
252     \expandafter\let\expandafter\guji@sp@first\csname #1\endcsname
253   \fi
254   \if!#3!% #3 is empty
255     \let\guji@sp@last=\guji@sp@middle
256   \else
257     \expandafter\let\expandafter\guji@sp@last\csname #3\endcsname
258   \fi
259   \ifguji@heavydebug
260     \message{first is #4 by \meaning\guji@sp@first}%
261   \fi
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
269     \else
270       \expandafter\guji@sp@docmd\expandafter\guji@sp@middle
271       \expandafter{\guji@sp@midtext}%
272       \ifguji@heavydebug
273         \message{middle is \guji@sp@midtext by \meaning\guji@sp@middle}%
274       \fi
275     \fi
276   }%
277   \expandafter\guji@sp@docmd\expandafter\guji@sp@last
278   \expandafter{\guji@sp@lasttext}%
279   \ifguji@heavydebug
280     \message{last is \guji@sp@lasttext by \meaning\guji@sp@last}%
281   \fi
282 }
283 \def\guji@twoline@sp@cial[#1]#2{% #1 is a comma-seperated list of command names
284   \ifguji@debug
285     \message{special \meaning #1 \meaning #2}%
286   \fi
287   \getnumofelem{#1}\guji@tmpcount%
288   \ifcase\guji@tmpcount
289     \ifguji@debug
290       \message{Zero}% just a local group
291     \fi
292     \setbox\guji@savebox=\hbox{\unhbox\guji@savebox{#2}\allowbreak\hskip\guji@hanzisep}%
293   \or
294     \ifguji@debug
295       \message{One}%  a command that applies to the entire #2
296     \fi
297     \setbox\guji@savebox=\hbox{\unhbox\guji@savebox{{\csname #1\endcsname{#2}}}\allowbreak\hskip\guji@hanzisep}%
298   \or
299     \ifguji@debug
300       \message{Two}% execute the first command, then apply the second to #2
301     \fi
302     \csname #1\endcsname
303     \setbox\guji@savebox=\hbox{\unhbox\guji@savebox{{\csname #1\endcsname{#2}}}\allowbreak\hskip\guji@hanzisep}%
304   \or
305     \ifguji@debug
306       \message{Three}%  #1,#2,#3, apply #1 #2 #3 to the first, middle, last char
307     \fi
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}%
311     }%
312     \guji@sp@cial@three[#1]#2\end
313   \else
314     \errmessage{guji@twoline@sp@cial: Unsupported option #1.}%
315   \fi
316   \guji@twoline@iterate % continue to iterate
317 }
318 \def\guji@twolinemode#1{%
319   \begingroup
320   \everypar={}%
321   \parindent=0pt
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
327   %(#1)%
328   \guji@twoline@iterate
329   #1\guji@twoline@enditer
330   \global\guji@tmpdim=\guji@hoffset
331   \endgroup
332   \guji@hoffset=\guji@tmpdim
333   \guji@iterate % continue to iterate
334 }
335 \def\guji@twoline@iterate#1{%
336   %\message{iterating \meaning#1}%
337   \ifx #1\guji@twoline@enditer
338     \guji@twoline@enditer
339   \else
340     \let\guji@twoiter@next\guji@twoline@iterate
341     \ifx#1\guji@special
342       %\guji@twoline@flush
343       \let\guji@twoiter@next\guji@special
344     \else
345       \testbreak\guji@oktext\guji@lasttext{#1}%
346       \ifx\guji@oktext\empty
347       \else
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
357           \guji@twoline@flush
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}%
360         \else
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}%
363         \fi
364       \fi
365     \fi
366     \expandafter\guji@twoiter@next
367   \fi
368 }
369 \def\guji@twoline@flush{%  \guji@tmpdim is required to be presetted
370   \ifguji@debug
371     \message{flush it}%
372   \fi
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
381   %\else
382   %  \advance\guji@tmpdim by \wd\guji@tmpbox
383   %  \divide\guji@tmpdim by 2
384   %\fi
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}%
389       \message{1<2}%
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
393       \fi
394     \else % the first box is longer than the second
395       \message{1>2}%
396       \advance\guji@tmpdim by \guji@hoffset
397       \ifdim\guji@tmpdim > \guji@hsize % at the end of line, should break in advance
398         \message{eol}%
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
412         \fi
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}%
417         \else
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{}%
423         \fi
424         %\showbox\guji@tmpboy
425         %\showbox\guji@savebox
426       \else
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{}%
431       \fi
432     \fi
433   \else
434     \message{normal}%
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{}%
438   \fi
439   \setbox\guji@tmpbox=\hbox to \guji@tmpdim{\vbox{\hsize=\guji@tmpdim
440     \nointerlineskip\box\guji@tmpbox\box\guji@tmpboy}}%
441   \leavevmode
442   \raise\guji@twolineraise\box\guji@tmpbox
443   \hskip\guji@hanzisep
444   \advance\guji@hoffset by \guji@tmpdim
445   \ifx\guji@twoline@break\break
446     \penalty -9999  % issue a break
447     \guji@hoffset=0pt
448   \else
449     \guji@tmpdim=\guji@hoffset
450     \advance\guji@tmpdim by \guji@hfuzz
451     \ifdim\guji@tmpdim > \guji@hsize
452       \penalty -9999  % issue a break
453       \guji@hoffset=0pt
454     \fi
455   \fi
456 }
457 \def\guji@twoline@enditer{%
458   %\message{end iter}%
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
465   \loop
466     %\message{LOOP}%
467     \setbox\guji@tmpboy=\copy\guji@savebox
468     \hsplit\guji@tmpboy\to\guji@tmpdim\into\guji@tmpbox
469     %\message{SPLITTED}%
470     \guji@tmpdil=\wd\guji@tmpbox
471     \ifdim\guji@tmpdil < \wd\guji@tmpboy % failed
472       \global\advance\guji@tmpdim by 0.5ex
473       %\message{REPEAT}%
474   \repeat
475   %\showbox\guji@tmpbox
476   \guji@twoline@flush
477   \relax
478   %\message{iteration ended}%
479 }
480 \def\guji@docommand{%
481   \ifguji@debug
482     \message{Starting do command \meaning\guji@whatcmd}%
483   \fi
484   \def\guji@whatparam{}%
485   \futurelet\guji@nextchar\guji@d@command
486 }
487 \def\guji@d@command{%
488   \ifcat\noexpand\guji@nextchar\bgroup
489     \let\guji@docmd@next\guji@docmd@saveparam
490   \else
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
495       \fi
496     \fi
497   \fi
498   \guji@docmd@next
499 }
500 \long\def\guji@docmd@saveparam#1{%
501   \ifguji@debug
502     \message{Param #1 saved}%
503   \fi
504   \edef\guji@whatparam{\guji@whatparam{#1}}%
505   \futurelet\guji@nextchar\guji@d@command
506 }
507 \def\guji@docomm@nd{%
508   \ifguji@debug
509     \message{Now doing command}%
510   \fi
511   \ifx\guji@whatcmd\unhbox
512     \expandafter\def\expandafter\guji@whatparam\guji@whatparam
513   \fi
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
518   \else
519     \begingroup
520       \everypar{}%
521       \the\guji@everycommand
522       \expandafter\guji@whatcmd\guji@whatparam
523       \endgraf
524     \endgroup
525   \fi
526   \guji@hoffset=0pt
527   \guji@iterate
528 }
529 \long\def\guji@iterate#1{%
530   %\message{ITERATing \meaning#1}%
531   \ifx #1\par
532     \guji@flush
533     \par
534     \guji@hoffset=0pt
535   \else
536     \ifx #1\endguji
537       \endguji
538     \else
539       \let\guji@iterate@next\guji@iterate
540       \ifx#1\guji@special
541         \guji@flush
542         \let\guji@iterate@next\guji@special
543       \else
544         \ifcat\noexpand#1\relax % test if it's a command
545           \guji@flush
546           \let\guji@whatcmd=#1%
547           \let\guji@iterate@next\guji@docommand
548         \else
549           \testbreak\guji@oktext\guji@lasttext{#1}%
550           \ifx\guji@oktext\empty
551           \else
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
557               \penalty -\@M
558               \guji@hoffset=\wd\guji@tmpbox
559               \unhbox\guji@tmpbox
560             \else
561               \advance\guji@hoffset by \wd\guji@tmpbox
562               \unhbox\guji@tmpbox\relax
563             \fi
564           \fi
565         \fi
566       \fi
567       \expandafter\expandafter\expandafter\guji@iterate@next
568       \expandafter
569     \fi
570   \fi
571 }
572 \def\guji@flush{%
573   \edef\guji@oktext{\guji@lasttext}%
574   \def\guji@lasttext{}%
575   \ifx\guji@oktext\empty
576   \else
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
581       \penalty -\@M
582       \guji@hoffset=\wd\guji@tmpbox
583       \unhbox\guji@tmpbox
584     \else
585       \advance\guji@hoffset by \wd\guji@tmpbox
586       %\show\guji@oktext
587       \unhbox\guji@tmpbox
588       %\showbox\guji@tmpbox
589     \fi
590     \def\guji@oktext{}%
591   \fi
592 }
593 \def\endguji{%
594   \guji@flush
595   \endgroup
596 }
597 \fi