在 expl3 中编写带有空格的批量文本文字的练习

在 expl3 中编写带有空格的批量文本文字的练习

假设我正在编写一个自定义文档类,我想在标题页上动态添加大量人类可读的文本(因此带有空格):


\tl_set:N \l_my_var_tl {My Dynamic Variable}

\cs_new:Nn \my_titletext: {
  There ~ is ~ some ~ text.
  There ~ is ~ the ~ variable ~ \l_my_var_tl.
  And ~ it~ is ~ long. \par
}

我必须~在代码中输入很多内容。我无法暂时\ExplSyntaxOff返回\ExplSyntaxOn。因为在函数内部我将使用 expl3 变量和包含_字符的函数。

我想知道在 expl3 中是否有类似的东西'~'.join(str1, st2, ...)(据我所知,在搜索文档后没有这样的功能),或者是否有其他更好的做法来在 expl3 语法中编写长文本文字?

答案1

在的范围内\ExplSyntaxOn,空格获得类别代码 9(忽略)并\endlinechar设置为 32,因此实际上在每一行的末尾添加了一个空格(稍后在标记化过程中被忽略)。

因此,解决您的问题的一个好策略是将空格的类别代码本地设置为 10,而不必担心会产生空格的结束线。

这正是我所做的kantlipsum.sty

\group_begin:
\char_set_catcode_space:n {`\ }
\__kgl_newpara:n {As any dedicated reader can clearly see, the Ideal of
practical reason is a representation of, as far as I know, the things
[...]
what first give rise to human reason.}

我不确定您是否想\cs_new:Nn对这些固定文本做什么,因为它们是包含文本的变量,而不是函数。

% this will later be set in the document
% with an appropriate option
\tl_new:N \l_my_var_tl

% an auxiliary function to store fixed texts
\cs_new_protected:Nn \__my_define_text:nn
 {
  \tl_clear_new:c { g_my_container_#1_tl }
  \tl_gset:cn { g_my_container_#1_tl } { #2 }
 }

% the function for using fixed texts
\cs_new:Nn \my_use_text:n { \tl_use:c { g_my_container_#1_tl } }

% the fixed texts
\group_begin:
\char_set_catcode_space:n { `\  }

\__my_define_text:nn { title }
 {
  There is some text.
  There is the variable \l_my_var_tl.
  And it is long.\par
 }
% other fixed texts
\group_end:

当然,控制序列后面的空格问题依然存在。我还略过了应该好好考虑的函数和变量的命名。

您可以考虑使用属性列表,而不是使用许多 tl 变量:

% this will later be set in the document
% with an appropriate option
\tl_new:N \l_my_var_tl

% an auxiliary function to store fixed texts
\prop_new:N \g_my_texts_prop

\cs_new_protected:Nn \__my_define_text:nn
 {
  \prop_gput:Nnn \g_my_texts_prop { #1 } { #2 }
 }

% the function for using fixed texts
\cs_new:Nn \my_use_text:n
 {
  \prop_item:Nn \g_my_texts_prop { #1 }
 }

% the fixed texts
\group_begin:
\char_set_catcode_space:n { `\  }

\__my_define_text:nn { title }
 {
  There is some text.
  There is the variable \l_my_var_tl.
  And it is long.\par
 }
% other fixed texts
\group_end:

答案2

您可以使用 Expl3 之外的文本定义宏。例如

\def\cs#1{\csname#1\endcsname}

\def\mytext {There is some text.
  There is the variable \cs{l_my_var_tl}.
  In fact, it is not a ``variable'' but it is simply \TeX{} macro,
  but Expl3 introduces a new terminology which differs
  from standard \TeX{} terminology.
}
\ExplSyntaxOn
\tl_set:Nn \l_my_var_tl {My Dynamic Variable}

\cs_new:Nn \my_titletext: { \mytext }
\ExplSyntaxOff

相关内容