![如何保存变量](https://linux22.com/image/248475/%E5%A6%82%E4%BD%95%E4%BF%9D%E5%AD%98%E5%8F%98%E9%87%8F.png)
我需要在文档的某些部分更改“hyphenpenalty”,但我不知道之后如何正确恢复以前的值。
例如:
\hyphenpenalty=10000%
\@starttoc{toc}%
\hyphenpenalty=50 %% revert to default (??)
我认为这不是一个很好的解决方案。我怎样才能将以前的值保存到临时变量中并从中恢复?
答案1
一个简单的解决方案是:
\newcount\temphyphenpenalty
\temphyphenpenalty=\hyphenpenalty
\hyphenpenalty=10000
\@starttoc{toc}%
\hyphenpenalty=\temphyphenpenalty %% revert to default
答案2
无需设置计数器来记住该值:
\begingroup
\hyphenpenalty=10000
\@starttoc{toc}%
\par\endgroup
无需记住或重置旧值,因为 TeX 将\hyphenpenalty
在组结束时恢复 的值。我添加了最后一个\par
以确保最后一段将设置为 的正确值\hyphenpenalty
。
如果你不想要该组(在不同情况下可能是必要的),你可以不浪费寄存器:
\mathchardef\savedhyphenpenalty=\hyphenpenalty
\hyphenpenalty=10000
\@starttoc{toc}
\hyphenpenalty=\savedhyphenpenalty
标记\mathchardef
可用于 TeX 寻找数字的任何地方。唯一的限制是要保存的数字必须是非负数且小于 32768。但是,通常\hyphenpenalty
在这个区间内。
答案3
(La)TeX“变量”可以是宏或寄存器。寄存器可以是计数器(整数)、维度、跳过(带单位的小数)或读/写处理程序等。请注意,您可以在组内更改它们,即{ .. }
或\begingroup
...\endgroup
或 LaTeX 环境,然后它们的旧值会在组结束时自动恢复。
像 这样的整数设置\hyphenpenalty
基本上是特殊count
寄存器。你可以将它们的当前值复制到任何其他count
寄存器中,然后使用 将其复制回来\somecount=\someothercount
,其中=
是可选的。(请注意count
是 TeX 类型,LaTeX 计数器基于它们)
LaTeX 提供了两个临时count
寄存器,分别称为\@tempcnta
和\@tempcntb
。通常,最好只在本地组中更改它们,但如果您可以添加一个,则无论如何都不需要临时存储该值。您使用的其他一些代码可能会更改此类通用临时寄存器,因此有时可能需要使用 来使用自己的count
寄存器\newcount\yourtempcount
。
% In the preamble, only once:
\newcount\yourtempcount
% Save and restore:
\yourtempcount=\hyphenpenalty
\hyphenpenalty=10000
\@starttoc{toc}%
\hyphenpenalty=yourtempcount
也可以不做临时登记通过将恢复代码放入(通常是临时的)宏.此处使用以下内容扩展当前值\the
:
% Save and restore:
\edef\myrestorecode{\hyphenpenalty=\the\hyphenpenalty\relax}
\hyphenpenalty=10000%
\@starttoc{toc}%
\myrestorecode
这将 定义\myrestorecode
为\hyphenpenalty=<current value, e.g. "50">\relax
,因为\hyphenpenalty
它本身是不可扩展的。\relax
将作为数字的结束标记添加。\space
也可以找到单个空格 ( )。 这样做的好处是您不需要寄存器(需要先声明),并且这也适用于多个值:
\edef\myrestorecode{%
\hyphenpenalty=\the\hyphenpenalty\relax
\someothercountordim=\the\someothercountordim\relax
% ...
}
它适用count
于维度/跳过寄存器。