4

This is a follow up to my earlier question Bump right-aligned text to next line iff no room. The difference now is that I need to place this formatted text within a \savebox. In my actual use case, for performance reasons, I am caching the text that needs to follow existing text (i.e., on the same line), and this cached text contains some text that is to be right aligned to the edge of the page.

I attempted to use all four solutions at Bump right-aligned text to next line iff no room along with a simple \hfill. These all seems to work when used outside of the \savebox, but not when inside the \savebox:

enter image description here

Notes:

  • I can not use \parbox{\linewidth}{} as I don't know where on the line the \savebox will start. That is, there is text on the same line before the \usebox is applied.
  • The desired version would have the XXX aligned on the right as is the ZZZ text.

Code:

\documentclass{article}
\usepackage{showframe}

\newsavebox{\MyCachedResults}

% The following are from % https://tex.stackexchange.com/questions/91548/bump-right-aligned-text-to-next-line-iff-no-room

\newcommand{\BumpCarlisle}[1]{% https://tex.stackexchange.com/a/91556/4301 {\rightskip\fill\parfillskip-\rightskip \linepenalty100 \exhyphenpenalty0 \linebreak[0] % <-- Need space here %Space before \hspace allows for a break before it \hspace*{\fill}#1}% }

\newcommand*{\FillLineEgreg}[1]{% https://tex.stackexchange.com/a/91564/4301 {% \nobreak\hfill\penalty50\hskip1em\null\nobreak \hfill#1% \parfillskip=0pt \finalhyphendemerits=0 \par% }% }

\newcommand{\signed}[1]{%https://tex.stackexchange.com/a/91563/4301 {% \leavevmode\unskip\nobreak\hfil\penalty50\hskip2em \hbox{}\nobreak\hfil#1% \parfillskip=0pt \finalhyphendemerits=0 \endgraf% }% }

\newcommand{\FillLineTohecz}[1]{% \raggedright \parfillskip-\rightskip \looseness=-1 % <-- Need space here %Space before \hspace allows for a break before it \hspace*{0pt plus 1fil}% #1% }

\begin{document}

\bigskip\noindent \savebox{\MyCachedResults}{Inside Savebox Carlisle: \BumpCarlisle{XXX}}% Outside Savebox Carlisle: \BumpCarlisle{ZZZ}\par \noindent Text \usebox{\MyCachedResults}%

\bigskip\noindent \savebox{\MyCachedResults}{Inside Savebox egreg: \FillLineEgreg{XXX}}% Outside Savebox egreg: \FillLineEgreg{ZZZ}\par \noindent Some Text \usebox{\MyCachedResults}%

\bigskip\noindent \savebox{\MyCachedResults}{Inside Savebox Seamus: \signed{XXX}}% Outside Savebox Seamus: \signed{ZZZ}\par \noindent A bit of text \usebox{\MyCachedResults}%

\bigskip\noindent \savebox{\MyCachedResults}{Inside Savebox tohecz: \FillLineTohecz{XXX}}% Outside Savebox tohecz: \FillLineTohecz{ZZZ}\par \noindent Text before the bump \usebox{\MyCachedResults}%

\bigskip\noindent \savebox{\MyCachedResults}{Inside Savebox hfill: \hfill XXX}% Outside Savebox hfill: \hfill ZZZ\par \noindent Some more text \usebox{\MyCachedResults}%

\end{document}

Peter Grill
  • 223,288

2 Answers2

5

An option using a \parbox of width given by linegoal from the linegoal package:

\documentclass{article}
\usepackage{showframe}
\usepackage{linegoal}

\newsavebox{\MyCachedResults}

% The following are from
%    http://tex.stackexchange.com/questions/91548/bump-right-aligned-text-to-next-line-iff-no-room

\newcommand*{\BumpCarlisle}[1]{% http://tex.stackexchange.com/a/91556/4301
    {\rightskip\fill\parfillskip-\rightskip
    \linepenalty100
    \exhyphenpenalty0
    \linebreak[0] % <-- Need space here
    %Space before \hspace* allows for a break before it
    \hspace*{\fill}#1}%
}

\newcommand*{\FillLineEgreg}[1]{% http://tex.stackexchange.com/a/91564/4301
    {%
        \nobreak\hfill\penalty50\hskip1em\null\nobreak
        \hfill#1%
        \parfillskip=0pt \finalhyphendemerits=0 \par%
     }%
}


\newcommand{\signed}[1]{%http://tex.stackexchange.com/a/91563/4301
    {%
        \leavevmode\unskip\nobreak\hfil\penalty50\hskip2em
        \hbox{}\nobreak\hfil#1%
        \parfillskip=0pt \finalhyphendemerits=0 \endgraf%
    }%
}

\newcommand*{\FillLineTohecz}[1]{%
    \raggedright
    \parfillskip-\rightskip
    \looseness=-1 % <-- Need space here
    %Space before \hspace* allows for a break before it
    \hspace*{0pt plus 1fil}%
    #1% 
}

\begin{document}

\bigskip\noindent
\savebox{\MyCachedResults}{\parbox[t]{\linegoal}{Inside Savebox Carlisle: \BumpCarlisle{XXX}}}%
Outside Savebox Carlisle: \BumpCarlisle{ZZZ}\par
\noindent
Text \usebox{\MyCachedResults}%

\bigskip\noindent
\savebox{\MyCachedResults}{\parbox[t]{\linegoal}{Inside Savebox egreg: \FillLineEgreg{XXX}}}%
Outside Savebox egreg: \FillLineEgreg{ZZZ}\par
\noindent
Some Text \usebox{\MyCachedResults}%

\bigskip\noindent
\savebox{\MyCachedResults}{\parbox[t]{\linegoal}{Inside Savebox Seamus: \signed{XXX}}}%
Outside Savebox Seamus: \signed{ZZZ}\par
\noindent
A bit of text \usebox{\MyCachedResults}%

\bigskip\noindent
\savebox{\MyCachedResults}{\parbox[t]{\linegoal}{Inside Savebox tohecz: \FillLineTohecz{XXX}}}%
Outside Savebox tohecz: \FillLineTohecz{ZZZ}\par
\noindent
Text before the bump \usebox{\MyCachedResults}%

\bigskip\noindent
\savebox{\MyCachedResults}{\parbox[t]{\linegoal}{Inside Savebox hfill: \hfill XXX}}%
Outside Savebox hfill: \hfill ZZZ\par
\noindent
Some more text \usebox{\MyCachedResults}%

\end{document}

enter image description here

Gonzalo Medina
  • 505,128
2

enter image description here

\documentclass{article}
\usepackage{showframe}

\newsavebox{\MyCachedResults}

% The following are from
%    http://tex.stackexchange.com/questions/91548/bump-right-aligned-text-to-next-line-iff-no-room

\newcommand*{\BumpCarlisle}[1]{% http://tex.stackexchange.com/a/91556/4301
    {\rightskip\fill\parfillskip-\rightskip
    \linepenalty100
    \exhyphenpenalty0
    \linebreak[0] % <-- Need space here
    %Space before \hspace* allows for a break before it
    \hspace*{\fill}#1}%
}


\begin{document}

\bigskip\noindent
\savebox{\MyCachedResults}{Inside Savebox Carlisle: \BumpCarlisle{XXX}}%
Outside Savebox Carlisle: \BumpCarlisle{ZZZ}\par
\noindent
Text \unhbox\MyCachedResults

\end{document}
David Carlisle
  • 757,742
  • Does \unhbox preserve penalties? – egreg Mar 13 '14 at 10:27
  • @egreg You shouldn't ask trick questions:-) \unhbox preserves all penalties that are in the box but the savebox (setbox) in an unfortunate premature optimisation when building the inner horizontal list doesn't add penalties and language nodes that would be added to an outer horizontal list in what latex calls par mode. – David Carlisle Mar 13 '14 at 10:31