名前: Dora 日時: 2010-11-15 14:26:58 IPアドレス: 121.92.88.*
いつもお世話になっております。 例えば,次のように,\vskip の後で \nopagebreak をおいても,そのタイミングでは効きません。 %%%%%%% ここからサンプルソース \documentclass{jsarticle} \newenvironment{myenvironment}{\par\vskip100pt\noindent\hrulefill\par}{\par\noindent\hrulefill\par\vskip100pt\par} \begin{document} A \vspace{400pt} \begin{myenvironment} B \end{myenvironment} \nopagebreak %%% これが効かない C \begin{myenvironment} D \end{myenvironment} E \begin{myenvironment} F \end{myenvironment} G \begin{myenvironment} H \end{myenvironment} I \end{document} %%%%%%%% ここまで もちろん, \newenvironment{myenvironment}{\par\vskip100pt\noindent\hrulefill\par}{\par\noindent\hrulefill\nopagebreak\par\vskip100pt\par} のように,\vskip する前のタイミングで \nopagebreak を置けば機能するのですが, それでは必ず \nopagebreak が効いてしまうので,ユーザーが \nopagebreak を明示的に置いた場合にだけ効くようにしたいと思っています。 考えたアイデアとしては,\everypar を利用して次の段落冒頭まで \vspace の発行を遅らせる,\vspace に代わる命令を自前で用意することです。 %%%%%%% ここからサンプルソース \documentclass{jsarticle} \newlength{\nextvspace} \def\myvspace#1{% \global\setlength{\nextvspace}{#1}% %%%% 現状の \everypar を保存 \expandafter\def \expandafter\currenteverypar \expandafter{\the\everypar}% %%%% 次の段落冒頭でスペースを空けつつ \everypar を復元 \expandafter\global \expandafter\everypar \expandafter{% \expandafter\par \expandafter\vspace \expandafter{% \expandafter\nextvspace \expandafter}% \expandafter\everypar \expandafter{\currenteverypar}% }% } \newenvironment{myenvironment2}{\par\vskip100pt\noindent\hrulefill\par}{\par\noindent\hrulefill\myvspace{100pt}\par} \begin{document} A \vspace{400pt} \begin{myenvironment2} B \end{myenvironment2} \nopagebreak %%% まだ効いていない C \begin{myenvironment2} D \end{myenvironment2} E \begin{myenvironment2} F \end{myenvironment2} G \begin{myenvironment2} H \end{myenvironment2} I \end{document} %%%%%%%% ここまで しかし,この方法もうまく機能していません。 (この方法では環境内の \everypar の設定が環境外へ漏れる,という問題もありますが,それは別にしても。) このような状況における常套手段などありましたら,ご教示頂ければ幸いです。
この書き込みへの返事: