下述代码输出
123def
abcdef
显然我希望输出的是
123456
abcdef
请问是哪里出了问题?
\documentclass{article}
\usepackage{expl3} % 加载 expl3 宏包
\begin{document}
\ExplSyntaxOn
% 声明全局序列
\seq_new:N \g_infos_seq
% 声明两个令牌列表
\tl_new:N \g_info_tl
\tl_new:N \g_title_tl
% 定义一个新的令牌列表用于存储拼接结果
\tl_new:N \g_combined_tl
% 定义一个新命令,将两个令牌列表拼接并添加到序列中
\cs_new:Nn \concat_and_add_to_seq:
{
% 清空临时令牌列表(可选)
\tl_gclear:N \l_tmp_combined_tl
% 将第一个令牌列表的内容赋值到新令牌列表
\tl_gset:Nx \g_combined_tl { \tl_use:N \g_info_tl }
% 将第二个令牌列表的内容追加到新令牌列表
\tl_gput_right:Nn \g_combined_tl { \tl_use:N \g_title_tl }
% 将拼接后的令牌列表推送到全局序列的右边
\seq_gput_right:NV \g_infos_seq \g_combined_tl
}
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {123}
\tl_gset:Nn \g_title_tl {456}
% 调用命令将拼接结果添加到序列中
\concat_and_add_to_seq:
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {abc}
\tl_gset:Nn \g_title_tl {def}
% 调用命令将拼接结果添加到序列中
\concat_and_add_to_seq:
% 显示序列的内容
\seq_use:Nn \g_infos_seq {\par}
\ExplSyntaxOff
\end{document}
感觉这个代码不是人写的...\tl_gclear:N \l_tmp_combined_tl
里面的变量根本没用上,应该是\g_combined_tl
问题的关键是变量\seq_new:N \g_infos_seq
在两次赋值之间没有\seq_gclear
,下面是修改过后调试版的mwe:
\documentclass{ctexart}
\usepackage{expl3} % 加载 expl3 宏包
\begin{document}
\ExplSyntaxOn
% 声明全局序列
\seq_new:N \g_infos_seq
% 声明两个令牌列表
\tl_new:N \g_info_tl
\tl_new:N \g_title_tl
% 定义一个新的令牌列表用于存储拼接结果
\tl_new:N \g_combined_tl
% 定义一个新命令,将两个令牌列表拼接并添加到序列中
% 这个\concat_and_add_to_seq:的逻辑应该是:
% 清空\g_combines_tl,合并两个token_list,最后转换为seq
\cs_new:Nn \concat_and_add_to_seq:
{
\tl_gclear:N \g_combined_tl
g_combined_tl~First~:\tl_use:N \g_combined_tl \par
% 将第一个令牌列表的内容赋值到新令牌列表
\tl_gset:Nx \g_combined_tl { \g_info_tl }
g_combined_tl~Second~:\tl_use:N \g_combined_tl \par
% 将第二个令牌列表的内容追加到新令牌列表
\tl_gput_right:Nn \g_combined_tl { \g_title_tl }
g_combined_tl~Third~:\tl_use:N \g_combined_tl \par
% 将拼接后的令牌列表推送到全局序列的右边
\seq_gput_right:NV \g_infos_seq \g_combined_tl
seq的输出结果: \seq_use:Nn \g_infos_seq {} \par
}
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {123}
\tl_gset:Nn \g_title_tl {456}
% 调用命令将拼接结果添加到序列中
\concat_and_add_to_seq:
\seq_use:Nn \g_infos_seq {\par}
\seq_gclear:N \g_infos_seq \par
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {abc}
\tl_gset:Nn \g_title_tl {def}
% 调用命令将拼接结果添加到序列中
\concat_and_add_to_seq:
% 显示序列的内容
\seq_use:Nn \g_infos_seq {\par}
\ExplSyntaxOff
\end{document}
v2
封装了一下
\documentclass{ctexart}
\usepackage{expl3}
\ExplSyntaxOn
% 声明全局变量
\tl_new:N \g_info_tl
\tl_new:N \g_title_tl
\tl_new:N \g_mixd_tl
\seq_new:N \g_infos_seq
\seq_gclear:N \g_infos_seq
\cs_new:Nn \concat_mixd:
{
% \tl_set:Nx \g_mixd_tl {asd \tl_use:N \g_info_tl dfg \tl_use:N \g_title_tl ghj}
\tl_set:Nx \g_mixd_tl { \tl_use:N \g_info_tl \tl_use:N \g_title_tl }
% 调试:g_mixd_tl:【\g_mixd_tl】
}
\cs_new:Nn \addseq_mixd:
{
\seq_put_right:Nx \g_infos_seq { \tl_use:N \g_mixd_tl }
}
\begin{document}
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {123}
\tl_gset:Nn \g_title_tl {456}
% 调用命令将拼接结果添加到序列中
\concat_mixd:
\addseq_mixd:
\par
% 输出序列内容
\seq_use:Nn \g_infos_seq {\par}
% 另起一段
\par
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {abc}
\tl_gset:Nn \g_title_tl {def}
% 调用命令将拼接结果添加到序列中
\concat_mixd:
\addseq_mixd:
\par
% 显示序列的内容
\seq_use:Nn \g_infos_seq {\par}
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {感谢 Sagittarius Rover}
\tl_gset:Nn \g_title_tl {\={a}}
% 调用命令将拼接结果添加到序列中
\concat_mixd:
\addseq_mixd:
\par
% 显示序列的内容
\seq_use:Nn \g_infos_seq {\par}
\end{document}
\ExplSyntaxOff
v1
已解决:
\documentclass{ctexart}
\usepackage{expl3}
\ExplSyntaxOn
% 声明全局变量
\tl_new:N \g_info_tl
\tl_new:N \g_title_tl
\tl_new:N \g_mixd_tl
\seq_new:N \g_infos_seq
\seq_gclear:N \g_infos_seq
% 自定义命令,将拼接结果添加到序列中
\cs_new:Npn \concat_and_add_to_seq:
{
% 拼接 \g_info_tl 和 \g_title_tl 的内容
\tl_set:Nx \g_mixd_tl { \tl_use:N \g_info_tl \tl_use:N \g_title_tl }
g_mixd_tl:【\g_mixd_tl】
% 将拼接结果添加到序列中
\seq_put_right:Nx \g_infos_seq { \tl_use:N \g_mixd_tl }
}
\begin{document}
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {123}
\tl_gset:Nn \g_title_tl {456}
% 调用命令将拼接结果添加到序列中
\concat_and_add_to_seq:
\par
% 输出序列内容
\seq_use:Nn \g_infos_seq {\par}
% 另起一段
\par
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {abc}
\tl_gset:Nn \g_title_tl {def}
% 调用命令将拼接结果添加到序列中
\concat_and_add_to_seq:
\par
% 显示序列的内容
\seq_use:Nn \g_infos_seq {\par}
% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {感谢 Sagittarius Rover}
\tl_gset:Nn \g_title_tl {\={a}
\'{a}
\v{a}
\`{a}
\={o}
\'{o}
\v{o}
\`{o}
\={e}
\'{e}
\v{e}
\`{e}
\={i}
\'{i}
\v{i}
\`{i}}
% 调用命令将拼接结果添加到序列中
\concat_and_add_to_seq:
\par
% 显示序列的内容
\seq_use:Nn \g_infos_seq {\par}
\end{document}
\ExplSyntaxOff
另外我觉得除非有设计上的特别需求,还是少用
global
,这里的\cs_new:Nn \concat_and_add_to_seq:
如果封装为\cs_new:Nn \concat_and_add_to_seq:NNN
功能性更强,直接修改local
变量会让代码逻辑更清晰.@u70550 你好,可能我没有说明白我的意思。
我本就不希望清空seq,我希望seq是输出累计的所有mixd令牌序列
我想要的结果:
但是现在的输出是【123def{换行}abcdef】
完整代码如下