Re: demobox マクロ

名前: しっぽ愛好家
日時: 2004-07-08 16:21:43
IPアドレス: 211.4.121.*

>>30186 \begin{document} の直後に \vspace*{.5\textheight} を入れてみれば, どういう状況になっているかがおわかりになることでしょう. 簡単に言えば,\demobox の定義中の \copy0 の際に“段落を開始しないで” ボックスを配置している(i.e. 垂直モードのままになっている)箇所があるので, その直後の \kern-\wd0 での移動方向が意図とは異なる方向への移動になっている, ということです. 下記の定義中にもコメントを入れていますが,段落の先頭にボックスを 配置することがあるようなマクロを定義する際には,処理開始時に \leavevmode によって段落を開始するのが常套手段です. %%% 垂直モードのままでボックスを配置してもよい場合にはこの限りでは %%% ありませんが,そのようなマクロを作成なさる方は \leavevmode の %%% 要・不要の判断は自力でできることでしょう… \makeatletter \def\dolist{\afterassignment\dodolist\let\next= } \def\dodolist{% \ifx\next\@nnil \let\next\relax \else \SP\let\next\dolist \fi \next} \def\hidehrule#1#2{% \kern-#1% \hrule height#1 depth#2 \kern-#2 } \def\hidevrule#1#2{% \kern-#1 {\dimen0=#1 \advance\dimen0 by#2\vrule width\dimen0}% \kern-#2 } \def\makeblankbox#1#2{% \hbox{% \lower\dp0 \vbox{% \hidehrule{#1}{#2}% \kern-#1 % overlap the rules at the corners \hbox to \wd0{% \hidevrule{#1}{#2}% \raise\ht0\vbox to #1{}% set the vrule height \lower\dp0\vtop to #1{}% set the vrule depth \hfil\hidevrule{#2}{#1}}% \kern-#1% \hidehrule{#2}{#1}}}} \def\maketypebox{\makeblankbox{0pt}{1pt}} \def\makelightbox{\makeblankbox{.2pt}{.2pt}} \def\SP{% \expandafter\if\space\next \ \else \setbox0=\hbox{\next}\maketypebox \fi} \def\demobox#1{% \leavevmode%%% \demobox を段落の先頭で使用することがある場合には,これが必要. \setbox0=\hbox{\dolist#1\@nnil}% \copy0\kern-\wd0 \makelightbox} %%% \@nnil は \def\@nnil{\@nil} のように定義されている LaTeX のマクロで, %%% 上記のようにトークン列の終端を表すためにしばしば用いられます. \makeatother [蛇足] 何らかのマクロが LaTeX ですでに定義されている(i.e. 再定義不可である)か 否かは,\meaning\endlist(これは,\endlist を検査する場合)の出力から 判断できます(文字列“undefined”ならば,文字通り未定義です). あるいは,\newcommand で定義してみてエラーになれば,再定義できないと みなせばよいでしょう. %%% 今回のサンプルでは list 系の環境が用いられてはいなかったので, %%% たまたま \endlist を再定義したことによる問題は顕在化しませんでしたが, %%% \endlist を再定義しては不具合がある,ということには変わりがありません.

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)