![LaTeX3:\clist_gpop 在 tabularx 中有额外的 pop](https://linux22.com/image/369676/LaTeX3%EF%BC%9A%5Cclist_gpop%20%E5%9C%A8%20tabularx%20%E4%B8%AD%E6%9C%89%E9%A2%9D%E5%A4%96%E7%9A%84%20pop.png)
我昨天问过\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}
- 在此代码中,输出是
b
(应该是a
) - 如果两者之间的块
% ----
使用两次,则会输出c
两d
行。 - 如果将表格对齐方式从 改为
c
(X
有 2 个块/2 行),则输出e
为f
为什么 ?
注意,我搜索tabularx
,expl3
然后我发现带有 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}