
Это продолжение моего предыдущего вопросаПереместить выровненный по правому краю текст на следующую строку, если нет места. Разница теперь в том, что мне нужно поместить этот отформатированный текст в \savebox
. В моем реальном варианте использования, из соображений производительности, я кэширую текст, который должен следовать за существующим текстом (т. е. на той же строке), и этот кэшированный текст содержит некоторый текст, который должен быть выровнен по правому краю страницы.
Я попытался использовать все четыре решения одновременно.Переместить выровненный по правому краю текст на следующую строку, если нет меставместе с простым \hfill
. Все это, кажется, работает при использовании вне \savebox
, но не внутри \savebox
:
Примечания:
- Я могунетиспользовать
\parbox{\linewidth}{}
, так как я не знаю, где на строке начнется\savebox
. То есть, есть текст на той же строкедоприменяется\usebox
. - Желаемая версия будет иметь
XXX
выравнивание по правому краю, как иZZZ
текст.
Код:
\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}
решение1
Вариант с использованием \parbox
ширины, заданной linegoal
изlinegoal
упаковка:
\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}
решение2
\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}