全局范围或永久长度或保存箱

全局范围或永久长度或保存箱

我正在尝试在一个环境中保存 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,但同样不起作用。不知道我做错了什么;包calcpicture(使用实际尺寸所需的包)是否会阻止正常\global行为?

结果

答案1

有一个原语\global可以使以下 TeX 赋值成为全局的。因此,您可以使用\global\setboxand \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

相关内容