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