我想保存\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}}}
一旦环境结束, \fboxsep
to的设置将被撤消;它不会影响环境内的任何命令,因为该文本已经被排版。8pt
framedminipage
\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}