我正在开发一个自定义环境,它可能会变得更大\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
,那么您需要使用。\parbox
myenvPar
但是,您也可以在 MWE 中用作(用于短文本)和(如果有可能是长文本)环境\centering
:CenteredEnvironment
CenteredEnvironmentPar
笔记:
- 包裹
showframe
仅用于显示页边距。实际使用中不需要它。 - 和不需要包
CenteredEnvironment
。CenteredEnvironmentPar
environ
代码:
\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}