如何记住不同汇编的长度

如何记住不同汇编的长度

我正在尝试在.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

根据您所需的精度,您可以简单地使用该totcount包:

\documentclass{article}

\usepackage{printlen}

\usepackage{totcount}
\newtotcounter{mylenght}


\begin{document}

\uselengthunit{mm}\printlength{\totvalue{mylenght}}

\newlength\mylen
\setlength{\mylen}{4.9999999mm}

\setcounter{mylenght}{\mylen}

\end{document}

在此处输入图片描述

答案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何时要设置临时值。

相关内容