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