在自定义环境中使用 makebox

在自定义环境中使用 makebox

我正在开发一个自定义环境,它可能会变得更大\textwidth(所以\centering不起作用),但仍然应该居中。我目前正在手动包装它,\makebox但更愿意将其包含在环境定义中。有什么办法可以做到这一点,或者实现类似的效果吗?

\newenvironment{myenv}{%
  %start
}{%
  %end
}
%use \makebox manually to center environment
\makebox[\textwidth][c]{%
  \begin{myenv}
    %some content here
  \end{myenv}
}

答案1

一个简单的实现:

\documentclass{article}
\usepackage[showframe]{geometry}% <-- for the example
\usepackage{lipsum}%              <-- for the example
\usepackage[strict]{changepage}
\usepackage{varwidth}
\newlength\myenvlen
\newenvironment{myenv}[2][\textwidth]%
  {%
    \setlength\myenvlen{#2}%
    \begin{adjustwidth}{-#2}{-#2}%
      \centering
      \begin{varwidth}{\dimexpr #1 + 2\myenvlen\relax}%
  }%
  {\end{varwidth}%
   \end{adjustwidth}}

\begin{document}

\lipsum[1]

\begin{myenv}{1cm}
\lipsum[1]
\end{myenv}

\begin{myenv}[.8\textwidth]{0pt}
\lipsum[1]
\end{myenv}

\begin{myenv}{5em}
\lipsum[1]
\end{myenv}

\lipsum[1]

\end{document}

可以进行改进,但基本思想是第一个可选参数是当您想要拥有小于 的\textwidth环境时,而第二个参数是您想要增加环境的值(在主体的每一侧)。如果环境通常小于\textwidth,您可能希望切换哪一个是可选的,哪一个是必需的。

答案2

如果您只是想拥有一个可以传递内容的环境,那么\makebox您可以使用environ在宏中提供环境内容的包\BODY。如果文本可能变得比下面环境中的文本更大\textwidth,那么您需要使用。\parboxmyenvPar

但是,您也可以在 MWE 中用作(用于短文本)和(如果有可能是长文本)环境\centeringCenteredEnvironmentCenteredEnvironmentPar

在此处输入图片描述

笔记:

  • 包裹showframe 仅用于显示页边距。实际使用中不需要它。
  • 和不需要包CenteredEnvironmentCenteredEnvironmentParenviron

代码:

\documentclass{article}
\usepackage{showframe}
\usepackage{environ}

\newcommand*{\Text}{%
Lorem ipsum dolor sit amet, con- sectetuer adipiscing elit. 
Ut purus elit, vestibulum ut, placerat ac, adip- iscing vitae, felis. Curabitur dictum gravida mauris.
}

\NewEnviron{myenv}{%
  \noindent\makebox[\textwidth][c]{\BODY}%
}

\newenvironment{CenteredEnvironment}{%
    \centering\noindent\ignorespaces%
}{%
    \par%
}

\NewEnviron{myenvPar}[2]{%
    \centering\noindent\parbox{#1}{\ignorespaces#2}\par%
}


\newcommand{\SavedSize}{}
\newcommand{\SavedText}{}
\newenvironment{CenteredEnvironmentPar}[2]{%
    \def\SavedSize{#1}%
    \def\SavedText{#2}%
}{%
    \centering\noindent\ignorespaces\parbox{\SavedSize}{\SavedText}\par%
}




\begin{document}
\begin{myenv}%
    some centered content here
\end{myenv}

\begin{CenteredEnvironment}
    some centered content here
\end{CenteredEnvironment}

\bigskip 
\begin{myenvPar}{6.0cm}
    \Text
\end{myenvPar}

\medskip
\begin{CenteredEnvironmentPar}{6.0cm}
    \Text
\end{CenteredEnvironmentPar}
\end{document}

答案3

这是一个tcolorbox解决方案。它具有高度可定制性,您可以添加框架、背景颜色、跨页面可拆分等。

\documentclass{article}
\usepackage[showframe]{geometry}% <-- for the example
\usepackage{lipsum}%              <-- for the example
\usepackage[most]{tcolorbox}
\newtcolorbox{myenv}[2][]{
  boxrule = 0pt,
  colback=white,
  grow to left by=#2,
  grow to right by=#2,
  left=1.6pt,
  right=1.6pt,
  top=0pt,
  bottom=0pt,
  arc=0pt,
  breakable,
  enhanced jigsaw,
  %center upper,  %% if you want content to be centered too
  #1
}

\begin{document}

\lipsum[1]

\begin{myenv}{1cm}
\lipsum[1]
\end{myenv}

\begin{myenv}{-1cm}
\lipsum[1]
\end{myenv}

\begin{myenv}{15pt}
\lipsum[1-4]
\end{myenv}

\lipsum[1]

\end{document}

在此处输入图片描述

相关内容