问题
我想到一个问题:如何用LaTeX3计算环境或段落的宽度?
我做了什么
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\box_new:N \l_calc_width_box
\dim_new:N \l_calc_width_dim
\cs_new:Npn \calcwidth:n #1
{
\the\linewidth
\vbox_set:Nw \l_calc_width_box { #1 } \vbox_set_end:
\dim_set:Nn \l_calc_width_dim { \box_wd:N \l_calc_width_box } \par
\dim_use:N \l_calc_width_dim
#1
}
\calcwidth:n {test}
\calcwidth:n
{
\begin{enumerate}
\item
\item
\item
\end{enumerate}
}
\ExplSyntaxOff
\end{document}
我的想法是
- 将我想测量的东西存放在盒子里
- 计算盒子的宽度
- 将宽度存储在 dim 变量中
我遇到的问题
- 如果我将其存储
content
在 vbox 中,那么它的宽度就是当前线宽; - 如果我将其存储
content
在 hbox 中,那么
- 我无法使用某些环境,
enumerate
例如content
会出现问题 - hbox 总是水平的:如果使用
\box_wd:N
来获取它的宽度,它会随着content
越来越大而无限制地增加
我想要的是
我想计算红色的部分但不是蓝色的部分
答案1
您可以varwidth
在 LaTeX3 代码中使用该包。虽然样式不完美,但只要没有您想要的 LaTeX3 接口,就可以了。该varwidth
包允许指定框的最大宽度,但如果可能的话,会生成一个宽度较小的框。
您可以通过将其嵌套在 中从代码内部对其进行交互\hbox_set:Nn
。
\documentclass[]{article}
\usepackage{varwidth}
\ExplSyntaxOn
\dim_new:N \l_xdyy_width_dim
\box_new:N \l__xdyy_calc_width_box
\NewDocumentCommand \calcwidth { m }
{
\xdyy_calc_width:Nn \l_xdyy_width_dim {#1}
\dim_use:N \l_xdyy_width_dim
\par
\fbox { \box_use:N \l__xdyy_calc_width_box }
}
\cs_new_protected:Npn \xdyy_calc_width:Nn #1#2
{
\hbox_set:Nn \l__xdyy_calc_width_box
{ \begin{varwidth} { \hsize } #2 \end{varwidth} }
\dim_set:Nn #1 { \box_wd:N \l__xdyy_calc_width_box }
}
\ExplSyntaxOff
\begin{document}
\calcwidth{test}
\calcwidth
{%
\begin{enumerate}
\item abc
\item def
\end{enumerate}
}
\end{document}