将 \newcommand 转换为 \newenvironment

将 \newcommand 转换为 \newenvironment

我已经定义了如下命令

\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是 环境lrboxminipage可以使用 环境 代替 命令\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),以及一些\struts 来管理段落开始/结束处的基线。我不知道这是否有必要。

相关内容