latex3令牌串相关

发布于 2024-08-25 17:27:00

下述代码输出
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}

查看更多

关注者
0
被浏览
372
2 个回答
Sagittarius Rover
Sagittarius Rover 2024-08-25
我要成为TikZ糕手/(ㄒoㄒ)/~~

感觉这个代码不是人写的...
\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}

image.png

泪过无痕
泪过无痕 2024-08-25
这家伙很懒,什么也没写!

v2
封装了一下
image.png

\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
已解决:
image.png

\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

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览