是否有可能知道橡胶长度的实际长度

是否有可能知道橡胶长度的实际长度

MWE 是

A \hskip 0pt plus 2pt \foo B
\end

然后宏会告诉我日志文件中\foo先前的实际长度。\hskip

是否可以编写这样的宏\foo? 怎样编写?

答案1

不完全是你问的,但是当你要求日志中的信息时你可以这样做

\tracingoutput1
    \showboxbreadth\maxdimen\showboxdepth\maxdimen

A \hskip 0pt plus 2pt  B

\parfillskip 0pt plus .5\hsize
A \hskip 0pt plus 2pt  B

\end

产生

..\hbox(6.83331+0.0)x469.75499, glue set 431.83829fil
...\hbox(0.0+0.0)x20.0
...\tenrm A
...\glue 3.33333 plus 1.66498 minus 1.11221
...\glue 0.0 plus 2.0
...\tenrm B
...\penalty 10000
...\glue(\parfillskip) 0.0 plus 1.0fil
...\glue(\rightskip) 0.0

..\hbox(6.83331+0.0)x469.75499, glue set 1.81032
...\hbox(0.0+0.0)x20.0
...\tenrm A
...\glue 3.33333 plus 1.66498 minus 1.11221
...\glue 0.0 plus 2.0
...\tenrm B
...\penalty 10000
...\glue(\parfillskip) 0.0 plus 234.87749
...\glue(\rightskip) 0.0

从中可以推断出第一行使用了无限胶合拉伸(因此未使用有限 2pt 拉伸),而第二行使用了有限拉伸,其倍数为 1.81032


如果你正在使用扩展的 tex,比如 pdftex,那么你可以测量 TeX 内的空间(大部分工作是设置辅助文件,因此在 latex 中更容易),但是

%\tracingoutput1
%    \showboxbreadth\maxdimen\showboxdepth\maxdimen

\newread\test
\newwrite\aux
\openin\test=\jobname.aux
\ifeof\test\else
\closein\test
\input\jobname.aux
\fi
\immediate\openout\aux=\jobname.aux
\def\foo#1#2{%
\pdfsavepos
\write\aux{\def\expandafter\string\csname#1Xa\endcsname{\the\pdflastxpos}}%
#2%
\pdfsavepos
\write\aux{\def\expandafter\string\csname#1Xb\endcsname{\the\pdflastxpos}}%
\expandafter\ifx\csname#1Xa\endcsname\relax\else
\wlog{LENGTH: \the\dimexpr\csname#1Xb\endcsname sp-\csname#1Xa\endcsname sp}%
\fi}



%%%%%%%


A \foo{x}{\hskip 0pt plus 2pt }B

\parfillskip 0pt plus .5\hsize
A \foo{y}{\hskip 0pt plus 2pt }B

\end

生产

LENGTH: 0.0pt
LENGTH: 3.62064pt

确认经典跟踪信息中显示的结果,第一个空间的最终长度为 0pt,第二个空间的最终长度为 0pt + 1.81032*2pt = 3.62064pt

相关内容