LaTeX3:\clist_gpop 在 tabularx 中有额外的 pop

LaTeX3:\clist_gpop 在 tabularx 中有额外的 pop

我昨天问过\clist_gpop表格:LaTeX3:clist_pop 中的标记列表无法显示在表格第二列中

已经修复。但是当我改用 时tabularx,它看起来好像有额外的弹出,并且受到表格对齐的影响。

这是 MWE:

\documentclass[12pt]{article}
\usepackage{expl3}
\usepackage{tabularx}
\ExplSyntaxOn

\begin{document}
    \clist_new:N \g_sppmg_my_cl
    \clist_gset:Nn \g_sppmg_my_cl {a,b,c,d,e,f,g,h}

    \begin{tabularx}{\textwidth}{|c|}
% --------------------------------
        \clist_gpop:NN \g_sppmg_my_cl \l_tmpa_tl
        \tl_gset_eq:NN \g_tmpa_tl \l_tmpa_tl 
        ``\g_tmpa_tl'' \\ 
% --------------------------------
    \end{tabularx}
\ExplSyntaxOff
\end{document}
  1. 在此代码中,输出是b(应该是a
  2. 如果两者之间的块% ----使用两次,则会输出cd行。
  3. 如果将表格对齐方式从 改为cX有 2 个块/2 行),则输出ef

为什么 ?

注意,我搜索tabularxexpl3然后我发现带有 tabularx 的 expl3 代码,但我还是不知道如何修复它。

答案1

原因是\clist_gpop:NN这里的是错误的,因为tabularx首先在框中设置,然后确定非 X 列的宽度,使用该值计算X潜在列,然后经过可能的多个进一步的计算步骤后对框进行排版。

现在,第一个“使用”(此处的计算阶段)从给定列表中弹出“a”,留下b“第一个”元素,然后在\tl_use:N \g_tmpa_tl实际的第二次弹出操作之后在排版阶段显示。如果发生更多计算步骤,则会弹出更多项目\clist(此处,tabularx表格仅处理两次,因此b保留)

这也会发生\clist_pop:NN,但不会造成任何损害,因为这发生在一个组中(即表格单元格)

总的来说,混合expl3代码和 LaTeX2e 环境可能会很尴尬......

\documentclass[12pt]{article}
\usepackage{expl3}
\usepackage{tabularx}
\ExplSyntaxOn

\begin{document}
    \clist_new:N \g_sppmg_my_cl
    \clist_gset:Nn \g_sppmg_my_cl {a,b,c,d,e,f,g,h}

    \begin{tabularx}{\textwidth}{|c|}
% --------------------------------
        \clist_pop:NN \g_sppmg_my_cl \l_tmpa_tl
        \tl_gset_eq:NN \g_tmpa_tl \l_tmpa_tl%
        ``\tl_use:N \g_tmpa_tl'' \\ 
% --------------------------------
    \end{tabularx}
\ExplSyntaxOff
\end{document}

在此处输入图片描述

答案2

我大致会这样做。在第一个单元格中设置列表以解决多个 gpop 问题。

\documentclass[12pt]{article}
\usepackage{expl3}
\usepackage{tabularx}
\ExplSyntaxOn
\clist_new:N \g_sppmg_my_cl
\newcommand\SetMyList[1]{
  \clist_gset:Nn \g_sppmg_my_cl { #1 }
}
\newcommand\PopMyList[1]{
  \clist_gpop:NN \g_sppmg_my_cl \l_tmpa_tl
  \cs_gset_eq:NN #1 \l_tmpa_tl
  %or \xdef#1{ \tl_use:N \l_tmpa_tl }
}
\ExplSyntaxOff

\begin{document}
    \begin{tabularx}{\textwidth}{|c|}
      \SetMyList{a,b,c,d,e,f,g,h}% Set the list in the first cell of tabularx
      \PopMyList{\MyTMP}%
      \MyTMP\\
      \PopMyList{\MyTMP}%
      \MyTMP\\
    \end{tabularx}
\end{document}

相关内容