如何使用 LaTeX3 中的 box-module 计算环境的宽度?

如何使用 LaTeX3 中的 box-module 计算环境的宽度?

问题

我想到一个问题:如何用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}

我的想法是

  1. 将我想测量的东西存放在盒子里
  2. 计算盒子的宽度
  3. 将宽度存储在 dim 变量中

我遇到的问题

  1. 如果我将其存储content在 vbox 中,那么它的宽度就是当前线宽;
  2. 如果我将其存储content在 hbox 中,那么
  • 我无法使用某些环境,enumerate例如content会出现问题
  • hbox 总是水平的:如果使用\box_wd:N来获取它的宽度,它会随着content越来越大而无限制地增加

我想要的是

  1. 我想知道是否可以通过使用盒子模块来完成此操作。
  2. 如果 LaTeX3 中有其他更好的方法可以轻松获取内容的宽度或高度(可能包括环境)。
  3. 为了更清楚地表达我的愿望,我使用了一张图片: 在此处输入图片描述

我想计算红色的部分但不是蓝色的部分

答案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}

相关内容