我正在尝试在一个环境中保存 minipage 的宽度和高度,并在后续环境中使用这些尺寸来创建图片环境。想法是使用 的其余部分在 minipage 的右侧创建一个图片,其\columnwidth
高度与左侧的 minipage 相同。据我所知,问题是\savebox
第一个环境中设置的长度和 'es 都不会保留到下一个环境中,因为它们受 LaTeX 的范围规则约束。
所以我的问题是,如何在一个环境中保存尺寸(或框)并在另一个环境中使用它们?
更新:这是使用(非工作)的示例\global
:
\documentclass{article}
\usepackage{calc}
\usepackage{picture}
\newsavebox{\questiontextbox}
\newsavebox{\questionpicturebox}
\newlength{\questiontextheight}
\newenvironment{questiontext}[1]%
{\begin{lrbox}{\questiontextbox}%
\begin{minipage}[t]{#1}}%
{\end{minipage}\end{lrbox}%
\noindent\usebox{\questiontextbox}%
\settoheight{\questiontextheight}{\usebox{\questiontextbox}}% ****
\global\setlength{\questiontextheight}{\questiontextheight}}
\newenvironment{questionpicture}[1]%
{\begin{lrbox}{\questionpicturebox}%
\setlength{\unitlength}{1cm}%
\begin{picture}(#1-\fboxsep-\fboxsep,\questiontextheight)}%
{\end{picture}\end{lrbox}%
\fbox{\raisebox{-\questiontextheight}{\usebox{\questionpicturebox}}}}
\begin{document}
\begin{questiontext}{0.2\columnwidth}
There must be some text here so I made it up to fill more than just a
single line.
\end{questiontext}%
\begin{questionpicture}{0.8\columnwidth}
\put(0.5,0.5){\circle{0.4}}
\end{questionpicture}
\end{document}
只是\fbox
为了显示图片高度只有 2\fboxsep
英寸。我尝试将其放在标有 **** 的行\global
之前\settoheight
,但同样不起作用。不知道我做错了什么;包calc
或picture
(使用实际尺寸所需的包)是否会阻止正常\global
行为?
答案1
有一个原语\global
可以使以下 TeX 赋值成为全局的。因此,您可以使用\global\setbox
and \global\def
= \gdef
。在 LaTeX 中,正如 David Carlisle 善意指出的那样\global\setlength
,在某些情况下,您可以这样做,但通常不能保证它能正常工作,并且加载诸如这样的包实际上会阻止它工作。一种解决方法是在之后calc
使用中间全局 TeX 赋值来计算结果:\global\len=\len
\setlength
\documentclass[a4paper]{article}
\usepackage{calc}
\newlength{\mylength}
\newlength{\myglength}
\newlength{\myllength}
\begin{document}
\setlength{\mylength}{10pt}
\setlength{\myglength}{10pt}
\setlength{\myllength}{10pt}
\verb+\mylength+ is \the\mylength.
\verb+\myglength+ is \the\myglength.
\verb+\myllength+ is \the\myllength.
\bigskip
\begin{minipage}{0.9\linewidth}
\setlength{\mylength}{20pt}
\setlength{\myglength}{20pt}
\global\setlength{\myllength}{20pt} % Doesn't work when calc is loaded
\global\myglength=\myglength
Minipage start
\verb+\mylength+ is \the\mylength.
\verb+\myglength+ is \the\myglength.
\verb+\myllength+ is \the\myllength.
Minigage end
\end{minipage}
\bigskip
\verb+\mylength+ is \the\mylength.
\verb+\myglength+ is \the\myglength.
\verb+\myllength+ is \the\myllength.
\end{document}
在您现在给出的具体示例中,您需要抓住totalheight
框的,以获取相同高度的图片,然后需要将其向下移动depth
小页面的。上述\global
技巧现在将起作用:
\documentclass{article}
\usepackage{calc}
\usepackage{picture}
\usepackage{ragged2e}
\newsavebox{\questiontextbox}
\newsavebox{\questionpicturebox}
\newlength{\questiontexttotalheight}
\newlength{\questiontextdepth}
\newenvironment{questiontext}[1]%
{\begin{lrbox}{\questiontextbox}%
\begin{minipage}[t]{#1}}%
{\end{minipage}\end{lrbox}%
\noindent\usebox{\questiontextbox}%
\settototalheight{\questiontexttotalheight}{\usebox{\questiontextbox}}%
\settodepth{\questiontextdepth}{\usebox{\questiontextbox}}%
\global\questiontexttotalheight=\questiontexttotalheight
\global\questiontextdepth=\questiontextdepth}
\newenvironment{questionpicture}[1]%
{\begin{lrbox}{\questionpicturebox}%
\setlength{\unitlength}{1cm}%
\begin{picture}(#1-\fboxsep-\fboxsep-0.8pt,\questiontexttotalheight)}%
{\end{picture}\end{lrbox}%
\fbox{\raisebox{-\questiontextdepth}{\usebox{\questionpicturebox}}}}
\begin{document}
\begin{questiontext}{0.2\columnwidth}
\RaggedRight There must be some text here so I made it up to fill more than just
a single line.
\end{questiontext}%
\begin{questionpicture}{0.8\columnwidth}
\put(0.5,0.5){\circle{0.4}}
\end{questionpicture}
\end{document}
我在你的代码中做了一些额外的改动。首先,你的宽度\fbox
不仅有 ,\fboxsep
还有两条规则0.4pt
的宽度,所以你需要减去0.8pt
更多以避免框过满。其次,左侧的窄列最好设置为右边参差不齐,使用ragged2e
包提供的\RaggedRight
命令,它比标准的命令要小一些\raggedright
。