我想创建一个环境,将其内容放在与当前页面一样宽的迷你页面中。该环境的工作方式如下:
\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 命令和环境的标准宏的语法。