使用 \let 命令保存长度

使用 \let 命令保存长度

我想保存\fboxsep长度\oldfboxsep并在以后使用它。以下代码不起作用:

\newlength{\oldfboxsep}
\let\oldfboxsep\fboxsep % 3pt by default
\setlength{\fboxsep}{8pt}
\fbox{\begin{minipage}{.9\textwidth}
  \setlength{\fboxsep}{\oldfboxsep}
  Text\fbox{Box}Text
\end{minipage}}

以下代码有效:

\newlength{\oldfboxsep}
\setlength{\oldfboxsep}{\fboxsep} % 3pt by default
\setlength{\fboxsep}{8pt}
\fbox{\begin{minipage}{.9\textwidth}
  \setlength{\fboxsep}{\oldfboxsep}
  Text\fbox{Box}Text
\end{minipage}}

这两种方式有什么区别?

答案1

当你将\let一个长度/维度更改为另一个时,新设置的长度指向同一个寄存器。在类似方面,人们可能会认为这\let是指向现有数据结构的指针(在编程语言中)。例如,考虑以下 MWE:

在此处输入图片描述

\documentclass{article}
\begin{document}

\let\oldfboxsep\fboxsep % 3pt by default
\show\fboxsep
\show\oldfboxsep

\verb|\fboxsep|: \the\fboxsep\par
\verb|\oldfboxsep|: \the\oldfboxsep

\setlength{\fboxsep}{10pt}

\verb|\fboxsep|: \the\fboxsep\par
\verb|\oldfboxsep|: \the\oldfboxsep

\setlength{\oldfboxsep}{15pt}

\verb|\fboxsep|: \the\fboxsep\par
\verb|\oldfboxsep|: \the\oldfboxsep

\end{document}

更具体地说,该\show命令将以下内容添加到.log

> \fboxsep=\dimen36.
l.5 \show\fboxsep


> \oldfboxsep=\dimen36.
l.6 \show\oldfboxsep

当然,正确的方法是定义一个新的长度,并将一个长度设置为另一个长度,就像在第二个例子中所做的那样。

也许,以非常类似的方式(摘自 TeX Book):

\let\a=\b和之间有显著差异吗\def\a{\b}

确实如此。在第一种情况下,接收 时当前\a的含义 。在第二种情况下,成为一个宏,每当使用 时 都会扩展到令牌中  ,因此它具有 时当前的含义 。如果您想交换和 的含义,则 需要。\b\let\a\b\a\b\let\a\b

答案2

您想保存价值\fboxsep不是它的意义。如果你

\show\fboxsep

答案是

\fboxsep=\dimen36

特别是,\fboxsep不是宏,因此这样做\let\foo\fboxsep将只是定义\foo为与相同\dimen36

你仍然可以不定义新的长度,通过使用强大的\the(见\命令):

\edef\savedfboxsep{\the\fboxsep} % 3pt by default
\setlength{\fboxsep}{8pt}
\fbox{\begin{minipage}{.9\textwidth}
  \setlength{\fboxsep}{\savedfboxsep}
  Text\fbox{Box}Text
\end{minipage}}

\setlength当执行内部指令时,TeX 会将其翻译成

\fboxsep=\savedfboxsep\relax

并且它会扩展,\savedfboxsep因为=TeX 正在寻找规范。


实现相同构造的可能更好的方法是使用盒子:

\newsavebox{\fminipagebox}
\newenvironment{framedminipage}
  {\begin{lrbox}{\fminipagebox}\begin{minipage}}
  {\end{minipage}\end{lrbox}%
   \setlength{\fboxsep}{8pt}%
   \fbox{\usebox{\fminipagebox}}}

一旦环境结束, \fboxsepto的设置将被撤消;它不会影响环境内的任何命令,因为该文本已经被排版。8ptframedminipage\fbox

请注意,由于该\begin部分以 结尾\begin{minipage},您可以(并且应该)指定与 相同的参数minipage,包括可选参数。

\documentclass{article}
\usepackage{lipsum}
\newsavebox{\fminipagebox}
\newenvironment{framedminipage}
  {\begin{lrbox}{\fminipagebox}\begin{minipage}}
  {\end{minipage}\end{lrbox}%
   \setlength{\fboxsep}{8pt}%
   \fbox{\usebox{\fminipagebox}}}

\begin{document}
\lipsum[2]

\medskip

\begin{framedminipage}{.9\textwidth}
  Text\fbox{Box}Text
\end{framedminipage}

\medskip

\lipsum[3]

\end{document}

在此处输入图片描述

相关内容