有没有一种简单的方法来创建本地长度

有没有一种简单的方法来创建本地长度

我想在 中重新定义\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}

相关内容