%jundline.sty %Copyright (C) 1996,1998 by Shinsaku Fujita %\typeout{juline.sty (v1.00) by Shinsaku Fujita 1996/03/31} \typeout{juline.sty (v1.00a) by Shinsaku Fujita 1998/08/26} \typeout{藤田眞作「LaTeX本づくりの八衢」第4章参照} % % v1.00a \global\dimen0などの\globalを除く % \mojitestを与えるアルゴリズム変更 % % 複数行にわたる下線を引くマクロ % % 書式: \jundline{内容} % % badnessの評価 % \def\undline@badness{2.8}%近似のために\hbadnessを100で割って三乗根をとる % (2.8)^3>(2.16)^3=10.0777 == 1000/100 % % 命令本体 % \def\jundline#1{\gdef\maemoji{}\gdef\mojitest{}\gdef\maemojitest{}% \leavevmode\hitomoji#1\endhitomoji} % % 1個の文字を下線付きで出力 % % \Printmaemoji --- 現文字の直前の文字を,禁則penaltyとともに % 出力(左寄せ) % \Printrightmaemoji --- 現文字の直前の文字を,禁則penaltyとともに % 出力(右寄せ) % \printmaemoji --- 現文字の直前の文字を,空きとともに % 出力(左寄せ) % \printpuncmaemoji --- 現文字の直前の括弧類を,空きとともに % 出力(左寄せ) \def\Printmaemoji{\hbox{\maemoji% \kern-\dimen0\lower0.33em\hbox{\vrule width\dimen0 height0.4pt}}} \def\Printrightmaemoji{\hbox to\dimen0{\hss\maemoji}% \kern-\dimen0\lower0.33em\hbox{\vrule width\dimen0 height0.4pt}} \def\printmaemoji{% \hbox to\dimen0{\maemoji\hss}% \kern-\dimen0\lower0.33em\hbox{\vrule width\dimen0 height0.4pt}% \dimen2= \undline@badness\dimen2% \xleaders\hbox{\ul@linebox{\dimen2}}\hskip\dimen2% \hskip-\dimen2\relax} % 1998/8/28 by SF %\def\ul@linebox#1{\lower0.33em\hbox{\vrule width#1 height0.05em}} \def\ul@linebox#1{\lower0.33em% \hbox{\vrule width#1 height0.4pt}} \def\printpuncmaemoji{% \setbox0=\hbox{\maemoji\hss}% \copy0% \kern-\wd0\lower0.33em\hbox{\vrule width\wd0 height0.4pt}% \advance\dimen0-\wd0% \advance\dimen0 \undline@badness\dimen2% \xleaders\hbox{\ul@linebox{\dimen0}}\hskip\dimen0% \hskip-\dimen0\relax} % % 和字--欧文,括弧和字--欧字などの,分離禁則かどうかを調べる. % 分離禁則ならば\nonxk@anjitrueとする % ---あとで\penalty 10000を入れる % 分離禁則でないならば\nonxk@anjifalseとする % ---あとで\xkanjiskipを入れる % \newif\ifnonxk@nji \nonxk@njifalse \def\testxk@nji#1#2{% \setbox0=\hbox{#1}\setbox1=\hbox{#2}\setbox2=\hbox{#1#2}% \dimen3=\wd2 \advance\dimen3-\wd0 \advance\dimen3-\wd1\relax \ifdim\dimen3<0.01pt \global\nonxk@njitrue\else\global\nonxk@njifalse\fi} % % 内部命令 % \def\hitomoji#1{% \dimen2=0pt% \ifx#1\endhitomoji%最後尾の処理 \setbox0=\hbox{\maemoji}% \copy0% \kern-\wd0\lower0.33em\hbox{\vrule width\wd0 height0.4pt}% \ifcase\mojitest%和字 \def\u@line{\hskip\kanjiskip}% \or%句読点 \def\u@line{\hskip.5zw\hskip\kanjiskip}% \or%始め括弧類 \def\u@line{\penalty\@M}% \or%そのほか \def\u@line{}% \fi \else% \setbox0=\hbox{#1}\setbox1=\hbox{#1\null}\setbox2=\hbox{\null#1}% \dimen3=1zw \advance\dimen3 by-\wd0\relax \dimen4=1zw \advance\dimen4 by-\wd1\relax \dimen5=1zw \advance\dimen5 by-\wd2\relax %\ifdim\wd0=1zw\gdef\mojitest{0}%通常の和字 \ifdim\dimen3<0.01pt\gdef\mojitest{0}%通常の和字 \dimen1=\wd0 \else %\ifdim\wd1=1zw\gdef\mojitest{1}%句読点類 \ifdim\dimen4<0.01pt\gdef\mojitest{1}%句読点類 \dimen1=\wd1 %\else\ifdim\wd2=1zw\gdef\mojitest{2}%始め括弧類 \else\ifdim\dimen5<0.01pt\gdef\mojitest{2}%始め括弧類 \dimen1=\wd2 \else\gdef\mojitest{3}%そのほか %\ifmmode \typeout{数式}\fi \dimen1=\wd0 \fi\fi\fi \ifx\maemojitest\empty\else \ifcase\maemojitest% \ifcase\mojitest%和字--和字 \dimen2=.5pt \printmaemoji \hskip\kanjiskip \or%和字--句読点類 \Printmaemoji \penalty\@M \or%和字--始め括弧 \dimen2=.5pt \printmaemoji \hskip\kanjiskip \or%和字--その他 \testxk@nji{\maemoji}{#1}% \ifnonxk@nji \Printmaemoji \penalty\@M \else \advance\dimen0 by.25zw \dimen2=.1zw \printmaemoji \hskip\xkanjiskip \fi\fi \or \ifcase\mojitest%句読点--和字 \dimen2=.5pt \printpuncmaemoji \hskip\kanjiskip \or%句読点--句読点類 \Printmaemoji \penalty\@M \or%句読点--始め括弧 \advance\dimen0 by.25zw \dimen2=.1zw \printpuncmaemoji \hskip\kanjiskip \or%句読点--その他 \testxk@nji{\maemoji}{#1}% \ifnonxk@nji \Printmaemoji \penalty\@M \else \advance\dimen0 by.25zw \dimen2=.1zw \printpuncmaemoji \hskip\xkanjiskip \fi\fi \or \ifcase\mojitest%始め括弧類--和字 \Printrightmaemoji \penalty\@M \or%始め括弧類--句読点類 \Printrightmaemoji \penalty\@M \or%始め括弧類--始め括弧 \Printrightmaemoji \penalty\@M \or%始め括弧類--その他 \Printrightmaemoji \penalty\@M \fi \or \ifcase\mojitest%その他--和字 \testxk@nji{\maemoji}{#1}% \ifnonxk@nji \Printmaemoji \penalty\@M \else \advance\dimen0 by.25zw \dimen2=.1zw \printmaemoji \hskip\xkanjiskip \fi \or%その他--句読点類 \Printmaemoji \penalty\@M \or%その他--始め括弧 \testxk@nji{\maemoji}{#1}% \ifnonxk@nji \Printmaemoji \penalty\@M \else \dimen2=.5pt \printmaemoji \hskip\xkanjiskip \fi \or%その他--その他 \let\@sf=\empty \ifhmode\edef\@sf{\spacefactor=\the\spacefactor}\fi \printmaemoji \@sf \fi\fi %%\let\maemojitest=\mojitest \fi \let\u@line=\hitomoji \gdef\maemoji{#1}% \let\maemojitest=\mojitest \dimen0=\dimen1\fi\u@line} \endinput