我正在尝试在.aux
文件中保存一个长度,以便在下面的编译中记住它。
换句话说,我正在寻找类似总计数包,但适用于长度。
更一般地说,是否有一种更高级的机制可以在编译过程中保存值?Tikz 的机制[remember picture]
很棒,而且易于使用,但\protected@write\@auxout
感觉特别低级,需要我摆弄\protected
,考虑文件何时加载等。
这是我迄今为止未奏效的尝试。
\documentclass{article}
\makeatletter
\newlength\mylen
\mylen=0pt% Default value
\def\reloadmylen#1{\mylen=#1}
\def\changelen#1{
\mylen=#1
\protected@write\@auxout{}{\protect\reloadmylen{\the\mylen}}
}
\makeatother
\begin{document}
\the\mylen% Should print 20pt, but prints 0.0pt.
\changelen{10pt}
\changelen{20pt}
\end{document}
答案1
\protected@write
如果想要在页面输出时将宏的当前值写入外部文件,则使用它。
在 OP 的案例中,使用 之后的 dimen 值\changelen
应存储在\@auxout
( \jobname.aux
) 中。这可以立即完成,不需要进一步延迟,因为在第二次 LaTeX 运行期间重新读取\changelen
时, 写的最后一个值才是最重要的。这就是为什么不是这里的最佳选择,但应该是首选。\jobname.aux
\protected@write
\immediate\write
\documentclass{article}
\newlength\mylen
\mylen=0pt% Default value
\makeatletter
% persistently sets length register
\def\changelen#1#2{%
\global#1=#2%
\immediate\write\@auxout{\global#1=\the#1}%
}
\makeatother
\begin{document}
\the\mylen% Prints 20pt after the second run.
\changelen{\mylen}{10pt}
%\changelen{\mylen}{20pt}
\newlength\otherlen\otherlen=20pt
\changelen{\mylen}{\otherlen} % also works (can be used like `\setlength')
\end{document}
答案2
\def\reloadmylen#1{\global\mylen=#1}
答案3
答案4
您可以totcount
使用不近似值,利用如果我们将长度作为计数器的值传递,则长度被强制为整数的事实。
\documentclass{article}
\usepackage{totcount}
% a `total' counter for saving the value of \mylen
\newtotcounter{savedlength}
% allocate the length
\newlength\mylen
% set it at begin document (using the last value in the previous run)
% the value had been coerced to an integer, that is, the length in scaled points
\AtBeginDocument{\setlength{\mylen}{\totvalue{savedlength}sp}}
% \changelen sets the value of \mylen, but also stores it in the counter
\newcommand\changelen[1]{%
\setlength{\mylen}{#1}%
\setcounter{savedlength}{\mylen}%
}
\begin{document}
\the\mylen
\changelen{10pt}
\the\mylen
\changelen{20pt}
\the\mylen
\end{document}
但请注意,\changelen
在组中执行操作将保存该值;但您当然可以说\setlength
何时要设置临时值。