创建可调整内容大小的环境

创建可调整内容大小的环境

我想创建一个环境,将其内容放在与当前页面一样宽的迷你页面中。该环境的工作方式如下:

\begin{FitToWidth}
HELLO
\end{FitToWidth}

并生成与页面文本宽度一样宽的“HELLO”。

无需定义环境,可以按如下方式完成:

\documentclass[letter,11pt]{article}
\usepackage{graphicx}

\begin{document}

\begin{center}
\begin{minipage}{\textwidth}
\begin{center}
\resizebox{\textwidth}{!}{%
HELLO
}
\end{center}
\end{minipage}
\end{center}

\end{document}

问题是,当我尝试将此代码转换为环境时,LaTeX 返回错误(Package graphics Error: Division by 0)。

这是我尝试过但没有成功的方法:

\newenvironment{FitToWidth}{
\begin{center}
\begin{minipage}{\textwidth}
\begin{center}
\resizebox{\textwidth}{!}{%
} {
}
\end{center}
\end{minipage}
\end{center}
}

问题是什么?

答案1

adjustbox

\documentclass[letter,11pt]{article}
\usepackage{adjustbox}
\usepackage{showframe}  %% just for demo
\newenvironment{FitToWidth}[1][\textwidth]{%
\begin{adjustbox}{width=#1,center}
}
{\end{adjustbox}}

\begin{document}

\begin{adjustbox}{width=\textwidth}
   HELLO
\end{adjustbox}

\bigskip
\begin{FitToWidth}
  HELLO
\end{FitToWidth}

\bigskip
\begin{FitToWidth}[0.5\textwidth]
  HELLO
\end{FitToWidth}

\end{document}

在此处输入图片描述

答案2

捕获环境内容,然后调整其大小。前者是导致问题的难点。不过,通过environ包裹

在此处输入图片描述

\documentclass{article}
\usepackage{graphicx,environ}
\NewEnviron{FitToWidth}[1][\textwidth]{%
  \begin{center}
  \makebox[\textwidth]{resizebox{#1}{!}{\BODY}}%
  \end{center}
}

\begin{document}

\noindent X \dotfill X

\begin{FitToWidth}
HELLO
\end{FitToWidth}

\noindent X \dotfill X

\begin{FitToWidth}[.5\textwidth]
HELLO
\end{FitToWidth}

\noindent X \dotfill X

\end{document}

environ允许您创建一个环境并在宏中捕获其内容\BODY,然后您可以在内部使用它\resizebox。在您尝试将内容放在\begin部分和\end部分中FitToWidth时,但 TeX 的工作方式是它永远不会以这种方式获取它的参数...因为\begin/\end部分是彼此独立设置的。

环境center提供了上面/下面一些空间,同时\makebox[\textwidth]确保无论你为可选参数提供什么FitToWidth(默认为\textwidth),它都不会导致盒子过满。


另一种方法(不使用environ)是将环境内容捕获到一个盒子中,然后您就可以对其进行操作:

\documentclass{article}
\usepackage{graphicx}
\newsavebox{\FTWbox}
\newenvironment{FitToWidth}[1][\textwidth]
  {% \begin{FitToWidth}[<width>]
    \gdef\FTWoptarg{#1}%
    \begin{lrbox}{\FTWbox}
  }{% \end{FitToWidth}
    \end{lrbox}%
    \begin{center}
      \makebox[\textwidth]{\resizebox{\FTWoptarg}{!}{\usebox{\FTWbox}}}%
    \end{center}
  }

\begin{document}

\noindent X \dotfill X

\begin{FitToWidth}
HELLO
\end{FitToWidth}

\noindent X \dotfill X

\begin{FitToWidth}[.5\textwidth]
HELLO
\end{FitToWidth}

\noindent X \dotfill X

\end{document}

答案3

这是您的代码:

\newenvironment{FitToWidth}{
  \begin{center}
    \begin{minipage}{\textwidth}
      \begin{center}
        \resizebox{\textwidth}{!}{%
        } {
        }
      \end{center}
    \end{minipage}
  \end{center}
}

其语法如下:

\newenvironment{arg1}{arg2}

但是 \newenvironment` 需要 3 个参数(可选 4 个或 5 个):

\newenvironment{name of environment}{stuff to do at the beginning of the environment}{stuff to do at the end}

因此,您的代码被解释为提供具有名称的新环境FitToWidth,而其他所有内容都被解释为在处理环境内容之前执行的代码。

这意味着

  \begin{center}
    \begin{minipage}{\textwidth}
      \begin{center}
        \resizebox{\textwidth}{!}{%
        } {
        }
      \end{center}
    \end{minipage}
  \end{center}

按照原样处理。也就是说,你尝试调整一个不包含任何内容的框的大小。没有任何东西的维度为零。因此,当 TeX 计算事物时,它会尝试除以零,然后放弃,因为它无法做到这一点。

这个答案(当然是我的)解释用于创建、重新定义和提供新的 LaTeX 命令和环境的标准宏的语法。

相关内容