6

Sometimes I would like to tell latex to do something after it finishes the line currently being typeset. For example, one might want to use the command \needspace{4\baselineskip} (assuming the needspace package is loaded) in the middle of a paragraph to prevent a pagebreak after the current paragraph. If done naively, this could end the current paragraph prematurely.

I know that some standard latex commands like \vspace automatically wait until the end of the current line before executing. Is there a way to mimic this behavior for other commands?

Note: Personally, I don't think a MWE is really helpful in this case. However, since I am sure someone will ask for one if I don't provide one, here is a not-entirely-minimal working example:

\documentclass[letterpaper]{article}
\usepackage{lipsum}
\usepackage{needspace}

\usepackage{amsthm}
\theoremstyle{plain}
\newtheorem{exercise}{Exercise}

\usepackage{xcolor}
\newcommand{\blank}[1]{\textcolor{white}{#1}}
%\newcommand{\blank}[1]{#1}

\begin{document}
\lipsum[1-4]
\begin{exercise}
This is an exercise that involves an equation, which is printed below.
\begin{equation}
1+1=2
\end{equation}
Please study the equation and somehow do something in the Solution box,
which may or may not be filled in depending on which line is commented out.
Please study the equation and\needspace{4\baselineskip}\noindent somehow do something in the Solution box,
which may or may not be filled in depending on which line is commented out.
\end{exercise}
\begin{proof}[Solution]
\blank{%
\lipsum[5-6]\qedhere%
}
\end{proof}
\end{document}
3
  • You'd like that the whole proof is contained in the page or the line after which you put the "adjustment" goes to the next page?
    – egreg
    Dec 10, 2012 at 22:39
  • @egreg The latter. But really, I'd like an answer to this question, not a solution to the example that does not involve answering the question. Other uses for the actual question might include wrapfigure, which by default dictates that the line write before it must break. Dec 10, 2012 at 22:43
  • @egreg: If you are interested in how to make this example work, see my answer to the question tex.stackexchange.com/q/28203/484 Dec 10, 2012 at 23:40

1 Answer 1

7

Basic answer is no. Donald Arseneau's magaz package goes to heroic lengths to apply different formatting to the first line of a paragraph. see Why does a color meant for the first typeset line *only* (with package magaz) affect the *entire* document? doing that for an arbitrary point in the paragraph would be even harder.

Note that \vspace is not executed after the line, it is executed at the point it appears but re-inserted (after the entire paragraph has been typeset) after the line that contained the original space command. (marks and inserts such as figures work similarly).

The basic point is that that the entire paragraph is set essentially as a single line, by the time the paragraph breaker is invoked to break the paragraph into lines, all macros (and assignments) have been done. The linebreaker just deals with boxes.

Note luatex provides callbacks that probably invalidate the above answer.


Note you can define commands like \vspace that insert vertical material between lines, but these are executed at the wrong place to do any kind of decisions based on the linebreaking, for example \vadjust{\hbox{hello}} will insert hello after the current line.

2

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .