我已经定义了如下命令
\newsavebox{\textsix}
\newcommand{\bottomr}[1]{\sbox{\textsix}{\parbox{11cm}{\begin{flushright} #1
\end{flushright}}}}
将命令的参数(文本)保存 \bottomr
到\sbox
,可以与\usebox{\textsix}
我想将其转换为类似的环境
\newsavebox{\textsix}
\newenvironment{bottomr}{ }{ }
捕获环境中的文本bottomr
并将其保存到\sbox
近似值中,如下所示
\documentclass[a4paper{article}
\usepackage{lipsum}
\begin{document}
\newsavebox{\textsix}
\newenvironment{bottomr}{?}{?}
\begin{bottomr}
\lipsum[1]
\end{bottomr}
\usebox{\textsix}
\end{document}
答案1
的环境形式\sbox
是 环境lrbox
。minipage
可以使用 环境 代替 命令\parbox
。环境flushright
不是必需的,因为有 命令形式\raggedleft
。
\documentclass[a4paper]{article}
\usepackage{lipsum}
\begin{document}
\newsavebox{\textsix}
\newenvironment{bottomr}{%
\begin{lrbox}{\textsix}%
\begin{minipage}{11cm}%
\raggedleft
}{%
\end{minipage}%
\end{lrbox}%
% export box register setting outside the scope of the environment
\global\setbox\textsix=\copy\textsix
}
\begin{bottomr}
\lipsum[1]
\end{bottomr}
\usebox{\textsix}
\end{document}
答案2
遵循以下指导原则如何在不进行分组的情况下在宏中收集 LaTeX 环境的内容?,这是一个environ
方法:
\documentclass{article}
\usepackage{lipsum,environ}
\newsavebox{\textsix}
\NewEnviron{bottomr}[1][11cm]{%
\expandafter\gdef\expandafter\envBODY\expandafter{\BODY}% Store body
\gdef\dolaterbottomr{\savebox\textsix{\parbox{#1}{\raggedleft\strut\envBODY\strut}}}
\aftergroup\dolaterbottomr%
}
\begin{document}
\begin{bottomr}
\lipsum*[2]
\end{bottomr}
\lipsum*[1]\strut
\usebox{\textsix}
\lipsum[3]
\end{document}
我添加了一个可选参数来指定宽度\parbox
(默认值为11cm
),以及一些\strut
s 来管理段落开始/结束处的基线。我不知道这是否有必要。