我想在 中重新定义\textheight
和。到目前为止效果很好。但 textheight 部分只有在 的帮助下才能工作。不幸的是将被全局创建。只能在本地分配它。\textwidth
\parbox
\textwidth
\newlength
\newlength
\setlength
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\begin{document}
\parbox{0.5\textwidth}{
\def\textwidth{\linewidth}
\newlength{\mylocal}
\setlength{\mylocal}{0.99\textheight}
\edef\textheight{\mylocal}
\parbox[t][\textheight]{\textwidth}{
\framebox[\textwidth]{Text2}
\vfill
\framebox[\textwidth]{Text3} \the\mylocal
}%inner parbox
}%outer parbox
\the\mylocal
\framebox[\textwidth]{Text4}
\end{document}
可以看到,在 之外并没有 undefined-error \parbox
。如果我\newlength{\mylocal}
在 之外使用\parbox
就会出现这样的错误。
答案1
我们先来看一下基础知识。首先,\textwidth
和\textheight
是\linewidth
寄存器<dimen>
,内部定义为\newdimen
。
如果你这么做\def\textwidth{\linewidth}
了不是设置\textwidth
为当前线宽,但只是制作\textwidth
一个将扩展为\linewidth
(存储当前线宽的内部寄存器的名称,主要用于列表)的宏。
当您执行 时\edef\textheight{\mylocal}
,您所做的是相同的:\textheight
变成扩展为 的宏\mylocal
。
这种(无用的)重新定义将在它们所在的 parbox 末尾消失,因为 parbox 被一个组包围。的分配\mylocal
不会消失,但其值会因同样的原因消失。
您可以<dimen>
在本地使用参数,但我建议使用您自己的参数(现在有很多寄存器)。
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\begin{document}
\parbox{0.5\textwidth}{
\setlength\textwidth{\linewidth}
\setlength\textheight{0.99\textheight}
\parbox[t][\textheight]{\textwidth}{
\framebox[\textwidth]{Text2}
\vfill
\framebox[\textwidth]{Text3}
}%inner parbox
}%outer parbox
\framebox[\textwidth]{Text4}
\end{document}
请注意能使用当前值为参数分配一个值:
\setlength{\textheight}{0.99\textheight}
完全合法有效。不过,最好分配自己的参数:
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\newlength\mgwidth \newlength\mgheight
\begin{document}
\parbox{0.5\textwidth}{
\setlength\mgwidth{\linewidth}
\setlength\mgheight{0.99\textheight}
\parbox[t][\mgheight]{\mgwidth}{
\framebox[\mgwidth]{Text2}
\vfill
\framebox[\mgwidth]{Text3}
}%inner parbox
}%outer parbox
\framebox[\textwidth]{Text4}
\end{document}